﻿////////////////////////////////////////////////////////////////////////////
//
//	系统JS公用函数库
//
// 2011-08-29  qingsong
// 增加转成人民币大写金额方法
//

/**
* 常用方法
**/
function $E(id) {
    return document.getElementById(id);
}
function $S(id) {
    var obj = document.getElementById(id);
    return obj.item(obj.selectedIndex).value;
}
function $ST(id) {
    var obj = document.getElementById(id);
    return obj.item(obj.selectedIndex).text;
}
isUndef = function (a) { return typeof a == "undefined"; };
isNull = function (a) { return typeof a == "object" && !a; };
$P = function (parameter, url) {
    url = isUndef(url) ? location.href : url;
    var result = url.match(new RegExp("[\#|\?]([^#]*)[\#|\?]?"));
    url = "&" + (isNull(result) ? "" : result[1]);
    result = url.match(new RegExp("&" + parameter + "=", "i"));
    return isNull(result) ? undefined : url.substr(result.index + 1).split("&")[0].split("=")[1];
};
String.prototype.trim = function () {
    return this.replace(new RegExp("(^[\\s]*)|([\\s]*$)", "g"), "");
}


/**
* 转成人民币大写金额形式
* @param {Integer}： 需转换数值
* @return {String} 转换后的字符串       	
**/
function ConvertMoneyUpper(num) {
    var str1 = '零壹贰叁肆伍陆柒捌玖';  //0-9所对应的汉字
    var str2 = '万仟佰拾亿仟佰拾万仟佰拾元角分'; //数字位所对应的汉字
    var str3;    //从原num值中取出的值
    var str4;    //数字的字符串形式
    var str5 = '';  //人民币大写金额形式
    var i;    //循环变量
    var j;    //num的值乘以100的字符串长度
    var ch1;    //数字的汉语读法
    var ch2;    //数字位的汉字读法
    var nzero = 0;  //用来计算连续的零值是几个

    num = Math.abs(num).toFixed(2);  //将num取绝对值并四舍五入取2位小数
    str4 = (num * 100).toFixed(0).toString();  //将num乘100并转换成字符串形式
    j = str4.length;      //找出最高位
    if (j > 15) { return '溢出'; }
    str2 = str2.substr(15 - j);    //取出对应位数的str2的值。如：200.55,j为5所以str2=佰拾元角分

    //循环取出每一位需要转换的值
    for (i = 0; i < j; i++) {
        str3 = str4.substr(i, 1);   //取出需转换的某一位的值
        if (i != (j - 3) && i != (j - 7) && i != (j - 11) && i != (j - 15)) {    //当所取位数不为元、万、亿、万亿上的数字时
            if (str3 == '0') {
                ch1 = '';
                ch2 = '';
                nzero = nzero + 1;
            }
            else {
                if (str3 != '0' && nzero != 0) {
                    ch1 = '零' + str1.substr(str3 * 1, 1);
                    ch2 = str2.substr(i, 1);
                    nzero = 0;
                }
                else {
                    ch1 = str1.substr(str3 * 1, 1);
                    ch2 = str2.substr(i, 1);
                    nzero = 0;
                }
            }
        }
        else { //该位是万亿，亿，万，元位等关键位
            if (str3 != '0' && nzero != 0) {
                ch1 = "零" + str1.substr(str3 * 1, 1);
                ch2 = str2.substr(i, 1);
                nzero = 0;
            }
            else {
                if (str3 != '0' && nzero == 0) {
                    ch1 = str1.substr(str3 * 1, 1);
                    ch2 = str2.substr(i, 1);
                    nzero = 0;
                }
                else {
                    if (str3 == '0' && nzero >= 3) {
                        ch1 = '';
                        ch2 = '';
                        nzero = nzero + 1;
                    }
                    else {
                        if (j >= 11) {
                            ch1 = '';
                            nzero = nzero + 1;
                        }
                        else {
                            ch1 = '';
                            ch2 = str2.substr(i, 1);
                            nzero = nzero + 1;
                        }
                    }
                }
            }
        }
        if (i == (j - 11) || i == (j - 3)) {  //如果该位是亿位或元位，则必须写上
            ch2 = str2.substr(i, 1);
        }
        str5 = str5 + ch1 + ch2;

        if (i == j - 1 && str3 == '0') {   //最后一位（分）为0时，加上“整”
            str5 = str5 + '整';
        }
    }
    if (num == 0) {
        str5 = '零元整';
    }
    return str5;
}


