
//change the background color of a row
function colorRow(srcElement, sortElementId) 
{
    var cb = event.srcElement;
	var curElement = cb;
	while (curElement && !(curElement.tagName == "TR")) 
	{
		curElement = curElement.parentElement;
	}
	if (!(curElement == cb)) 
	{		
	    curElement.style.backgroundColor = "#C1D1EE";
	    // also change the color for the sortElementId too
	    var sortElement = document.getElementById(sortElementId);

	    if(sortElement) 
	    {
	        sortElement.style.backgroundColor = "#C1D1EE";
	    } 
	}
}

//reset the background color of a row
function resetColorRow(srcElement, sortElementId) 
{
	var cb = event.srcElement;
	var curElement = cb;
	while (curElement && !(curElement.tagName == "TR")) 
	{
		curElement = curElement.parentElement;
	}
	if (!(curElement == cb)) 
	{
	    curElement.style.backgroundColor = "#FFFFFF";
	    // also change the color for the sortElementId too
	    var sortElement = document.getElementById(sortElementId);

	    if(sortElement) 
	    {
	        sortElement.style.backgroundColor = "#EEF0F6";
	    } 
	}
}

function changeBackground(srcElement, stringUrl) 
{        
    srcElement.style.backgroundImage = 'url(' + stringUrl + 'grid_BarBkOn.gif)';
    srcElement.style.backgroundPositionY = 'bottom';
    srcElement.style.backgroundRepeat = 'repeat-x';
}

function resetBackground(srcElement,stringUrl) 
{
    srcElement.style.backgroundImage = 'url(' + stringUrl + 'clear.gif)';                        
}

function openWindow(objectUrl, oId) 
{
    if(objectUrl && objectUrl.length > 0){
        if(objectUrl.indexOf('?') > 0){
            window.open(objectUrl + "&id={" + oId + "}", 'Details', 'toolbar=0,resizable=1,menubar=0,scrollbars=1,location=1');
        }else{
            window.open(objectUrl + "?id={" + oId + "}", 'Details', 'toolbar=0,resizable=1,menubar=0,scrollbars=1,location=1');
        }
    }
}

/**
 * The following code is for grid item selection
 */

if(!String.trim) String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g, '')};
if(!String.trimLeft) String.prototype.trimLeft = function(){return this.replace(/^\s+/g, '')};
if(!String.trimRight) String.prototype.trimRight = function(){return this.replace(/\s+$/g, '')};
 
//add key down/up event handler
document.attachEvent("onkeydown", grid_KeyDown);
document.attachEvent("onkeyup", grid_KeyUp);

//
var bControlKeyDown;
var bShiftKeyDown;
var lastSelectedItemId;

var GridContainerDIV;
var GridHeaderDIV;
var GridBodyDIV;
var GridFooterDIV;
var GridHiddenField_SelectedIds;
var arrGridHiddenField_ColumnSize;
var arrGridHeaderColumns;
var GridBodyTABLE;
var GridItemSelectionIndicatorSPAN;
var ScrollbarAdjustColumnTD;

bControlKeyDown = false;
bShiftKeyDown = false;

function grid_KeyDown()
{
    switch(event.keyCode){
        case 16:
            bShiftKeyDown = true;
            bControlKeyDown = false;
            break;
        case 17:
            bControlKeyDown = true;
            bShiftKeyDown = false;
            break;
        default:
            break;
    }
}

function grid_KeyUp()
{
    switch(event.keyCode){
        case 16:
            bShiftKeyDown = false;
            break;
        case 17:
            bControlKeyDown = false;
            break;
        default:
            break;
    }
}

function grid_ItemClick(item)
{
    if (!GridHiddenField_SelectedIds || !GridBodyTABLE) initGrid();
    
    var strIds = GridHiddenField_SelectedIds.value;
    
    if(bControlKeyDown){
        strIds = strIds + ',' + realId(item.id);
        lastSelectedItemId = realId(item.id);
    }else if (bShiftKeyDown){
        if(!lastSelectedItemId || lastSelectedItemId == ''){
            lastSelectedItemId = realId(item.id);
            strIds = realId(item.id);
        }else{
            //find all the items in between the last selected item and this item
            strIds = grid_FindItemIdsInBetween(GridBodyTABLE, realId(item.id), lastSelectedItemId);
        }
    }else{
        strIds = realId(item.id);
        lastSelectedItemId = realId(item.id);
    }
    
    GridHiddenField_SelectedIds.value = strIds;
    
    //Highlight the selected items
    grid_HighlightItems(GridBodyTABLE, strIds);

    updateItemSelectionIndicator();
}

