var _DEFAULT_NULL = "";
var _ERROR_COLOR = "PINK";
var _SELECT_COLOR = "#C4E7E7";
var _DISABLED_COLOR = "buttonshadow";
var _INVALID_VALUE = "<INVALID>";

function getRowByCell(cell){
    return cell.parentElement;
}

function getTBodyByCell(cell){
    var tbody=getRowByCell(cell).parentElement;
    return tbody;
}

function getTableByCell(cell){
    var tbody=getRowByCell(cell).parentElement;
    if (tbody) return tbody.parentElement;
}

function getTableByRow(row){
    var tbody=row.parentElement;
    if (tbody) return tbody.parentElement;
}

function setIdSelected(id, selected){
    if (selected){
        if (id.split("^")[1] == null){
            id = id + "^1";
        }
    } else {
        if (id.split("^")[1] != null){
            id = id.split("^")[0];
        }
    }

    return id;
}

function findIndexFormArray(inObj, inArray){
    for (var i=0; i < inArray.length; i++){
        if (inObj == inArray[i]){
            return i;
        }
    }

    return -1;
}

function findLocationByCell(cell){
    var row = cell.parentElement;
    var table = getTableByRow(row);

    var cellLocation = new Array();

    try{
        cellLocation[0] = row.rowIndex;

        if (table.tHead != null){
            cellLocation[0] -= table.tHead.rows.length;
        }
        cellLocation[1] = cell.cellIndex;
    } catch(e){
        //alert(cell.outerHTML);
    }

    return cellLocation;
}

function getParentByTagName(oElement,sTagName){
    var oParent=oElement;
    while (oParent!=null) {
        if (oParent.tagName.toLowerCase()==sTagName.toLowerCase()) {
            if (oParent.readyState=="complete") return oParent;
            break;
        }
        oParent=oParent.parentElement;
    }
    return null;
}

window._watchs = new Array();
window.document.onkeydown = function(){
    switch (event.keyCode){
        case 192:{
            if (event.ctrlKey){
                var watchWin = window.open("/portal/common/scriptwatch.html", "", "width=800,height=600,status=1,scrollbars=1")
            }
            break;
        }
    }
}

function getPriorTabElement(obj){
    var i=obj.sourceIndex-1;
    var elementCount=document.all.length
    var tmpObj=null;
    while (i<elementCount){
        tmpObj=document.all[i];
        if (tmpObj!=obj){
            switch (tmpObj.tagName.toLowerCase()){
            case "input":
            case "textarea":
            case "button":
                if (tmpObj.tabIndex!=-1 && !tmpObj.disabled && !tmpObj.readOnly && !tmpObj.skipTab){
                    return tmpObj;
                }
                break;
            case "td":
                var cellLocation = findLocationByCell(tmpObj);
                var table = getTableByCell(tmpObj);

                if (typeof table.handler != "undefined" && table.handler.isCellEditable(cellLocation[0], cellLocation[1])){
                    return tmpObj;
                }
            }
        }
        i--;
    }
}

function getNextTabElement(obj){
    var i=obj.sourceIndex+1;
    var elementCount=document.all.length
    var tmpObj=null;
    while (i<elementCount){
        tmpObj=document.all[i];
        if (tmpObj!=obj){
            switch (tmpObj.tagName.toLowerCase()){
            case "input":
            case "textarea":
            case "button":
                if (tmpObj.tabIndex!=-1 && !tmpObj.disabled && !tmpObj.readOnly && !tmpObj.skipTab){
                    return tmpObj;
                }
                break;
            case "td":
                var cellLocation = findLocationByCell(tmpObj);
                var table = getTableByCell(tmpObj);

                if (typeof table.handler != "undefined" && table.handler.isCellEditable(cellLocation[0], cellLocation[1])){
                    return tmpObj;
                }
            }
        }
        i++;
    }
}

function checkTableCellIndex(table, rowIndex, cellIndex){
    var r_rowIndex=rowIndex;
    var r_cellIndex=cellIndex;
    var minRowIndex=(table.tHead)?table.tHead.rows.length:0;
    minRowIndex=(minRowIndex<0)?0:minRowIndex;
    var maxRowIndex=(table.tBodies[0])?(minRowIndex+table.tBodies[0].rows.length-1):-1;
    var minCellIndex=table.minCellIndex;
    var maxCellIndex=table.tBodies[0].rows[0].cells.length-1;

    if ((!r_cellIndex)||(r_cellIndex<minCellIndex)) r_cellIndex=minCellIndex
    else if (r_cellIndex>maxCellIndex) r_cellIndex=maxCellIndex;
    if ((!r_rowIndex)||(r_rowIndex<minRowIndex)) r_rowIndex=minRowIndex
    else if (r_rowIndex>maxRowIndex) r_rowIndex=maxRowIndex;

    return ([r_rowIndex, r_cellIndex]);
}

