var strAsc = '<img src="/GYGlobal/images/sortasc.png" border="0">'
var strDesc = '<img src="/GYGlobal/images/sortdesc.png" border="0">'
var SORT_INDEX = 0

function $E(v) { return(document.getElementById(v)); }
function $T(v,i) { return((typeof(i)=='string'?$E(i):(i?i:document)).getElementsByTagName(v)); }
function iSW(w,n) { if($E(w)) $E(w).id=''; if(n) n.id=w; }

function grabText(obj) {

	if(typeof(obj)=="string"||typeof(obj)=="undefined") return(o);
	if(obj.innerText) return(obj.innerText); // IE
	if(obj.textContent) return(obj.textContent); // FireFox + Opera

	var strText=''
	var objNodes=obj.childNodes;

	for(var i=0; i<objNodes.length; i++) {
		switch(objNodes[i].nodeType) {
		  case 1: strText+=grabText(objNodes[i]); break; // ELEMENT_NODE
		  case 3: strText+=objNodes[i].nodeValue; break; // TEXT_NODE
		}
	}

	return(strText);
}

// Typically call this function with: SortTable(this, this.cellindex)
function SortTable(objThis,intIndex) {
	var objThis = arguments[0]
	var intIndex = arguments[1]

	SORT_INDEX=intIndex||objThis.parentNode.cellIndex;

	var objTable=getParent(objThis.parentNode,'TABLE');
	if(objTable.rows.length<=1) { return; }

	var strFirstValue=grabText(objTable.tBodies[0].rows[0].cells[SORT_INDEX]);
	var objSpan=$T('span',objThis)[0];
	var arrRows=new Array();
	var strDefaultSort = '';

	if(strFirstValue.match(/^\d{1,2}(\-|\/|\.)\d{1,2}(\-|\/|\.)\d{4}$/)) { fn=sortDate; strDefaultSort = 'A'; }
	else if(strFirstValue.match(/^[\d\.\,\-]+$/)) { fn=sortNumeric; strDefaultSort = 'D'; }
	else if(strFirstValue.match(/\d%$/)) { fn=sortNumeric; strDefaultSort = 'D'; }
	else if(strFirstValue.match(/\d{1,}\smins$/)) { fn=sortHoursMins; strDefaultSort = 'D'; }
	else if(strFirstValue.match(/[£$]/)) { fn=sortCurrency; strDefaultSort = 'D'; }
	else { fn=sortLower; strDefaultSort = 'A'; }
	if (arguments[2]) { strDefaultSort = arguments[2] }


	for(i=0; i<objTable.tBodies[0].rows.length; i++) { arrRows[i]=objTable.tBodies[0].rows[i]; } arrRows.sort(fn);

	if (strDefaultSort == 'A') {
		if(objSpan.innerHTML.indexOf('sortasc')==-1) { objSpan.innerHTML=strAsc; } else { arrRows.reverse(); objSpan.innerHTML=strDesc; }
	}
	else {
		if(objSpan.innerHTML.indexOf('sortdesc')==-1) { arrRows.reverse(); objSpan.innerHTML=strDesc; } else { objSpan.innerHTML=strAsc; }
	}

	if($E('prevTH') && $E('prevTH') != objSpan) { $E('prevTH').innerHTML='&nbsp;'; } iSW('prevTH',objSpan);

	for(i=0; i<arrRows.length; i++) {
		objTable.tBodies[0].appendChild(arrRows[i]);
	}

	var j = 1
	for(i=0; i<arrRows.length; i++) {
		objTable.tBodies[0].rows[i].className = 'reportrow' + j.toString();
		j = j % 2 + 1
	}

}

function sortCurrency(a,b) { a=z(a); b=z(b);

    function z(v) {
    	var blnNeg = false
    	v = grabText(v.cells[SORT_INDEX]);
    	if (v.indexOf('(') > -1) { blnNeg = true }
    	if (v.indexOf('-') > -1) { blnNeg = true }
    	v = v.replace(/[^0-9.]/g,'');
    	if (blnNeg) { return -1 * parseFloat(v); }
    	else { return parseFloat(v); }
    }

    return((isNaN(a)?0:a)-(isNaN(b)?0:b));
}

function sortDate(a,b) { a=z(a); b=z(b);

    function z(v) {
    	v=grabText(v.cells[SORT_INDEX]);
    	switch(true) {
    		case v.indexOf('.') > -1: var arr = v.split('.'); break;
    		case v.indexOf('-') > -1: var arr = v.split('-'); break;
    		default: var arr = v.split('/');
    	}
    	if (arr.length > 0) { return arr[2]+(arr[0].length==2?arr[0]:'0'+arr[0])+(arr[0].length==2?arr[1]:'0'+arr[1]); }
    	else { return v; }
    }

    return((a==b?0:(a<b?-1:1)));

}

function sortNumeric(a,b) { a=z(a); b=z(b);

	function z(v) {
		var blnNeg = false
		v = grabText(v.cells[SORT_INDEX])
    	if (v.indexOf('(') > -1) { blnNeg = true }
    	if (v.indexOf('-') > -1) { blnNeg = true }
    	v = v.replace(/[^0-9.]/g,'');
    	if (blnNeg) { return -1 * parseFloat(v); }
    	else { return parseFloat(v); }
	}

	return((isNaN(a)?0:a)-(isNaN(b)?0:b));

}

function sortHoursMins(a,b) { a=z(a); b=z(b);

    function z(v) {
    	v=grabText(v.cells[SORT_INDEX]).replace('mins','').replace('hrs', '');
    	arr = v.split(',');
    	switch(arr.length) {
    		case 1: return parseFloat(arr[1]); break;
    		case 2: return parseFloat(arr[0]) * 60 + parseFloat(arr[1]); break;
    		case 3: return parseFloat(arr[0]) * 3600 + parseFloat(arr[1]) * 60 + parseFloat(arr[2]);
    	}
    }

    return((isNaN(a)?0:a)-(isNaN(b)?0:b));

}

function sortLower(a,b) {
	x=a;
	y=b;
	a=z(a);
	b=z(b);

	function z(v) { return(grabText(v.cells[SORT_INDEX]).toLowerCase()); }

	//Sometimes IE needs a little more time to get the value - give it another chance
	if (!a){
		a = z(x);
	}
	if (!b){
		b = z(y);
	}

	//If you still can't get the value - initialize it to prevent IE JavaScript Errors
	if (!a){
		a = "";
	}
	if (!b){
		b = "";
	}

	return((a==b)?0:((a<b)?-1:1));

}

function getParent(obj,strTag) {

    if(obj==null) return null;
    else if(obj.nodeType==1 && obj.tagName.toLowerCase()==strTag.toLowerCase()) return(obj);
    else return(getParent(obj.parentNode,strTag));

}
