/*
function replaceIndex(str,i) {
function gridItemChanged(field){
function gridSetRowStatus(field){
function gridCompute(){
function gridCheckAll(field){
function evalForAll(name,exp,attr){
function sumForAll(name,exp){
function gridDeleteAll(gridName){
function gridGetRowStatusName(fieldName){
function gridGetRowIndex(rowName){
function gridGetRowId(rowIndex){
function gridGetRow(fieldName){
function gridGetParentRowId(column){
function gridGetParent(grid){    
function gridGetRowCount(rowCount){
function showTabPage(tabHandle){
function sortTable(column,tablename,type){
function gridFilter(obj,filterName){
function gridValidate(){
function gridValidateColumn(fieldName,format,mandatory){    
function gridWarn(){
function gridSetCurrentRow(grid,name){
function gridGetCurrentRow(grid){
function gridPaint(grid){
*/

var gridNames = new Array();
var gridComputeField = new Array();
var gridComputeExp = new Array();
var gridComputeValue = new Array();
var tabpages=new Array();
var sortDirection=new Array();  // used in sortTable() to record ASC/DESC sorting
var filterValue = new Array();
var filterExp = new Array();
var gridColumns = new Array();
var gridFormats = new Array();
var gridMandatory  = new Array();
var currentRow = new Array();
var diffEvenOddRows= new Array();

function replaceIndex(str,i) {
    str= String(str);
    return str.replace(/_X/g,"_"+i);
} 

function gridItemChanged(field){
    gridSetRowStatus(field);
    // computed values
    gridCompute();
}

function gridSetRowStatus(field){
    // 0 = not modified
    // 1 = new
    // 2 = modified
    // 3 = new modified
    var j =field.name.lastIndexOf("_"); 
    if(j == -1) 
        return;
    var i = field.name.substring(j + 1,field.name.length);
    
    var rowstatus = gridGetRowStatusName(field.name);
    if( rowstatus == ""){
        return;
    }
        
//    alert("RowStatus="+rowstatus+i);
    var el = document.getElementById(rowstatus+i);
    if(el.value == '0'){
        el.value='2';
    }else if(el.value == '1'){
        el.value='3';
    }

    // look for parent grid
    var parent = field.name.substring(0,j);
    j =parent.lastIndexOf("_"); 
    if(j == -1) 
        return;
    parent = field.name.substring(0,j);
    j =parent.lastIndexOf("_"); 
    if(j == -1) 
        return;
    i = parent.substring(j + 1,parent.length);

    rowstatus = gridGetRowStatusName(parent);
    if( rowstatus == ""){
        return;
    }
        
//    alert("RowStatus="+rowstatus+i);
    el = document.getElementById(rowstatus+i);
    if(el.value == '0'){
        el.value='2';
    }else if(el.value == '1'){
        el.value='3';
    }

}

function gridCompute(){
    // eval row expressions first
    for(var j=0;j<gridComputeField.length;j++){
        if(gridComputeExp[j].indexOf('SUM') == 0){
            sumForAll(gridComputeField[j],gridComputeExp[j].substring(3,gridComputeExp[j].length));
        }else{
            if((gridComputeField[j].lastIndexOf('_X') + 2) != gridComputeField[j].length){
                evalOnce(gridComputeField[j],gridComputeExp[j],gridComputeValue[j]);
            }else{            
                evalForAll(gridComputeField[j],gridComputeExp[j],gridComputeValue[j]);
            }
        }
    }

/*
    for(var j=0;j<gridComputeField.length;j++){
        if(gridComputeExp[j].indexOf('SUM') == 0){
            sumForAll(gridComputeField[j],gridComputeExp[j].substring(3,gridComputeExp[j].length));
        }else{
            if((gridComputeField[j].lastIndexOf('_X') + 2) != gridComputeField[j].length){
                evalOnce(gridComputeField[j],gridComputeExp[j],gridComputeValue[j]);
            }else{            
                evalForAll(gridComputeField[j],gridComputeExp[j],gridComputeValue[j]);
            }
        }
    }
*/
    
    for(var j=0;j<diffEvenOddRows.length;j++){
        gridPaint(diffEvenOddRows[j]);
    }
}

