var doHighlight =null;
var strHighlightedBG = "#ffffcc";
var strHighlightedText = "#000000";
var orgBColor = "#ffffff";
var orgTColor = "#000000";
var objRowClicked;
 
var SORT_COLUMN_INDEX;
var preEl1, preEl2;
var orgBColor1, orgBColor2;
var orgTColor1, orgTColor2;
var selected1, selected2;

 
/***************************************************************
* Returns the innerText value of the specified element
****************************************************************/
function rah_getInnerText(el) {
    if (typeof el == "string") return el;
    if (typeof el == "undefined") { return el };
    if (el.innerText) return el.innerText;  //Not needed but it is faster
    var str = "";
    
    var cs = el.childNodes;
    var l = cs.length;
    for (var i = 0; i < l; i++) {
        switch (cs[i].nodeType) {
            case 1: //ELEMENT_NODE
                str += rah_getInnerText(cs[i]);
                break;
            case 3: //TEXT_NODE
                str += cs[i].nodeValue;
                break;
        }
    }
    return str;
}
 
/***************************************************************
* Returns the innerHTML of an image node in a cell
****************************************************************/
function rah_getCellImage(el) {
 
    
    if (typeof el == "string") return el;
    if (typeof el == "undefined") { return el };
 
    var imageHTML = "";
    var tagName = "";
    
    var cs = el.childNodes;
    var l = cs.length;
 
    for (var i = 0; i < l; i++) {
        switch (cs[i].nodeType) {
            case 1: //ELEMENT_NODE
                tagName = cs[i].tagName.toUpperCase();
                if (tagName == "IMG"){
                    imageHTML = cs[i].outerHTML;
                }
                break;
            case 3: //TEXT_NODE
                break;              
        }
    }
    return imageHTML;
}
 
 
 
/***************************************************************
* Resorts the column that was clicked 
****************************************************************/
function rah_resortTable(lnk,tableId,sortType) {
    // get the span
    var span;
    var td = lnk.parentNode;
    
    for (var ci=0;ci<td.childNodes.length;ci++) {
        if (td.childNodes[ci].tagName && td.childNodes[ci].tagName.toLowerCase() == 'span') span = td.childNodes[ci];
    }

    var spantext = rah_getInnerText(span);
    var td = lnk.parentNode;
    var column = td.cellIndex;
    //var table = document.getElementById(tableId.id);       
    var table = document.getElementById(tableId);
    
    // Work out a type for the column
    if (table.rows.length <= 1) return;
    
    var cellObj = table.rows[0].cells[column];

	if (sortType == null) sortType = '';

    switch(sortType)
    {
    	case 'radio':
		case 'checkbox':
			sortfn = rah_sort_checkbox;
    		break;
		case 'select-one':
			sortfn = rah_sort_value;
			break;
		case 'select-one-text':
			sortfn = rah_sort_value_text;
			break;
		case 'date':
			sortfn = rah_sort_date;
			break;
		case 'currency':
			sortfn = rah_sort_currency;
			break;
		case 'numeric':
			sortfn = rah_sort_numeric;
			break;
		case 'input':
			sortfn = rah_sort_input;
			break;
   		default:
			sortfn = rah_sort_caseinsensitive;
    }

    SORT_COLUMN_INDEX = column;
    var firstRow = new Array();
    var newRows = new Array();
    for (j=0;j<table.rows.length;j++) { newRows[j] = table.rows[j]; }
 
	var salida = "";
	 for (i=0;i<newRows.length;i++)
    { salida = salida + rah_getInnerText(newRows[i].cells[SORT_COLUMN_INDEX]).replace(/\-[^0-9.]/g,'') + "\n";
	}
	//alert(salida);
    newRows.sort(sortfn);
 
    if (span.getAttribute("sortdir") == 'down') {
    	if (span.className == 'noarrow') {
    		ARROW='&nbsp;';
    	} else {
        	ARROW = '<img src="images/icons/down.gif" border="0" align=absbottom>';
        	//ARROW = '&nbsp;&uarr;';
        }
        newRows.reverse();
        span.setAttribute('sortdir','up');
    } else {
    	if (span.className == 'noarrow') {
        	//ARROW = '&nbsp;&darr;';
	        ARROW = '&nbsp;';    	
    	} else {
    	    //ARROW = '&nbsp;&darr;';
        	ARROW = '<img src="images/icons/up.gif" border="0" align=absbottom>';
        }
        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
    for (i=0;i<newRows.length;i++)
    {
    	if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1)))
    	{
    		var preCheckArr = getPreChecks(newRows[i]);
    		table.tBodies[0].appendChild(newRows[i]);
    		updateChecks(preCheckArr, newRows[i]);
    	}
    }

    // do sortbottom rows only
    for (i=0;i<newRows.length;i++)
    {
    	if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1))
    	{
    		var preCheckArr = getPreChecks(newRows[i]);
    		table.tBodies[0].appendChild(newRows[i]);
    		updateChecks(preCheckArr, 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 (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?
                allspans[ci].innerHTML = '';
            }
        }
    }
        
    span.innerHTML = ARROW;
}

