

function sortableTable(tableIDx,intDef,sortProps){

  var tableID = tableIDx;
  var intCol = 0;
  var intDir = 1;
  var strMethod;
  var arrHead = null;
  var arrMethods = sortProps.split(",");

  //wks
  //  var image_path = "http://www.joostdevalk.nl/code/sortable-table/";
  var image_path = "./img/";
  var image_up = "arrowup.gif";
  var image_down = "arrowdown.gif";
  var image_none = "arrownone.gif";


  this.init = function(){

      //wks: in case table empty
      if (document.getElementById(tableID) == null ||
          document.getElementById(tableID).getElementsByTagName('thead') ==null ||
	  document.getElementById(tableID).getElementsByTagName('thead')[0] == null ||
	  document.getElementById(tableID).getElementsByTagName('thead')[0].getElementsByTagName('th') == null)
          return;

    arrHead = document.getElementById(tableID).getElementsByTagName('thead')[0].getElementsByTagName('th');
    for(var i=0;i<arrHead.length;i++){
	  arrHead[i].onclick = new Function(tableIDx + ".sortTable(" + i + ",'" + arrMethods[i] + "');");
    }
    this.sortTable(intDef,arrMethods[intDef]);
  }

  this.sortTable = function(intColx,strMethodx){ 

    intCol = intColx;
	strMethod = strMethodx;

	var arrRows = document.getElementById(tableID).getElementsByTagName('tbody')[0].getElementsByTagName('tr');
    //wks: in case table is empty
    if (arrRows==null) return;
    /* //wks
    alert(arrHead);
    alert(arrHead[intCol]);
    alert(arrHead[intCol].className);

    while (arrHead[intCol] == null) arrHead.push(document.createElement('th'));
    if (arrHead[intCol].className==null) arrHead[intCol].className="asc";
    */

    intDir = (arrHead[intCol].className=="asc")?1:-1;

    //wks arrow

    var ARROW = (intDir==1)? '&nbsp;&nbsp;<img src="'+ image_path + image_up + '" alt="&uarr;"/>' :
    '&nbsp;&nbsp;<img src="'+ image_path + image_down + '" alt="&uarr;"/>' ;
    var allspans = document.getElementsByTagName("span");
    var wksarrowIndex = intCol;
    for (var ci=0;ci<allspans.length;ci++) {
	if (allspans[ci].className == 'sortarrow') {
	    //	    if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?
	    //wks-set up/down arrow for column I'm sorting
	    wksarrowIndex--;
	    if (wksarrowIndex==0) allspans[ci].innerHTML = ARROW;
	    else allspans[ci].innerHTML = '&nbsp;&nbsp;<img src="'+ image_path + image_none + '" alt="&darr;"/>';
		//	    }
	}
    }

    

    //wks end arrow

    arrHead[intCol].className = (arrHead[intCol].className=="asc")?"des":"asc";
	for(var i=0;i<arrHead.length;i++){
      if(i!=intCol){arrHead[i].className="";}
	}
	  
	var arrRowsSort = new Array(); 
	for(var i=0;i<arrRows.length;i++){ 
      arrRowsSort[i]=arrRows[i].cloneNode(true); 
    }
    arrRowsSort.sort(sort2dFnc);
	      
	for(var i=0;i<arrRows.length;i++){   
	  arrRows[i].parentNode.replaceChild(arrRowsSort[i],arrRows[i]);
      arrRows[i].className = (i%2==0)?"":"alt";
	} 

  } 

  function sort2dFnc(a,b){
    var col = intCol;
    var dir = intDir;
    var aCell = a.getElementsByTagName("td")[col].innerHTML;
    var bCell = b.getElementsByTagName("td")[col].innerHTML;
	   
    switch (strMethod){
    case "int":
      aCell = parseInt(aCell);
      bCell = parseInt(bCell);			 
	  break;
	case "float":
      aCell = parseFloat(aCell);
      bCell = parseFloat(bCell);			 		   
	  break;
	case "date":
      aCell = new Date(aCell);
      bCell = new Date(bCell);
	  break;	   
	}
    return (aCell>bCell)?dir:(aCell<bCell)?-dir:0;
  }
}