// used in trailer check boxes; name of check box is column_tc
function gridCheckAll(field){

    var j =field.name.lastIndexOf("_"); 
    var colName="";
    if(j != -1) {
        colName = field.name.substring(0,j);
    }else{
        return;
    }
    var i=0;
    var el = document.getElementById(colName+"_"+i);
    while(el != null){
        if(el.checked != field.checked){
            el.checked = field.checked;
            gridSetRowStatus(el);
        }
        el = document.getElementById(colName+"_"+ ++i);
    }
    gridCompute();
}

// name is column_X
function evalForAll(name,exp,attr){
    //alert(exp);
    var i=0;
    var rowstatus = gridGetRowStatusName(name);
    var st = document.getElementById(rowstatus+i);

    var j=attr.indexOf("style.");
    var isStyle=false;
    if( j != -1){
        attr=attr.substring(j+6);
        isStyle=true;
    }

    while(st != null){
        var el = document.getElementById(replaceIndex(name,i));
        if(el==null)
            return;
        if(isStyle){
            bdSetStyle(el,attr,eval(replaceIndex(exp,i)));
// Netscape            el.style.setProperty(attr,eval(replaceIndex(exp,i)),"");
// MSIE            el.style.setAttribute(attr,eval(replaceIndex(exp,i)));
        }else if(attr=='className'){
            el.className=eval(replaceIndex(exp,i));
        }else{
            el.setAttribute(attr,eval(replaceIndex(exp,i)));
        }
        st = document.getElementById(rowstatus+ ++i);
    }
}

// name is header, trailer, etc
function evalOnce(name,exp,attr){

    var j=attr.indexOf("style.");
    var isStyle=false;
    if( j != -1){
        attr=attr.substring(j+6);
        isStyle=true;
    }

    var el = document.getElementById(name);
    if(el==null)
        return;
        
    if(isStyle){
            bdSetStyle(el,attr,eval(exp));

// Netscape            el.style.setProperty(attr,eval(replaceIndex(exp,i)),"");
//        el.style.setAttribute(attr,eval(exp));
    }else if(attr=='className'){
        el.className=eval(exp);
    }else{
        el.setAttribute(attr,eval(exp));
    }
}

function sumForAll(name,exp){

    var i=0;
    var el = document.getElementById(name);
    var rowstatus = gridGetRowStatusName(name);
    var deleteColumn = gridGetDeleteName(name);
    var st = document.getElementById(rowstatus+i);
    var num = 0;
    while(st != null){
        // skip filtered
        
        var row = gridGetRow(rowstatus+i);
    	if(row.className != 'filtered'){
        
            // skip deleted
            if(getValue(deleteColumn+i) != 1){
                var n =toNumber(eval(replaceIndex(exp,i)));
                if(! isNaN(n)){
                    num += n;
                }
            }
        }
        st = document.getElementById(rowstatus + ++i);
    }
    
    el.value = formatNumber(num);
}

function gridDeleteAll(gridName){
    if(!confirm("Delete All?")){
        return false;
    }
    var i=0;
    var deleteName = gridName+"_"+"delete_";
    var el = document.getElementById(deleteName+i);
    while(el != null){
        el.value = '1';
        el = document.getElementById(deleteName + ++i);
    }
    gridCompute();
}



function gridGetRowStatusName(fieldName){
    var j =fieldName.lastIndexOf("_"); 
    if(j == -1){
        return "";
    }
    fieldName=fieldName.substring(0,j)
    j =fieldName.lastIndexOf("_"); 
    
    var pre="";
    if(j != -1) {
        pre = fieldName.substring(0,j+1);
    }
    return pre+"rowstatus_";
}

function gridGetRow(fieldName){
    // in form grid_column_index
    var pattern = /^(.*)_.*_(.*)$/;

    var gotIt = pattern.exec(fieldName);
    if(!gotIt){
    	return "";
    }
    var rowName = RegExp.$1 +"_row_"+RegExp.$2;
    return document.getElementById(rowName);
}

function gridGetDeleteName(fieldName){
    var j =fieldName.indexOf("_"); 
    var pre="";
    if(j != -1) {
        pre = fieldName.substring(0,j+1);
    }
    return pre+"delete_";
}


