// 
// author: Johan Stolk http://www.techcodediver.nl 
//  (sort functionality based on code by unknown author)
// created: 08-08-2007
// 12-08-2007	added optional use_arrows to fix table alignment problems in IE
//
var SORT_COLUMN_INDEX;
		
function jdatagrid_makeSortable(table_id, header_row_index, use_arrows) 
{
	if (typeof use_arrows == "undefined")
		use_arrows = true;
		
	var table = document.getElementById(table_id);	
	if (table && table.rows && table.rows.length > 1) 
	{
		var header_row = table.rows[header_row_index];
		// the header, make its contents clickable links
		for (var i = 0; i < header_row.cells.length; i++) 
		{
			var cell = header_row.cells[i];
			var text = jdatagrid_getInnerTextSkip(cell, 'span').trim();
      if (text.length > 0)
      {
  			if (use_arrows)
  				cell.innerHTML = '<span class="jdatagrid_sort_span" onclick="jdatagrid_resortTable(this, ' + header_row_index + ');return false;">' + 
  												text +
  												'<span class="sortarrow">&nbsp;&nbsp;</span></span>';
  			else
  				cell.innerHTML = '<span class="jdatagrid_sort_span" onclick="jdatagrid_resortTable(this, ' + header_row_index + ');return false;">' + 
  												text +
  												'</span>';
      }
		}
	}
}