/**
* 按签名获得XML表单
* @param {String}： Sign
* @return {XML} 转换后的XML字符串       	
**/
function getFormXmlBySign(sign) {
    var xmlDoc = "";
    //文本
    var arrList = document.getElementsByTagName("input");
    for (var i = 0; i < arrList.length; i++) {
        if (isDataControl(arrList[i].id, sign)) {
            var columnName = getDataColumnName(arrList[i].id, sign);
            if (arrList[i].type == "checkbox") {  //复选
                if (arrList[i].checked) {
                    xmlDoc += "<" + columnName + ">1</" + columnName + ">";
                    xmlDoc += "<" + columnName + "Value><![CDATA[" + arrList[i].value + "]]></" + columnName + "Value>";
                }
                else {
                    xmlDoc += "<" + columnName + ">0</" + columnName + ">";
                }
            }
            else if (arrList[i].type == "radio") {  //单选
                if (arrList[i].checked) {
                    xmlDoc += "<" + getDataColumnName(arrList[i].name, sign) + ">" + arrList[i].value + "</" + getDataColumnName(arrList[i].name, sign) + ">";
                    if (arrList[i].text) xmlDoc += "<" + getDataColumnName(arrList[i].name, sign) + "Value><![CDATA[" + arrList[i].text + "]]></" + getDataColumnName(arrList[i].name, sign) + "Value>";
                }
            }
            else {
                xmlDoc += "<" + columnName + "><![CDATA[" + arrList[i].value + "]]></" + columnName + ">";
                columnName = null;
            }
        }
    }
    //下拉列表
    arrList = document.getElementsByTagName("select");
    for (var i = 0; i < arrList.length; i++) {
        if (isDataControl(arrList[i].id, sign)) {
            var columnName = getDataColumnName(arrList[i].id, sign);
            xmlDoc += "<" + columnName + "><![CDATA[" + arrList[i].item(arrList[i].selectedIndex).value + "]]></" + columnName + ">";
            xmlDoc += "<" + columnName + "Text><![CDATA[" + arrList[i].item(arrList[i].selectedIndex).text + "]]></" + columnName + "Text>";
            columnName = null;
        }
    }
    //文本区域
    arrList = document.getElementsByTagName("textarea");
    for (var i = 0; i < arrList.length; i++) {
        if (isDataControl(arrList[i].id, sign)) {
            var columnName = getDataColumnName(arrList[i].id, sign);
            xmlDoc += "<" + columnName + "><![CDATA[" + arrList[i].value + "]]></" + columnName + ">";
            columnName = null;
        }
    }
    return xmlDoc;
}
//是否为数据控件
function isDataControl(controlId, sign) {
    if (controlId.substring(0, sign.length) == sign) { return true; }
    else { return false; }
}
//获得数据列名
function getDataColumnName(controlId, sign) {
    return controlId.substr(sign.length);
} 
//获得XML表单
function getFormXml() {
    return getFormXmlBySign('txt');
}


