/**

Description:
	PINT grid control object.

Dependencies:
	Inward:
		none

	Outward:
		none

Usage:
	used to organize data in sortable rows

Comments:
    B. Wetter 02/07/2006 -
    This code is needs a lot of work and is missing a lot of functionlity.  Below are a few of the changes/improvements that are needed.
        - change layout from a table to sized div elements
        - make columns resizable
        - results need pagination
        - set body as the default 'container' object
*/
var gColumnSortIndex = 1;
function PINT_GridControl(objectName) {
    this.gridOrderBy = 0;
    this.name = objectName;
    this.gridColumns = new Array();
    this.gridData = new Array();
    this.evenRowClassname = "even";
    this.oddRowClassname = "odd";
    this.rolloverClassname = "gridRowRollover";
    this.emptyCellValue="--";
    this.charterValueSort = 'asc';
    this.cityValueSort = 'asc';
    this.stateValueSort = 'asc';
}

PINT_GridControl.prototype.drawGrid = function() {
    gridArray = new Array();
    gridArray.push('<table cellpadding="0" cellspacing="0" class="inventory_results">');
    gridArray.push(this.gridColumnHeaders());

    var rowClass = this.oddRowClassname;
    // loop through data and create rows
    for(var i=0; i < this.gridData.length; i++) {
        gridArray.push(this.gridResultRow(this.gridData[i], rowClass));
        if (rowClass == this.evenRowClassname)rowClass = this.oddRowClassname;
        else rowClass = this.evenRowClassname;
    }
    gridArray.push('</table>');
    // write our grid to the page

    this.gridContainer.innerHTML = gridArray.join(" ");
}

PINT_GridControl.prototype.gridResultRow = function(rowData, className) {
    if (!className) className = this.oddRowClassname;
    // we assume the last item in the rowData is the link for the row
    var rowStr = "<tr class=\"" + className + "\" onmouseover=\"this.className += ' " + this.rolloverClassname + "';\" onmouseout=\"this.className = this.className.replace(' " + this.rolloverClassname + "', '');\" onclick=\"document.location.href = '" + rowData[rowData.length-1] + "';\">";
    // rowData should be in the same order as the columns and use gridColumn structure for the count since the rowData has extra indexes that should not be displayed
    for(var c=0; c < this.gridColumns.length; c++) {
        if (c == 4) rowStr += "<td class=\"fr_number\">";
        else rowStr += "<td>";
        rowStr += (rowData[c]) ? rowData[c]:this.emptyCellValue;
        rowStr += "</td>";
    }
    rowStr +="</tr>";
    return rowStr;
}

PINT_GridControl.prototype.gridColumnHeaders = function() {
    var headerRow = "<tr>";
    for (var i =0; i < this.gridColumns.length; i++) {
        if (i == 4) headerRow += "<th class=\"fr_number\">";
        else headerRow += "<th>";
        headerRow += "<a href=\"#\" onclick=\"" + this.name + ".sortGrid(" + i + "); return false;\";>" + this.gridColumns[i] + "</a></th>";
    }
    headerRow += "</tr>";
    return headerRow;
}

PINT_GridControl.prototype.sortGrid = function(orderBy) {
    if (orderBy == this.gridOrderBy) {
      if (orderBy == 5) {
			if (this.charterValueSort == 'asc') {
				this.gridData.sort(PINT_NumericSort);
				this.charterValueSort = 'dsc';
			}else {
				this.gridData.sort(PINT_NumericSortWithEmptyValue).reverse();
				this.charterValueSort = 'asc';
			}
        }
      else if (orderBy == 6 ) {
			if (this.cityValueSort == 'asc') {
				this.gridData.sort(PINT_defaultAlphaSort).reverse();
				this.cityValueSort = 'dsc';
			}else {
				this.gridData.sort(PINT_AlphaSort);
				this.cityValueSort = 'asc';
			}
	  }
	  else if (orderBy == 7) {
			if (this.stateValueSort == 'asc') {
				this.gridData.sort(PINT_defaultAlphaSort).reverse();
				this.stateValueSort = 'dsc';
			}else {
				this.gridData.sort(PINT_AlphaSort);
				this.stateValueSort = 'asc';
			}

      }
	  else this.gridData.reverse();
	}
    else {
        gColumnSortIndex = orderBy;
        this.gridOrderBy = orderBy;
       /* if (isNaN(parseFloat(this.gridData[0][orderBy], 10))) this.gridData.sort(PINT_AlphaSortByGlobalOrderBy);
        else this.gridData.sort(PINT_NumericSortByGlobalOrderBy);*/
        var sortFunction = PINT_AlphaSort;
		if (orderBy == 4) this.gridData.sort(PINT_FrNumberSort);
		else if (orderBy == 9) this.gridData.sort(PINT_gradeSort);
		else if (this.gridData[0][orderBy].match(/^\d\d[\/-]\d\d[\/-]\d\d\d\d$/)) this.gridData.sort(PINT_DateSort);
		else if (this.gridData[0][orderBy].match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) this.gridData.sort(PINT_DateSort);
		else if (this.gridData[0][orderBy].match(/^[£$]/)) this.gridData.sort(PINT_CurrencySort);
		else if (this.gridData[0][orderBy].match(/^[\d\.]+$/) || orderBy == 5) this.gridData.sort(PINT_NumericSort);
		else this.gridData.sort(PINT_AlphaSort);
    }
    this.drawGrid();
}

// Sorting functions
function PINT_AlphaSort(a,b){
    var aa = (a[gColumnSortIndex] == "") ? 'zzz' : a[gColumnSortIndex];
    var bb = (b[gColumnSortIndex] == "") ? 'zzz' : b[gColumnSortIndex];

    return aa > bb ? 1 : aa < bb ? -1 : 0;
}

