﻿//参数：operationType（0-简单调用，不需要返回数据 10-获取单条信息 20-填充表单  30-获取列表）


var AjaxBaseEx = new Class({
    options:
    {
        method:'post',
        url:'/Common/AjaxFactory.aspx',
        param:null,
        inputFormID:'',
        outputFormID:'',
        chkCodeID:'CheckCode',
        className:'',
        functionName:'',
        onCompleteEvent:null,
        onFillDataEvent:null,
        onFinishedEvent:null,
        operationType:0,
        onPageNavViewEvent:null,
        onSetParamEvent:null,
        parentDivID:'',
        tblContentID:'tblAreaFill',
        tblTemplateID:'tblAreaList',
        trTemplateHeaderID:'trHeader',
        trTemplateContentID:'trContent',
        hdnPageIndexID:'hdnPageIndex',
        isShowTip:true,
        isMask:false,
        objMase:null,
        isRaiseOnFaile:false,
        pageNavFooterDivID:'divPageNavFooter'
    },        
    //初始化
    initialize:function(options)
    {
        //设置参数
        this.setOptions(options);        
        this.Execute(options);
        
    },
    
    ShowMessage:function(title,message)
    {
        var tips = new InfoTips({top:'20%',left:'20%',height:100,mask:true});
        tips.message(title,"<div class='loading'>" + message + "</div>");
        tips.show();
    },
    
    Execute:function(options)
    {        
        //设置参数
        this.setOptions(options);
        
        //数据加载提示
        /*********************/
        
        if(this.options.isMask)
        {
            this.options.objMask = new InfoTips({mask:true,width:200,height:60,autoClose:true});
            this.options.objMask.message("","数据处理中...");
            this.options.objMask.show();
        }
        
        /********************/
        
        
        try
        {       
                //如果给定了表单，则从表单读取数据给实体参数赋值，否则直接采用传入的实体参数值
                if ($(this.options.inputFormID))
                {
                    this.options.param = new ModelToolsEx({form:this.options.inputFormID}).setModelValue(this.options.param);
                }
                //如果需要自定义处理实体赋值，则进行特殊处理
                if (this.options.onSetParamEvent != null)
                {
                    this.options.param = this.options.onSetParamEvent(this.options.param);
                }
                //获取验证码数据
                var checkCode = ($(this.options.chkCodeID)==null)?"":$("CheckCode").value;       
                //组织Ajax格式的xml数据内容
                var xmlData = new ModelToolsEx().getAjaxXML(this.options.className,this.options.functionName,checkCode,this.options.param);    
                if (xmlData == null || xmlData == "")
                {                    
                    this.ShowMessage("错误","参数异常，程序终止了数据的传输！");                    
                }else              
                {                    
                    //调用ajax获取业务数据                
                    this.RunAjax(xmlData);
                }
        }
        catch(e)
        {
            alert(e);
        }                     
    },

    RunAjax:function(xmlData)
    {
        var infoTip = new Tip('数据加载中...');
        if(this.options.isShowTip) infoTip.show();

        var my = this;
        var myAjax = new Ajax('/Common/AjaxFactory.aspx',{method:this.options.method,data:xmlData,onComplete:function(txt,xml){ 
            infoTip.hide();
            
            //关闭遮罩
            if(my.options.objMask!=null)
            {
                my.options.objMask.hide();
                my.options.objMask = null;
            }
            
            try
            {   
                var resultXML = new XMLDom(xml); 
                switch(resultXML.getValue("Succeed"))
                {
                    case '0':
                        //服务器端出错
                        my.ShowMessage("错误",resultXML.getValue("Message"));         
                        window.fireEvent("onServerError",resultXML.getValue("Message"));
                        window.fireEvent("onError",resultXML.getValue("Message"));
                        break;
                    case '1':
                        //成功
                        var model = new ModelToolsEx().getModel(resultXML);                        
                        window.fireEvent("onRunSucceed",model);                              
                        switch(my.options.operationType)
                        {
                             //获取单条信息
                            case 10:               
                                if (model.length<1) break;                 
                                var item = model[0];                   
                                //用默认方式进行自动填充                    
                                if ($(my.options.parentDivID))
                                {
                                    var spans = $(my.options.parentDivID).getElementsByTagName("span");
                                    for (i=0; i < spans.length; i++) 
                                    {                                                
                                        var span = spans[i];  
                                        if (typeof(item[span.id]) != 'undefined')
                                        {
                                            span.innerHTML = item[span.id];        
                                        }
                                    }             
                                }              
                                if (my.options.onCompleteEvent != null)
                                {
                                    my.options.onCompleteEvent(item);
                                }                         
                                break;
                            //填充表单
                            case 20:
                                if (model.length<1) break;                 
                                var item = model[0];
                                new ModelToolsEx({form:my.options.outputFormID}).setFormValueByModel(model);
                                if (my.options.onCompleteEvent != null)
                                {
                                    my.options.onCompleteEvent(item);
                                }                                
                                break;
                            //列表方法    
                            case 30:
                                //如果设置完成事件，就调用完成事件，否则采用公用填充方法
                                if (my.options.onCompleteEvent != null)
                                {
                                    my.options.onCompleteEvent(model);
                                }else
                                {       
                                        //表格处理
                                        var tableTools = new PageTagTools();                           
                                        var sdivContent = $(my.options.tblContentID);//存放内容的容器        
                                        var sContentBody = tableTools.GetFirstChild(sdivContent);//找存放内容table中的tbody
                                        //删除存放内容table中tbody内的所有内容
                                        tableTools.ClearChild(sContentBody);                        
                                        var sdivall = $(my.options.tblTemplateID);  
                                        //找模版table中的tbody
                                        var stbody = tableTools.GetFirstChild(sdivall);
                                        //找模版table中的tbody的表头
                                        var headtr = tableTools.GetChildById(stbody, my.options.trTemplateHeaderID);                        
                                        //找模版table中的tbody内容容器
                                        var sourcetr= tableTools.GetChildById(stbody,  my.options.trTemplateContentID);                        
                                        //把header新增到内容表中
                                        var newHr = headtr.cloneNode(headtr);
                                        sContentBody.appendChild(newHr);
                                    
                                        var strPageCount=0;//页码总数
                                        var strPageIndex=1;//当前页码
                                        var strTotalCount=0;//总记录数
                                        var strShowPageCount =10;//页码显示个数   
                                        model.each(function(item,index)
                                        {          
                                            strPageCount = item.TotalPage;
                                            strPageIndex = item.PageIndex;
                                            strTotalCount = item.TotalCount;      
                                            var newtr = sourcetr.cloneNode(true);
                                            newtr.id = "tr_"+index;  
                                            //用默认方式进行自动填充
                                            var spans = newtr.getElementsByTagName("span");
                                            for (i=0; i < spans.length; i++) 
                                            {                                                
                                                var span = spans[i];  
                                                span.innerHTML = item[span.id];        
                                            }
                                            //如果设置了填充事件，调用自定义填充事件
                                            if (my.options.onFillDataEvent != null)
                                            {
                                                my.options.onFillDataEvent(item,newtr);     
                                            }                   
                                            sContentBody.appendChild(newtr);      
                                        });
                                       //如果设置了分页处理事件，则进行分页，否则不需要进行分页
                                       if (my.options.onPageNavViewEvent != null)
                                       {
                                           if ($(my.options.hdnPageIndexID)) {$(my.options.hdnPageIndexID).value = strPageIndex;}//保存当前页
                                           var pageNavBar = new PageNavBar({
                                                recordCount:strTotalCount,
                                                pageCount:strPageCount,     
                                                pageIndex:strPageIndex,     
                                                showPageCount:strShowPageCount,     
                                                containerId:my.options.pageNavFooterDivID,  //页码显示的容器id
                                                onPageClick:my.options.onPageNavViewEvent 
                                           });
                                       }
                                   }
                                window.fireEvent("NoCount",strTotalCount);//主要用于添加监听数据为0，一般用于提示语。by zhengchong
                                break;       
                            //不需要返回数据时，采用缺省的处理                     
                            default:
                                if (my.options.onCompleteEvent != null)
                                {
                                    my.options.onCompleteEvent(model);

                                }                            
                                break;
                        }
                        //如果设置了完成事件，调用自定义完成事件
                        if (my.options.onFinishedEvent != null)
                        {
                            my.options.onFinishedEvent(model);  
                        } 
                        break;
                    case '2':
                        //登陆超时
                        window.fireEvent("onLoginTimeOut",resultXML.getValue("Message"));                        
                        window.fireEvent("onError",resultXML.getValue("Message"));                        
                        window.top.location.href = '/member/ilogin.aspx';
                        break;
                    case '3':
                        //数据验证异常
                        my.ShowMessage("错误",resultXML.getValue("Message"));    
                        window.fireEvent("onDataValidateError",resultXML.getValue("Message"));
                        window.fireEvent("onError",resultXML.getValue("Message"));
                        break;
                    case '4':
                        //逻辑层允许异常
                        my.ShowMessage("错误",resultXML.getValue("Message"));    
                        window.fireEvent("onLogicError",resultXML.getValue("Message"));
                        window.fireEvent("onError",resultXML.getValue("Message"));
                        break;
                    case '5':
                        //无权限
                        my.ShowMessage("错误",resultXML.getValue("Message"));    
                        window.fireEvent("onAccessDeniedError",resultXML.getValue("Message"));
                        window.fireEvent("onError",resultXML.getValue("Message"));
                        break;
                    case '6':
                        //ajax出错
                        my.ShowMessage("错误",resultXML.getValue("Message"));    
                        window.fireEvent("onAjaxOperationError",resultXML.getValue("Message"));
                        window.fireEvent("onError",resultXML.getValue("Message"));
                        break;
                    case '7':
                        //web层允许异常
                        my.ShowMessage("错误",resultXML.getValue("Message"));    
                        window.fireEvent("onWebSiteAllowedError",resultXML.getValue("Message"));
                        window.fireEvent("onError",resultXML.getValue("Message"));
                        break;
                    default:
                        my.ShowMessage("错误","未知异常标志：" + resultXML.getValue("Message"));     
                        window.fireEvent("onError",resultXML.getValue("Message"));
                        break;
                }  
            }
            catch(e)
            {
                alert(e.message);
            }            
            
        },onFailure:function(){        
            //显示失败提示信息
            if(my.options.isRaiseOnFaile)
            {
                window.fireEvent("onError","服务器连接失败，请检查网络是否断开！");
            }
            if(my.options.isShowTip)
            {
                infoTip.hide();
                my.ShowMessage("错误","服务器连接失败，请检查网络是否断开！");                 
            }
        }}).request();
    }   
});
AjaxBaseEx.implement(new Events, new Options);