function isChild(obj, parentObj) {
    var tmpObj=obj;
    var result=false;
    if (parentObj) {
        while (tmpObj) {
            if (tmpObj==parentObj){
                result=true;
                break;
            }
            tmpObj=tmpObj.parentElement;
        }
    }
    return result;
}

function setFocusTableCell(table, rowIndex, cellIndex){
    table.rows[rowIndex].cells[cellIndex].focus();
}

function appendZero(number, zeroLength){
    if (zeroLength ==0){
        return number;
    }

    var index = number.indexOf(".");
    var len = 0;
    if (index == -1){
        number += ".";
    } else {
        len = number.split(".")[1].length;
    }

    for (var i=0; i < zeroLength - len; i++){
        number += "0";
    }

    return number;
}

function TableKeydownHandler() {
    function getCell(obj){
        return getParentByTagName(obj, "TD");
    }

    function processTab(obj){
        if (event.shiftKey){
            obj = getCell(obj);
            obj=getPriorTabElement(obj);
        } else {
            obj=getNextTabElement(obj);
        }

        try {
            if (obj){
                if (obj.tagName != "TD"){
                    obj = getCell(obj);
                }
                var cellLocation = findLocationByCell(obj);
                var table = getTableByCell(obj);
                table.handler.editCell(cellLocation[0], cellLocation[1]);
            }
            event.returnValue=false;
            return obj;
        } catch (e) {
        }
    }

    element=event.srcElement;
    var rowIndex, columnIndex;
    switch (event.keyCode) {
        //Tab
        case 9:{
            processTab(element);
            break;
        }
        //Enter
        case 13:{
            if (element.tagName != "TEXTAREA" || event.shiftKey || event.ctrlKey || event.altKey){
                var cell=getCell(element);
                if (cell && !event.shiftKey){
                    var row=getRowByCell(cell);
                    var table=getTableByRow(row);
                    var maxIndex=checkTableCellIndex(table, 9999, 9999);
                    if (row.rowIndex==maxIndex[0]){
                        var next = getNextTabElement(cell);
                        if (next==null || !isChild(next, table)) {
                            //
                        } else {
                            processTab(element);
                        }
                    } else {
                        processTab(element);
                    }
                } else{
                    processTab(element);
                }
            }
        }
        //Left
        case 37:{
            var cell=getCell(element);
            if (cell){
                if ((event.ctrlKey) || (event.altKey)){
                    var row=getRowByCell(cell);
                    var cellLocation = findLocationByCell(cell);
                    var table = getTableByCell(cell);
                    table.handler.editCell(cellLocation[0], cell.cellIndex == 0 ? 0 : cell.cellIndex - 1);
                }
            }
            break;
        }
        //Right
        case 39:{
            var cell=getCell(element);
            if (cell){
                if ((event.ctrlKey) || (event.altKey)){
                    var row=getRowByCell(cell);
                    var cellLocation = findLocationByCell(cell);
                    var table = getTableByCell(cell);
                    table.handler.editCell(cellLocation[0], cell.cellIndex == row.cells.length - 1 ? row.cells.length - 1 : cell.cellIndex + 1);
                }
            }
            break;
        }
        //Down
        case 40:{
            if ((element.tagName != "TEXTAREA" && element.tagName != "SELECT") || event.shiftKey || event.ctrlKey || event.altKey){
                var cell=getCell(element);
                if (cell){
                    var row=getRowByCell(cell);
                    var tbody=getTBodyByCell(cell);
                    var rowIndex = findIndexFormArray(row, tbody.rows);

                    if (rowIndex + 1 < tbody.rows.length){
                        getTableByRow(row).handler.editCell(rowIndex + 1, findIndexFormArray(cell, row.cells));
                    }
                }
                event.returnValue=false;
            } else if (element.tagName != "SELECT"){
                element.click();
            }
            break;
        }
        //Up
        case 38:{
            if ((element.tagName != "TEXTAREA" && element.tagName != "SELECT") || event.shiftKey || event.ctrlKey || event.altKey){
                var cell=getCell(element);
                if (cell){
                    var row=getRowByCell(cell);
                    var tbody=getTBodyByCell(cell);
                    var rowIndex = findIndexFormArray(row, tbody.rows);

                    if (rowIndex - 1 >= 0){
                        getTableByRow(row).handler.editCell(rowIndex - 1, findIndexFormArray(cell, row.cells));
                    }
                }
                event.returnValue=false;
            }
            break;
        }
        //Home
        case 36:{
            var cell=getCell(element);
            if (cell){
                if ((event.ctrlKey) || (event.altKey)){
                    var cellLocation = findLocationByCell(cell);
                    var table = getTableByCell(cell);
                    table.handler.editCell(cellLocation[0], 0);
                }
            }
            break;
        }
        //End
        case 35:{
            var cell=getCell(element);
            if (cell){
                if ((event.ctrlKey) || (event.altKey)){
                    var row=getRowByCell(cell);
                    var cellLocation = findLocationByCell(cell);
                    var table = getTableByCell(cell);
                    table.handler.editCell(cellLocation[0], row.cells.length - 1);
                }
            }
            break;
        }
        //Del
        case 46:{
            if (event.ctrlKey){
                var cell=getCell(element);
                if (cell){
                    var table = getTableByCell(cell);
                    table.handler.deleteRow();
                }
            }
            break;
        }
        //Insert
        case 45:{
            var cell=getCell(element);
            if (cell){
                var table = getTableByCell(cell);
                table.handler.appendRow();
            }
            break;
        }
        //ESC
        case 27:{
            var cell=getCell(element);
            if (cell){
                var table = getTableByCell(cell);
                table.handler.stoppingEdit(true);
            }
            break;
        }
    }
}