function gridGetRowIndex(rowIndex){
    var tableName="";
    var j =rowIndex.indexOf("_"); 
    if(j != -1) {
        tableName= rowIndex.substring(0,j);
    }else{
        return -1;
    }
    j =rowIndex.lastIndexOf("_"); 
    var idx="";
    if(j != -1){
        idx= rowIndex.substring(j+1);
    }else{
        return -1;
    }
    var rowName = tableName+"_row_"+idx;        
    var table = document.getElementById(tableName);
    for(i=0;i<table.rows.length;i++){
        if(table.rows[i].id == rowName){
            return i;
        }
    }
    return -1;
}

function gridGetRowId(rowIndex){
    j =rowIndex.lastIndexOf("_"); 
    var idx="";
    if(j != -1){
        return rowIndex.substring(j+1);
    }else{
        return -1;
    }
}

function gridGetParentRowId(column){
    // in form parent_child_index_column_index
    var pattern = /^.*_.*_(.*)_.*_.*$/;
    
    var gotIt = pattern.exec(column);
    if(!gotIt){
    	return "";
    }
    return RegExp.$1;
}

function gridGetParent(grid){
    // in form parent_child_index
    var pattern = /^(.*)_.*_.*$/;
    
    var gotIt = pattern.exec(grid);
    if(!gotIt){
    	return "";
    }
    return RegExp.$1;
}

function gridGetRowCount(rowCount){

    var tableName="";
    var j =rowCount.indexOf("_"); 
    if(j != -1) {
        tableName= rowCount.substring(0,j);
    }else{
        return -1;
    }
    
    var table = document.getElementById(tableName);
    var i=0;
    for(j=0;j<table.rows.length;j++){
    	if(table.rows[j].className != 'filtered'){
    		i++;
    	}
    }
    return i;

    //return rowCount + 1;
}


function showTabPage(tabHandle){
    var j =tabHandle.name.indexOf("_handle"); 
    if(j == -1) {
        return;
    }
    var tabName = tabHandle.name.substring(0,j);
    for(var i=0;i<tabpages.length;i++){
        var tabPage = document.getElementById(tabpages[i]);
        var tabHandle = document.getElementById(tabpages[i]+"_handle");
        if(tabName == tabpages[i]){
            tabPage.style.visibility='visible';
            tabPage.style.position='static';
            tabHandle.className='tabHandleSelected';
        }else{
            tabPage.style.visibility='hidden';
            tabHandle.className='tabHandleUnSelected';
            tabPage.style.position='absolute';
        }
    }
}

function sortTable(column,tablename,type){
//    document.body.style.cursor = 'wait';
    var i=0;
    var el = document.getElementById(column+"_"+i);
    var values = new Array();
    while(el != null){
        var v=getObjectLabel(el);
        arrayPush(values,v);
        el = document.getElementById(column+"_"+ ++i);
    }
    
    //types: 0 - strings, 1-numbers, 2- dates
    if(type == 1){
        // numbers
        values.sort(compareNum);
    }else if(type == 2){
        // dates
        values.sort(compareDate);
    }else{
        values.sort();
    }

    if(sortDirection[column] == 'ASC'){
        values.reverse();
        sortDirection[column] = 'DESC';
    }else{
        sortDirection[column] = 'ASC';
    }
    
    var table = document.getElementById(tablename);
    for(j=0;j<values.length;j++){
        i=0;
        el = document.getElementById(column+"_"+i);
        while(el != null){
            if(getObjectLabel(el) == values[j]){
                var tr = document.getElementById(tablename+"_row_"+i);
                bdMoveRow(table,tr,j);           
//                table.moveRow(tr.sectionRowIndex, j);

//Netscape        table.deleteRow(tr.sectionRowIndex);
//                table.appendChild(tr);
//                break;
            }
            el = document.getElementById(column+"_"+ ++i);
        }
    }
    gridCompute();
//    document.body.style.cursor = 'default'    
}
 