//Model 操作方法类
var ModelToolsEx = new Class({
    options:
    {
        form:''
    },     
    //初始化
    initialize:function(options)
    {
        //设置参数
        this.setOptions(options);       

    },    
    getParamsXML:function(obj) 
    { 
        try
        {
            var strModelNode = "Model";
            
            var strXML = "";
            if (obj == null)
                return strXML;

            if (obj["Model_ClassName"] == null || obj["Model_ClassName"]=="")
                return strXML;
        
            strXML = "<"+strModelNode+">";
            // 开始遍历
            for(var p in obj){
                //不是方法 
                if (typeof(obj[p])=="object"){
                    if (obj[p] != null)
                    {
                        if(typeof(obj[p].length) != "undefined")                    
                        //if($type(obj[p])=="array")
                        {
                            strXML += "<" + p + "><ModelList>";
                            for(var i=0;i<obj[p].length;i++)
                            {
                                strXML += this.getParamsXML(obj[p][i]);
                            }
                            //strXML += GetParamsXML(obj[p]);
                            strXML += "</ModelList></" + p + ">";
                        }
                        else
                        {
                            strXML += "<" + p + ">" + this.getParamsXML(obj[p]) + "</" + p + ">";
                        }
                    }
                } 
                else// if(typeof(obj[p])!="function")
                {
                    //if (obj[p] != "")
                    //此处增加了字符过滤
                        strXML += "<" + p + ">" + this.xmlFilter(obj[p]) + "</" + p + ">"; 
                } 
            } 
            return strXML+"</"+strModelNode+">";
        }
        catch(err)
        {
            return "";
        }
    },
    
    getAjaxXML:function(classname, funname, checkCode, objmodel)
    {
        try
        {
            var strXML = "";
            
            if (classname == null || funname == null || objmodel == null || objmodel["Model_ClassName"] == null)
                return strXML;
               
            if (classname == "" || funname == "" || objmodel["Model_ClassName"]=="")
                return strXML;
            
            strXML = "<Root><LogicClass>"+classname+"</LogicClass><FunctionName>"+funname+"</FunctionName><CheckCode>"+checkCode+"</CheckCode>";//+"<Model>";

            var strModel = this.getParamsXML(objmodel);
            strXML += strModel + "</Root>";
            return strXML;
        }
        catch(err)
        {
            return "";
        }
    },
    
    getModel:function(xmlDom)
        {
        
        
        var result = xmlDom.getNodes("Result");
        var modelList = new Array();
        
        try
        {        
              if(result[0].firstChild != null)
              {
                if(result[0].firstChild.nodeName != "#text")
                {
                    
                    for(var i=0;i<result[0].childNodes.length;i++)
                    {
                        var iResult = null;
                        
                        try
                        {
                                eval("iResult = new " + result[0].childNodes[i].nodeName + "()");
                        }
                        catch(e)
                        {
                            throw ("不能创建实体对象：" + result[0].childNodes[i].nodeName);
                        }
                        
                        for(var r in iResult)
                        {
                            if(r.toString().toLowerCase() != "Model_ClassName".toLowerCase())
                            {
                                
                                //if(r!=null && typeof(r.length) != "undefined")
                                if($type(iResult[r])=="array") 
                                {
                                    
                                    //r = new Array();
                                    
                                    for(var j=0;j<result[0].childNodes[i].childNodes.length;j++)
                                    {
                                        if(r.toString() == result[0].childNodes[i].childNodes[j].nodeName)
                                        {
                                            var nodelist = result[0].childNodes[i].childNodes[j];
                                            for(var k=0;k<nodelist.childNodes.length;k++)
                                            {
                                                var newp = this.AnalysisModel(xmlDom,nodelist.childNodes[k]);
                                                if(newp != null)
                                                {
                                                    //eval("iResult." + r.toString() + "push("+newp+")");
                                                    iResult[r].push(newp);
                                                }
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    try
                                    {              
                                        var nodelist = result[0].childNodes[i];
                                        for(var k=0;k<nodelist.childNodes.length;k++)
                                        {
                                            if(r.toString() == nodelist.childNodes[k].nodeName)
                                            {
                                                //eval("iResult." + r.toString() + " = \"" + escape(xmlDom.getNodeValue(nodelist.childNodes[k],r.toString())) + "\";");
                                                if (window.ie)
                                                {       
                                                    eval("iResult." + r.toString() + " = \"" + escape(nodelist.childNodes[k].text)+ "\";");
                                                    if(nodelist.childNodes[k].childNodes.length>0)
                                                    {
                                                        eval("iResult." + r.toString() + " = \"" + escape(nodelist.childNodes[k].childNodes[0].data)+ "\";");
                                                    } 
                                                }
                                                else
                                                {
                                                    if (nodelist.childNodes[k].firstChild != null)
                                                    {
                                                        eval("iResult." + r.toString() + " = \"" + escape(nodelist.childNodes[k].firstChild.data)+ "\";");
                                                    }
                                                }
                                                if(iResult[r.toString()] != null)
                                                {
                                                    eval("iResult." + r.toString() + " = unescape(iResult." + r.toString() + ");");
                                                }
                                            }
                                        }
                                    }
                                    catch(e)
                                    {
                                        alert("解析数据异常"+e.message+escape(xmlDom.getNodeValue(result[0].childNodes[i],r.toString())));
                                    }
                                }
                            }                
                        }
                        modelList.push(iResult);
                    }
                }
                else
                {
                    modelList.push(result[0].firstChild.nodeValue);
                }
              }
        }
        catch(e)
        {
            alert("解析数据异常2"+e.message);
        }
        return modelList;
    
    },
    
    AnalysisModel:function (xmlDom,xmlNode)
    {
        var iResult = null;
        
        try
        {
            eval("iResult = new " + xmlNode.nodeName + "()");
        }
        catch(e)
        {
            throw ("不能创建实体对象：" + xmlNode.nodeName);
        }
        
        for(var r in iResult)
        {
            if(r.toString().toLowerCase() != "Model_ClassName".toLowerCase())
            {
                try
                {                                
                    eval("iResult." + r.toString() + " = \"" + escape(xmlDom.getNodeValue(xmlNode,r.toString())) + "\";");
                    eval("iResult." + r.toString() + " = unescape(iResult." + r.toString() + ");");
                }
                catch(e)
                {
                    alert("分析实体异常"+escape(xmlDom.getNodeValue(xmlNode,r.toString())));
                }
                
            }                
        }
        
        return iResult;
    },    
//    getModel:function(xmlDom)
//    {
//        var result = xmlDom.getNodes("Result");
//        var modelList = new Array();
//        
//        try
//        {        
//              if(result[0].firstChild != null)
//              {
//                if(result[0].firstChild.nodeName != "#text")
//                {
//                    for(var i=0;i<result[0].childNodes.length;i++)
//                    {
//                        var iResult = null;
//                        
//                        try
//                        {
//                            eval("iResult = new " + result[0].childNodes[i].nodeName + "()");
//                        }
//                        catch(e)
//                        {
//                            throw ("不能创建实体对象：" + result[0].childNodes[i].nodeName);
//                        }
//                        
//                        for(var r in iResult)
//                        {
//                            if(r.toString().toLowerCase() != "Model_ClassName".toLowerCase())
//                            {
//                                try
//                                {                                
//                                    eval("iResult." + r.toString() + " = \"" + escape(xmlDom.getNodeValue(result[0].childNodes[i],r.toString())) + "\";");
//                                    eval("iResult." + r.toString() + " = unescape(iResult." + r.toString() + ");");
//                                }
//                                catch(er)
//                                {
//                                    alert(escape(xmlDom.getNodeValue(result[0].childNodes[i],r.toString())));
//                                }
//                            }                
//                        }
//                        modelList.push(iResult);
//                    }
//                }
//                else
//                {
//                    modelList.push(result[0].firstChild.nodeValue);
//                }
//              }
//        }
//        catch(e)
//        {
//            alert(e);
//        }
//        return modelList;
//        
//    },
    //设置实体值
    setModelValue:function(model)
    {    
        for(var p in model)
        {
            //如果参数是实体对象，需要递归赋值
            if (model[p]!=null && typeof(model[p])=="object")
            {
                model[p] = this.setModelValue(model[p]);
            }else
            {   
                
                //遍历所有input输入框   
                $ES("input",this.options.form).each(function(item,index)
                {
                    switch(item.type)
                    {
                        case 'text':
                        case 'password':
                        case 'hidden':
                            if(p.toString()==item.id)
                            {
                                model[p] = item.value;
                            }
                            break;
                        case 'radio':
                            if(p.toString()==item.name && item.checked)
                            {
                                model[p] = item.value;
                            }
                            break;
                        case 'checkbox':
                            if(p.toString()==item.name && item.checked)
                            {
                                if(model[p]==null)
                                {
                                    model[p] = item.value;
                                }
                                else
                                {
                                //待修改 by rock
                                    model[p] = model[p] + ',' + item.value;
                                }
                            }
                            break;
                        default:
                            break;                            
                    }          
                });
                
                $ES("textarea",this.options.form).each(function(item,index)
                {
                    if(p.toString()==item.id)
                    {
                        model[p] = item.value;
                    }           

                });
                
                $ES("select",this.options.form).each(function(item,index)
                {              
                    if(p.toString()==item.id)
                    {
                        model[p] = item.value;
                    }                 
                });            
            }            
        }        
        return model;    
    },
    
    setFormValueByModel:function(model)
    {
        
        for(var p in model)
        {
            if (model[p]!=null && typeof(model[p])=="object")
            {
                this.setFormValueByModel(model[p]);
            }
            else
            {
                var elName = p.toString();
                var elValue = model[p];
                
                $$("input").each(function(item,index){

                    if(item.type == "text" || item.type == "password")
                    {
                        if(p.toString()==item.id)
                        {
                            item.value = model[p];
                        }
                    }
                    
                    if(item.type == "radio")
                    {
                        if((p.toString()==item.name) && (model[p] == item.value))
                        {
                            item.checked = true;
                        }
                    }
                    
                    if(item.type == "checkbox")
                    {
                        if((p.toString()==item.name) && (model[p] == item.value))
                        {                            
                            item.checked = true;
                        }
                    }
                    
                });
                
                $$("textarea").each(function(item,index){

                    if(p.toString()==item.id)
                    {
                        item.value = model[p];
                    }           
                    
                });
                
                $$("select").each(function(item,index){

                    if(p.toString()==item.id)
                    {
                        item.value = model[p];
                    }           
                    
                });                
            
            }
        }
        
    },
    
    xmlFilter:function(str)
    {
        if(str!=null && typeof(str)=="string")
        {
//            str = str.replace("<","&lt;");
//            str = str.replace(">","&gt;");
//            str = str.replace("&","·");
              str = escape(str);
        }
        return str;
    },
    
    xmlResumption:function(str)
    {
        if(str!=null && typeof(str)=="string")
        {
//            str = str.replace("&lt;","<");
//            str = str.replace("&gt;",">");
//            str = str.replace("·","&");
              str = unescape(str);
        }
        return str;
    }

});
ModelToolsEx.implement(new Options);


var PageTagTools = new Class({
    //获取元素对象
    //参数:source为数据容器,stagname为元素名称,sId元素ID
    //返回:ID对象
    GetObjByTagNameId:function(source,stagname,sId)
    {
        return $(source).getElement(stagname + "[id=" + sId + "]");    

    },

    GetFirstChild:function (tagObj)
    {
        return $(tagObj).getFirst();
    },

    GetChildById:function (sourcetag, tagid)
    {
        return $(sourcetag).getElementById(tagid);
    },

    ClearChild:function (sourcetag)
    {
        //删除存放内容table中tbody内的所有内容
        for(var i=sourcetag.childNodes.length-1; i>=0; i--)
        {
            sourcetag.removeChild(sourcetag.childNodes[i]);
        }
    }
});
