// This function is used to setup sorting on a table's headers

var sortedOn = 0;
var lastSorted = "asc";
var globalSortOrder = "";

// Removes leading whitespaces
function LTrim( value ) {
	
	var re = /\s*((\S+\s*)*)/;
	return value.replace(re, "$1");
	
}

// Removes ending whitespaces
function RTrim( value ) {
	
	var re = /((\s*\S+)*)\s*/;
	return value.replace(re, "$1");
	
}

// Removes leading and ending whitespaces
function trim( value ) {
	
	return LTrim(RTrim(value));
	
}


function sortTableByColumn(tableId, sortOn, type, sortOrder) {
    
    var table = document.getElementById(tableId);
    var tbody = table.getElementsByTagName('tbody')[0];
    var rows = tbody.getElementsByTagName('tr');

    var rowArray = new Array();
    for (var i=0, length=rows.length; i<length; i++) {
        rowArray[i] = rows[i].cloneNode(true);
    }

    lastSorted = sortOrder; 
    if (sortOn == sortedOn) { 
        rowArray.reverse(); 
	globalSortOrder = (globalSortOrder == "asc" || globalSortOrder == "") ? "desc" : "asc";
        //lastSorted = (lastSorted == "asc" || lastSorted == "") ? "desc" : "asc";
    } else {
        //lastSorted = "asc";
	globalSortOrder = "";
        sortedOn = sortOn;
        if (type == "number") {
            rowArray.sort(rowCompareNumbers);
        } else if (type == "dollar") {
            rowArray.sort(rowCompareDollars);
        } else if (type == "price") {
            rowArray.sort(rowComparePrice);
        } else if (type == "resortname") {
	   rowArray.sort(rowCompareResortName);
        } else {
            rowArray.sort(rowCompare);
        }
    }
            
    var newTbody = document.createElement('tbody');
    for (var i=0, length=rowArray.length; i<length; i++) {
        newTbody.appendChild(rowArray[i]);
    }
    
    table.replaceChild(newTbody, tbody);
    
    // get all the cells in the thead and set the class on the sorted column
    var thead = table.getElementsByTagName('thead')[0];
    var cells = thead.getElementsByTagName('th');
    for (var i=0; i < cells.length; i++) {
        cells[i].className = "";    
        var spans = cells[i].getElementsByTagName('img');
        for (var j=0; j < spans.length; j++) {
            cells[i].removeChild(spans[j]);
        }
        cells[i].onclick = null;
    }
    cells[sortedOn].onclick = function() {sortTableByColumn(tableId,sortOn,type,sortOrder)};
    setIndicator(cells[sortedOn],globalSortOrder);
}

function rowCompare(a, b) {
    var aVal = "";
    var bVal = "";
    //aVal = a.getElementsByTagName('td')[sortedOn].firstChild.nodeValue;
    //bVal = b.getElementsByTagName('td')[sortedOn].firstChild.nodeValue;
      aVal = a.getElementsByTagName('td')[sortedOn].innerHTML;
      bVal = b.getElementsByTagName('td')[sortedOn].innerHTML;	
    if(aVal=='&nbsp;') {
	aVal = "";
    }
    if( bVal == '&nbsp;'){ 
	bVal = "";
    }
    return (aVal == bVal ? 0 : (aVal > bVal ? 1 : -1));
}

function rowCompareNumbers(a, b) {
    var aVal = parseInt(a.getElementsByTagName('td')[sortedOn].firstChild.nodeValue);
    var bVal = parseInt(b.getElementsByTagName('td')[sortedOn].firstChild.nodeValue);
    if(aVal=='&nbsp;') {
	aVal = 0;
    }
    if( bVal == '&nbsp;'){ 
	bVal = 0;
    }
    return (aVal - bVal);
}