//Find all the <TR> ids in between the given <TR> ids
function grid_FindItemIdsInBetween(table, trId1, trId2)
{
    var strIds = '';
    
    if(!table) return '';
    if(trId1.length <= 0 || trId1.length <= 0) return '';
    
    var beginTrId = '';
    var endTrId = '';
    var bSuccess = false;
    
    var tr = table.firstChild.firstChild;
    
    trId1 = trId1.trim();
    trId2 = trId2.trim();
    
    while(tr != null){
        var trId = realId(tr.id.trim());
        
        //Have not found any of the trId1 and trId2
        if(beginTrId == '' && endTrId == ''){
            if(trId == trId1){
                beginTrId = trId1;
                endTrId = trId2;
                strIds = strIds + trId + ',';
            }else if(trId == trId2){
                beginTrId = trId2;
                endTrId = trId1;
                strIds = strIds + trId + ',';
            }
        
        //Either trId1 or trId2 has been found, continue to find the other
        }else{
            strIds = strIds + trId + ',';
            
            //All the ids have been found, break loop.
            if(trId == endTrId){
                bSuccess = true;
                break;
            }
        }
        
        tr = tr.nextSibling;
    }

    if(bSuccess) {
        if (strIds.substring(strIds.length-1) == ',')
            strIds = strIds.substring(0, strIds.length-1);
            
        return strIds;
    }
    else return '';
}

function grid_HighlightItems(table, trIds)
{
    if(!table) return;
    
    var tr = table.firstChild.firstChild;
    
    while(tr != null){
        var strId = realId(tr.id.trim());
        
        if((',' + trIds + ',').indexOf(',' + strId + ',') >= 0){
            tr.style.backgroundColor = '#C1D1EE';
            tr.style.color = "#FFFFFF";
        }else{
            tr.style.backgroundColor = '#FFFFFF';
            tr.style.color = "#000000";
        }
        
        tr = tr.nextSibling;
    }
    
}

function realId(strId){
    return strId.replace('ItemId_', '');
}

function rawId(strId){
    return 'ItemId_' + strId;
}

//Check if the <TR>, which contains the given <TD>, has been highlighted
function isItemHighlighted(cell){
    if(!GridHiddenField_SelectedIds) return false;
    
    var strSelectedIds = ',' + GridHiddenField_SelectedIds.value + ',';
    
    if( strSelectedIds.indexOf(',' + realId(cell.parentElement.id) + ',') >= 0 )
        return true;
        
    return false;
}

//Update the item selection indicator
function updateItemSelectionIndicator(){
    if(!GridItemSelectionIndicatorSPAN) initGrid();;

    GridItemSelectionIndicatorSPAN.innerText = getNumberOfSelectedItem();
}

