﻿/* --------------------------------------- Custom Validation --------------------------------*/

dhtmlXGridObject.prototype.validateCell = function (id, ind, rule, value) {
    rule = rule || (this._validators.data[ind] || this.cells(id, ind).getAttribute("validate"));
    value = value || this.cells(id, ind).getValue();
    if (!rule) return;
    if (!dhtmlxValidation.checkValue(value, rule.split(","), this, id, ind)) {
        if (this.callEvent("onValidationError", [id, ind, value, rule])) {
            this.cells(id, ind).cell.className += " dhtmlx_validation_error"
        };
        return false
    } else {
        this.callEvent("onValidationCorrect", [id, ind, value, rule]);
    }
    return true
};

dhtmlxValidation.checkValue = function(value, rule, grid, rId, cInd) {
    if (!rule) return;
    if (typeof rule != "string" && rule.length) {
        var final_res = true;
        for (var i = 0; i < rule.length; i++) {
            if (rule[i] == '' || rule[i] == null) { continue; }
            var res = this.checkValue(value, rule[i], grid, rId, cInd);
            final_res = final_res && res
        };
        return final_res
    };
    if (!this["is" + rule]) alert("Incorrect validation rule: " + rule);
    return this["is" + rule](value, grid, rId, cInd)
};


dGrid.prototype._parseValidation = function(vInfo) {

    var vArr = [];
    var vObj = {};
    var vTmpStr = [];
    var j = 0;
    var k = 0;
    
    for (var i=0; i<vInfo.length; i++) {
        k = 0;
        vTmpStr = [];
        vObj = this._getValidator(vInfo[i]);
        this.xColData(i)['DT'] = vInfo[i];
        this.xColData(i)['DTO'] = vObj;
        
        vTmpStr[k++] = (vObj) ? vObj.fn : '';
        if (this.xColData(i)['isCode']&&this.xColData(i)['isCode']==true) { vTmpStr[k++] = "CODE"; }
        if (this.xColData(i)['V']) { vTmpStr[k++] = this.xColData(i)['V']; }
        if (vTmpStr.length>0) { vArr[j++] = vTmpStr.join(","); }
    }

    return vArr;

};

dGrid.prototype._getValidator = function(vStr) {

    if(!vStr) {return null;}

    var validatorFormat = /^(\w+)\((.*)\)$/;
    var validatorParsed = vStr.match(validatorFormat);
    var validatorFn;
    var validatorArgs = [];

    if (validatorParsed) {
        validatorFn = validatorParsed[1];
        validatorArgs = validatorParsed[2].split(',');
        return {fn: validatorFn, args: validatorArgs};
    } else {
        return null;
    }

};

dGrid.prototype._mapAndValidate = function(val, cInd) {

    var vObj = this.xColData(cInd)['DTO'];
    
    var dataTypeFn = {};
    var dataTypeArgs = {};
    
    dataTypeFn = vObj.fn;
    dataTypeArgs = vObj.args.join(',');
    dataTypeArgs = dataTypeArgs.split(',');
    if (dataTypeArgs.length==0) { dataTypeArgs[0] = val; dataTypeArgs[1] = false; }
    else { dataTypeArgs.splice(0, 0, val, false); }

    return eval(dataTypeFn).apply(null,dataTypeArgs);

};

dhtmlxValidation.isN = function(val,grid,rId,cInd) {
    return grid._mapAndValidate(val, cInd);
};

dhtmlxValidation.isVC = function(val,grid,rId,cInd) {
    return grid._mapAndValidate(val, cInd);
};

dhtmlxValidation.isDT = function(val,grid,rId,cInd) {
    return grid._mapAndValidate(val, cInd);
};

dhtmlxValidation.isDTM = function(val,grid,rId,cInd) {
    return grid._mapAndValidate(val, cInd);
};

dhtmlxValidation.isTM = function(vala,grid,rId,cInd) {
    return grid._mapAndValidate(val, cInd);
};

dhtmlxValidation.isCODE = function(val,grid,rId,cInd) {

    var codeinfo = grid.xColData(cInd)['CodeInfo'];
    if (!codeinfo) { alert('Cannot validate code. Validation information is missing!'); return true; }
    codeinfo.gridRow = rId;
    
    return grid._validate_code(codeinfo);

};

