//全局配置
//默认的全局实体标识
TaxTools.defaultInstanceName = "taxTools_yhj";
//辅助工具类的设计者
TaxTools.author = "yanghongjian";
//版本号
TaxTools.version = "1.0.0";
//开始设计日期
TaxTools.startDesign = "2009.3.22";
//修改日期
TaxTools.editDate = "";
//修改次数
TaxTools.editDegree = "1";

//统一消息提示框的皮肤配置参数
//提供了五种皮肤，Vista、QQ、dmm-green、ExtBlue和BlackColl
var __ymPrompt_skin = "dmm-green";

/**
 * 清除空格
 */
String.prototype.trim = function() {
    return this.replace(/\s|　|&nbsp(;)?/gi, "");
}

/**
 * Date:2009-3-22<br>
 * 支持多浏览器的税务产品线辅助工具类
 * @author <a href="mailto:yanghongjian@htjs.net">YangHongJian</a>
 * @version 1.0
 *
 * <pre>
 * <OL>
 * 功能支持：
 * <LI>进度提示框   showLoadingMessage/hideLoadingMessage；
 * <LI>表单自动封装成值对字符串   preparePostData
 * <LI>解析JSON的数据格式，并把数据绑定到显示控件    bindFormData
 * <LI>从URL中获取属性值     getUrlQueryString
 * <LI>回车后光标下移    checkLock
 * <LI>封装减化版本的通讯控制组件 xhrAjax    请先引用dhtmlxcommon.js
 * <LI>自动展开折叠   toggleDiv 请先引入toggle.js
 * <LI>四种类型的消息提示类型    请先引入myPrompt.js
 * <lI>cookie操作  setCookie/getCookie/delCookie
 * <LI>添加遮照层    showMask/hideMask
 * <LI>根据DOM的ID获取对象(快速方法)   byId
 * <LI>判断当前浏览器类型及版本号 getIeVer/getFirefoxVer/getChromeVer/getOperaVer/getSafariVer
 * </OL>
 * </pre>
 */
function TaxTools() {
    this.id = TaxTools.defaultInstanceName;
    this._domain = "";
    //发布域根路径
    this._rootPath = "";
    //当前页面的完整路径

    this.prePath = "";
    this._curPage = "";
    //当前页面的相对路径
    this._curPagePath = "";
    //当前页面parent的路径
    this.pPage = "";
    this._bgAlpha = 0.5;	//遮罩透明度
    this._bgAlphaColor = "#FFFFFF";
    //页面的实际宽高
    this._docWidth = 0;
    this._docHeight = 0;
}


//判断当前浏览器类型及版本号
TaxTools.prototype.ua = navigator.userAgent.toLowerCase();
/**
 * 判断当前浏览器类型是否是IE,如果是IE返回版本号
 * @return 如果不是IE返回null,如果是IE返回版本号
 */
TaxTools.prototype.getIeVer = function() {
    if (window.ActiveXObject)
        return this.ua.match(/msie ([\d.]+)/)[1];
    return null;
}

/**
 * 同时兼容ie和ff的写法
 * @return 返回跨浏览器的事件对象
 */
TaxTools.prototype.getEvent = function() {
    if (document.all)    return window.event;
    var func = getEvent.caller;
    while (func != null) {
        var arg0 = func.arguments[0];
        if (arg0)
            if ((arg0.constructor == Event || arg0.constructor == MouseEvent)
                    || (typeof(arg0) == "object" && arg0.preventDefault && arg0.stopPropagation)) {
                return arg0;
            }
        func = func.caller;
    }
    return null;
}

/**
 * 获取触发事件的对象
 * @return 返回触发事件的对象
 */
TaxTools.prototype.getEventTarget = function() {
    var target;
    var evt = getEvent();
    if (this.getIeVer())
        target = evt.srcElement;
    else
        target = evt.srcElement || evt.target;
    return target;
}
/**
 * 判断当前浏览器类型是否是firefox,如果是firefox返回版本号
 * @return 如果不是firefox返回null,如果是firefox返回版本号
 */
TaxTools.prototype.getFirefoxVer = function() {
    if (document.getBoxObjectFor)
        return this.ua.match(/firefox\/([\d.]+)/)[1];
    return null;
}