function PINT_defaultAlphaSort(a,b){
    return a[gColumnSortIndex] > b[gColumnSortIndex] ? 1 : a[gColumnSortIndex] < b[gColumnSortIndex] ? -1 : 0;
}

function PINT_NumericSort(a,b){
    var aa = parseFloat(a[gColumnSortIndex]);
    var bb = parseFloat(b[gColumnSortIndex]);

    // if for some reason one of the entries is not a number set value to 99999 so that they get displayed last
    if (isNaN(aa)) aa = 99999;
    if (isNaN(bb)) bb = 99999;

    return aa-bb;
}

function PINT_NumericSortWithEmptyValue(a,b){
    var aa = parseFloat(a[gColumnSortIndex]);
    var bb = parseFloat(b[gColumnSortIndex]);

    // if for some reason one of the entries is not a number set value to 0 so that they get displayed last
    if (isNaN(aa)) aa = 0;
    if (isNaN(bb)) bb = 0;

    return aa-bb;
}

function PINT_gradeSort(a, b) {

	var aa = a[gColumnSortIndex];
        var bb = b[gColumnSortIndex];

	var gradeValue = new Object();

	gradeValue['Fair'] = 0.5;
	gradeValue['Good'] = 1.0;
	gradeValue['Good+'] = 1.3;
	gradeValue['G-VG'] = 1.5;
	gradeValue['VG'] = 2.0;
	gradeValue['VG+'] = 2.3;
	gradeValue['VG-F'] = 2.5;
	gradeValue['Fine'] = 3.0;
	gradeValue['Fine+'] = 3.3;
	gradeValue['F-VF'] = 3.5;
	gradeValue['VF'] = 4.0;
	gradeValue['VF+'] = 4.3;
	gradeValue['VF-XF'] = 4.5;
	gradeValue['XF'] = 5.0;
	gradeValue['XF+'] = 5.3;
	gradeValue['XF-AU'] = 5.5;
	gradeValue['AU'] = 6.0;
	gradeValue['AU+'] = 6.3;
	gradeValue['AU-CU'] = 6.5;
	gradeValue['CU'] = 6.9;
	gradeValue['CU,Unc'] = 7.0;
	gradeValue['CU+'] = 7.3;
	gradeValue['CU-ChCU'] = 7.5;
	gradeValue['ChCU'] = 8.0;
	gradeValue['Ch CU'] = 8.1;
	gradeValue['ChCU+'] = 8.3;
	gradeValue['ChCU-VChCu'] = 8.5;
	gradeValue['VChCu'] = 9.0;
	gradeValue['VChCu+'] = 9.3;
	gradeValue['VChCu-Gem'] = 9.5;
	gradeValue['Gem CU'] = 10.0;

	if (!gradeValue[aa]) gradeValue[aa] = 0;
	if (!gradeValue[bb]) gradeValue[bb] = 0;

	return gradeValue[aa]-gradeValue[bb];
}


function PINT_FrNumberSort(a, b) {
	var frNumber = new Object();

	frNumber['a'] = new Array();
	frNumber['a'][0] = new Array();
    frNumber['a'][0] = a[gColumnSortIndex].split("");
	frNumber['a'][1] = ''; // numeric part
	frNumber['a'][2] = ''; // alpha part

	frNumber['b'] = new Array();
    frNumber['b'][0] = new Array();
	frNumber['b'][0] = b[gColumnSortIndex].split("");
	frNumber['b'][1] = '';
	frNumber['b'][2] = '';

	for(var element in frNumber) {
		// splitting numeric and alpha part
		var hasAlpha = false;
		for(var i=0; i < frNumber[element][0].length; i++) {
			var curr = frNumber[element][0][i];
			if (hasAlpha || isNaN(curr)) {
				frNumber[element][2] += curr;
				hasAlpha = true;
			}
			else { frNumber[element][1] += frNumber[element][0][i]; }
		}
		frNumber[element][1] = parseInt(frNumber[element][1]) + getAlphaValue(frNumber[element][2]);
	}

	return frNumber['a'][1] - frNumber['b'][1];

}

function getAlphaValue(alphaPart) {
	var alphaValue = 0;
	for(var i=0; i < alphaPart.length; i++) {
		alphaValue += parseFloat(alphaPart.charCodeAt(i)) * (Math.pow(0.01, (i+1)));
	}
	return alphaValue;
}

function PINT_CurrencySort(a,b) {
    aa = a[gColumnSortIndex].replace(/[^0-9.]/g,'');
    bb = b[gColumnSortIndex].replace(/[^0-9.]/g,'');
    return parseFloat(aa)-parseFloat(bb);
}


function PINT_DateSort(a,b) {
    // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
    var aa = (a[gColumnSortIndex] == "") ? '00/00/00' : a[gColumnSortIndex];
    var bb = (b[gColumnSortIndex] == "") ? '00/00/00' : b[gColumnSortIndex];
    if (aa.length == 10) {
        dt1 = aa.substr(6,4)+aa.substr(0,2)+aa.substr(3,2);
    } else {
        yr = aa.substr(6,2);
        if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
        dt1 = yr+aa.substr(0,2)+aa.substr(3,2);
    }
    if (bb.length == 10) {
        dt2 = bb.substr(6,4)+bb.substr(0,2)+bb.substr(3,2);
    } else {
        yr = bb.substr(6,2);
        if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
        dt2 = yr+bb.substr(0,2)+bb.substr(3,2);
    }
    if (dt1==dt2) return 0;
    if (dt1<dt2) return -1;
    return 1;
}