/**
* 异步操作
* 下面是 XMLHttpRequest 对象的三个重要的属性
* onreadystatechange存储函数（或函数名），每当readyState属性改变时，就会调用该函数。
* readyState存有XMLHttpRequest的状态。从0到4发生变化。
* 0: 请求未初始化
* 1: 服务器连接已建立
* 2: 请求已接收
* 3: 请求处理中
* 4: 请求已完成，且响应已就绪
* status 200: "OK"
*        404: 未找到页面
**/
//创建XMLHttpRequest对象
function createXMLHttpRequest() {
    //定义一个XMLHTTP变量，初始值为false
    var objXMLHttp = false;
    if (window.XMLHttpRequest)  //如果支持XMLHTTP则创建XMLHTTP对象
    {
        objXMLHttp = new XMLHttpRequest();
        if (objXMLHttp.overrideMimeType) {
            objXMLHttp.overrideMimeType("text/xml");
        }
    }
    else if (window.ActiveXObject)  //是否支持XMLHTTP ActiveX
    {
        try {
            objXMLHttp = new ActiveXObject('Msxml2.XMLHTTP');  //IE高版本中创建XMLHTTP对象
        }
        catch (e) {
            try {
                objXMLHttp = new ActiveXObject('Microsoft.XMLHTTP');  //IE低版本中创建
            }
            catch (e)  //都不能创建对象，返回false
            {
                alert("您的浏览器不支持ajax！");
            }
        }
    }
    return objXMLHttp;
}

//封装XMLHTTP的ajax类的代码 
var ajax = new Object();
//定义一个XMLHTTP的数组
ajax.reqList = [];

//封装XMLHTTP向服务器发送请求的操作
ajax.send = function (options) {
    var options = options ? options : {};
    //true：异步；false：同步
    var async = true;
    if (typeof options.async != "undefined") { async = options.async; }
    //请求方式 ("POST" 或 "GET")
    var type = "GET";
    if (typeof options.type != "undefined") { type = options.type; }
    //发送请求的地址
    var url = "";
    if (typeof options.url != "undefined") { url = options.url; }
    //请求完成后回调函数 (请求成功或失败时均调用)。参数： XMLHttpRequest 对象和一个描述成功请求类型的字符串。
    var complete = false;
    if (typeof options.complete != "undefined") { complete = options.complete; }
    //请求成功后回调函数。参数：服务器返回数据，数据格式。
    var success = false;
    if (typeof options.success != "undefined") { success = options.success; }
    // 请求失败时调用时间。参数：XMLHttpRequest 对象、错误信息、（可选）捕获的错误对象。
    var error = false;
    if (typeof options.error != "undefined") { error = options.error; }
    //发送信息至服务器时内容编码类型
    var contentType = "application/x-www-form-urlencoded";
    if (typeof options.contentType != "undefined") { contentType = options.contentType; }
    //参数，请求字符串格式（&name=value）
    var par = "";
    if (typeof options.par != "undefined") { par = options.par; }
    //数据，只对POST
    var data = false;
    if (typeof options.data != "undefined") { data = options.data; }
    //是否XML
    var isXml = false;
    if (typeof options.isXml != "undefined") { isXml = options.isXml; }
    //预期服务器返回的数据类型。如果不指定，jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或 responseText，并作为回调函数参数传递
    var dataType = "";
    if (typeof options.dataType != "undefined") { dataType = options.dataType; }

    //得到一个XMLHTTP的实例
    var xmlHttp = createXMLHttpRequest();

    //当XMLHTTP的请求状态发生改变时调用。每当 readyState 改变时，就会触发 onreadystatechange 事件。readyState 属性存有 XMLHttpRequest 的状态信息。存储函数（或函数名），每当 readyState 属性改变时，就会调用该函数。
    xmlHttp.onreadystatechange = function () {
        //当请求已完成
        if (xmlHttp.readyState == 4) {
            //请求完成后回调函数
            if (complete) eval(complete(xmlHttp, xmlHttp.status));
            //当请求返回成功
            if (xmlHttp.status == 200) {
                //返回数据
                var backValue = xmlHttp.responseText;
                if (dataType == "xml") { backValue = xmlHttp.responseXML; }
                //请求成功后回调函数
                if (success) eval(success(xmlHttp.responseText, xmlHttp.status));
            }
            else  //当请求返回错误
            {
                //请求失败后回调函数
                if (error) {
                    eval(error(xmlHttp, xmlHttp.status));
                }
                else {
                    //alert("程序发生了未知错误，请再次尝试！");
                    return false;
                }
            }
            //删除XMLHTTP，释放资源
            try {
                delete xmlHttp;
                xmlHttp = null;
            }
            catch (e) { }
        }
    };

    //如果以GET方式回发服务器
    if (type == "GET") {
        //异步
        if (async) {
            xmlHttp.open("GET", url + "?rnd=" + (new Date()).getTime() + par, true);
        }
        else {
            xmlHttp.open("GET", url + "?rnd=" + (new Date()).getTime() + par, false);
        }
        xmlHttp.send();
        ajax.reqList.push(xmlHttp);
    }
    else {
        //异步
        if (async) {
            xmlHttp.open("POST", url + "?rnd=" + (new Date()).getTime() + par, true);
        }
        else {
            xmlHttp.open("POST", url + "?rnd=" + (new Date()).getTime() + par, false);
        }
        //请求需要编码
        if (!isXml) { xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); }
        xmlHttp.send(data);
        ajax.reqList.push(xmlHttp);
    }
}