/**
 * 判断当前浏览器类型是否是chrome,如果是chrome返回版本号
 * @return 如果不是chrome返回null,如果是chrome返回版本号
 */
TaxTools.prototype.getChromeVer = function() {
    if (window.MessageEvent && !document.getBoxObjectFor)
        return this.ua.match(/chrome\/([\d.]+)/)[1];
    return null;
}
/**
 * 判断当前浏览器类型是否是opera,如果是opera返回版本号
 * @return 如果不是opera返回null,如果是opera返回版本号
 */
TaxTools.prototype.getOperaVer = function() {
    if (window.opera)
        return this.ua.match(/opera.([\d.]+)/)[1];
    return null;
}
/**
 * 判断当前浏览器类型是否是safari,如果是safari返回版本号
 * @return 如果不是safari返回null,如果是safari返回版本号
 */
TaxTools.prototype.getSafariVer = function() {
    if (window.openDatabase)
        return this.ua.match(/version\/([\d.]+)/)[1];
    return null;
}

TaxTools.prototype.initTaxTools = function() {
    this._curPage = window.document.location.href;
    this._curPagePath = window.document.location.pathname;
    var pos = this._curPage.indexOf(this._curPagePath);
    this.prePath = this._curPage.substring(0, pos);
    var postPath = this._curPagePath.substring(0, this._curPagePath.substr(1).indexOf('/') + 1);
    this._domain = postPath;

    this._rootPath = this.prePath + postPath;
    try {
        this.pPage = parent.window.document.location.href;
    } catch(e) {
    }
}

//把实例绑定到window对象上,保证整个系统只有一个实例
TaxTools.prototype.bindById = function() {
    var key = "TaxTools." + this.id;
    window[key] = this;
}

//通过id返回实例名称
TaxTools.findInstance = function(id) {
    var key = "TaxTools." + id;
    return window[key];
}

/**
 * 获取发布域路径
 * <pre>
 * 例如地址栏中显示http://localhost/web/dojoajax.htm
 * 该方法返回:http://localhost/web
 * </pre>
 */
TaxTools.prototype.getWebRoot = function() {
    return this._rootPath;
}
TaxTools.prototype.getPrePath = function() {
    return this.prePath;
}
/**
 * 获取当前页的完整路径
 * <pre>
 * 例如地址栏中显示http://localhost/web/dojoajax.htm
 * 该方法返回:http://localhost/web/dojoajax.htm
 * </pre>
 */
TaxTools.prototype.getCurPage = function() {
    return this._curPage;
}

/**
 * 获取当前界面的相对路径<br>
 * <pre>
 * 例如地址栏中显示http://localhost/web/dojoajax.htm
 * 该方法返回:web/dojoajax.htm
 * </pre>
 */
TaxTools.prototype.getCurPagePath = function() {
    return this._curPagePath;
}

/**
 * 从url的属性值对中取值
 * <pre>
 * 例如:http://localhost/web/dojoajax.htm?name=yhj&note=good
 * var name = taxTools.getUrlQueryString('name');
 * name值为"yhj"
 * <pre>
 * @param val 要获取的属于
 * @return 没有找到时返回""
 */
TaxTools.prototype.getUrlQueryString = function(val) {
    var uri = this._curPage;
    var re = new RegExp("" + val + "=([^&?]*)", "ig");
    return ((uri.match(re)) ? (uri.match(re)[0].substr(val.length + 1)) : "");
}
/**
 * 从当前页面的preant页面url的属性值对中取值
 * <pre>
 * 例如:http://localhost/web/dojoajax.htm?name=yhj&note=good
 * var name = taxTools.getUrlQueryString('name');
 * name值为"yhj"
 * <pre>
 * @param val 要获取的属于
 * @return 没有找到时返回""
 */
TaxTools.prototype.getpUrlQueryString = function(val) {
    var uri = this.pPage;
    var re = new RegExp("" + val + "=([^&?]*)", "ig");
    return ((uri.match(re)) ? (uri.match(re)[0].substr(val.length + 1)) : "");
}

/**
 * 解析JSON的数据格式，并把数据绑定到显示控件
 * strJson 基本格式为控件NAME:值
 * @param formName json格式的对象,注意显示控件的NAME要与JSON的键名要保持一致
 */