/**
 * Event Object
 */
function Event(inSrcElement, inType, inData){
    this.srcElement = inSrcElement;
    this.returnValue = true;
    this.type = inType;
    this.data = inData;
}

function UpperCaseHandler(){
    if (event.keyCode > 96 && event.keyCode < 123){
        event.keyCode = event.keyCode - 32;
    }
}

function LowerCaseHandler(){
    if (event.keyCode > 64 && event.keyCode < 90){
        event.keyCode = event.keyCode + 32;
    }
}

function NumberKeyHandler(){
    if ((event.keyCode > 47 && event.keyCode < 58) || event.keyCode == 46 || event.keyCode == 43 || event.keyCode == 45){
    } else {
        event.keyCode = 0;
    }
}

function checkString(obj){
    if (obj.notnull == "true" && obj.value == ""){
        obj.className = "cssTextError";
    } else {
        obj.className = "cssTextOk";
    }
}

function checkDate(obj){
    if (obj.notnull == "true" && obj.value == ""){
        obj.className = "cssTextError";
    } else {
        obj.className = "cssTextOk";
    }
}

function checkNum(obj,integral,decimal){
    if (obj.notnull == "true" && obj.value == ""){
        obj.className = "cssTextError";
    } else {
        if(typeof integral != "undefined" && typeof decimal != "undefined"){
            var result = NumberHandler(obj.value, integral, decimal);

            if (_INVALID_VALUE == result){
                obj.className = "cssNumTextError";
            } else {
                obj.className = "cssNumTextOk";
            }
        }
    }
}

function NumberHandler(sValue, integerDigits, fractionDigits){
    if (sValue.length > 0){
        var sPrefix="";
        var sTemp=sValue.charAt(0);
        if (sTemp=="+" || sTemp=="-") {
            sPrefix=sTemp;
            sValue=sValue.replace(/^[\+-]/,"");
        }

        sValue=sValue.replace(/^0+\./,"^.");
        sValue=sValue.replace(/^0+/,"");
        sValue=sValue.replace(/^\^\./,"0.");

        var regNum;
        if (fractionDigits == 0){
            regNum=new RegExp("^\\d{0," + integerDigits + "}$");
        } else {
            regNum=new RegExp("^\\d{0," + integerDigits + "}\\.?\\d{0,"+fractionDigits+"}$");
        }

        if (!regNum.test(sValue)){
            return _INVALID_VALUE;
        }

        sValue=sValue.replace(/^\./,"0.");
        sValue=sValue.replace(/\.$/,".0");

        sValue=sPrefix+sValue;
    }

    return sValue;
}