function rowCompareDollars(a, b) {
    var aVal = parseFloat(a.getElementsByTagName('td')[sortedOn].firstChild.nodeValue.substr(1));
    var bVal = parseFloat(b.getElementsByTagName('td')[sortedOn].firstChild.nodeValue.substr(1));
    return (aVal - bVal);
}

function rowCompareResortName(a, b) {
    var aVal = a.getElementsByTagName('td')[sortedOn].innerHTML;
    var bVal = b.getElementsByTagName('td')[sortedOn].innerHTML;
    /**
    var aindex = aVal.indexOf("<A href=") + 9;
    aVal = aVal.substr(aindex);
    aVal = aVal.substr(aVal.indexOf(aindex, ">")+1);
    aVal = aVal.substr(0,aVal.indexOf("</A>"));
    **/
    var testRegEx = new RegExp("\">(.*)</A>");
    var results = testRegEx.exec(aVal);	
    aVal = results[1];
    results = testRegEx.exec(bVal);
    bVal = results[1];
    if(aVal=='&nbsp;') {
	aVal = "";
    }
    if( bVal == '&nbsp;'){ 
	bVal = "";
    }
    return (aVal== bVal? 0 : (aVal> bVal? 1 : -1));
}

function getArray(aVal) {
    var aValArray;
    aVal = aVal.replace("\$","").replace("\$","") ;
    if( aVal.indexOf("-") != -1) {
	aValArray = aVal.split("-");
    }else {
	aValArray = new Array(1);
	aValArray[0] = aVal;
    }
    return aValArray;
}

function rowComparePrice(a, b) {
    var aVal = a.getElementsByTagName('td')[sortedOn].innerHTML;
    var bVal = b.getElementsByTagName('td')[sortedOn].innerHTML;

    var priceRegEx = new RegExp("price>(.*)</SPAN>");
    var results=priceRegEx.exec(aVal);
    aVal = trim(results[1]);
    results = priceRegEx.exec(bVal);
    bVal = trim(results[1]);
    if(aVal=='&nbsp;' || aVal=='&nbsp;&nbsp;' || aVal ==' &nbsp;') {
	aVal = "";
    }
    if( bVal == '&nbsp;' || bVal=='&nbsp;&nbsp;' || bVal ==' &nbsp;'){ 
	bVal = "";
    }

    return compareArrays(aVal, bVal);
}

function setIndicator(e, lastSorted) {
    e.className = "sorted";
    var indicator = document.createElement("img");
    indicator.setAttribute("src", "/ehweb/graphics/table/"+lastSorted+".gif");
    indicator.setAttribute("width", "9");
    indicator.setAttribute("height", "10");
    indicator.setAttribute("alt", (lastSorted == "asc") ? "Ascending" : "Descending");
    indicator.className = "sortIndicator";
    e.appendChild(indicator);
}

function compareArrays(aVal, bVal) {

     if (aVal== bVal) {
	    return 0;
    }
    if( aVal == "" ) {
	return 1;
    }
    if( bVal == "" ) {
	return -1;
    }

    var aValArray = getArray(aVal);
    var bValArray = getArray(bVal);  
    if( (  aValArray.length <2 ) || (bValArray.length <2) ) {
          if( parseFloat(aValArray[0]) == parseFloat(bValArray[0]) ) {
		return 0;
	  }
	  return ( parseFloat(aValArray[0]) > parseFloat(bValArray[0]) ) ? 1 : -1;	
    } else { 
          if( parseFloat(aValArray[0]) == parseFloat(bValArray[0]) ) {
		if ( parseFloat(aValArray[1]) == parseFloat(bValArray[1]) ) {
			return 0;
		} 
 	        return ( parseFloat(aValArray[1]) > parseFloat(bValArray[1]) ) ? 1 : -1;	
	   }
	   if ( parseFloat(aValArray[0]) > parseFloat(bValArray[0]) ) {
		return  1;
	   }	
	   if ( parseFloat(aValArray[0]) < parseFloat(bValArray[0]) ) {
		return -1;		
	   }   
    }	
   return 0;   
}