dGrid.prototype._validate_code = function(codeinfo) {

    if (!codeinfo) { return true; }

    var row = codeinfo.gridRow;

    // clear description fields
    if (codeinfo.othdesc) {
        var descfield;
        for (var i=0; i< codeinfo.othdesc.length; i++) {
            descfield = trim(codeinfo.othdesc[i]);
            if (descfield!='') this.matrix(row, descfield).setValue('');
        }
    }

    if (this.matrix(row, codeinfo.keycond).getValue() == '') {return true; }

    // check if pre conditions have been input
    if (codeinfo.precond) {
        var precond;
        for (var i=0; i< codeinfo.precond.length; i++) {
            precond = codeinfo.precond[i];
            if (precond!='' && this.matrix(row, precond).getValue()=='') {
                alert(this.getColumnLabel(this.getColIndexById(precond)) + ' is required!');
                this.matrix(row, codeinfo.keycond).setValue('');
                this.selectCell(row, this.getColIndexById(precond), false, false, this.isEditable, true);
                return false;
                break;
            }
        }
    }

    var pb = new PostBox('POST_CALL');
    
    var codedata = {
        keycond: '',
        precond: [],
        optcond: []
    };
    
    codedata.keycond = this.matrix(row, codeinfo.keycond).getValue();
    
    if (codeinfo.precond) {
        for (var i=0; i<codeinfo.precond.length; i++) {
            codedata.precond[i] = this.matrix(row, codeinfo.precond[i]).getValue();
        }
    } else {
        // TODO: fix this -> temporary solution because server-side method cannot accept empty array
        codedata.precond[0] = '';
    }

    if (codeinfo.optcond) {
        for (var i=0; i<codeinfo.optcond.length; i++) {
            codedata.optcond[i] = this.matrix(row, codeinfo.optcond[i]).getValue();
        }
    } else {
        // TODO: fix this -> temporary solution because server-side method cannot accept empty array
        codedata.optcond[0] = '';
    }

    if (codeinfo.codeid == 'CustomDef') {
        pb.AddCalls(codeinfo.codeid + '_Check', codeinfo.dbFields, codeinfo.dbTables, codeinfo.dbWhere, codedata.keycond, codedata.precond, codedata.optcond);
    } else {        
        pb.AddCalls(codeinfo.codeid + '_Check', codedata.keycond, codedata.precond, codedata.optcond);
    }

    pb.Sync = true;
    
    var retval = pb.dPostGridCodeValidate(codeinfo);
    
    if (retval == 'null') {
        //wg_search_code(codeinfo);
        //return false;
        window.event.cancelBubble = true;
        return this._search_code(codeinfo);
    } else {
        if (codeinfo.othdesc) {
            for (var i=0; i<codeinfo.othdesc.length; i++) {
                this.matrix(row, trim(codeinfo.othdesc[i])).setValue(retval[i+1]);
            }
        }
        return true;
    }
    
};

dGrid.prototype._search_code = function(codeinfo){
    
    if (!codeinfo) { return true; }

    var codedata = {
        keycond: '',
        precond: [],
        optcond: [],
        desclist: []
    };
    
    var row = codeinfo.gridRow;

    // check if pre conditions have been input
    if (codeinfo.precond) {
        var precond;
        for (var i=0; i< codeinfo.precond.length; i++) {
            precond = codeinfo.precond[i];
            if (precond!='' && this.matrix(row, precond).getValue()=='') {
                alert(this.getColumnLabel(this.getColIndexById(precond)) + ' is required!');

                // clear key field
                this.matrix(row, codeinfo.keycond).setValue('');

                // clear description fields
                if (codeinfo.othdesc) {
                    var descfield;
                    for (var i=0; i< codeinfo.othdesc.length; i++) {
                        descfield = trim(codeinfo.othdesc[i]);
                        if (descfield!='') this.matrix(row, descfield).setValue('');
                    }
                }

                this.selectCell(row, this.getColIndexById(precond), false, false, this.isEditable, true);
                return false;
                break;
            }
        }
    }
    
    codedata.keycond = this.matrix(row, codeinfo.keycond).getValue();

    if (codeinfo.precond) {
        for (var i=0; i<codeinfo.precond.length; i++) {
            codedata.precond[i] = this.matrix(row, codeinfo.precond[i]).getValue();
        }
    } else {
        // TODO: fix this -> temporary solution because server-side method cannot accept empty array
        codedata.precond[0] = '';
    }

    if (codeinfo.optcond) {
        for (var i=0; i<codeinfo.optcond.length; i++) {
            codedata.optcond[i] = this.matrix(row, codeinfo.optcond[i]).getValue();
        }
    } else {
        // TODO: fix this -> temporary solution because server-side method cannot accept empty array
        codedata.optcond[0] = '';
    }

    if (codeinfo.othdesc) {
        for (var i=0; i<codeinfo.othdesc.length; i++) {
            codedata.desclist[i] = this.matrix(row, codeinfo.othdesc[i]).getValue();
        }
    } else {
        // TODO: fix this -> temporary solution because server-side method cannot accept empty array
        codedata.desclist[0] = '';
    }
    
    var param = [codeinfo,codedata,window];

    var codeFile = codeinfo.codefile || '/common/codemaster.aspx';
    
    var retval = window.showModalDialog(codeFile+"?CODEID="+codeinfo.codeid, param,"dialogWidth:340px;dialogHeight:400px;resizable:no;help:no;status:no;scroll:no;");
    if (retval != null){
        this.matrix(row, codeinfo.keycond).setValue(retval[0]);
        
        if (codeinfo.othdesc) {
            for (var i=0; i<codeinfo.othdesc.length; i++) {
                this.matrix(row, trim(codeinfo.othdesc[i])).setValue(retval[i+1]);
            }
        }
        
        return true;
    } else {
        return false;
    }
    
};