/*
function gridPrint(gridName){

    var tbody = document.getElementById(gridName);
    var table = document.createElement("table");

    var rows = tbody.rows;
    for(i=0;i<rows.length;i++){
        var cells = rows[i].cells;
        var row=table.insertRow();
        for(j=0;j<cells.length;j++){
            var cell=row.insertCell();
            cell.innerHTML= rows[i].cells[j].innerHTML;
        }
    }

    var printWindow = window.open("","Help","width=320,height=200,location=no,menubar=no,statusbar=no,resizable=yes,scrollbars=auto");

    printWindow.document.write("<html>\n\n<head>\n <title>Print</title>\n\n");
    printWindow.document.write("<LINK rel='stylesheet' href='report.css' type='text/css'>");
    printWindow.document.write("<body>");
    printWindow.document.write(table.outerHTML);
    printWindow.document.write("</body></html>");
    printWindow.document.close();
}
*/   

function gridFilter(field,filterName){

    var idx = gridGetParentRowId(field.name);
    if(idx == ""){
        idx= gridGetRowId(field.name);
    }
    if(idx==""){
        return -1;
    }
//    alert(idx);
    var newFilter = eval(replaceIndex(filterExp[filterName],idx));
    if(newFilter != filterValue[filterName]){
        filterValue[filterName]=newFilter;
//        alert(field.name+" "+filterName+" "+filterExp[filterName]+" '"+filterValue[filterName]+"'");
        gridCompute();
    }

}

function gridValidate(){
    var ok = true;
    for(var i=0;i<gridColumns.length;i++){
        if(gridFormats[gridColumns[i]]  != null || gridMandatory[gridColumns[i]]  != null ){
            ok = gridValidateColumn(gridColumns[i],gridFormats[gridColumns[i]],gridMandatory[gridColumns[i]]) && ok;
        }
    }
    if(!ok){
        alert("Some fields have invalid or missing values. Please correct!");
    }
    return ok;
}


function gridValidateColumn(fieldName,format,mandatory){
    
    if(mandatory == null){
        mandatory=false;
    }

    if(format == null){
        format="";
    }

    if(fieldName.indexOf('_X') == -1){
        //header field
        var field = document.getElementbyId(fieldName);
        return validateFormat(field,format,mandatory);
    }
    
    var j =fieldName.indexOf("_"); 
    var gridName_="";
    if(j != -1) {
        gridName_ = fieldName.substring(0,j+1);
    }
    
    var i=0;
    var el = document.getElementById(gridName_ +"rowstatus_"+i);
    var ok=true;
    while(el != null){
        if(el.value =='0' || el.value =='1'){
            el = document.getElementById(gridName_ +"rowStatus_"+ ++i);
            continue; // not modified - no validation
        }
        var del = document.getElementById(gridName_ +"delete_"+i);

        if(del != null && del.checked){
            el = document.getElementById(gridName_ +"rowStatus_"+ ++i);
            continue; // deleted row - no validation
        }
        
        var field=document.getElementById(replaceIndex(fieldName,i));
        ok = validateFormat(field,format,mandatory) && ok;
        el = document.getElementById(gridName_ +"rowStatus_"+ ++i);
    }
    return ok;
}

function gridWarn(){
    for(var j=0;j<gridNames.length;j++){
        var i=0;
        var el = document.getElementById(gridNames[j] +"_rowstatus_"+i);
        while(el != null){
            if(el.value =='2' || el.value =='3'){
                return confirm("All Modifications will be lost. Continue?");

            }
            el = document.getElementById(gridNames[j] +"_rowStatus_"+ ++i);
        }

    }
    return true;
}

function gridSetCurrentRow(grid,name){
    var	rowId=gridGetRowId(name);
    var compute = false;
//    alert(grid +" "+rowId);
    if(currentRow[grid]!=rowId){
        currentRow[grid]=rowId;
        compute = true;
    } 

    // try the parent rowid first in case we are in a child
    // only does two levels    
    var rowId=gridGetParentRowId(name);
    if(rowId!=''){
        grid = gridGetParent(grid);

        if(currentRow[grid]!=rowId){
            currentRow[grid]=rowId;
            compute = true;
        } 
    }
    
    if(compute){
        gridCompute();
    }

}

function gridGetCurrentRow(grid){
    return currentRow[grid];
}

function gridPaint(grid){
    var table = document.getElementById(grid);

    var i=0;
    for(j=0;j<table.rows.length;j++){
    	if(table.rows[j].className != 'filtered'){
    	    table.rows[j].className = (i%2==0?'oddRow':'evenRow');
    		i++;
    	}
    }
}