/*
   Depends on Prototype, rock.js, rock-util.js
 */
 
// define the namespace
rock.namespace("rock.ui");

/*================================================
   Class SortableTable
 =================================================*/
rock.ui.SortableTable = function(){
	/* Change these values */
	var image_path = "images/";
	var image_up = "sort_up.gif";
	var image_down = "sort_down.gif";	
	
	var SORT_COLUMN_INDEX;
	
	this.init = function() {	
		// Find all tables with class sortable and header and make them sortable    	
		var headerTbls = $$('table.sortableHeader');	
		
		for (var ti=0; ti<headerTbls.length; ti++) {
			makeSortable(headerTbls[ti]);
		}
	}
	
	function makeSortable(headerTable) {
		if (headerTable.rows && headerTable.rows.length > 0) {
			var firstRow = headerTable.rows[0];
		}
		if (!firstRow) return;
		
		// We have a first row: assume it's the header, and make its 
		// contents clickable links
		for (var i=0; i<firstRow.cells.length; i++) {
			var cell = firstRow.cells[i];
			var txt = rock.util.DomUtil.getInnerText(cell);
			if (!Element.hasClassName(cell, 'unsortable')) {
				// make the column sortable
				cell.innerHTML = '<a href="#" class="sortheader" ' + 
					'onclick="rock_sortableTable.sort(this);return false;">'+
					txt + ' <span class="sortarrow"><img src="'+ image_path + 
					image_down + '" alt="&darr;"/></span></a>';
			}
		}
		
		var bodyTable = findBodyTable(headerTable);
		rock.util.DomUtil.alternateTableRows(bodyTable);
	}	
	
	function findBodyTable(headerTable){		
		return rock.util.DomUtil.findNextSibling(headerTable, 'table');
	}
	
	this.sort = function(lnk) {
		// get the span
		var span;
		for (var ci=0;ci<lnk.childNodes.length;ci++) {
			if(lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span'){
			 	span = lnk.childNodes[ci];
			 }
		}
		var spantext = rock.util.DomUtil.getInnerText(span);
		var td = lnk.parentNode;
		
		// get column index
		var column = td.cellIndex;
		
		// get header table
		var headerTable = rock.util.DomUtil.getParent(td, 'TABLE');
		
		// find body table
		var table = findBodyTable(headerTable);
		
		if (table.rows.length <= 0) return;
		
		// Work out a type for the column		
		var itm = rock.util.DomUtil.getInnerText(table.rows[0].cells[column]);
		sortfn = sort_caseinsensitive;
		if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d\d\d$/)) sortfn = sort_date;
		if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) sortfn = sort_date;
		if (itm.match(/^[£$€]/)) sortfn = sort_currency;
		if (itm.match(/^[\d\.]+$/)) sortfn = sort_numeric;
		SORT_COLUMN_INDEX = column;
		var newRows = new Array();
		for (j=0;j<table.rows.length;j++) { 
			newRows[j] = table.rows[j];
		}
	
		// sort new rows
		newRows.sort(sortfn);
	
		if (span.getAttribute("sortdir") == 'down') {
			ARROW = '<img src="'+ image_path + image_up + '" alt="&uarr;"/>';
			// reverse sorting
			newRows.reverse();
			span.setAttribute('sortdir','up');
		} else {
			ARROW = '<img src="'+ image_path + image_down + '" alt="&darr;"/>';
			span.setAttribute('sortdir','down');
		} 
				
	    // We appendChild rows that already exist to the tbody, 
	    // so it moves them rather than creating new ones
	    // don't do sortbottom rows
	    var sortbottomRows = [];
	    for (i=0; i<newRows.length; i++) { 
			if(!Element.hasClassName(newRows[i], 'sortbottom')){
				// this actually does the row moving
				table.tBodies[0].appendChild(newRows[i]);
			}else{
				sortbottomRows.push(newRows[i]);
			}
		}		
		
	    // do sortbottom rows only
	    for (i=0; i<sortbottomRows.length; i++) {
			table.tBodies[0].appendChild(sortbottomRows[i]);
		}	    										
		    
		// update header
		span.innerHTML = ARROW;
		
		rock.util.DomUtil.alternateTableRows(table);		
	}
		
	function sort_date(rowA, rowB) {
		var valueA = rock.util.DomUtil.getInnerText(rowA.cells[SORT_COLUMN_INDEX]);
		var valueB = rock.util.DomUtil.getInnerText(rowB.cells[SORT_COLUMN_INDEX]);
		return rock.util.SortUtil.sortDate(valueA, valueB);
	}
	
	function sort_currency(rowA, rowB) {
		var valueA = rock.util.DomUtil.getInnerText(rowA.cells[SORT_COLUMN_INDEX]);
		var valueB = rock.util.DomUtil.getInnerText(rowB.cells[SORT_COLUMN_INDEX]);
		return rock.util.SortUtil.sortCurrency(valueA, valueB);
	}
	
	function sort_numeric(rowA, rowB) { 
		var valueA = rock.util.DomUtil.getInnerText(rowA.cells[SORT_COLUMN_INDEX]);
		var valueB = rock.util.DomUtil.getInnerText(rowB.cells[SORT_COLUMN_INDEX]);
		return rock.util.SortUtil.sortNumeric(valueA, valueB);
	}
	
	function sort_caseinsensitive(rowA, rowB) {
		var valueA = rock.util.DomUtil.getInnerText(rowA.cells[SORT_COLUMN_INDEX]);
		var valueB = rock.util.DomUtil.getInnerText(rowB.cells[SORT_COLUMN_INDEX]);
		return rock.util.SortUtil.sortIgnoreCase(valueA, valueB);
	}
	
	function sort_default(rowA, rowB) {
		var valueA = rock.util.DomUtil.getInnerText(rowA.cells[SORT_COLUMN_INDEX]);
		var valueB = rock.util.DomUtil.getInnerText(rowB.cells[SORT_COLUMN_INDEX]);
		return rock.util.SortUtil.sortDefault(valueA, valueB);
	}		

}

// create object rock_sortableTable if not exist
if (!rock_sortableTable) {
    var rock_sortableTable = new rock.ui.SortableTable();
}