//全部清除XMLHTTP数组元素，释放资源
ajax.clearReqList = function () {
    var ln = ajax.reqList.length;
    for (var i = 0; i < ln; i++) {
        var req = ajax.reqList[i];
        if (req) {
            try {
                delete req;
            }
            catch (e) { }
        }
    }
    ajax.reqList = [];
}

//加载
ajax.loadHTML = function (url, par, resObjId, complete) {
    var complete = (typeof complete != "undefined") ? complete : function () { load.close(); };
    ajax.clearReqList();
    ajax.send({
        url: url,
        par: par,
        success: function (html) {
            if (resObjId != null && $E(resObjId) != null) {
                $E(resObjId).innerHTML = html;
            }
        },
        complete: complete
    });
}
//运行代码
ajax.runCode = function (url, par, success, complete) {
    var success = (typeof success != "undefined") ? success : false;
    var complete = (typeof complete != "undefined") ? complete : function () { load.close(); };
    ajax.clearReqList();
    ajax.send({
        url: url,
        par: par,
        success: success,
        complete: complete
    });
}
//加载、运行代码
ajax.loadHTMLAndRunCode = function (url, par, resObjId, success, complete) {
    var success = (typeof success != "undefined") ? success : false;
    var complete = (typeof complete != "undefined") ? complete : function () { load.close(); };
    ajax.clearReqList();
    ajax.send({
        url: url,
        par: par,
        success: function (html) {
            if (resObjId != null && $E(resObjId) != null) {
                $E(resObjId).innerHTML = html;
                if (success) { success(); }
            }
        },
        complete: complete
    });
}
//保存数据、运行代码
ajax.saveDataAndRunCode = function (url, par, Xml, success, complete) {
    var success = (typeof success != "undefined") ? success : false;
    var complete = (typeof complete != "undefined") ? complete : function () { load.close(); };
    ajax.clearReqList();
    ajax.send({
        type: "type",
        url: url,
        par: par,
        isXml: true,
        data: Xml,
        success: success,
        complete: complete
    });
}