TaxTools.prototype.bindFormData = function (formName, jsonObj) {
    try {
        //排除不需要显示的列
        for (var key in jsonObj) {
            var obj = this.byId(formName + "_" + key);
            if (obj) {
                if (obj.tagName.toLowerCase() == "input")
                    if (obj.type.toLowerCase() == "checkbox") {
                        var bCheck = jsonObj[key];
                        if (bCheck == 1)
                            obj.checked = true;
                    }
                obj.value = jsonObj[key];
            }
        }
    } catch(e) {
        alert("客户端绑定错误:\n"
                + "URL:\n\t" + this._curPage
                + "\nmessage:\n\t" + e.message);
    }
}

//获取对象
//function $obj(id){
//	return document.getElementById(id);
//}

//obj:要添加css的对象，css:css文本,append:追加还是覆盖，默认覆盖
TaxTools.prototype._addCSS = function(obj, css, append) {
    if (!append) {
        this._isOpera ? obj.setAttribute("style", css) : obj.style.cssText = css;
    } else {
        this._isOpera ? obj.setAttribute("style", obj.getAttribute("style") + css) : obj.style.cssText += css;
    }
}
//显示遮罩层
TaxTools.prototype.showMask = function() {
    //第一次需要创建一个蒙板层
    if (!this.byId("promptShield")) {
        var shieldStyle = "position:absolute;top:0px;left:0px;width:0;height:0;background:" + this._bgAlphaColor + ";text-align:center;z-index:10000;filter:alpha(opacity=" + (this._bgAlpha * 100) + ");opacity:" + this._bgAlpha + ";";
        try {    //IE
            document.body.appendChild(document.createElement("<div id='promptShield' style=\"" + shieldStyle + "\">1212312</div>"));
            //为IE创建Iframe遮罩
            document.body.appendChild(document.createElement("<iframe id='promptShieldIframe'></iframe>"));
        } catch(e) {
            var promptShield = document.createElement("div");
            promptShield.id = "promptShield";
            promptShield.setAttribute("style", shieldStyle);
            document.body.appendChild(promptShield);
            promptShield = null;
        }
    }
    document.getElementById("promptShield").style.display = "none";	//如果显示则先隐藏便于后面计算页面的高宽
    //根据html Doctype获取html根节点，以兼容非xhtml的页面
    var rootEl = document.compatMode == "CSS1Compat" ? document.documentElement : document.body;	//根元素
    //使用scrollTop和scrollWidth判断是否有滚动条更加准确，但需要加上onscroll监听,
    // 一旦发现有scrollTop或scrollLeft则使用scrollWidth/Height
    this._docHeight = ((rootEl.scrollTop == 0) ? rootEl.clientHeight : rootEl.scrollHeight) + "px";
    this._docWidth = ((rootEl.scrollLeft == 0) ? rootEl.clientWidth : rootEl.scrollWidth) + "px";

    this.byId("promptShield").style.width = this._docWidth;
    this.byId("promptShield").style.height = this._docHeight;

    //添加Iframe遮罩，仅在IE下才会存在Iframe遮罩
    var psIframe = this.byId("promptShieldIframe");
    if (psIframe) {
        this._addCSS(psIframe, this.byId("promptShield").style.cssText + ";z-index:9999;filter:alpha(opacity=0);opacity:0");
        psIframe.style.display = "";
    }
    //显示蒙板
    this.byId("promptShield").style.display = "";
    rootEl = null;	//清空引用，释放内存
    //禁止对页面的任何操作
    document.body.onselectstart = function() {
        return false
    };
    document.body.oncontextmenu = function() {
        return false
    };
};

//隐藏遮罩层
TaxTools.prototype.hideMask = function() {
    //隐藏蒙板
    this.byId("promptShield").style.display = "none";
    if (this.byId("promptShieldIframe"))     //隐藏IE下创建的Iframe遮罩
        this.byId("promptShieldIframe").style.display = "none";

    document.body.onselectstart = function() {
        return true
    };
    document.body.oncontextmenu = function() {
        return true
    };
};

/**
 * 默认的操作进度提示方法
 * @param msg 提示文字,不指定时显示默认提示文字
 */