function getPreChecks(tr)
{
	var td = tr.getElementsByTagName("td");
	var i;

	if (!td) return;
	
	var ret_arr = new Array();

	for (i = 0; i < td.item.length; i++)
	{
		if (td.item(i) && td.item(i).childNodes.item.length > 0)
		{
			var tmp = td.item(i).childNodes.item(0);
			if (tmp.type == 'radio' || tmp.type == 'checkbox')
			{
				ret_arr[i] = tmp.checked;
			}
		}
	}

	return ret_arr;
}

function updateChecks(arr, tr)
{
	var td = tr.getElementsByTagName("td");
	var i;

	if (!td) return;

	for (i = 0; i < td.item.length; i++)
	{
		if (td.item(i) && td.item(i).childNodes.item.length > 0)
		{
			var tmp = td.item(i).childNodes.item(0);
			if (tmp.type == 'radio' || tmp.type == 'checkbox')
			{
				tmp.checked = arr[i];
			}
		}
	}
}

/***************************************************************
* 
****************************************************************/
function getParent(el, pTagName) {
    if (el == null) return null;
    else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())    // Gecko bug, supposed to be uppercase
        return el;
    else
        return getParent(el.parentNode, pTagName);
}
 
/***************************************************************
* 
****************************************************************/
function rah_sort_date(a,b) {
    // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
    aa = rah_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = rah_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    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;
}
 
/***************************************************************
* 
****************************************************************/
function rah_sort_currency(a,b) { 
    aa = rah_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/\-[^0-9.]/g,'');
    if (aa == '') aa = '0';
    bb = rah_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/\-[^0-9.]/g,'');
    if (bb == '') bb = '0';
   // if (aa<0)alert(aa);
   // if (bb<0)alert(bb);
    return parseFloat(aa) - parseFloat(bb);
  
}
 
/***************************************************************
* 
****************************************************************/
function rah_sort_numeric(a,b) { 
   // return rah_sort_currency(a, b);
    aa = parseFloat(rah_getInnerText(a.cells[SORT_COLUMN_INDEX]));
    //aa = parseFloat(rah_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/\-[^0-9.]/g,''));
    if (isNaN(aa)) aa = 0;
    bb = parseFloat(rah_getInnerText(b.cells[SORT_COLUMN_INDEX])); 
   // bb = parseFloat(rah_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/\-[^0-9.]/g,''));
    if (isNaN(bb)) bb = 0;
    return aa-bb;
}

/***************************************************************
* created by Rahim
****************************************************************/
function rah_sort_value(a,b) {
    aa = parseFloat(a.cells[SORT_COLUMN_INDEX].childNodes[0].value);
    if (isNaN(aa)) aa = 0;
    bb = parseFloat(b.cells[SORT_COLUMN_INDEX].childNodes[0].value);
    if (isNaN(bb)) bb = 0;
    return aa-bb;
}

function rah_sort_value_text(a,b) {
    aa = a.cells[SORT_COLUMN_INDEX].childNodes[0].value;
    if (aa == null) aa = rah_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = b.cells[SORT_COLUMN_INDEX].childNodes[0].value;
    if (bb == null) bb = rah_getInnerText(b.cells[SORT_COLUMN_INDEX]);

    if (aa==bb) return 0;
    if (aa<bb) return -1;
    return 1;
}

/***************************************************************
* created by Rahim
****************************************************************/
function rah_sort_checkbox(a,b) {
	if (a.cells[SORT_COLUMN_INDEX].childNodes[0] != null)
		return a.cells[SORT_COLUMN_INDEX].childNodes[0].checked ? 1 : -1;
	return -1;
}