/**
* 验证字段      	
**/
//正则表达式
var validateRegExp = {
    email: "^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$", //邮件
    zip: "^\\d{6}$", //邮编
    tel: "^[0-9\-()（）]{7,18}$", //电话号码的函数(包括验证国内区号,国际区号,分机号)
    mobile: "^(13|15|18)[0-9]{9}$", //手机
    username: "^[A-Za-z0-9_\\-\\u4e00-\\u9fa5]+$", //用户名
    decmal: "^([+-]?)\\d*\\.\\d+$", //浮点数
    decmal1: "^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*$", //正浮点数
    decmal2: "^-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*)$", //负浮点数
    decmal3: "^-?([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0)$", //浮点数
    decmal4: "^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0$", //非负浮点数（正浮点数 + 0）
    decmal5: "^(-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*))|0?.0+|0$", //非正浮点数（负浮点数 + 0）
    integer: "^-?[1-9]\\d*$", //整数
    integer1: "^[1-9]\\d*$", //正整数
    integer2: "^-[1-9]\\d*$", //负整数
    num: "^([+-]?)\\d*\\.?\\d+$", //数字
    num1: "^[1-9]\\d*|0$", //正数（正整数 + 0）
    num2: "^-[1-9]\\d*|0$", //负数（负整数 + 0）		
    ascii: "^[\\x00-\\xFF]+$", //仅ACSII字符
    chinese: "^[\\u4e00-\\u9fa5]+$", //仅中文
    color: "^[a-fA-F0-9]{6}$", //颜色
    date: "^\\d{4}(\\-|\\/|\.)\\d{1,2}\\1\\d{1,2}$", //日期
    idcard: "^[1-9]([0-9]{14}|[0-9]{17})$", //身份证
    ip4: "^(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)$", //ip地址
    letter: "^[A-Za-z]+$", //字母
    letter_l: "^[a-z]+$", //小写字母
    letter_u: "^[A-Z]+$", //大写字母
    notempty: "^\\S+$", //非空
    password: "^[A-Za-z0-9_-]+$", //密码
    picture: "(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$", //图片
    qq: "^[1-9]*[1-9][0-9]*$", //QQ号码
    rar: "(.*)\\.(rar|zip|7zip|tgz)$", //压缩文件
    url: "^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$", //url
    deptname: "^[A-Za-z0-9_()（）\\-\\u4e00-\\u9fa5]+$", //单位名
    realname: "^[A-Za-z0-9\\u4e00-\\u9fa5]+$",  // 真实姓名
    companyname: "^[A-Za-z0-9_()（）\\-\\u4e00-\\u9fa5]+$",
    companyaddr: "^[A-Za-z0-9_()（）\\#\\-\\u4e00-\\u9fa5]+$",
    companysite: "^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&#=]*)?$"
};

//验证规则
var validateRules = {
    isNull: function (str) {
        return (str == "" || typeof str != "string");
    },
    betweenLength: function (str, _min, _max) {
        return (str.length >= _min && str.length <= _max);
    },
    isEmail: function (str) {
        return new RegExp(validateRegExp.email).test(str);
    },
    isZip: function (str) {
        return new RegExp(validateRegExp.zip).test(str);
    },
    isTel: function (str) {
        return new RegExp(validateRegExp.tel).test(str);
    },
    isMobile: function (str) {
        return new RegExp(validateRegExp.mobile).test(str);
    },
    isRealName: function (str) {
        return new RegExp(validateRegExp.realname).test(str);
    },
    isUid: function (str) {
        return new RegExp(validateRegExp.username).test(str);
    },
    isPwd: function (str) {
        return new RegExp(validateRegExp.password).test(str);
    },
    isPwd2: function (str1, str2) {
        return (str1 == str2);
    },
    checkType: function (element) {
        return (element.attr("type") == "checkbox" || element.attr("type") == "radio" || element.attr("rel") == "select");
    },
    isChinese: function (str) {
        return new RegExp(validateRegExp.chinese).test(str);
    },
    isDeptname: function (str) {
        return new RegExp(validateRegExp.deptname).test(str);
    },
    isCompanyname: function (str) {
        return new RegExp(validateRegExp.companyname).test(str);
    },
    isCompanyaddr: function (str) {
        return new RegExp(validateRegExp.companyaddr).test(str);
    },
    isCompanysite: function (str) {
        return new RegExp(validateRegExp.companysite).test(str);
    },
    isInteger: function (str) {
        return new RegExp(validateRegExp.integer).test(str);
    },
    isInteger1: function (str) {
        return new RegExp(validateRegExp.integer1).test(str);
    },
    isInteger2: function (str) {
        return new RegExp(validateRegExp.integer2).test(str);
    }
};
//检查是否为空
function isEmpty(_ID) {
    var obj = $E(_ID);
    if (obj) {
        if (obj.value.trim() == "") { return true; }
    }
    return false;
}
function checkEmpty(_ID, _Msg) {
    if (isEmpty(_ID)) {
        alert(_Msg + "不能为空!");
        $E(_ID).focus();
        return false;
    }
    return true;
}
