﻿var JsonEngine = null;
var UUID = 1;
var iError = 0;
var bUserChange = false;
var getJson = function(){
    if(JsonEngine == null){
        Json.BindContainer = new Object();
        Json.ContainerType = new Object();
        JsonEngine = new Json.Bind();
        Json.Dao = new Json.Dao();
        if(Json.Dao.searchByList("Json_Config_Info"))
            Json.Config = Json.Dao.searchByList("Json_Config_Info");
        else
            Json.Config = {};
     }
    return JsonEngine;
}
var Json = {
    //保存bindList,bindPanel的容器
    BindContainer : null,
    //类型child,pnl,grd,prm,upd
    ContainerType : null,
    Dao : null,
    Config : null,
    ErrorMsg:"",
    Submit:function(id,parm){
        bUserChange = false;
        if(typeof(SubmitEx) !="undefined"){
            if(!SubmitEx()) return;
        }
        if(document.getElementById(id) && Json.Config.OpType !="Search"){
            UTIL.DisableButton(document.getElementById(id));
            //document.getElementById(id).disabled = true;
            //document.getElementById(id).className = "disabled";
        }
        
        Json.Dao.ReflashDBInput("Json_Config_Info",Json.Config);
        __doPostBack(id,parm);
    }
};
Json.Util={
    //PUBLIC
    getString : function(o){//o - JSON
        var reg = new RegExp("Date\\((\\d{1,})");
        var r = [];
        //if(o && typeof(o.v)!="undefined") o=o.v;//client data field
        if(o==null) return "null";        
        if(typeof o =="string"){ 
			if(o.match(reg)){
			    return o.match(reg)[1];
			}
            return "\""+o.replace(/([\'\"\\])/g,"\\$1").replace(/(\n)/g,"\\n").replace(/(\r)/g,"\\r").replace(/(\t)/g,"\\t")+"\"";
        }
        if(typeof o == "object"){
            if(!o.sort){
                r[0]="{"
                var isNull = true;
                for(var i in o){
                    isNull = false;
                    r[r.length]=i;
                    r[r.length]=":";
                    r[r.length]=this.getString(o[i]);
                    r[r.length]=",";
                }
                if(isNull){
                    r[r.length]="}";
                }else{
                    r[r.length-1]="}";
                }
            }else{
                r[0]="["
                var isNull = true;
                for(var i =0;i<o.length;i++){
                    isNull = false;
                    r[r.length]=this.getString(o[i]);
                    r[r.length]=",";
                }
                if(isNull)
                    r[r.length]="]"
                else
                    r[r.length-1]="]"
            }
            return r.join("");
        }
        return o.toString();
    }, 
    getCellText : function(key,grid){
        var oGrid = Json.BindContainer[grid];
        if(oGrid && oGrid.Count>0){
            var obj = oGrid.GetCurrent();
            if(obj){
                return obj[key];
            }
            else{
                window.alert(UTIL.getMessage('CLTMSG_NO_SELECTED_ROW'));
	            return null;
	        }            
        }
        else
            window.alert(UTIL.getMessage('CLTMSG_NO_RECORD'));
	    
    },   
	clone : function(old)
    {
	    if(typeof(old) != 'object') return old;
	    if(old == null) return old;
	    if(old.sort){
	        var arr = new Array();
	        for(var i=0;i<old.length;i++){
	            arr.push(this.clone(old[i]))
	        }
	        return arr;
	    }else{
	        var newO = new Object();
	        for(var i in old)
		        newO[i] = this.clone(old[i]);
	        return newO;
	    }
    },
    unLoad:function(){
        window.focus();
        if(bUserChange){
            UTIL.getEvent().returnValue = "Are you sure to lost changes?"
        }
    },
    userChange:function(ctl){
        bUserChange = true;
    },
    //序列化log
    logToString:function(nLog,oLog){
        var sLog = "";
        if(!oLog || nLog.State==4) oLog = new Object();
        for(var i in nLog){
            if(i=="State" && nLog[i] != 2){ 
                sLog += "%Modify%";continue;
            }
            if(nLog[i] != oLog[i]){
                var n = nLog[i];
                var o = oLog[i];
                if(!n) n = "";
                if(!o) o = "";
                sLog += i+" from:"+ o +" to:"+  n + "; ";
            }
        }
        return sLog;
    }
}

Json.BindObject=function(oBindObject,type){
    var SELF = this;
    SELF.Control = oBindObject;
    SELF.BindName;
    SELF.Error;
    var _isModify = false;
    var _regex = new RegExp("^\\w{2,5}?_(\\w*)_((\\w*\\d{1,3})*)$");
    var _t = type;//tagName
    var _o;//old value;
    var _v;//validate
    var _d =1;//tag
    var _f;
    var _N //name
    var _e//扩展，现在e4为Log
    var _arrMId
    var _init = function(){
        if(SELF.Control==null) return;
        var id = SELF.Control.getAttribute("ID")
        if(id){
            _arrMId = id.match(_regex);
            if(_arrMId){
                SELF.BindName = _arrMId[1];
                if(_arrMId[2]){
                    var d = _getSuffix(_arrMId[2],"D");
                    if(d)
                        _d = d;
                    else
                        _d = 1;
                    
                    var v = _getSuffix(_arrMId[2],"V");
                    if(v){
                        _v = v;
                        if((v&4)>0){
                            SELF.Control.disabled = true;
                            SELF.Control.className = "disabled";
                        }
                        if((v&2)>0){
                            UTIL.addEventHandler(id,"keypress",UTIL.onlyNum);
                        }
                        
                        if((v&16)>0){
                            UTIL.addEventHandler(id,"keypress",UTIL.onlyInt);
                        }
                    }
                    
                    _e = _getSuffix(_arrMId[2],"E");
                }
            }
        }
        _f = SELF.Control.getAttribute("Format");
        setDisplayText();
        
        if(SELF.Control.tagName == "TEXTAREA"){
            var length = SELF.Control.getAttribute("Length");
            if(length && length>0){
                var areaValue;
                UTIL.addEventHandler(id,"keypress",function(){UTIL.maxLength(SELF.Control,length)});
                UTIL.addEventHandler(id,"keyup",function(){UTIL.checkLength(SELF.Control,length)});
            }
        }
        
        //UTIL.addEventHandler(id,"change",function(){Json.Util.userChange(SELF.Control)});
    };
    
    var setDisplayText = function(){//sibling's contentText
        if(SELF.Control.getAttribute('T'))//firfox
	        _N=SELF.Control.getAttribute('T');
	    if(!_N){
            var prevNode = SELF.Control.parentNode;
            if(prevNode.tagName == "TD"){
               prevNode = prevNode.previousSibling
               if(!prevNode)return _T=SELF.BindName;
            }else
                return _T=SELF.BindName
            if(!prevNode.hasChildNodes()) prevNode = prevNode.previousSibling;//FireFox, #TEXT node.
            if(prevNode && prevNode.hasChildNodes()){
                for(var i=0;i<prevNode.childNodes.length;i++){
                    var tmp = prevNode.childNodes[i];
                    if(tmp.tagName == "TD" || tmp.tagName =="SPAN"){
                        prevNode = tmp;
                    }
                }
                if(prevNode.childNodes[0] && prevNode.childNodes[0].hasChildNodes())//<span TEXT/>*
                    _N = prevNode.childNodes[0].innerHTML;
                else
                    _N = prevNode.innerHTML;
            }
        }
        if(!_N|| _N.length==0) _T=SELF.BindName;
    };
    
    var _getSuffix = function(s,fix){
        
        var r = new RegExp(fix+"(\\d{1,3})");
        var arr = s.match(r);
	    if(arr)
	        return arr[1];
	        
    }

    var _validate = function(obj){
        return true;
    }
    
    var _format = function(value){
        if(_f){
            return Format.F(value,_f);
        }else
            return value;
    }
    //验证是否合
    SELF.Validate = function(tag){
        if(!tag) tag=1;
        if(_arrMId){
            return tag&_d;
        }    
        return false;
    }


    SELF.Get=function(){
        var sValue="";
        switch(_t){
            case "INPUT":
                switch(SELF.Control.type){
	                case 'checkbox':
	                    sValue=SELF.Control.checked?'1':'0';
	                    if(typeof(GetCheckBoxValueEx) != "undefined" && typeof(GetCheckBoxValueEx(SELF.BindName,SELF.Control))!="undefined"){
	                        sValue=GetCheckBoxValueEx(SELF.BindName,SELF.Control);
	                    }
	                    break;
	                    case 'radio':
	                    sValue=SELF.Control.checked?'1':'0';
	                    if(typeof(GetCheckBoxValueEx) != "undefined" && typeof(GetCheckBoxValueEx(SELF.BindName,SELF.Control))!="undefined"){
	                        sValue=GetCheckBoxValueEx(SELF.BindName,SELF.Control);
	                    }
	                    break;
	                    case 'password':
	                    sValue=SELF.Control.value.trim()        
	                default:
	                    sValue=SELF.Control.value.trim();
	                    if((!SELF.Control.Upper) || !SELF.Control.Upper=="false")
	                    {
	                       if(!(SELF.Control.id && SELF.Control.id.indexOf("_MRN_") > 0))
	                            sValue = sValue.toUpperCase();
	                    }
	                    break;
	            }
                break;
            case "TEXTAREA":
            sValue = SELF.Control.value.trim().toUpperCase();
            break;
            case "TD":
            sValue = SELF.Control.innerHTML.trim();
            break;
            case "SPAN":
            sValue = SELF.Control.innerHTML.trim();
            break;
            case "SELECT":
            sValue=SELF.Control.value.trim().toUpperCase();
            break;
        }
        //add by linhc at 2010-09-08
        if(typeof(GetValueEx) != "undefined" && typeof(GetValueEx(SELF.BindName,SELF.Control,sValue))!="undefined"){
	      sValue=GetValueEx(SELF.BindName,SELF.Control,sValue);
	    }
	            
        if(sValue && sValue.length>0 && _validate(sValue)){
             sValue = sValue.toUpperCase() == "NULL"?"":sValue;
             sValue = _format(sValue);
        }
        if(sValue != _o)
            _isModify = true;
        else
            _isModify = false;
       
       if(sValue.length == 0){
           return null;
       }
       return sValue;
    };

    SELF.Set=function(sValue){
        if((!sValue && sValue!=0) || sValue.toString().toUpperCase() == "NULL") 
            sValue = "";
         else
            sValue = _format(sValue);
            
        sValue=sValue.toString();
        if((_v&4)>0 && (sValue.indexOf("1900")!=-1 || sValue.indexOf("0001")!=-1)){
            sValue = "";
        }
        _o = sValue;
        
        //add by linhc at 2010-09-08
        if(typeof(SetValueEx) != "undefined" && typeof(SetValueEx(SELF.BindName,sValue))!="undefined"){
          sValue =  SetValueEx(SELF.BindName,sValue);
        }
            
        switch(_t){
            case "INPUT":
                switch(SELF.Control.type){
                    case 'checkbox':
                        SELF.Control.checked=(sValue=='1' || sValue.n=='Yes')?true:false;
                        if(typeof(SetCheckBoxValueEx) != "undefined" && typeof(SetCheckBoxValueEx(SELF.BindName,sValue))!="undefined"){
                            SELF.Control.checked = SetCheckBoxValueEx(SELF.BindName,sValue)
                        }
                        break;
                    case 'radio':
                        if(typeof(SetCheckBoxValueEx) != "undefined" && typeof(SetCheckBoxValueEx(SELF.BindName,sValue))!="undefined"){
                            SELF.Control.checked = SetCheckBoxValueEx(SELF.BindName,sValue)
                        }
                        SELF.Control.checked=(sValue=='1' || sValue.n=='Yes')?true:false;
                        break;
                    default:
                        if(typeof(sValue)=="string")
                            SELF.Control.value = sValue.trim();
                        else
                            SELF.Control.value = sValue;
                        break;
                }
                break;
            case "TEXTAREA":
                SELF.Control.value = sValue;
                break;
            case "TD":
                SELF.Control.innerHTML = sValue;
                break;
            case "SPAN":
                SELF.Control.innerHTML = sValue;
                break;
            case "SELECT":
                var b = true;
                for(var i=0;i<SELF.Control.options.length;i++){
                    if(SELF.Control.options[i].value==sValue || SELF.Control.options[i].text==((!sValue &&  sValue!=0)?"":sValue.toString())){//grid keep dispText only
                        SELF.Control.selectedIndex=i;
                        b = false;
                        break;
                    }
                }
                if(b)SELF.Control.selectedIndex = 0;
                break;
        }
    };
    SELF.GetName = function(){
        return _N;
    };
    SELF.GetV = function(){
        return _v;
    };
    SELF.Cancel=function(tag){
        //added on 2009-2-17
        if(_o.State!=2)
            SELF.Set(_o,tag);
        return _o;
    }

    SELF.IsModify=function(tag){
        SELF.Get(tag);
        return _isModify;
    }
    SELF.isLog = function(){
        if(_e && (_e&4)>0)
            return true; 
    }

    _init();
}

Json.QueryInfo=function(oQueryInfo,bindName){
    var SELF = this;
    var BindContainer = new Object();
    SELF.Current = new Object();
    SELF.BindName = bindName;
    SELF.Control = oQueryInfo;
    
    
    var Init = function(){
        var o = SELF.Control;
        if(o){
            InitObject(o,"INPUT");
            InitObject(o,"TEXTAREA");
            InitObject(o,"TD");
            InitObject(o,"SPAN");
            InitObject(o,"SELECT");
        }
    };
    
    var InitObject=function(o,type){
        var arrObj = o.getElementsByTagName(type);
        for(var i=0;i<arrObj.length;i++){
            var oChild = arrObj[i];
            var id = oChild.getAttribute("ID");
            if(id){
                var bindObject = new Json.BindObject(oChild,type);
                if(bindObject.Validate()){
                    if(!BindContainer[1])
                        BindContainer[1] = new Object();
                    BindContainer[1][id] = bindObject;
                }else
                    bindObject = null;
            }
        }
    };
    
    SELF.Save=function(page,PageRow){
        if(page)
            SELF.Current.StartRowIndex = (page-1)*PageRow;
            
        SELF.Current.MaximumRows = PageRow;
        
        for(var bindObjID in BindContainer[1]){
            var bindObj = BindContainer[1][bindObjID];
            var value = bindObj.Get()
            if(!SELF.Current.Parameters)
                SELF.Current.Parameters = new Object();
            SELF.Current.Parameters[bindObj.BindName] = value;
        }
        return SELF.Current;
    };
    
    SELF.Load=function(obj){
        var bLog = false;
        if(!obj){
            if(!SELF.Param){
                obj = Json.Dao.searchByList(this.BindName);
                bLog = true;
            }
            if(!obj) return;
        }
        SELF.Current = obj;
        if(!SELF.Current.Parameters)
            return;
        for(var bindObjID in BindContainer[1]){
            var bindObj = BindContainer[1][bindObjID];
            bindObj.Set(SELF.Current.Parameters[bindObj.BindName]);
        }
    };
    
    SELF.Validate = function(bAlert){
        return Json.Validate.validate(BindContainer,1,bAlert);
    };
    
    Init();
}
/*
**oBindPanel，页面有oBindPanel属性的控件;
**bindName,控件所绑定的数据
**data，初使化时的数据
*/
Json.BindPanel=function(oBindPanel,bindName){
    var SELF = this;
    var BindContainer = new Object();
    var Current = new Object();
    var BindName = bindName;
    var bShowError = false;
    SELF.Control = oBindPanel;
    SELF.ClassTemp; 
    
    var bLog = new Object();//需要填写log的bindname
    var oLog = new Object();//保存log的旧值
    var nLog = new Object();//保存log的新值
    
    var Init = function(){   
        var bind = new Object();
        if(BindName.indexOf(";") != -1){
            var arr = BindName.split(";");
            var tag = 1;
            for(var i=0;i<arr.length;i++){
                if(i == 0){
                    bind[1] = arr[0];
                    InitObj(SELF.Control,1);
                    
                    logState(1,arr[0])
                    continue;
                }
                tag = tag * 2;
                bind[tag] = arr[i];
                InitObj(SELF.Control,tag);
                
                logState(tag,arr[i])
            }
        }else{
            bind[1] = BindName;
            InitObj(SELF.Control,1);
            
            logState(1,BindName)
        }
        
        BindName = bind;
        
        InitSib(SELF.Control.getAttribute("Sibling"));
    };
    
    var logState = function(tag,bindName){
        var r = new RegExp("E(\\d{1,3})$");
        var arr = bindName.match(r);
        
        if(arr!=null && (arr[1]&4)>0){
            bLog[tag] = true;
        }
    }
    //设置State
    SELF.SetState = function(tag,State){
        if(!tag) tag = 1;
        if(State){
            Current[tag].State = State;
            return;
        }
        if(Current[tag].State){
            if(Current[tag].State == 2)
                Current[tag].State = 3;
        }else{
           var _rg = new RegExp("^[a-z]{3}");
           if(BindName[tag].match(_rg)[0]!="prm"){
               Current[tag].State=4;
               if(!Current[tag].UUID){
                   Current[tag].UUID = UUID;
                   UUID++; 
               }
               var _regex = new RegExp("^\\w{2,5}?_(\\w*)_((\\w*\\d{1,3})*)$");
               var arrM = BindName[tag].match(_regex);
               Current[tag].GetTableName = arrM[1];
           }
        }
    }
    //获得兄弟结点的值
    //sib = Sibling属性 sibling的格式为　sibling结点ＩＤ：Ｄ值;sibling结点ＩＤ：Ｄ值
    var InitSib = function(sib){
        if(!sib)return;
        var arr = sib.split(";");
        for(var i=0;i<arr.length;i++){
            var sib = arr[i];
            if(sib.indexOf(":")==-1){
                InitObj(document.getElementById(sib));
            }else{
                var arrSib = sib.split(":");
                InitObj(document.getElementById(arrSib[0]),arrSib[1])
            }
        }
    }
    //
    var InitObj = function(ctl,tag){
        if(!ctl) return;
        InstanceObj(ctl,"INPUT",tag);
        InstanceObj(ctl,"TEXTAREA",tag);
        InstanceObj(ctl,"TD",tag);
        InstanceObj(ctl,"SPAN",tag);
        InstanceObj(ctl,"SELECT",tag);
    }
    //实例化BindObject
    var InstanceObj=function(o,type,tag){
        var arrObj = o.getElementsByTagName(type);
        for(var i=0;i<arrObj.length;i++){
            var oChild = arrObj[i];
            var id = oChild.getAttribute("ID");
            if(id){  
                var bindObject = new Json.BindObject(oChild,type);
                if(bindObject.Validate(tag)){
                    if(!BindContainer[tag])BindContainer[tag] = new Object();
                    BindContainer[tag][id] = bindObject;
                    
                }else
                    bindObject = null;
            }
        }
    };

    SELF.Load=function(obj,tag,initLog){
        if(!initLog)
            initLog = false;
        if(tag!=0 && !tag) tag =1;

        if(!obj){
            obj = Json.Dao.searchByList(BindName[tag]);
            if(!obj) return; 
            
            if(obj.OldObject){
                oLog[tag] = obj.OldObject;
            } else{
                initLog = true;
            }
        }
        if(initLog==true && bLog[tag]){
            oLog[tag] = new Object();
        }
        for(var bindObjID in BindContainer[tag]){
            var bindObj = BindContainer[tag][bindObjID];
            bindObj.Set(obj[bindObj.BindName],tag);
            if(initLog && bindObj.isLog()){
                oLog[tag][bindObj.BindName] = obj[bindObj.BindName];
            }
        }
        
        Current[tag] = Json.Util.clone(obj);
        if(initLog){
            Current[tag].OldObject = oLog[tag];
        }
        //用户自定义的Load方法
        if(typeof(LoadEx)!="undefined")
            LoadEx(SELF.Control.id,obj,tag);
        if(obj.State){
            SELF.ShowError(obj.StateDesc);
        }   
        
    };
    SELF.GetLogObject=function(tag){
        if(!tag) tag =1;
        if(!oLog[tag])oLog[tag] = new Object();
        for(var bindObjID in BindContainer[tag]){
            var bindObj = BindContainer[tag][bindObjID];
            var value = bindObj.Get(tag);
            
            if(bindObj.isLog()){
                oLog[tag][bindObj.BindName] = value;
                bLog[tag] = true;
            }
        }
        
        return oLog;
    }
    SELF.Save=function(tag,bModify){
        if(!tag) tag =1;
        var initLog = false;
        if(bModify || SELF.IsModify(tag)){
            if(bLog[tag]) {
                initLog = true;
                nLog[tag] = new Object();
            }
            
            for(var bindObjID in BindContainer[tag]){
                var bindObj = BindContainer[tag][bindObjID];
                var value = bindObj.Get(tag);
                if(Current[tag])
                    Current[tag][bindObj.BindName] = value;
                else{
                    Current[tag] = new Object();
                    Current[tag][bindObj.BindName] = value;
                }
                
                if(initLog && bindObj.isLog()){
                    nLog[tag][bindObj.BindName] = value;
                }
            }
            SELF.SetState(tag);
            //设置更新时间,因为服务端找不一个合适的点来做这件事，所以暂时放在这里。
//            var d = new Date(); 
//            if(Json.Config.UserName){
//                Current[tag].LAST_UPDATE_USER = Json.Config.UserName;
//            }
//            Current[tag].LAST_UPDATE_DATE = Format.DateTime.formatDate(d,"y-MM-dd");
//            
//            var arrTime = new Array();
//            arrTime.push(d.getHours());
//            if(d.getMinutes().toString().length == 1){
//                arrTime.push("0");
//                arrTime.push(d.getMinutes().toString());
//            }else
//                arrTime.push(d.getMinutes().toString());
//                
//            Current[tag].LAST_UPDATE_TIME = arrTime.join("");
            
            if(SELF.GetCurrent(tag).StateDesc)
                Current[tag].StateDesc = null;
                
            if(initLog)
                nLog[tag].State = Current[tag].State;
        }
        if(initLog){
            Current[tag]["LogDesc"] = Json.Util.logToString(nLog[tag],oLog[tag]);
        }
        //用户自定义的Save方法
        if(typeof(SaveEx)!="undefined")
            Current[tag] = SaveEx(SELF.Control.id,SELF.GetCurrent(tag),tag);
        return SELF.GetCurrent(tag);
    };
    SELF.Cancel=function(tag){
        if(!tag) tag = 1;
        if(!SELF.GetCurrent(tag)) return null;
        if(!SELF.GetCurrent(tag).State) return null;
           
        var obj = Json.Dao.searchById(SELF.GetCurrent(tag));
        if(SELF.GetCurrent(tag).State == 4){
            SELF.Control.className = SELF.ClassTemp;
            SELF.ClassTemp = null;
            SELF.GetCurrent(tag).State = 10;
        }else{
            SELF.Load(obj.tag);
        }
        
    };
    SELF.IsModify=function(tag){
        if(!tag) tag=1;
        var bModify = false;
        if(this.GetCurrent(tag).State == 2){
            for(var bindObjID in BindContainer[tag]){
                var bindObj = BindContainer[tag][bindObjID];

                bModify = bModify || bindObj.IsModify(tag);
            }
        }else
            bModify = true;
        return bModify;
    };
    SELF.GetCurrent = function(tag){
        if(tag!=0 && !tag)tag = 1;
        if(tag == 0){
            return Current;
        }
		if(Current[tag])
			return Current[tag];
		else
			return new Object();
    };
    SELF.GetBindName = function(tag){
        if(tag!=0 && !tag)tag = 1;
        if(tag == 0){
            return BindName;    
        }
        return BindName[tag];
    };
    SELF.Validate = function(tag,bAlert){
        if(tag!=0 && !tag) tag=1;
        return Json.Validate.validate(BindContainer,tag,bAlert);
    };
    //显示Error
    SELF.ShowError=function(msg){
        if(msg && msg.length>0 && bShowError)
            Json.ErrorMsg = Json.ErrorMsg+msg+"\n";
    };
    //设置是否要进行错误显示
    SELF.BShowError=function(bShow){
        bShowError = bShow;
    }
    Init();
}

Json.BindList=function(oBindList,bindName){
    var SELF = this;
    var _id = oBindList.id;
    SELF.BindContainer = new Object();
    
    SELF.BindName = bindName;
    SELF.Update = null;
    SELF.Param = null;
    SELF.PageRow = null;
    SELF.Count = 0;
    SELF.NeedPage=null;
    //added by zhanglw on 2008-12-16
    //增加一个维护id的递增变量，保证生成的行id唯一
    SELF.RowIdNo=0;
    
    SELF.Current = null;
    var _headerId = "HeadId"+ bindName;
    var _bShowError = true;
    var _gridId = "GridId"+ bindName;
    SELF.BtnContainer = new Object();
    var Init = function(){
        var _html = SELF.Control().getElementsByTagName("TABLE")[0];
        if(_html){
            _html.className='grid';
            _html.rules='cols';
            _html.style.cssText='border-collapse:collapse;';
            
            var _grid = null;
            
            if(_html.firstChild.tagName)
                _grid = _html.firstChild;
            else
                _grid = _html;
            
            if(_grid.id=="")
                _grid.id = _gridId;
            else
                _gridId = _grid.id;
            
            var _headerTemp = _html.rows[0];
            if(_html.rows[0].id=="")
               _html.rows[0].id =  _headerId;
            else
                _headerId = _html.rows[0].id;
            _headerTemp = null;
            _grid = null;
            _html.rows[0].className='h';
        }
        var update = oBindList.getAttribute("Update")
        if(update){
            SELF.Update = update;
            Json.ContainerType[update] = "upd";
        }   
        var param = oBindList.getAttribute("Param");
        if(param)
            SELF.Param = param;
            
        var pageRow = oBindList.getAttribute("PageRow");
        if(pageRow)
            SELF.PageRow = parseInt(pageRow);
            
        var isSelect = oBindList.getAttribute("Select");
        if(isSelect || update)
            UTIL.addEventHandler(SELF.Grid(),"click",function(){SELF.Select()});
        var needPage = oBindList.getAttribute("NeedPage");
        if(needPage)
            SELF.NeedPage=needPage;
    }
    SELF.Grid = function(){
        return document.getElementById(_gridId);
    }
    var _header = function(){
        return document.getElementById(_headerId);
    }
    SELF.Control = function(){
         return document.getElementById(_id);
    }
    var CreateRow = function(obj,index){
        var sD = "_X"+index;
        var tr =  _header().cloneNode(true);
        var trId = "tr_"+SELF.BindName+sD;
        tr.setAttribute("id",trId);
        tr.setAttribute("BindPanel",SELF.BindName);
        for(var i=0;i<tr.childNodes.length;i++){
            var td = tr.childNodes[i];
            if(td.tagName != "TD") continue; 
            var bind = td.getAttribute("Bind");
            td.innerHTML = "";
            if(bind){
                var bCell = true;
                if(typeof(CreateCellEx)!="undefined"){
                   var sTag =  CreateCellEx(bind,"td_"+bind+sD,obj);
                   if(sTag){
                       if(typeof(sTag) =="string"){
                           var ele = document.createElement("INPUT");
                           ele.setAttribute("type",sTag);
                           ele.setAttribute("id","td_"+bind+sD);
                           ele.setAttribute("className","cell");
                           ele.setAttribute("disabled","true");
                           td.appendChild(ele);
                           ele = null;
                       }else{
                           td.appendChild(sTag);
                           sTag = null;
                       }
                       bCell = false;
                   }
                }
                if(bCell) td.setAttribute("id","td_"+bind+sD);
                
            }
        }
        var rowClass = null;
        if(typeof(CreateRowStyleEx) != "undefined" && typeof(CreateRowStyleEx(_id,obj,index)) != "undefined"){
            rowClass = CreateRowStyleEx(_id,obj,index);
        }
        if(!rowClass){
           if(index%2==0)
               rowClass='a';
            else
               rowClass='n'; 
        }
        
        tr.className = rowClass;
        
        var bindPanel = new Json.BindPanel(tr,SELF.BindName);
        SELF.BindContainer[trId] = bindPanel;
        
        return tr;
    }
    var PagelinkString=function(page){
        var link = "javascript:getJson().Search('"+_id+"','"+page+"')";
        return link;
        
    }
    //建立分页
    var CreatePageIndex = function(queryInfo){
        if(!queryInfo.StartRowIndex){
            queryInfo.StartRowIndex = 0;
        }        
        var div = document.createElement("div");
        div.type = "pageIndex";
        div.id="pagination";
        div.className="p";
        div.align = "center"
        div.style.textAlign = "center";
        div.style.width = "100%";
        if(document.all)
            div.style.textAlign = "center";
        if (queryInfo.Count==0) div.style.display="none";        
        
        var table = document.createElement("table");
        table.style.height="16px";
        table.align = "center";
        table.width="100%";
	    var tr = document.createElement("tr");
	    var TotalPage = Math.ceil(queryInfo.Count/SELF.PageRow);
	    var CurPage = Math.ceil(queryInfo.StartRowIndex/SELF.PageRow)+1;
	    var startPage = (Math.floor((CurPage-1)/10)*10)+1;
	    var stratPageTemp = startPage;	    
	    
        //Modify 08-16
        var _first,_previous,_next,_last,_current,_line;       
        _first="<a href="+PagelinkString(1)+"><img src=../images/frames/first.gif width=10 height=18 hspace=5 border=0 align=absmiddle></a>";
        _last="<a href="+PagelinkString(TotalPage)+"><img src=../images/frames/last.gif width=10 height=18 hspace=5 border=0 align=absmiddle></a>";
            
        if(CurPage>1)
            _previous="<a href="+PagelinkString(CurPage-1)+"><img src=../images/frames/previous.gif width=6 height=18 hspace=5 border=0 align=absmiddle></a>";
        else
            _previous="<img src=../images/frames/previous_.gif width=6 height=18 hspace=5 border=0 align=absmiddle>";
            
        if(CurPage<TotalPage)        
            _next="<a href="+PagelinkString(CurPage+1)+"><img src=../images/frames/next.gif width=6 height=18 hspace=3 border=0 align=absmiddle></a>";
        else
            _next="<img src=../images/frames/next_.gif width=6 height=18 hspace=3 border=0 align=absmiddle>";
        
        _current="Page <input id=pageno type=text value="+CurPage+" style='width:20px;height:18px;border:1px solid #5C82A9' onchange=getJson().Search('"+_id+"',this.value)>/"+TotalPage;
        _line="<img src=../images/page_line.gif width=2 height=18 hspace=5 align=absmiddle>";
        
        var ltd = document.createElement("td");
        ltd.innerHTML=_first+_previous+_line+_current+_line+_next+_last+_line;
        tr.appendChild(ltd);
        
        var rtd = document.createElement("td");
        rtd.align="right";
        if (CurPage==TotalPage && queryInfo.Count%SELF.PageRow!=0)
            rtd.innerHTML="Records From "+((CurPage-1)*SELF.PageRow+1)+" TO "+(CurPage*SELF.PageRow-(SELF.PageRow-queryInfo.Count%SELF.PageRow))+",&nbsp;&nbsp;&nbsp;Total Records:"+queryInfo.Count;
        else
            rtd.innerHTML="Records From "+((CurPage-1)*SELF.PageRow+1)+" TO "+(CurPage*SELF.PageRow)+",&nbsp;&nbsp;&nbsp;Total Records:"+queryInfo.Count;
        tr.appendChild(rtd);
        

	    if(window){
	        var control = document.createElement("tbody");
	        control.appendChild(tr);
	        table.appendChild(control);
	    }else{
	        table.appendChild(tr);
	    }
	    
	    div.appendChild(table);
	    return div; 
    }
    //要Load的对象，如果ＩＤ为空的话，使用currnet来代替
    SELF.Load = function(obj,Id){
        if(!Id)
            Id = SELF.Current;
        var bindPanel = SELF.BindContainer[Id];
        bindPanel.Load(obj);
        if(bindPanel.GetCurrent.State ==3){
            bindPanel.ClassTemp = "upd";   
            bindPanel.Control.className = "upd"; 
        }else if(bindPanel.GetCurrent.State ==4){
            bindPanel.ClassTemp = "ins"; 
            bindPanel.Control.className = "ins"; 
        }else if(bindPanel.GetCurrent.State ==8){
            bindPanel.ClassTemp = "del"; 
            bindPanel.Control.className = "del"; 
        }else if(bindPanel.GetCurrent.State ==1){
            bindPanel.ClassTemp = "hidden"; 
            bindPanel.Control.className = "hidden"; 
        }
        SELF.ShowError(bindPanel,obj);  
    };
    SELF.LoadAll = function(lstObj,queryInfo){
        var initLog = false;
        if(!lstObj){
            lstObj = Json.Dao.searchByList(this.BindName);
            initLog = true;
            if(!lstObj) return; 
        }
        if(!queryInfo){
            if(SELF.Param){
                var pnlInfo = Json.BindContainer[SELF.Param];
                queryInfo = Json.Dao.searchByList(pnlInfo.BindName);
            }
        }
        for(var i=0;i<lstObj.length;i++){
            var o = lstObj[i];
            
            var tr = CreateRow(o,i);
            SELF.Grid().appendChild(tr);
            SELF.Load(o,tr.id);
            //获得log的初使值
            if(initLog){
                var bindPanel = SELF.BindContainer[tr.id];
                bindPanel.GetLogObject(1);
                tr = null;
            }
            SELF.Count++;
            SELF.RowIdNo++;
        }
        if(queryInfo){
           if(SELF.NeedPage!="false")
           {
               var pageTable = CreatePageIndex(queryInfo);
               SELF.Control().appendChild(pageTable);
           }
        }
    };
    SELF.SaveAll = function(bModify){
        var arr = new Array();
        for(var name in this.BindContainer){
            var panel = this.BindContainer[name];
            var dbPanel = null;
            if(SELF.Update)
                dbPanel = panel.GetCurrent(1);
            else
                dbPanel = panel.Save(1,bModify);
            arr.push(dbPanel);
        }
        return arr;
    };
    SELF.Save = function(oUptDb){
        if(!oUptDb){
            var oUptPanel = Json.BindContainer[SELF.Update];
            
            oUptDb = oUptPanel.Save();
            oUptPanel.Load(oUptDb);
        }
        
        if(SELF.Current){
            SELF.ClearError(SELF.BindContainer[SELF.Current],oUptDb);
        }

        //用户自定义的Save方法
        if(typeof(SaveEx)!="undefined")
            oUptDb = SaveEx(_id,oUptDb);

        //新增一条空记录
        if(!SELF.Current) SELF.Add();
        SELF.Load(oUptDb);
       //用户自定义的Save方法
        if(typeof(BindListSaveOkEx)!="undefined")
           BindListSaveOkEx(_id,oUptDb);
       
        return oUptDb;
    };
    SELF.Select = function(obj){
        var tdObj;
        if(typeof(obj)!="undefined")
            tdObj = obj;         
        else
            tdObj = UTIL.getEventElement();
        var curTr = UTIL.getParentNode(tdObj,"TR");    

        if(curTr){
            var id = curTr.getAttribute("ID");
            var oUpdatePanel = null;
            if(id){
                if(SELF.Update){
                    oUpdatePanel = Json.BindContainer[SELF.Update];
//                    if(SELF.Current && oUpdatePanel.IsModify() && !window.confirm(UTIL.getMessage('CLTMSG_BE_LOST_CHANGE')))
//                        return null;
                }
                
                if(SELF.Current){
                    var bindPanelP = SELF.BindContainer[SELF.Current];
                    bindPanelP.Control.className = bindPanelP.ClassTemp;
                    
                }
                var bindPanel = SELF.BindContainer[id];
                if(!bindPanel)
                    return;
                
                SELF.Current = id;
                
                if(SELF.Update && bindPanel.GetCurrent())
                    oUpdatePanel.Load(bindPanel.GetCurrent(),1,true);
                if(typeof(SelectEx) != "undefined"){
                    SelectEx(_id);
                }
                bindPanel.ClassTemp = bindPanel.Control.className;
                bindPanel.Control.className = "selected";
            }
        }
    };
    SELF.Delete = function(){
        if(!SELF.Current){
            alert(UTIL.getMessage('CLTMSG_NO_SELECTED_ROW'));
            return null
        }
        //add by linhc 进行删除前的数据校验
        if(typeof DeleteValidator !="undefined"){
          if(!DeleteValidator(_id)){
             return true;
          }
        }
        
        if(!window.confirm(UTIL.getMessage('CLTMSG_BE_DELETE_ROW')))
            return true; 
            
        var bindPanel = SELF.BindContainer[SELF.Current];
        
        if(!bindPanel.GetCurrent().State || bindPanel.GetCurrent().State ==4){
            SELF.Grid().removeChild(bindPanel.Control);
            delete SELF.BindContainer[SELF.Current]
            //SELF.BindContainer[SELF.Current] = null;
            SELF.Count--;
            // added by zhanglw on 2009-2-17
           // 增加一个删除行后的回调接口，当删除一行后允许额外的操作,比如统计操作
           // 参数为包含该表的SPAN元素ID
           if(typeof DeleteRowEx != "undefined")
           {
               DeleteRowEx(_id);
           }
        }else{
            // added by zhanglw on 2009-2-15
            //开放一个删除回调接口，允许用户在DeleteEx做一些其他操作，比如直接提交服务器删除该条数据
            //返回true，则不进行后续改变状态，修改css样式操作。
            if(typeof DeleteEx !="undefined") {
                if (DeleteEx(_id))
                    return;
            }
                       
            bindPanel.SetState(1,8);
            bindPanel.Save(1,true);
            bindPanel.Control.className="del";
            bindPanel.ClassTemp = "del";
            if(SELF.Update!=null)
            {
                var oUpdatePanel = Json.BindContainer[SELF.Update];
                oUpdatePanel.Load(new Object());
            }
            SELF.Load(bindPanel.GetCurrent());
            return bindPanel.GetCurrent(); 
        }
        
        SELF.Current = null;
    };
    SELF.New = function(){
        if(SELF.Update){
            oUpdatePanel = Json.BindContainer[SELF.Update];
//            if(SELF.Current && oUpdatePanel.IsModify() && !window.confirm(UTIL.getMessage('CLTMSG_BE_LOST_CHANGE')))
//                return null;
        }
       if(SELF.Current){
            var bindPanelP = SELF.BindContainer[SELF.Current];
            bindPanelP.Control.className = bindPanelP.ClassTemp;
            SELF.Current = null;
        }
        if(SELF.Update){
            var dbUpdate = new Object();
            if(typeof(NewEx) != "undefined"){
                dbUpdate = NewEx(SELF.BindName);
            }
            var oUpdatePanel = Json.BindContainer[SELF.Update];
            oUpdatePanel.Load(dbUpdate);
        }
    };
    
    SELF.Add = function(){
        var oUpdatePanel = null;
       if(SELF.Current){
           if(SELF.Update){
                oUpdatePanel = Json.BindContainer[SELF.Update];
                if(SELF.Current && oUpdatePanel.IsModify() && !window.confirm(UTIL.getMessage('CLTMSG_BE_LOST_CHANGE')))
                    return null;
            }
           var bindPanel = SELF.BindContainer[SELF.Current];
           bindPanel.Control.className=bindPanel.ClassTemp;
       }
       //changed by zhanglw
       //var row = CreateRow(new Object(),SELF.Count);
       var row=CreateRow(new Object(),SELF.RowIdNo);
       SELF.Current =row.getAttribute("ID");
       var addPanel = SELF.BindContainer[SELF.Current];
       addPanel.ClassTemp = "ins";
       addPanel.Control.className="selected";
       SELF.Grid().appendChild(row);
       SELF.Load(new Object(),row.id);
       SELF.Count++;
       SELF.RowIdNo++;
       if(SELF.Update){
            oUpdatePanel = Json.BindContainer[SELF.Update];
       }
       // added by zhanglw on 2009-2-17
       // 增加一个新增行的回调接口，当新增一行允许额外的操作
       // 参数为包含该表的SPAN元素ID和当前新增行的ID
       if(typeof AddRowEx != "undefined")
       {
           AddRowEx(_id,SELF.Current);
       }
    }
    SELF.Cancel = function(){
        if(!SELF.Current){
            alert(UTIL.getMessage('CLTMSG_NO_SELECTED_ROW'));
            return null
        }
        
        var bindPanel = SELF.BindContainer[SELF.Current];
        var oCancel = bindPanel.GetCurrent();
        if(!oCancel) return null;
        
        var org = new Object();
        
        if(!oCancel.State || oCancel.State ==4){
            SELF.Grid().removeChild(bindPanel.Control);
            SELF.BindContainer[SELF.Current] = null;
            SELF.Current = null;
            SELF.Count--;
        }else if(oCancel.State ==3 || oCancel.State ==8 || oCancel.State ==2){
            org = Json.Dao.searchById(bindPanel.GetBindName(),oCancel);
            var r = new RegExp("_X(\\d{1,3})$");
            var arr = bindPanel.Control.id.match(r);
            if(arr[1]%2==0)
               bindPanel.Control.className='a';
            else
               bindPanel.Control.className='n';
            bindPanel.Load(org);
        }
        if(SELF.Update){
            var oUpdatePanel = Json.BindContainer[SELF.Update];
            oUpdatePanel.Load(org);
        }
        SELF.Current = null;
        return oCancel;
    };
    SELF.CancelAll = function(){
        if(SELF.Current){
            var bindPanel = SELF.BindContainer[SELF.Current];
            bindPanel.Control.className=bindPanel.ClassTemp;
        }
        for(var name in SELF.BindContainer){
             var bindPanel = SELF.BindContainer[name];
             SELF.Current = bindPanel.Control.id;
             SELF.Cancel();
        }
        SELF.Current = null;
    };
    
    SELF.Validate = function(bAlert){
        if(SELF.Update){
            var oUpdatePanel = Json.BindContainer[SELF.Update];
            return (oUpdatePanel.Validate(bAlert));
        }if(SELF.Current){
            var oUpdatePanel = SELF.BindContainer[SELF.Current];
            return (oUpdatePanel.Validate(bAlert));
        }
    };
    SELF.ValidateAll = function(bAlert){
        if(SELF.Update){
            var oUpdatePanel = Json.BindContainer[SELF.Update];
            return (oUpdatePanel.Validate(1,bAlert));
        }else{
            var bSuc = true;
            for(var name in SELF.BindContainer){
                bSuc = bSuc && SELF.BindContainer[name].Validate(1,false);
            }
            return bSuc;
        }
    };
    
    SELF.AppendEvent = function(id){
        var btn = document.getElementById(id);
        var type = btn.getAttribute("OpType");
        if(!type){
            var _regex = new RegExp("^\\w{2,5}?_(\\w*)_((\\w*\\d{1,3})*)$");
            var arrM = id.match(_regex);
            type = arrM[1];
        }
        switch(type){
            case "New":
                UTIL.addEventHandler(btn,"click",function(){SELF.New()});
                SELF.BtnContainer.New = id;
                break;
            case "Save":
                UTIL.addEventHandler(btn,"click",function(){if(SELF.Validate()){SELF.Save()}});
                SELF.BtnContainer.Save = id;
                break;
            case "Delete":
                UTIL.addEventHandler(btn,"click",function(){SELF.Delete()});
                SELF.BtnContainer.Delete = id;
                break;
            case "Cancel":
                UTIL.addEventHandler(btn,"click",function(){SELF.Cancel()});
                SELF.BtnContainer.Cancel = id;
                break;   
            case "CancelAll":
                UTIL.addEventHandler(btn,"click",function(){SELF.CancelAll()});
                SELF.BtnContainer.CancelAll = id;
                break;
            
            case "Search":
                UTIL.addEventHandler(id,"click",function(){getJson().Search(_id,1)});
                SELF.BtnContainer.Search = id;hotkey
                UTIL.addEventHandler(document,"keypress",function(){hotkey(function(){getJson().Search(_id,1)})});
                break;
                
           case "Copy":
                UTIL.addEventHandler(btn,"click",function(){SELF.Copy()});
                SELF.BtnContainer.Copy = id;
                break;
//            case "DeleteSubmit":
//                UTIL.addEventHandler(btn,"click",function(){getJson().Delete(_id)});
//                SELF.BtnContainer.DeleteSubmit = id;
//                break;
        }
        btn = null;
    };
    
    SELF.DeleteAll = function(){
        
        for(var name in SELF.BindContainer){
            var bindPanel = SELF.BindContainer[name];
            SELF.Grid().removeChild(bindPanel.Control);
        }
        SELF.BindContainer = new Object();
        SELF.Count = 0;
        //added by zhanglw on 2009-2-17
        //同步RowIdNo
        SELF.RowIdNo=0;
        SELF.Current = null;
        var arrDiv = SELF.Control().getElementsByTagName("DIV");
        if(arrDiv){
            for(var i=0;i<arrDiv.length;i++){
                var div = arrDiv[i];
                if(div.type == "pageIndex"){
                    SELF.Control().removeChild(div);
                }
            }
        }
        
    };
    SELF.IsModify = function(tag){
        var b = false;
        if(SELF.Update){
            for(var name in SELF.BindContainer){
                var panel = SELF.BindContainer[name];
                b = b || (panel.GetCurrent(tag).State !=2)
            }
        }else{
            for(var name in SELF.BindContainer){
                var panel = SELF.BindContainer[name];
                b = b || panel.IsModify();
            }
        }
        return b;
    }
    SELF.GetCurrent = function(bAlert){
        if(!bAlert) bAlert = false;
        if(SELF.Current){
            var panel = this.BindContainer[SELF.Current];
            return panel.GetCurrent();
        }
        if(bAlert)
            window.alert(UTIL.getMessage('CLTMSG_NO_SELECTED_ROW'));
    };
    SELF.ShowError = function(bindPanel,dbPanel){
        //update by zhanglw on 2009-2-27 
        //配合批量更新，当保存成功时状态描述为Successful，此时不设置错误状态
        if(dbPanel.StateDesc && dbPanel.StateDesc!="Successful"){
            bindPanel.ClassTemp = "error"; 
            bindPanel.Control.className = "error"; 
            bindPanel.Control.title = dbPanel.StateDesc;
            iError ++;
        }
    }
    
    SELF.ClearError = function(bindPanel,dbPanel){
        if(dbPanel.StateDesc){
            dbPanel.StateDesc = null;
            bindPanel.ClassTemp = ""; 
            bindPanel.Control.className = ""; 
            bindPanel.Control.title = null;
        }
        return dbPanel
    }
    
    SELF.BShowError = function(bShow){
        _bShowError =  bShow;
    }
    
    SELF.Copy = function(){
        if(!SELF.Current){
            alert(UTIL.getMessage('CLTMSG_NO_SELECTED_ROW'));
            return null
        }
        
        var oPanel = this.BindContainer[SELF.Current];
        var oUptDb = Json.Util.clone(this.GetCurrent());
        
        oUptDb.State =4;
        oUptDb.RECORD_VERSION = null;
        
        if(SELF.Current){
            SELF.ClearError(SELF.BindContainer[SELF.Current],oUptDb);
        }
        
        oPanel.Control.className = oPanel.ClassTemp;
        oPanel.ClassTemp = null;
        SELF.Current = null;

        //用户自定义的Copy方法
        if(typeof(CopyEx)!="undefined"){
            oUptDb = CopyEx(_id,oUptDb);
        }
        if(SELF.Update){
            oUpdatePanel = Json.BindContainer[SELF.Update];
            oUpdatePanel.Load(oUptDb);
        }
        return oUptDb;
    }
    
    Init();
}


Json.Bind=function(){
    var SELF = this;
    SELF.BtnContainer = new Object();
    function Init(){
        var arrSpan = document.getElementsByTagName("SPAN");
        if(arrSpan){
            for(var i=0;i<arrSpan.length;i++){
                var oSpan = arrSpan[i];
                var bindName = null
                
                bindName =  oSpan.getAttribute("QueryInfo")
                if(bindName!=null && bindName.length>0){
                    var ID = oSpan.getAttribute("ID");
                    if(ID){
                        var obj = new Json.QueryInfo(oSpan,bindName);
                        Json.BindContainer[ID] = obj;
                        Json.ContainerType[ID] = "prm";
                    }
                    continue;
                }
                
                bindName = oSpan.getAttribute("BindPanel");
                if(bindName !=null && bindName.length>0){
                    var ID = oSpan.getAttribute("ID");
                    if(ID){
                        var obj = new Json.BindPanel(oSpan,bindName);
                        Json.BindContainer[ID] = obj;
                        obj.Load(new Object());
                        if(!Json.ContainerType[ID])
                            Json.ContainerType[ID] = "pnl";
                    }
                    continue;
                }
                
                bindName =  oSpan.getAttribute("BindList")
                if(bindName!=null && bindName.length>0){
                    var ID = oSpan.getAttribute("ID");
                    if(ID){
                        var obj = new Json.BindList(oSpan,bindName);
                        Json.BindContainer[ID] = obj;
                        Json.ContainerType[ID] = "grd";
                    }
                }
            }
        }
        var arrBtn = document.getElementsByTagName("BUTTON");
        if(arrBtn){
            for(var i=0;i<arrBtn.length;i++){
                var curBtn = arrBtn[i]; 
                var target = curBtn.getAttribute("Target");
                if(target && target.toUpperCase() == "SUBMIT"){
                    var type = curBtn.getAttribute("OpType");
                    if(!type){
                        var _regex = new RegExp("^\\w{2,5}?_(\\w*)_((\\w*\\d{1,3})*)$");
                        var arrM = curBtn.id.match(_regex);
                        type = arrM[1];
                    }
                    switch(type){
                        case "SaveAll":
                            UTIL.addEventHandler(curBtn,"click",function(){SELF.SaveAll()});
                            SELF.BtnContainer.SaveAll = curBtn.id;
                            break;
                    }
                }else if(target && Json.BindContainer[target]){
                    Json.BindContainer[target].AppendEvent(curBtn.id);
                }    
                 if(curBtn && curBtn.disabled){
                    if(curBtn.className && curBtn.className.indexOf("_disabled")==-1)
                        curBtn.className =curBtn.className+ "_disabled";
                    if(curBtn.firstChild && curBtn.firstChild.src && curBtn.firstChild.src.indexOf("_.gif")==-1)
                        curBtn.firstChild.src=curBtn.firstChild.src.replace(".gif","_.gif");
                }      
            }
        }
    };

    SELF.Save = function(ID,tag){
       var type = Json.ContainerType[ID];
       var name =  ID;
        switch(type){
            case "grd":
                var oGrid = Json.BindContainer[name];
                if(oGrid.IsModify()){
                    if(oGrid.Update){
                        var oUpdatePanel = Json.BindContainer[oGrid.Update];
                        if(oUpdatePanel.IsModify() && !window.confirm(UTIL.getMessage('CLTMSG_BE_LOST_CHANGE'))){
                            if(oGrid.Validate())
                                oGrid.Save();
                            else{
                                return;
                            }
                        }
                    }else{
                        if(!oGrid.ValidateAll()) return;
                    }
                    Json.Dao.ReflashDBInput(oGrid.BindName,oGrid.SaveAll());
                    bChange =bChange || oGrid.IsModify();
                }
                break;
            case "pnl":
                var oPanel = Json.BindContainer[name];
                if(oPanel.Validate(0)){
                    for(var tag in oPanel.GetBindName(0)){
                        var dbPanel = oPanel.Save(tag);
                        if(oPanel.IsModify(tag)){
                            Json.Dao.ReflashDBInput(oPanel.GetBindName(tag),dbPanel);
                            bChange = bChange || oPanel.IsModify(tag);
                        }
                    }
                }
                break;
        }
        
        if(bChange){
            Json.OpType ="Save";
            Json.Target　= ID+":"+tag;
            Json.Submit(UTIL.getEventElement().id,'');
        }else
            alert(UTIL.getMessage('CLTMSG_NO_CHANGES'));
    };
    SELF.SaveAll = function(bModify){
        var bChange = false;
        for(var name in Json.BindContainer){
            var type = Json.ContainerType[name];
            switch(type){
                case "grd":
                var oGrid = Json.BindContainer[name];
                
                if(bModify || oGrid.IsModify()){
                    var dbGrid = oGrid.SaveAll(bModify);
                    Json.Dao.ReflashDBInput(oGrid.BindName,dbGrid);
                    bChange =bChange || oGrid.IsModify();
                }
                break;
                case "pnl":
                    var oPanel = Json.BindContainer[name];
                    if(oPanel.Validate(0)){
                        for(var tag in oPanel.GetBindName(0)){
                            var dbPanel = oPanel.Save(tag,bModify);
                            if(bModify || oPanel.IsModify(tag)){
                                Json.Dao.ReflashDBInput(oPanel.GetBindName(tag),dbPanel);
                                bChange = bChange || oPanel.IsModify(tag);
                            }
                        }
                    }else
                        return;
                    break;
            }
        }
        if(bModify || bChange){
            if(typeof(SaveValidator)!="undefined"){
               if(!SaveValidator()){
                 return;
               }
            }
            Json.Config.OpType = "SaveAll";           
            Json.Submit(SELF.BtnContainer.SaveAll,'');
        }else
            alert(UTIL.getMessage('CLTMSG_NO_CHANGES'));
            
    };
    SELF.Load = function(ID,tag){
        var type = Json.ContainerType[ID];
        switch(type){
            case "grd":
                var oGrid = Json.BindContainer[ID];
                oGrid.BShowError(true);
                oGrid.BindName,oGrid.LoadAll();
                break;
            case "pnl":
                var oPanel = Json.BindContainer[ID];
                oPanel.BShowError(true);
                oPanel.Load(tag);
                break;
            case "prm":
                var oPanel = Json.BindContainer[ID];
                oPanel.BindName,oPanel.Load();
                break;
        }
        if(ErrorMsg !=0){
            alert("List 有"+iError+"条数据不能保存成功");
        }
    };
    SELF.LoadAll = function(){
        for(var name in Json.BindContainer){
            var type = Json.ContainerType[name];

            switch(type){
                case "grd":
                    var oGrid = Json.BindContainer[name];
                    oGrid.BShowError(true);
                    oGrid.LoadAll();
                    break;
                case "pnl":
                    var oPanel = Json.BindContainer[name];
                    oPanel.BShowError(true);
                    for(var tag in oPanel.GetBindName(0)){
                        oPanel.Load(null,tag);
                    }
                    break;
                case "prm":
                    var oPanel = Json.BindContainer[name];
                    oPanel.Load();
                    break;
            }
        }
        //提交后要回调的方法扩展
        if(typeof(CallBackEx) != "undefined"){
            if(CallBackEx(Json.Config.OpType)){
                return;
            }
        }
        
        switch(Json.Config.OpType){
            case "SaveAll":
                if(iError !=0 || (Json.ErrorMsg && Json.ErrorMsg.length>0)){
                    var msg = "Save Failed!\n";
                    if(Json.ErrorMsg)
                        msg = msg + Json.ErrorMsg;
                    alert(msg);
                }else
                    alert("Save Successfully!");
                break;
        }
    };
    
    SELF.Search=function(ID,page){
        var oBind = Json.BindContainer[ID];
        var oParam = Json.BindContainer[oBind.Param];
        if(oParam.Validate()){
            var query = oParam.Save(page,oBind.PageRow);
            Json.Dao.ReflashDBInput(oParam.BindName,query);
            Json.Config.OpType = "Search";
            Json.Submit(oBind.BtnContainer.Search,'');
        }
    };
    //要提交的对象的ＩＤ，TableName：要提交的表名，OpType：要提交的操作类型
    SELF.Submit=function(ID,TableName,OpType){
        var oGrid = Json.BindContainer[ID];
        if(oGrid.GetCurrent(true)){
            Json.Dao.ReflashDBInput(TableName,oGrid.GetCurrent(true));
            Json.Config.OpType = OpType
            Json.Submit(UTIL.getEventElement().id,'');
        }
    };
    SELF.IsModify = function(){
        var bChange = false;
        for(var name in Json.BindContainer){
            var type = Json.ContainerType[name];
            switch(type){
                case "grd":
                var oGrid = Json.BindContainer[name];
                if(oGrid.IsModify()){
                    bChange =bChange || oGrid.IsModify();
                }
                break;
                case "pnl":
                    var oPanel = Json.BindContainer[name];
                    for(var tag in oPanel.GetBindName(0)){
                        if(oPanel.IsModify(tag)){
                            bChange = bChange || oPanel.IsModify(tag);
                        }
                    }
                break;
            }
        }
        return bChange;
    };
    Init();
}
 /*操作Jason的类
*/
Json.Dao = function(){
    var SELF = this;
    var db = new Object();
    var type = new Object();
    function Init(){
        var arrType = null;
        if(document.getElementById("Json_TypeName")){
            sType = document.getElementById("Json_TypeName").value;
            if(sType != null && sType.length>0)
                arrType = sType.split("^");
                if(!arrType) return;
        }else{
            return;
        }
        
        for(var i=0;i<arrType.length;i++){
            var sTableName = arrType[i];
            if(sTableName.length==0 || !document.getElementById(sTableName)) continue;
            sTable = document.getElementById(sTableName).value;
            if(sTable.length==0) continue;
            db[sTableName] = eval("("+sTable+")");
            
        }
    };
	
    /*功能：根据主键来取得字对象
    *参数：bindName:路径;sPkName:主键名;sPk主键值,或对象
    */
    SELF.searchById=function(bindName,pk){
        var arrCur = eval("db."+bindName);
        if(!arrCur.sort)
            return arrCur;
        var sPkName = arrCur[0].GetKeyCols[0];
        var sPk;
        if(typeof(pk) == "object")
            sPk = pk[sPkName];
        else
            sPk = sPk
        for(var i=0;i<arrCur.length;i++){
            var objCur = arrCur[i];
	        var pkValue = eval("objCur."+sPkName);
	        if(pkValue == sPk){
		        return Json.Util.clone(objCur);
	        }
        }
    };
	
    /*功能：查找在bindName路径下的所有对象
    *参数：bindName:路径
    */
    SELF.searchByList=function(bindName){
        var arrCur = eval("db."+bindName);
        return Json.Util.clone(arrCur);
        
    };
    
    /*功能：根据参数对象来查找对象。
    *参数：bindName:路径，obj：参数对象
    */
    SELF.select=function(bindName,obj){
        //searchByList:function(bindName)
    };
    
    SELF.GetString=function(tableName,oTable){

        var sJson = Json.Util.getString(oTable);
        
        return sJson;
    };
    
    //序列化到返回textbox
    SELF.ReflashDBInput = function(tableName,oTable){
        var sJson = SELF.GetString(tableName,oTable);
      
        if(!document.getElementById(tableName)){
            var input = document.createElement("INPUT");
            input.setAttribute("id",tableName);
            input.setAttribute("name",tableName);
            input.setAttribute("type","hidden");
            var form = document.getElementsByTagName("FORM")[0];
            form.appendChild(input);
            if(!document.getElementById("Json_TypeName")){
                var type = document.createElement("INPUT");
                type.setAttribute("id","Json_TypeName");
                type.setAttribute("name","Json_TypeName");
                type.setAttribute("type","hidden");
                var form = document.getElementsByTagName("FORM")[0];
                form.appendChild(type);
            }
            if(document.getElementById("Json_TypeName").value.length>0){
                document.getElementById("Json_TypeName").value += "^"+ tableName;
            }else{
                document.getElementById("Json_TypeName").value = tableName;
            }
        }
        document.getElementById(tableName).value = sJson;
    };
    
    Init();
}

Json.Validate = {

    JS_VALIDATORS_ERROR : null,
    //PUBLIC
    validate : function(BindContainer,tag,bAlert){
	    if(bAlert==null) bAlert=true;
        if(tag!=0 && !tag) tag=1;
	    this.JS_VALIDATORS_ERROR='';
	    var cntrTemp = new Object();
	    if(tag == 0){
	        for(var tagTemp in BindContainer){
	            for(var name in BindContainer[tagTemp]){
		            if(BindContainer[tagTemp][name].GetV())
			            this._check(BindContainer[tagTemp][name]);
	            }
	        }
	    }else{
	        for(var name in BindContainer[tag]){
	            if(BindContainer[tag][name].GetV)
		            this._check(BindContainer[tag][name]);
            }
	    }
	      	
	    if(this.JS_VALIDATORS_ERROR.length==0)
	        return true;
	    else if(bAlert)
	        alert(this.JS_VALIDATORS_ERROR);
        return false;
    },    
    _check : function(bindObject){
        this._resetError(bindObject);
        
	    if((bindObject.GetV()&1)>0 && !this._checkRegex('V_REQUIRED',bindObject))
		    this.raiseError(bindObject,UTIL.getMessage('V_REQUIRED'));
		if((bindObject.GetV()&8)>0 && typeof(Page_Validate) == "function")//custom per page validate
	        Page_Validate(bindObject);
        if(!bindObject.Get() || bindObject.Get().trim().length==0) return;    			
	    if((bindObject.GetV()&2)>0 && !this._checkRegex('V_NUMERIC',bindObject))
	        this.raiseError(bindObject,UTIL.getMessage('V_NUMERIC'));    	
	    if((bindObject.GetV()&4)>0 && !this._checkRegex('V_DATETIME',bindObject))
	        this.raiseError(bindObject,UTIL.getMessage('V_DATETIME'));  
	    if((bindObject.GetV()&16)>0 && !this._checkRegex('V_INT',bindObject))
	        this.raiseError(bindObject,UTIL.getMessage('V_INT')); 
    },
    _checkRegex : function(vType,bindObject){
        switch(vType){
            case 'V_REQUIRED':
                if(!bindObject.Get())return false;
                return (bindObject.Get().trim().length>0);// /.+/
                break;
            case 'V_NUMERIC':
                return (!isNaN(bindObject.Get()));// /^[-\+]?\d+(\.\d+)?$/
                break;
            case 'V_DATETIME':
                return (/^\d{4}-\d{1,2}-\d{1,2}( \d{1,2}:\d{1,2}){0,1}$/).test(bindObject.Get());
                break;
            case 'V_INT':
                return (/^[-\+]?\d*$/).test(bindObject.Get());
                break;
        }
    },    
    _resetError : function(bindObject){
        if(bindObject.Error=='1'){
            bindObject.Error='0';
            bindObject.Control.parentNode.removeChild(bindObject.Control.parentNode.lastChild);
        }
    },
    //PUBLIC
    raiseError : function(bindObject,resource){
        this.JS_VALIDATORS_ERROR=this.JS_VALIDATORS_ERROR+'- '+resource.replace('%FIELDNAME%',bindObject.GetName)+'\n';
        if(bindObject.Error!='1'){
            bindObject.Error='1';
            var vErr=document.createElement("SPAN");
	        vErr.style.cssText="color:Red";
	        vErr.innerHTML="*";
	        bindObject.Control.parentNode.appendChild(vErr);
	    }
    }
   
}

Json.Event=function(){
    var Self = this;
    _events={};
    Self.dispatch=function(sId,args1,args2,args3){
		var arr = new Array();
		for(var i=0;i<arguments.length;i++){
			if(i==0)continue;
			arr.push(arguments[i]);
		}
        if(_events[sId]) return _events[sId].apply(Json.JsonContainer[sId],arr);
    };
    Self.register=function(sId,fun){
        if(typeof(fun)== 'function') _events[sId]=fun;
    };
}