function TimeHandler(sValue){
    var result = null;

    if (sValue != null && sValue.length > 0){
        var regNum = new RegExp("^\\d{4}$");

        if (!regNum.test(sValue)){
            result = _INVALID_VALUE;
        } else {
            var sHour = sValue.substring(0, 2);
            var sMin = sValue.substring(2, 4);

            if (parseInt(sHour) > 23 || parseInt(sMin) > 59){
                result = _INVALID_VALUE;
            } else {
                result = sValue;
            }
        }
    } else {
        result = sValue;
    }

    return result;
}

function DateTimeKeyHandler(){
    if (event.keyCode > 47 && event.keyCode < 58){
    } else {
        event.keyCode = 0;
    }
}

function DateHandler(sValue, sMinDate, sMaxDate){
    if (sValue.length > 0){
        sValue=sValue.replace(/\\D/g,"");

        if (sValue.length == 2){
            var oDate=new Date();
            sValue = oDate.getFullYear().toString() + getDbNum(oDate.getMonth()+1) + sValue;
        }

        if (sValue.length == 4){
            var oDate=new Date();
            sValue = oDate.getFullYear().toString() + sValue;
        }

        var regDate=new RegExp("^\\d{8}$");
        if (!regDate.test(sValue)) {
            return _INVALID_VALUE;
        }

        var iTempYear=parseInt(sValue.substring(0, 4));
        var iTempMonth=parseInt(sValue.substring(4, 6).replace(/^0/, ""))-1;
        var iTempDay=parseInt(sValue.substring(6, 8).replace(/^0/, ""));

        var arrDate = ([iTempYear, getDbNum(iTempMonth + 1), getDbNum(iTempDay)]);

        var oRealDate=new Date(iTempYear,iTempMonth,iTempDay);
        if (oRealDate.getMonth()!=iTempMonth || oRealDate.getDate()!=iTempDay) {
            return _INVALID_VALUE;
        }

        if (sMaxDate!=null) {
            var arrMaxDate=getRealDate(sMaxDate);
            if (getDateInt(arrDate)>getDateInt(arrMaxDate)) return _INVALID_VALUE;
        }

        if (sMinDate!=null) {
            var arrMinDate=getRealDate(sMinDate);
            if (getDateInt(arrDate)<getDateInt(arrMinDate)) return _INVALID_VALUE;
        }

        return arrDate.join("-");
    } else {
        return sValue;
    }
}

function getRealDate(sRange){
    var arrRange;
    if (sRange=="today") {
        var oDate=new Date();
        arrRange=new Array((oDate.getFullYear()).toString(),oDate.getMonth()+1,oDate.getDate());
    } else {
        arrRange=sRange.split("-");
    }

    arrRange[1]=getDbNum(arrRange[1]);
    arrRange[2]=getDbNum(arrRange[2]);
    return arrRange;
}

function getDbNum(iNum){
    var sNum=iNum.toString();
    if (sNum.length==1) {
        return ("0"+sNum);
    } else {
        return sNum;
    }
}

function getDateInt(arrRange){
    return (parseInt(arrRange.join("")));
}

function roundNumber(sValue, fractionDigits){
    return Math.round(sValue * Math.pow(10, fractionDigits)) / Math.pow(10, fractionDigits);
}

function InitBodyHandler(){
    var tables = document.body.getElementsByTagName("TABLE");
    if (tables != null && tables.length > 0){
        for (var i=0; i < tables.length; i++){
            if (tables[i].className == "datatable"){
                tables[i].boundModel();
            }
        }
    }

    if (typeof window.bodyInit != "undefined"){
        window.bodyInit();
    }

    if (tables != null && tables.length > 0){
        for (var i=0; i < tables.length; i++){
            if (tables[i].className == "datatable"){
                tables[i].handler.init();
            }
        }
    }
}

function getLocation(component){
    var top = component.offsetTop;
    var left = component.offsetLeft;

    while(component = component.offsetParent){
        top += component.offsetTop;
        left += component.offsetLeft;
    }

    return ([top, left]);
}

function comboboxSelect(){
    var dataLine = getParentByTagName(event.srcElement, "TR");
    window._ComboBoxPopup.srcElement.handler.selectValue(dataLine);
    window._ComboBoxPopup.style.display = "none";
}

function sleep(time){
    var startTime = (new Date()).getTime();
    while(true){
        if ((new Date()).getTime() - startTime > time){
            break;
        }
    }
}