//Get the number of selected items
function getNumberOfSelectedItem(){
    if(!GridHiddenField_SelectedIds) initGrid();
    
    //remove original double quotes and add [","] to make function eval working properly
    var tmp = GridHiddenField_SelectedIds.value;
    tmp = tmp.replace(/\"/g, '');
    tmp = tmp.replace(/\,/g, '\",\"');
    
    var arr = eval('["' + tmp + '"]');
    
    if(!arr) return 0;

    if(!arr.length) return 0;
    
    return arr.length;    
}

/**
 * The following function is for showing tooltips
 */
function showTooltip()
{
    var o = event.srcElement;
    
    if(o && o.innerText != "" && o.title == "")
        o.title = o.innerText;
}

/**
 * The following functions are for searching child object by id
 * idPosition: EXACT, START, END, MIDDLE
 */
 function findChildObjById(strId, parent, idPosition){
    if(parent == null) return null;
    if(strId.length <= 0) return null;
    
    var obj;
    var i;
    var id;
    if(parent.children){
        for(i = 0; i<parent.children.length; i++){
            id = parent.children[i].id.trim();
            
            if( (idPosition == "EXACT" && id == strId) ||
                (idPosition == "START" && id.indexOf(strId) == 0) ||
                (idPosition == "END" && id.indexOf(strId) >= 0 && (id.indexOf(strId) == id.length - strId.length) ) ||
                (idPosition == "MIDDLE" && id.indexOf(strId) > 0 && id.indexOf(strId) < id.length - strId.length) )
            {
                return parent.children[i];
            }else{
                obj = findChildObjById(strId, parent.children[i], idPosition);
                if(obj != null) return obj;
            }
            
        }
    }
    
    return null;
 }
 
 /**
  * The following functions are for searching sibling object by id
  * idPosition: EXACT, START, END, MIDDLE
  */
 function findSiblingObjById(strId, element, idPosition){
    if(!element) return null;
    if(strId.length <= 0) return null;

    var obj;
    var id;
    
    //search next siblings
    obj = element.nextSibling;
    while(obj){
        id = obj.id.trim();
        
        if(id){
            if( (idPosition == "EXACT" && id == strId) ||
                (idPosition == "START" && id.indexOf(strId) == 0) ||
                (idPosition == "END" && id.indexOf(strId) >= 0 && (id.indexOf(strId) == id.length - strId.length) ) ||
                (idPosition == "MIDDLE" && id.indexOf(strId) > 0 && id.indexOf(strId) < id.length - strId.length) )
            {
                return obj;
            }
        }
        
        obj = obj.nextSibling;
    }
    
    //search previous siblings
    obj = element.previousSibling;
    while(obj){
        id = obj.id.trim();
        
        if(id){
            if( (idPosition == "EXACT" && id == strId) ||
                (idPosition == "START" && id.indexOf(strId) == 0) ||
                (idPosition == "END" && id.indexOf(strId) >= 0 && (id.indexOf(strId) == id.length - strId.length) ) ||
                (idPosition == "MIDDLE" && id.indexOf(strId) > 0 && id.indexOf(strId) < id.length - strId.length) )
            {
                return obj;
            }
        }
        
        obj = obj.previousSibling;
    }
    return null;
 }

 function getHeaderColumnObj(index){	
	if(!arrGridHeaderColumns) initGrid();
	
	return arrGridHeaderColumns[index];
}

function getHiddenColumnWidthObj(index){
    if(!arrGridHiddenField_ColumnSize) initGrid();
	
	return arrGridHiddenField_ColumnSize[index];
}

function getColumnWidth(index){
    var obj = getHeaderColumnObj(index);
    return parseInt(obj.width);
}

function scrollGridHeader(){
    if(!GridBodyDIV || !GridHeaderDIV) initGrid();

    if(GridHeaderDIV.scrollLeft != GridBodyDIV.scrollLeft)
        GridHeaderDIV.scrollLeft = GridBodyDIV.scrollLeft;

}

function initGrid(){
    if (!GridContainerDIV || GridContainerDIV.innerHTML == "")
        GridContainerDIV = findChildObjById('divGridContainer', window.document.body, 'END');
    
    if(!GridHeaderDIV || GridHeaderDIV.innerHTML == "")
        GridHeaderDIV = findChildObjById('divGridHeader', GridContainerDIV, 'END');
    
    if(!GridBodyDIV || GridBodyDIV.innerHTML == "")
        GridBodyDIV = findSiblingObjById('divGridBody', GridHeaderDIV, 'END');
        
    if(!GridFooterDIV || GridFooterDIV.innerHTML == "")
        GridFooterDIV = findSiblingObjById('divGridFooter', GridHeaderDIV, 'END');
    
    if(!GridBodyTABLE || GridBodyTABLE.innerHTML == "")
        GridBodyTABLE = GridBodyDIV.firstChild.firstChild; //Get the table generated by DataGrid
    
    if(!GridHiddenField_SelectedIds || GridHiddenField_SelectedIds.innerHTML == "")
        GridHiddenField_SelectedIds = findSiblingObjById('hdSelectedItemIds', GridBodyTABLE, 'END');
    
    if(!GridItemSelectionIndicatorSPAN || GridItemSelectionIndicatorSPAN.innerHTML == "")
        GridItemSelectionIndicatorSPAN = findChildObjById('gridItemSelectionIndicator', GridFooterDIV, 'END');
    
    if(!arrGridHiddenField_ColumnSize || !arrGridHiddenField_ColumnSize.length || !arrGridHiddenField_ColumnSize[0] || arrGridHiddenField_ColumnSize[0].innerHTML == "")
    {
        arrGridHeaderColumns = new Array();
        arrGridHiddenField_ColumnSize = new Array();
        
        var i=0;
        var obj = findChildObjById('gdHeaderCol_' + i, GridHeaderDIV, 'END');
        while(obj){
        
            arrGridHeaderColumns[i] = obj;
            arrGridHiddenField_ColumnSize[i] = findSiblingObjById('hdHeaderWidth_' + i, GridBodyTABLE, 'END');
            
            i++;
            obj = findChildObjById('gdHeaderCol_' + i, GridHeaderDIV, 'END');
        }
    }
}