function rah_sort_input(a,b) {
	if (a.cells[SORT_COLUMN_INDEX].childNodes[0] != null)
		aa = a.cells[SORT_COLUMN_INDEX].childNodes[0].value;
	else
		aa = '';

	if (b.cells[SORT_COLUMN_INDEX].childNodes[0] != null)
		bb = b.cells[SORT_COLUMN_INDEX].childNodes[0].value;
	else
		bb = '';

    if (aa==bb) return 0;
    if (aa<bb) return -1;
    return 1;
}

/***************************************************************
* 
****************************************************************/
function rah_sort_caseinsensitive(a,b) {
    aa = rah_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
    bb = rah_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
    if (aa==bb) return 0;
    if (aa<bb) return -1;
    return 1;
}
 
/***************************************************************
* 
****************************************************************/
function rah_sort_default(a,b) {
    aa = rah_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = rah_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    if (aa==bb) return 0;
    if (aa<bb) return -1;
    return 1;
}
 
 
/***************************************************************
* Adds an event to the DOM
* Author: Scott Andrew
*
* @input: elm => 
* @input: evType => 
* @input: fn => 
* @input: useCapture => 
****************************************************************/
function addEvent(elm, evType, fn, useCapture)
{
  if (elm.addEventListener){
    elm.addEventListener(evType, fn, useCapture);
    return true;
  } else if (elm.attachEvent){
    var r = elm.attachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
}
/**************************************************************
* print a whole sortable data table
*
* @input: headerDivId
* @input: dataDivId
*
***************************************************************/
 
function printScrollTable(headerDivId, dataDivId)
{
	if (document.getElementById != null)
	{
		var html = '<HTML>\n<HEAD>\n';
 
		if (document.getElementsByTagName != null)
		{
			var headTags = document.getElementsByTagName("head");
			if (headTags.length > 0)
				html += headTags[0].innerHTML;
		}
 
		html += '\n</HE' + 'AD>\n<BODY>\n';
 
//		var printReadyElem = document.getElementById(strDivName);
		var headerObj = document.getElementById(headerDivId);
		var dataObj = document.getElementById(dataDivId);
 
		if ((headerObj != null) && (dataObj != null))
		{
				html += headerObj.innerHTML + dataObj.innerHTML;
				
		}
		else
		{
			alert("Could not find the " + headerDivId + " section in the HTML");
			return;
		}
 
		html += '\n</BO' + 'DY>\n</HT' + 'ML>';
 
		var printWin = window.open("","printDiv");
		printWin.document.open();
		printWin.document.write(html);
		printWin.document.close();
		printWin.print();
		//printWin.close();
		return;
	}
	else
	{
		alert("Sorry, the print ready feature is only available in modern browsers.");
	}
}
 
 
/***************************************************************
* Print the specified DIV tag.  A new window will open 
* containing the contents of the DIV along with the Print 
* dialog.  Once the "Print" or "Cancel" buttons are pressed the 
* window and Print dialog will close.
*
* @input: strDivName => id of DIV tag to print
****************************************************************/
function printDiv(strDivName)
{
    if (document.getElementById != null)
    {
        var html = '<HTML>\n<HEAD>\n';
 
        if (document.getElementsByTagName != null)
        {
            var headTags = document.getElementsByTagName("head");
            if (headTags.length > 0)
                html += headTags[0].innerHTML;
        }
        
        html += '\n</HE' + 'AD>\n<BODY>\n';
        
        var printReadyElem = document.getElementById(strDivName);
        
        if (printReadyElem != null)
        {
                html += printReadyElem.innerHTML;
        }
        else
        {
            alert("Could not find the " + strDivName + " section in the HTML");
            return;
        }
            
        html += '\n</BO' + 'DY>\n</HT' + 'ML>';
        
        var printWin = window.open("","printDiv");
        printWin.document.open();
        printWin.document.write(html);
        printWin.document.close();
        printWin.print();
        printWin.close();
        return;
    }
    else
    {
        alert("Sorry, the print ready feature is only available in modern browsers.");
    }
}
 
 
/*================= Row Highlight Functions =================/
 
 
/****************************************************
* Handler for the click event. 
*
*****************************************************/
function dataTableClickHandler() {
 
    var el = event.srcElement;
 
    if ((doHighlight != null) && (doHighlight == true)) {
        if (el.tagName.toLowerCase() == "td") {
            try{highlightDataTableRow(el);}catch(e){;}
            objRowClicked = getRowFromTd(el);
        }
    }
}
 
/****************************************************
* Highlights a row in a sortable "data" table. 
* @input: objTd => cell object (TD) of the selected row in the "data" table
* @output:  highlighted row object
*****************************************************/
function highlightDataTableRow(objTd) {
 
    var table, tableRows;
    var clickedRow, row;
    var selected = null;
    var blnHighlight = true;
 
    //Get the row clicked on    
    if (objTd.tagName.toLowerCase() == "td") {
        clickedRow = objTd.parentElement;
        while (clickedRow.tagName.toLowerCase() != "tr")
            {
                clickedRow = clickedRow.parentElement;
            }
    }
    
    table = clickedRow.parentElement;
        
    //Get the table clicked on
    if (table.tagName.toLowerCase() != "table") {
        while (table.tagName.toLowerCase()  != "table")
            {
                table = table.parentElement;
            }
    }
    
    //Reset the currently highlighted row and highlight the new one
    if (table.className.indexOf("data") != -1) {
            for (i=0; i<table.tBodies[0].rows.length; i++) {
                row = table.tBodies[0].rows[i];
                if (row.bgColor == strHighlightedBG)  {
                    highlightRow(row, orgBColor, orgTColor);        
                    if (row == clickedRow)
                        blnHighlight = false;                   
                }
            }
            
            if (blnHighlight) {
                selected = highlightRow(clickedRow, strHighlightedBG, strHighlightedText);
            }
    }
    return selected;
}
 
/****************************************************
* Changes the background and text color of the provided row
* @input: objSelectedRow
* @input: strBackColor => new background Color
* @input: strTextColor => new text color
* @output: changed row (TR) object
*****************************************************/ 
function highlightRow(objSelectedRow, strBackColor, strTextColor){
    if(typeof(objSelectedRow)!='undefined') {
        objSelectedRow.bgColor=strBackColor;
        try{changeRowTextColor(objSelectedRow,strTextColor); }catch(e){;}
    }
    return objSelectedRow;
}  
 
/****************************************************
* Changes the text color for each cell of the provided row
* 
* @input: a_obj => row object
* @input: a_color => new text color
* @output: none
*****************************************************/
function changeRowTextColor(a_obj,a_color){  ;
    for (i=0;i<a_obj.cells.length;i++)
        a_obj.cells(i).style.color=a_color;
}
 
/****************************************************
* Returns the application Id (text in the first cell) from the given row
*@input: objRow => row object
*@output: none
*****************************************************/
function getAppId (objRow) {
    return objRow.cells[0].innerText;
}
 
/****************************************************
* Returns the application Id (text in the first cell) from the given row
*@input: objRow => row object
*@output: none
*****************************************************/
function getColumnData (objRow, columnNum) {
    return objRow.cells[columnNum].innerText;
}
 
/****************************************************
* Returns the row object (TR) from the given cell object (TD)
*@input: objTD => cell object
*@output: row object
*****************************************************/
function getRowFromTd(objTd) {
 
    var objRow = null;
 
    if (objTd.tagName.toLowerCase() == "td") {
        objRow = objTd.parentElement;
        while (objRow.tagName.toLowerCase() != "tr")
            {
                objRow = objRow.parentElement;
            }
    }
    return objRow;
}
 
/****************************************************
* Returns the table object (TABLE) from the given cell object (TD)
*@input: objTD => cell object
*@output: table object
*****************************************************/
function getTableFromTd(objTd) {
    var objTable;
    var objRow = getRowFromTd(objTd);
 
    objTable = objRow.parentElement;    
 
    //Get the table clicked on
    if (objTable.tagName.toLowerCase() != "table") {
        while (objTable.tagName.toLowerCase()  != "table")
            {
                objTable = objTable.parentElement;
            }
    }       
    return objTable;
}
 
/****************************************************
* Determines if the given row is highlighted
*@input: objRow
*@output: none
*****************************************************/
function isRowSelected (objRow) {
    if (objRow.bgColor == strHighlightedBG)  
        return true;
    return false;
}
 
/****************************************************
* Removes a row from a table
* @input: objRow
* @output: none
*****************************************************/
function removeTableRow(objRow) {
    if (objRow.rowIndex >= 0) {
        objRow.parentNode.removeChild(objRow);
    }
}