function jdatagrid_getInnerText(el) 
{
	if (typeof el == "string" || typeof el == "undefined") 
		return el;
		
	if (el.innerText) 
		return el.innerText;
		
	var str = "";	
	var cs = el.childNodes;
	for (var i = 0; i < cs.length; i++) 
	{
		switch (cs[i].nodeType)
		{
			case 1: //ELEMENT_NODE
				str += jdatagrid_getInnerText(cs[i]);
				break;
			case 3:	//TEXT_NODE
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
}

function jdatagrid_getInnerTextSkip(el, el_name_to_skip) 
{
	if (typeof el == "string" || typeof el == "undefined") 
		return el;
		
	var str = "";	
	var cs = el.childNodes;
	for (var i = 0; i < cs.length; i++) 
	{
		if (cs[i].tagName && cs[i].tagName.toLowerCase() == el_name_to_skip)
			continue;
			
		switch (cs[i].nodeType)
		{
			case 1: //ELEMENT_NODE
				str += jdatagrid_getInnerTextSkip(cs[i], el_name_to_skip);
				break;
			case 3:	//TEXT_NODE
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
}

function jdatagrid_getSpan(jdatagrid_href_header_href) 
{
	for (var i = 0; i < jdatagrid_href_header_href.childNodes.length; i++) 
	{
		if (jdatagrid_href_header_href.childNodes[i].tagName && 
				jdatagrid_href_header_href.childNodes[i].tagName.toLowerCase() == 'span')
		 return jdatagrid_href_header_href.childNodes[i];
	}
	return null;
}

function jdatagrid_resortTable(jdatagrid_href_header_href, header_row_index) 
{
	var td = jdatagrid_href_header_href.parentNode;
	var table = jdatagrid_getParent(td, 'table');    
	if (table.rows.length <= 1)
		return;
	
	SORT_COLUMN_INDEX = td.cellIndex;
		
	var start_row_index = header_row_index + 1;  
  
  // skip search boxes if present				
  
  var searchboxes_row_id = table.getAttribute("id") + "_searchboxes";
  var searchboxes_row = document.getElementById(searchboxes_row_id);
  if (searchboxes_row)
    start_row_index++;
    
	var top_item_text = jdatagrid_getInnerText(table.rows[start_row_index].cells[SORT_COLUMN_INDEX]).trim();
	
	// Work out a type for the column
	sortfn = jdatagrid_sort_caseinsensitive;
	if (top_item_text.match(/^\d\d[\/-]\d\d[\/-]\d\d\d\d$/)) 
    sortfn = jdatagrid_sort_date;
	if (top_item_text.match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) 
    sortfn = jdatagrid_sort_date;
	if (top_item_text.match(/^-?[\d\.]+$/)) 
    sortfn = jdatagrid_sort_numeric;
	if (top_item_text.match(/^[0-9.,]*\s*[£$€]\s*[0-9.,]*$/)) // Johan Stolk 060907: note save this file as utf8 encoded and include charset="utf-8" in the script tag for the euro sign to come accross!
    sortfn = jdatagrid_sort_currency;
	if (top_item_text.match(/^[0-9.,]*\s*&euro;\s*[0-9.,]*$/)) 
    sortfn = jdatagrid_sort_currency;
  if (top_item_text.match(/^[0-9]+\.[0-9]+\.[0-9]+$/)) // bubs article nrs
    sortfn = jdatagrid_sort_caseinsensitive;
    
	var newRows = new Array();
	for (j = start_row_index; j < table.rows.length; j++) 
		newRows[j - start_row_index] = table.rows[j];

	newRows.sort(sortfn);

	if (jdatagrid_href_header_href.getAttribute("sortdir") == 'down')
	{
		arrow = '&nbsp;&uarr;';
		newRows.reverse();
		jdatagrid_href_header_href.setAttribute('sortdir', 'up');
	} 
	else 
	{
		arrow = '&nbsp;&darr;';
		jdatagrid_href_header_href.setAttribute('sortdir', 'down');
	}
	
	// appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
	// don't do sortbottom rows
	for (i = 0; i < newRows.length; i++) 
	{ 
		if (!newRows[i].className || 
			 (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) 
			table.tBodies[0].appendChild(newRows[i]);
	}
			
	// do sortbottom rows only
	for (i = 0; i < newRows.length; i++) 
	{ 
		if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) 
			table.tBodies[0].appendChild(newRows[i]);
	}
	
	// Delete any other arrows there may be showing
	var allspans = document.getElementsByTagName("span");
	for (var ci=0;ci<allspans.length;ci++) 
	{
		if (allspans[ci].className == 'sortarrow')
		{
			if (jdatagrid_getParent(allspans[ci],"table") == jdatagrid_getParent(jdatagrid_href_header_href,"table")) // in the same table as us?
				allspans[ci].innerHTML = '&nbsp;&nbsp;';					
		}
	}
	// get the span
	var span = jdatagrid_getSpan(jdatagrid_href_header_href);
	if (span != null)
		span.innerHTML = arrow;
}

function jdatagrid_getParent(el, pTagName)
{
	if (el == null) 
		return null;
		
	if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
		return el;
	
	return jdatagrid_getParent(el.parentNode, pTagName);
}

function jdatagrid_sort_date(a,b)
{
  aa = jdatagrid_getInnerText(a.cells[SORT_COLUMN_INDEX]);
  bb = jdatagrid_getInnerText(b.cells[SORT_COLUMN_INDEX]);
  var aa_parts = aa.split("-");
  var bb_parts = bb.split("-");
  var aa_year = aa_parts[2];
  var bb_year = bb_parts[2];
  if (aa_year > bb_year)
    return 1;
  if (aa_year < bb_year)
    return -1;
  var aa_month = aa_parts[1];
  var bb_month = bb_parts[1];
  if (aa_month > bb_month)
    return 1;
  if (aa_month < bb_month)
    return -1;
  var aa_day = aa_parts[0];
  var bb_day = bb_parts[0];
  if (aa_day > bb_day)
    return 1;
  if (aa_day < bb_day)
    return -1;
  return 0;
}

function jdatagrid_sort_currency(a,b) 
{ 
  aa = jdatagrid_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9,]/g,'').replace(',','.');
  bb = jdatagrid_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9,]/g,'').replace(',','.');
  return parseFloat(aa) - parseFloat(bb);
}

function jdatagrid_sort_numeric(a,b) 
{ 
    aa = parseFloat(jdatagrid_getInnerText(a.cells[SORT_COLUMN_INDEX]));
    if (isNaN(aa)) aa = 0;
    bb = parseFloat(jdatagrid_getInnerText(b.cells[SORT_COLUMN_INDEX])); 
    if (isNaN(bb)) bb = 0;
    return aa-bb;
}