TaxTools.prototype.showLoadingMessage = function(msg) {
    var div = document.getElementById("yhj_" + this.id + "_loading_div");
    msg = "<span style='color:#f00;font-size:12px;'>" + (msg && msg.length > 0 ? msg : "加载中...") + "</span>";
    if (div == null) {
        div = document.createElement("DIV");
        document.body.appendChild(div);
        div.id = "yhj_" + this.id + "_loading_div";
        div.style.display = "none";
        div.style.position = "absolute";
        div.style.height = 32;
        div.style.zIndex = "11000";
        div.style.textAlign = "center";
        //        div.innerHTML = "<img src='" + this._rootPath
        //                + "/commons/taxui/images/loading.gif'/><br><span id=yhj_msg></span";
        var oImg = new Image();
        oImg.src = this._domain + "/include/images/loading.gif";
        div.innerHTML = "<img src='" + oImg.src + "'/><br><span id=yhj_msg></span>";
        delete oImg;
    }
    var len = (msg.length - 26) * 12;
    div.style.width = len;
    div.style.top = (document.body.clientHeight / 2 - 32) + "px";
    div.style.left = (document.body.clientWidth / 2 - len / 2) + "px";
    this.byId("yhj_msg").innerHTML = msg;
    div.style.display = "";
    this.showMask();
}

/**
 * 默认的操作进度提示隐藏方法
 */
TaxTools.prototype.hideLoadingMessage = function() {
    this.hideMask();
    var div = this.byId("yhj_" + this.id + "_loading_div");
    if (div != null)
        div.style.display = "none";
}

/**
 * 兼容火狐的回车换焦点
 * @param event
 */
TaxTools.prototype.checkLock = function(event) {
    try {
        var keycode;
        event = event ? event : (window.event ? window.event : event);
        if (document.all) {
            keycode = event.keyCode;
        } else {
            keycode = event.which;
        }
        var src = event.srcElement ? event.srcElement : event.target;
        if (keycode == 13) {
            if (document.all) {
                event.keyCode = 9;
            } else {
                var fl = document.forms.length;  //子桢个数.
                for (var a = 0; a < fl; a++) {
                    var ele = document.forms[a].elements;
                    for (var i = 0; i < ele.length; i++) {
                        var q = (i == ele.length - 1) ? 0 : i + 1;//   if   last   element   :   if   any   other
                        if (src == ele[i]) {
                            ele[q].focus();
                            break;
                        }
                    }
                }
                event.preventDefault();
            }
        }
    } catch(e) {
    }
}

var specialChars = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\' };
var replaceChars = function(chr) {
    return specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16);
};

/**
 * 自动组装指定表单数据
 * @param formNames 表单名称数组，可以为空
 * @param params 附加参数对象数组 可以为空
 * @return 返回值对字符串,找不到表单时返回""
 */
