﻿//dCombo object (inherit from dhtmlXCombo)
//dependant: dhtmlxCombo

dCombo.prototype = {};
dCombo.prototype.constructor = dCombo;
dCombo.xInstances = [];

//dCombo.xInstances = new Array();   //static member
//dCombo.xInstanceCnt = 0;           //static member

function dCombo(CntrName,ObjName) {

    var cntr = document.all(CntrName);
    var width = 200;
    if (cntr) { width = (cntr.style.width) ? cntr.style.width : 200; }
    
    var obj = new dhtmlXCombo(CntrName, ObjName, width);

    dCombo.xInstances[ObjName] = obj;
    dCombo.xInstanceCnt++;

	for (var c in dCombo.prototype)
		if (typeof (dCombo.prototype[c]) == "function" || typeof (dCombo.prototype[c])  == "object" )
			obj[c]=dCombo.prototype[c];

    var options = (arguments[2]) ? arguments[2] : null;
    if (options) obj.xInit(options);
    
    obj.attachEvent("onChange", function(){ gDocModified=true; });    
    obj.attachEvent("onKeyPressed", function(keycode){ 
        if (keycode==13) {
            mf(obj.DOMelem_input);
        }
    });    

    return obj;
    
};


/*---------------------------------------Helper Properties + Methods---------------------------------------*/

dCombo.prototype.focus = function() {
    this.DOMelem_input.focus();
};

dCombo.prototype.FilterMode = {
    None: 0,
    Simple: 1,
    DataBound: 2,
    EventBound: 3
};

dCombo.prototype.xInit = function(oInfo) {

    this.xId = oInfo.id;
    this.xFilter = oInfo.filter;
        
    if (oInfo.data) {
        this.addOption(oInfo.data);
        
        if (oInfo.selectedIndex) {
            this.selectOption(oInfo.selectedIndex, true, true);
        }
    }
    
    if (oInfo.readOnly) this.readonly(true,true);
    
    if (oInfo.filter) {
    
        switch (oInfo.filter) {
            case this.FilterMode.Simple:
                this.enableFilteringMode(true);
                break;
                
            case this.FilterMode.DataBound:
                this.enableFilteringMode(true,document.URLUnencoded + "?flag=POST_AC&etgt="+oInfo.id,true);
                break;
                
            case this.FilterMode.EventBound:
                this.enableFilteringMode(true,document.URLUnencoded + "?flag=POST_AC&etgt="+oInfo.id,true);
                break;
                
            default:
                break;
        }
    }
    
    if (oInfo.nullText) {}

};

dCombo.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;
        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;
    }
    
};

dCombo.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;
    }
    
};



/***********************************************************/
/*                                                         */
/*  OVERRIDE                                               */
/*                                                         */
/***********************************************************/

/**
*     @desc: load list of options from XML
*     @param: url - (string) xml url
*     @type: public
*     @topic: 0
*/
dhtmlXCombo.prototype.loadXML = function(url,afterCall){
    this._load=true;
    this.callEvent("onXLS",[]);
    if (this._prs)
     	for (var i=0; i<this._prs.length; i++)
     		url+=[getUrlSymbol(url),escape(this._prs[i][0]),"=",escape(this._prs[i][1])].join("");         
    if ((this._xmlCache)&&(this._xmlCache[url])){
        this._fillFromXML(this,null,null,null,this._xmlCache[url]);
        if (afterCall) afterCall();
    }
    else{
        var xml=(new dtmlXMLLoaderObject(this._fillFromJSON,this,true,true));
        if (afterCall) xml.waitCall=afterCall;
        xml._cPath=url;
        xml.loadXML(url);
    }
};


/**
*     @desc: on JSON load handler
*     @type: private
*     @topic: 0
*/
dhtmlXCombo.prototype._fillFromJSON = function(obj,b,c,d,xml){
    var jObj = eval("(" + xml.xmlDoc.responseText + ")");

    xml.xmlDoc.responseXML.loadXML(json2xml(jObj, "  "));
    obj._fillFromXML(obj,b,c,d,xml);

};

// PATCHED BECAUSE BACKSPACE WILL NOT OPEN SELECT BOX
dhtmlXCombo.prototype._onKeyB = function(ev)
{
 if (ev=="40"){  //down
    var z=this.selectNext(1);
 } else if (ev=="38"){ //up
    this.selectNext(-1);
 } else{
    // ADDED BY WOO JOO
    this._activeMode=true;
    // ==================
    this.callEvent("onKeyPressed",[ev])
    if (this._filter) return this.filterSelf((ev==8)||(ev==46));
    for(var i=0; i<this.optionsArr.length; i++)
       if (this.optionsArr[i].data()[1]==this.DOMelem_input.value){
//                  ev.cancelBubble=true;
          this.selectOption(i,false,false);
          return false;
          }
    this.unSelectOption();
 }
 return true;
}