function jdatagrid_sort_caseinsensitive(a,b) 
{
    aa = jdatagrid_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
    bb = jdatagrid_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
    if (aa==bb) return 0;
    if (aa<bb) return -1;
    return 1;
}

function jdatagrid_sort_default(a,b)
{
    aa = jdatagrid_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = jdatagrid_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    if (aa==bb) return 0;
    if (aa<bb) return -1;
    return 1;
}

function jdatagrid_add_searchboxes(table_id, header_row_index, cut_off_count)
{
	var table = document.getElementById(table_id);
	if (table && table.rows && table.rows.length > 1) 
	{
		var header_row = table.rows[header_row_index];
		var searchboxes_row = table.insertRow(header_row_index + 1);
    searchboxes_row.setAttribute("id", table_id + "_searchboxes");
		var start_row_index = header_row_index + 2; // after header & boxes
		for (var i = 0; i < header_row.cells.length - cut_off_count; i++) 
		{
			var searchbox_cell = searchboxes_row.insertCell(i);
     // if (i == (header_row.cells.length - 2))
     //   searchbox_cell.colSpan = 2;
			searchbox_cell.className = "jdatagrid_search_box_cell";
      
			var searchbox_input = document.createElement("input");		
			searchbox_input.setAttribute("id", "flt" + i + "-" + table_id + "-" + start_row_index);
			searchbox_input.setAttribute("type", "text");
			searchbox_input.className = "jdatagrid_search_box";
			searchbox_input.onkeypress = jdatagrid_detect_enter;
			searchbox_cell.appendChild(searchbox_input);		
		}
	}
}

function jdatagrid_add_search_button(table_id, title, click, src)
{
  searchbox_row_id = table_id + "_searchboxes";
	var searchboxes_row = document.getElementById(searchbox_row_id);
	if (searchboxes_row) 
	{
    var search_button_cell = searchboxes_row.insertCell(searchboxes_row.cells.length);
    search_button_cell.className = "jdatagrid_search_box_button";
    var img = document.createElement("img");
    img.setAttribute("src", src);
    img.setAttribute("onclick", click);
    img.setAttribute("title", title);
    search_button_cell.appendChild(img);
  }
}

function jdatagrid_search(table_id, start_row_index, cut_off_count)
{    
  // if there's no searchboxes_row yet, add it
  var searchboxes_row_id = table_id + "_searchboxes";
  var searchboxes_row = document.getElementById(searchboxes_row_id);
  if (!searchboxes_row)
  {
    jdatagrid_add_searchboxes(table_id, start_row_index - 1, cut_off_count);
    return;
  }
  // now search the rows, retrieve the actual start_row_index from the inputs id (set in jdatagrid_add_searchboxes)
	var table = document.getElementById(table_id);    
  var inputs = searchboxes_row.getElementsByTagName("input");	
  var input1 = inputs[0];
  var parts = input1.getAttribute("id").split("-");
	start_row_index = parts[2];
  
	var search_text_array = new Array();
	for (var c = 0; c < inputs.length; c++) 
	{		
		search_text_array.push(inputs[c].value.toLowerCase());		
	}
	
	for (var r = start_row_index; r < table.rows.length; r++) 
	{
		table.rows[r].style.display = ""; // default visible
		for (var c = 0; c < search_text_array.length; c++) 
		{	
			var search_text = search_text_array[c];		
			if (search_text != "")
			{
				var item_text = jdatagrid_getInnerText(table.rows[r].cells[c]).toLowerCase();
				if (item_text.indexOf(search_text) < 0)
				{
					table.rows[r].style.display = "none"; // make invisible
					break;
				}
			}
		}
	}
}

function jdatagrid_detect_enter(e)
{
	var event = (e ? e : window.event);
	if (event)
	{
		var key = (event.charCode ? event.charCode : (event.keyCode ? event.keyCode : event.which));
		if (key == 13)
		{
			var parts = this.getAttribute("id").split("-");
			var table_id = parts[1];
			var start_row_index = parts[2];
			jdatagrid_search(table_id, start_row_index);
		}
	}	
}