TaxTools.prototype.preparePostData = function(formNames, params) {
    var result = [];
    if (formNames) {
        for (var f = 0; f < formNames.length; f++) {
            var formObj = document.getElementById(formNames[f]);
            if (formObj)
                for (var i = 0; i < formObj.elements.length; i++) {
                    var el = formObj.elements[i];
                    if (el.post == 0)//是否提交的伪属性
                        continue;
                    //   alert(result+'\ntagName='+el.tagName+'\ttagType='+el.type+'\nelName='+el.name+'\nelValue='+el.value)
                    if (el.tagName.toLowerCase() == "select") {
                        for (var j = 0; j < el.options.length; j++) {
                            var op = el.options[j];
                            if (op.selected)
                                result.push("&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(op.value.replace(/[\x00-\x1f\\"]/g, replaceChars)));
                        }
                    } else if (el.tagName.toLowerCase() == "textarea") {
                        result.push("&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value.replace(/[\x00-\x1f\\"]/g, replaceChars)));
                    } else if (el.tagName.toLowerCase() == "input") {
                        if(el.type.toLowerCase() == "hidden"){
                           result.push("&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value));//不处理特殊字符，为编辑器使用 edit by jiangxiangwei 2009-6-9
                        }else if (el.type.toLowerCase() == "checkbox" || el.type.toLowerCase() == "radio") {
                            if (el.checked)
                                result.push("&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value.replace(/[\x00-\x1f\\"]/g, replaceChars)));
                        } else if ((el.type.toLowerCase() != "button") && (el.type.toLowerCase() != "reset")) {
                            result.push("&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value.replace(/[\x00-\x1f\\"]/g, replaceChars)));
                        }
                    }
                }
            formObj = null;
        }
    }
    //添加附加参数
    if (params)
        for (var key in params) {
            var val = params[key] != undefined ? params[key].toString() : "";
            val = val.toString().replace(/[\x00-\x1f\\"]/g, replaceChars);
            result.push("&" + encodeURIComponent(key) + "=" + encodeURIComponent(val));
        }
    return result.join("");
}

/**
 * 简化调用版本,根据参数对象中指定的值向服务端提交请求
 * <pre>
 * 例如:
 *  var xhrArgs = {
 url:"getXT_USERByPage.do",
 method:"POST",
 forms:["saveForm"],
 params:params,
 msg:"正在加载..." ,//进度提示文字 可以不写
 //  callBefore:[callBefore],
 callback:[pageFlowControl]
 };
 taxTools.xhrAjax(xhrArgs);
 * </pre>
 * @param xhrArgs
 * 例如:
 * //请求时的参数
 var params = {USER_DM:taxTools.byId("saveForm_USER_DM").value};
 * var args = {
 url:"getXT_USERByPage.do",
 method:"POST",
 forms:["form1",],
 params:{id:123,ddre:234},
 msg:"加载中..." ,//进度提示文字 可以不写
 callback:[fun1,fun2]
 };
 */
TaxTools.prototype.xhrAjax = function(xhrArgs) {
    this.showLoadingMessage(xhrArgs.msg);
    var bl = true;
    //在发送请求前回调函数
    if (xhrArgs.callBefore != null)
        for (var b = 0; b < xhrArgs.callBefore.length; b++) {
            if (!xhrArgs.callBefore[b](xhrArgs)) {
                bl = false;
                taxTools.hideLoadingMessage();
                return;
            }
        }

    if (bl && xhrArgs.forms != null) {
        for (var f = 0; f < xhrArgs.forms.length; f++) {
            //进行form校验
            /*
             if (!Validator.Validate(dojo.byId(f), 1))
             {
             bl = false;
             return;
             }
             */
        }
    }
    var loader;
    if (bl) {
        var urlParam = this.preparePostData(xhrArgs.forms, xhrArgs.params);
        if (xhrArgs.method && xhrArgs.method.toUpperCase() == "GET")
            loader = dhtmlxAjax.getSync(xhrArgs.url + "?" + urlParam);
        else
            loader = dhtmlxAjax.postSync(xhrArgs.url, urlParam);
        var jsonObj = null;
        try {
            jsonObj = eval('(' + loader.xmlDoc.responseText + ')');
        } catch(e) {
            alert("系统提示:\n返回值不能够生成JSON对象,中止执行!\n\n错误类型:" + e.name + "\n错误信息:" + e.message);
            urlParam = null;
            this.hideLoadingMessage();
            loader = null;
            return;
        }
        if (xhrArgs.callback != null)
            for (var i = 0; i < xhrArgs.callback.length; i++)
                xhrArgs.callback[i](jsonObj, xhrArgs);

        jsonObj = null;
        urlParam = null;
    }

    this.hideLoadingMessage();
    loader = null;
}

/**
 * 自动展开折叠
 * 注意：先引入toggle.js
 * @param titleID 标题标签ID
 * @param divID 需要展开折叠的DIV标签ID
 */
TaxTools.prototype.toggleDiv = function(titleID, divID) {
    var div = new _toggle($.id(divID));
    $.id(titleID).onclick = function() {
        div.toggle();
    }
}

/**
 * 普通消息提示类型
 * 注意:先引入myPrompt.js
 * <pre>
 * 例如:
 * taxTools.alertInfo("请录入用户代码",function(){taxTools.byId("saveForm_USER_DM").focus();});
 * </pre>
 * @param message 消息组件要显示的内容
 */
TaxTools.prototype.alertInfo = function() {
    var fun = null;
    if (arguments[1] != null)
        fun = arguments[1];
    Alert(arguments[0], null, null, "系统提示", fun, null);
}

/**
 * 成功信息类型
 * 注意:先引入myPrompt.js
 *  taxTools.alertSucceedInfo("请录入用户代码",function(){taxTools.byId("saveForm_USER_DM").focus();})
 * @param message 消息组件要显示的内容
 * @param fun 回调函数
 */
TaxTools.prototype.alertSucceedInfo = function() {
    var fun = null;
    if (arguments[1] != null)
        fun = arguments[1];
    SucceedInfo(arguments[0], null, null, "系统提示", fun, null);
}

/**
 * 错误信息类型
 * 注意:先引入myPrompt.js
 * <pre>
 * 例如:
 * taxTools.alertErrorInfo("请录入用户代码",function(){dojo.byId("saveForm.USER_DM").focus();});
 * </pre>
 * @param message 消息组件要显示的内容
 */
TaxTools.prototype.alertErrorInfo = function() {
    var fun = null;
    if (arguments[1] != null)
        fun = arguments[1];
    ErrorInfo(arguments[0], null, null, "系统提示", fun, null);
}

/**
 * 询问消息类型
 * @param message 消息组件要显示的内容
 * @param title 标题
 * @param funQD 确定回调函数
 * @param funQX 取消回调函数
 */
TaxTools.prototype.alertConfirmInfo = function() {
    var funQD = null;
    var funQX = null;
    var message = null;
    var title = null;
    if (arguments[0] != null)
        message = arguments[0];
    if (arguments[1] != null)
        title = arguments[1];
    if (arguments[2] != null)
        funQD = arguments[2];
    if (arguments[3] != null)
        funQX = arguments[3];

    // 消息, 宽, 高, 标题,确定回调函数,取消回调函数
    ConfirmInfo(message, null, null, "系统提示", funQD, funQX);
}

/**
 * 询问消息类型(不需要title参数)
 * @param message 消息组件要显示的内容
 * @param funQD 确定回调函数
 * @param funQX 取消回调函数
 */
TaxTools.prototype.alertConfirm = function() {
    var funQD = null;
    var funQX = null;
    var message = null;
    if (arguments[0] != null)
        message = arguments[0];
    if (arguments[1] != null)
        funQD = arguments[1];
    if (arguments[2] != null)
        funQX = arguments[2];

    // 消息, 宽, 高, 标题,确定回调函数,取消回调函数
    ConfirmInfo(message, null, null, "系统提示", funQD, funQX);
}

/**
 * 设置 cookies 默认存活时间为30天，可以在第三个参数中设定存活时间
 * @写cookies
 * @param {String} name cookies' 名称
 * @param {String} value cookies' 值
 */
TaxTools.prototype.setCookie = function(name, value) {
    var days = 30;
    var exp = new Date();
    exp.setTime(exp.getTime() + days * 24 * 60 * 60 * 1000);
    document.cookie = name + "=" + escape(value) + ";expires=" +
                      exp.toGMTString();
}

/**
 * 从cookies中获取指定的值
 * @param {String} name cookies' name
 * @return {string} 返回指定name的值
 */
TaxTools.prototype.getCookie = function(name) {
    var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
    if (arr == document.cookie.match(reg))
        return unescape(arr[2]);
    else
        return null;
}

/**
 * 从cookies中删除指定name的值
 * @param {String} name cookies'name
 */
TaxTools.prototype.delCookie = function(name) {
    var exp = new Date();
    exp.setTime(0);
    document.cookie = name + "=" + escape(value) + ";expires=" +
                      exp.toGMTString();
}

/**
 * 根据DOM的ID获取对象(快速方法)
 * @param tagId DOM的ID
 */
TaxTools.prototype.byId = function(tagId) {
    return document.getElementById(tagId);
}
/**
 * MD5加密算法
 * 例如:
 *  var strMd = taxTools.MD5(taxTools.byId("saveForm_USER_DM").value);
 taxTools.alertInfo(strMd);
 * @param {String} s 需要加密的字符串
 * @param {String} r
 * @param {String} hexcase
 * @param {String} chrsz
 * @return {String} 返回加密后的字符串
 */
TaxTools.prototype.MD5 = function(s, r, hexcase, chrsz) {
    r = (typeof r == "undefined" ? false : r);
    hexcase = (typeof hexcase == "undefined" ? false : hexcase);
    chrsz = (typeof chrsz == "undefined" ? 8 : chrsz);
    function safe_add(x, y) {
        var lsw = (x & 0xFFFF) + (y & 0xFFFF);
        var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
        return (msw << 16) | (lsw & 0xFFFF);
    }
    function bit_rol(num, cnt) {
        return (num << cnt) | (num >>> (32 - cnt));
    }
    function md5_cmn(q, a, b, x, s, t) {
        return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
    }
    function md5_ff(a, b, c, d, x, s, t) {
        return md5_cmn((b & c) | ((~ b) & d), a, b, x, s, t);
    }
    function md5_gg(a, b, c, d, x, s, t) {
        return md5_cmn((b & d) | (c & (~ d)), a, b, x, s, t);
    }
    function md5_hh(a, b, c, d, x, s, t) {
        return md5_cmn(b ^ c ^ d, a, b, x, s, t);
    }
    function md5_ii(a, b, c, d, x, s, t) {
        return md5_cmn(c ^ (b | (~ d)), a, b, x, s, t);
    }
    function core_md5(x, len) {
        x[len >> 5] |= 0x80 << ((len) % 32);
        x[(((len + 64) >>> 9) << 4) + 14] = len;
        var a = 1732584193;
        var b = -271733879;
        var c = -1732584194;
        var d = 271733878;
        for (var i = 0; i < x.length; i += 16) {
            var olda = a;
            var oldb = b;
            var oldc = c;
            var oldd = d;
            a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
            d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
            c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
            b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
            a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
            d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
            c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
            b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
            a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
            d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
            c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
            b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
            a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
            d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
            c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
            b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
            a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
            d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
            c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
            b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
            a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
            d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
            c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
            b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
            a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
            d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
            c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
            b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
            a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
            d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
            c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
            b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
            a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
            d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
            c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
            b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
            a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
            d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
            c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
            b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
            a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
            d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
            c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
            b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
            a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
            d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
            c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
            b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
            a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
            d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
            c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
            b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
            a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
            d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
            c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
            b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
            a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
            d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
            c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
            b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
            a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
            d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
            c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
            b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
            a = safe_add(a, olda);
            b = safe_add(b, oldb);
            c = safe_add(c, oldc);
            d = safe_add(d, oldd);
        }
        return [a, b, c, d];
    }
    function str2binl(str) {
        var bin = [];
        var mask = (1 << chrsz) - 1;
        for (var i = 0; i < str.length * chrsz; i += chrsz)
            bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32);
        return bin;
    }
    function binl2str(bin) {
        var str = "";
        var mask = (1 << chrsz) - 1;
        for (var i = 0; i < bin.length * 32; i += chrsz)
            str += String.fromCharCode((bin[i >> 5] >>> (i % 32)) & mask);
        return str;
    }
    function binl2hex(binarray) {
        var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
        var str = "";
        for (var i = 0; i < binarray.length * 4; i++)
            str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF);
        return str;
    }
    return (r ? binl2str(core_md5(str2binl(s), s.length * chrsz)) : binl2hex(core_md5(str2binl(s), s.length * chrsz)));
}

//创建税务产品线辅助工具类对象
var taxTools = new TaxTools();
taxTools.bindById();
taxTools.initTaxTools();

//页面卸载时清除对象
function unLoadDestory() {
    //清删除dhtmlxAjax对象
    if (typeof(dhtmlxAjax) == 'object') {
        delete dhtmlxAjax;
        dhtmlxAjax = null;
    }

    //清删除taxTools对象
    delete taxTools;
    taxTools = null;
}
window.onunload = unLoadDestory;

//屏蔽后退
function keyDown(event) {
    try {
        event = event ? event : (window.event ? window.event : event);
        var Element = event.srcElement ? event.srcElement : event.target;
        var type = Element.tagName.toLowerCase();
        if ((event.keyCode == 8) &&
            (type != "text" &&
             type != "textarea" &&
             type != "password") || //屏蔽退格删除键
            (event.keyCode == 116) || //屏蔽 F5 刷新键
            (event.ctrlKey && event.keyCode == 82)) {            //Ctrl + R
            if (document.all) {
                event.keyCode = 0;
                event.returnvalue = false;
            } else {
                event.returnvalue = false;
            }
        }
    } catch(e) {
    }
}
document.onkeydown = keyDown;
