
// JScript 文件
//常用函数库======================================================================================
 
var $ = function(){
    return document.getElementById(arguments[0]);
}
var Class = {
    create: function(){
        return function(){
            this.initialize.apply(this, arguments);
        }
    }
}
var $A = Array.from = function(iterable){
    if (!iterable) 
        return [];
    if (iterable.toArray) {
        return iterable.toArray();
    }
    else {
        var results = [];
        for (var i = 0; i < iterable.length; i++) 
            results.push(iterable[i]);
        return results;
    }
}


var Try = {
    these: function(){
        var returnValue;
        
        for (var i = 0; i < arguments.length; i++) {
            var lambda = arguments[i];
            try {
                returnValue = lambda();
                break;
            } 
            catch (e) {
            }
        }
        
        return returnValue;
    }
}
Function.prototype.bind = function(){
    var __method = this, args = $A(arguments), object = args.shift();
    return function(){
        return __method.apply(object, args.concat($A(arguments)));
    }
}


//======================================================================================
//创建对象的 基础类
var Class = {
    create: function(){
        return function(){
            this.initialize.apply(this, arguments);
        }
    }
}
/*例子
 var XML=Class.create();
 XML.prototype = {
 initialize : function() {   //改造函数
 this.xmlhttp = this.getTransport();
 },
 Load  : function(FileName) { //成员方法
 }
 }
 */
//======================================================================================
// 方法.bind(self,传如的参数数组); 方法绑定到到别人 那运行，并把别人当 this
Function.prototype.bind = function(){
    var __method = this, args = $A(arguments), object = args.shift();
    return function(){
        return __method.apply(object, args.concat($A(arguments)));
    }
}
/*例子
 var XML=Class.create();
 XML.prototype = {
 initialize : function() {   //改造函数
 this.xmlhttp = this.getTransport();
 },
 Load  : function(FileName) { //成员方法
 }
 }
 */
//事件

function GetEvent(event){
    return (event || window.event);
}

function GetEventObj(event){
    return event.target || event.srcElement;
}

Function.prototype.bindAsEventListener = function(object){
    var __method = this;
    return function(event){
        return __method.call(object, event || window.event);
    }
}

Function.prototype.bindEvent = function(){
    var __method = this, object = arguments[0];
    return function(e){
        var EventObj = GetEventObj(e || window.event);
        return __method.apply(object, new Array(EventObj, (window.event || e)));
    }
}
//切换显示
function SwitchDisplay(TagName){
    var DivName=$(TagName);
    if(DivName.style.display=='block')
        DivName.style.display='none';
    else
        DivName.style.display='block';
}
// XML 加载类 ======================================================================================
var XML = Class.create();
XML.prototype = {
    initialize: function(){
        this.xmlhttp = this.getTransport();
    },
    Load: function(FileName){
        this.xmlhttp.open("GET", FileName, true);
        this.xmlhttp.onreadystatechange = this.Loaded.bind(this);
        this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        this.xmlhttp.setRequestHeader("Accept-Charset", "utf-8");
        this.xmlhttp.send(null);
    },
    Loaded: function(){
        if (this.xmlhttp.readyState == 4) {
            this.onLoad();
        }
        else {
        
        }
    },
    //载入完后调用的
    onLoad: function(){
    
    },
    getTransport: function(){
        return Try.these(function(){
            return new XMLHttpRequest()
        }, function(){
            return new ActiveXObject('Msxml2.XMLHTTP')
        }, function(){
            return new ActiveXObject('Microsoft.XMLHTTP')
        }) ||
        false;
    }
}

/*
 var XMLList = new XML();
 //设置加载好以后的方法
 XMLList.onLoad=XMLLoader.bind(XMLList,参数); //用 bind 函数可以吧 XMLList 当成 this
 XMLList.Load("http://www.jdxt.net/data/39.xml");
 function XMLLoader(参数)
 {
    window.alert(this.xmlhttp.responseText);
 }
 */
// 表单验证类 ======================================================================================

//不能为空的验证
//提交按钮 onclick="return CanNotNull($('form1'))" 
//form onsubmit="return CanNotNull($('form1'))" 
//例 Validate.TestValue("555","QQ")
//var Validate=Class.create();
//Validate.prototype={
var Validate = {
    Require: /.+/,
    Email: /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
    Phone: /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/,
    Mobile: /^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/,
    Url: /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
    IdCard: /^\d{15}(\d{2}[A-Za-z0-9])?$/,
    Currency: /^\d+(\.\d+)?$/,
    Number: /^\d+$/,
    Zip: /^[0-9]\d{5}$/,
    QQ: /^[0-9]\d{4,10}$/,
    Integer: /^[-\+]?\d+$/,
    Double: /^[-\+]?\d+(\.\d+)?$/,
    English: /^[A-Za-z]+$/,
    Chinese: /^[\u0391-\uFFE5]+$/,
    UnSafe: /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
    data:/^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$/,
    //测试已经有的正则表达式
    TestValue: function(value, DataType){
        if (value == "") 
            return true;
        if (this[DataType].test(value)) {
            return true;
        }
        else {
            return false;
        }
    },
        //不能为空
    CanNotNull:function(theForm){
        var obj = theForm || event.srcElement;
        var count = obj.elements.length;
        var ErrMag;
        var FirstObj;
        var length = 0;
        for (var i = 0; i < count; i++) { //循环整个表单
            var inputObj = obj.elements[i];
            var _data = inputObj.getAttribute("NotNull");
            
            if (typeof(_data) == "object") continue;
            this.CleanErrMsg(inputObj);
            
            //参考一个对象，如果别人不空那自己也不能空
            if($(_data) && $(_data).value.length==0)
            {
                continue;
            }
            
            ErrMag = inputObj.getAttribute("msg");
            if (_data && inputObj.value.length <= 0) 
            {
                if (!FirstObj) {
                    FirstObj = inputObj;
                    inputObj.focus();
                }
                //各个标签显示错误的模式
                switch(inputObj.tagName.toLowerCase( ))
                {
                    case "select":
                    {
                        this.ShowErrMsg(inputObj,(ErrMag ||"提示：必填项请在下拉列表中选择。") );
                        break;
                    }
                    default:
                    this.ShowErrMsg(inputObj,(ErrMag || "提示：必填项不能为空，请填写。"));
                }
                length++;
              }
                

        }
        if (length > 0) {
            return false;
        }
        else {
            return true;
        }
    },

    //比较大小
    Max: function(V1, V2){
        Number(V1) > Number(V2) ? true : false;
    },
    Min: function(V1, V2){
        Number(V1) < Number(V2) ? true : false;
    },
    
    IsKeyNum: function(){
        if (event.keyCode == 0) 
            return true;
        if((event.keyCode>47 && event.keyCode<58) || (event.keyCode>95 && event.keyCode<106)){
          return true; 
        } 
        else {
          return false; 
        }
    },
    IsDel: function(){
        if ((event.keyCode == 8) || (event.keyCode == 46) || (event.keyCode == 9)) 
            return true;
        else 
            return false;
    },
    
    //显示错误
    ShowErrMsg: function(TagObj, msg)//onblur
    {
        TagObj.style.backgroundColor = "#FF0000";
        var errObjName = (TagObj.id || TagObj.name) + "__ErrorMegPanel";
        try {
            var span = $(errObjName)
            if (span == null) {
                //创建一个显示错误的，SPAN 放到 表单后面
                var span = document.createElement("SPAN");
                span.id = errObjName;
                TagObj.parentNode.insertBefore(span, TagObj.nextSibling);
            }
            span.style.color = "red";
            span.innerHTML = msg;

        } 
        catch (e) {
            alert(e.description);
        }
    },
    
    ShowErrInputStyle: function(TagObj, msg)//onblur
    {
        var errObjName = (TagObj.id || TagObj.name) + "__ErrorMegPanel";
        try {
            var span = $(TagObj.id + "__ErrorMegPanel")
            if (span == null) {
                //创建一个显示错误的，SPAN 放到 表单后面
                var span = document.createElement("SPAN");
                span.id = TagObj.id + "__ErrorMegPanel";
                TagObj.parentNode.insertBefore(span, TagObj.nextSibling);
            }
            span.style.color = "red";
            span.innerHTML = msg;
            TagObj.style.backgroundColor = "#FF0000";
        } 
        catch (e) {
            alert(e.description);
        }
    },
    
    //清除错误消息
    CleanErrMsg: function(TagObj)//onblur
    {
        try {
            var span = $((TagObj.id || TagObj.name) + "__ErrorMegPanel")
            if (span != null) {
                span.style.color = "";
                span.innerHTML = "";
                TagObj.style.backgroundColor = "";
            }
        } 
        catch (e) {
            alert(e.description);
        }
    },
    
    SetErrTextBoxStyle: function(TagObj, msg)//onblur
    {
    
    },
    
    //只能是数字
    //例 //onKeyDown="Validate.OnlyNum(this,500,3,'消息');"
    //onKeyDown="Validate.OnlyNum(this,5,0);" 
    //onblur="Validate.OnlyNum(this,5,0);" 
    OnlyNum: function(TagObj, Max, length, msg)
    {
        if(window.event.ctrlKey || window.event.shiftKey) return true;
        TagObj.style.imeMode =  "disabled";
        try {
            if (!this.IsKeyNum() && !this.IsDel()) {
                throw  (msg || ("提示：只能输入数字"));
            }
            if (!this.TestValue(TagObj.value, "Integer")) {
                throw  (msg || ("提示：只能输入数字"));
            }
            if (Number(TagObj.value) > Max && Max != 0) {
                throw (msg || ("提示：您输入的数值超已过最大数值限制"+Max));
            }
            if (TagObj.value.length > length && length!=0) {
                throw (msg || ("提示：您输入的字数已超过最大"+length+"个字符限制！"));
            }
        } 
        catch (err) {
            this.ShowErrMsg(TagObj,String(err));
            TagObj.style.backgroundColor = "#FF0000";
//          err+=event.type;
            if(event.type=="blur")
            window.alert(err);
            TagObj.value = TagObj.value.substr(0, TagObj.value.length - 1);
            TagObj.value = TagObj.value.substr(0, length);
            window.event.keyCode = null;
            TagObj.focus();
            return false;
        }
        this.CleanErrMsg(TagObj);
        TagObj.style.backgroundColor = "";
        return true;
    },
    //在一个数字范围
    //例 onblur="Validate.ConfineNum(this,50,500,'您输入的数字必须在50～500之内');"
    //onKeyDown="Validate.ConfineNum(this,50,500,'您输入的数字必须在50～500之内');"
    ConfineNum: function(TagObj, Min, Max, msg) 
    {
        if(window.event.ctrlKey || window.event.shiftKey) return true;
        TagObj.style.imeMode =  "disabled";
        try {
            if (!this.IsKeyNum() && !this.IsDel()) {
                throw  (msg || ("提示：只能输入数字"));
            }
            if (!this.TestValue(TagObj.value, "Integer")) {
                throw  (msg || ("提示：只能输入数字"));
            }
            if (Number(TagObj.value) > Max && Max != 0) {
                throw  (msg || ("提示：超过最大"+Max+"限制"));
            }
            if (Number(TagObj.value) < Min && Min != 0 && window.event.keyCode==0 && TagObj.value.length!=0 ) {
                throw  (msg || ("提示：没达到最小数"+Min));
            }
        } 
        catch (err) {
            this.ShowErrMsg(TagObj, err);
            TagObj.style.backgroundColor = "#FF0000";
            window.event.returnValue = false;
            if(String(event.type)=="blur")
            window.alert(err);
            TagObj.value = TagObj.value.substr(0, TagObj.value.length - 1);
            TagObj.value = TagObj.value.substr(0,String(Max).length);
            window.event.keyCode = null;
            TagObj.focus();
            return false;
        }
        this.CleanErrMsg(TagObj);
        TagObj.style.backgroundColor = "";
        return true;
    },
    //现在输入长度
    //例 onblur="Validate.LimitLength(this,5,'您输入的数字必须在50～500之内');"
    //onKeyDown="Validate.LimitLength(this,5,'您输入的数字必须在50～500之内');"
    //onKeyDown="Validate.LimitLength(this,5);"

    LimitLength: function(TagObj, length, msg) //onKeyDown="return limitInput(this,5,'消息');"
    {
        try {
            if (TagObj.value.length > length && !this.IsDel()) {
                throw (msg || ("提示：您输入的字数已超过最大"+length+"个字符限制！"));
            }
        } 
        catch (err) {
            this.ShowErrMsg(TagObj, err);
            TagObj.style.backgroundColor = "#FF0000";
            TagObj.value = TagObj.value.substr(0, TagObj.value.length - 1);
            TagObj.value = TagObj.value.substr(0, length);
            window.event.keyCode = null;
            window.alert(err);
            TagObj.focus();
            return false;
        }
        this.CleanErrMsg(TagObj);
        TagObj.style.backgroundColor = "";
        return true;
    },
    //限制输入的字符在范围内
    ConfineText : function(TagObj,Maxlength,Minlength, msg){
        try {
            if (TagObj.value.length > Maxlength && !this.IsDel() && Minlength != 0 ) {
                throw (msg || ("提示：您输入的字数已超过最大"+Maxlength+"个字符限制！"));
            }else if (TagObj.value.length < Minlength && !this.IsDel() && Minlength != 0 && window.event.keyCode==0 && TagObj.value.length!=0 ) {
                throw (msg || ("提示：您输入的字数没达到最少"+Minlength+"个字符要求！"));
            }
        } 
        catch (err) {
            this.ShowErrMsg(TagObj, err);
            TagObj.style.backgroundColor = "#FF0000";
            TagObj.value = TagObj.value.substr(0, Maxlength);
            window.event.keyCode = null;
            window.alert(err);
            TagObj.focus();
            return false;
        }
        this.CleanErrMsg(TagObj);
        TagObj.style.backgroundColor = "";
        return true;    
    },
    //比较
    Compare : function(TagObj,CompareObj, msg){
        try {
            if (TagObj.value != CompareObj.value && TagObj.value.length>0) {
                throw (msg || ("两个红色提示框中填写的值必须一至"));
            }
        } 
        catch (err) {
            this.ShowErrMsg(TagObj, err);
            this.ShowErrMsg(CompareObj, err);
            TagObj.style.backgroundColor = "#FF0000";
            CompareObj.style.backgroundColor = "#FF0000";
            TagObj.value = TagObj.value.substr(0,CompareObj.value.length);
            window.event.keyCode = null;
            window.alert(err);
//            TagObj.focus();
            return false;
        }
        this.CleanErrMsg(TagObj);
        this.CleanErrMsg(CompareObj);
        TagObj.style.backgroundColor = "";
        CompareObj.style.backgroundColor = "";
        return true;    
    },
    //正则表达式测试
    //例  onblur="Validate.RegValidate(this,'Email','邮箱格式不正确');"
    //onKeyDown="Validate.RegValidate(this,'Email','邮箱格式不正确');"
    RegValidate: function(TagObj, DataType, msg,length)
    {
        try {
            if (!this.TestValue(TagObj.value, DataType) && !this.IsDel()) {
                throw msg;
            }
        } 
        catch (err) {
            this.ShowErrMsg(TagObj, err);
            TagObj.style.backgroundColor = "#FF0000";
            TagObj.value = TagObj.value.substr(0, (length||100));
            window.event.keyCode = null;
            if(String(event.type)=="blur")
            window.alert(err);
            TagObj.focus()
            return false;
        }
        this.CleanErrMsg(TagObj);
        TagObj.style.backgroundColor = "";
        return true;
    },
    //自定义正则表达式
    CustomReg: function(TagObj, expr, msg)//onblur
    {
        var re = new RegExp(expr, "img");
        try {
            if (!re.test(TagObj.value) && TagObj.value.length!=0) {
                throw msg;
            }
        } 
        catch (err) {
            this.ShowErrMsg(TagObj, err);
            TagObj.style.backgroundColor = "#FF0000";
            window.event.keyCode = null;
//          if(String(event.type)=="blur")
//            window.alert(err);
//            TagObj.focus()
            return false;
        }
        this.CleanErrMsg(TagObj);
        TagObj.style.backgroundColor = "";
        return true;
    },
        //yyyy-mm-dd
    isDate:function(TagObj,msg) {
      var sDate=TagObj.value;
          var mDate   = (sDate);//this.TrimStr
          var mLen    = mDate.length;
        try {

          if ( mLen < 8 || mLen > 10 ) throw msg;

          mDate = mDate.replace(/(\/)/g, "-");
          if ( mDate.search(/\d{4}-\d{1,2}-\d{1,2}/gi) == -1 ) throw msg;
          var arrDate = mDate.split('-');
          var mYear   = parseInt(arrDate[0],10);
          var mMonth  = parseInt(arrDate[1],10) - 1;  
          var mDay    = parseInt(arrDate[2],10);

          if (mYear<1900 || mYear>3000)throw msg;

          var objDate = new Date(mYear,mMonth,mDay);
          if(objDate.getFullYear() != mYear || objDate.getMonth() != mMonth || objDate.getDate() != mDay ) throw msg;
      }catch (err) {
              return false;
        this.ShowErrMsg(TagObj, "日期格式不正确");
      }
      
      
      
      
      this.CleanErrMsg(TagObj);
          return true;
      }

    /*
    //验证表单长度
    limitInput: function(TagObj, length, msg) //onKeyDown="return limitInput(this,5,'消息');"
    {
        try {
            if (TagObj.value.length > length) {
                throw msg;
            }
        } 
        catch (err) {
            if (IsDel()) 
                return true;
            this.ShowErrMsg(TagObj, err);
            TagObj.value = TagObj.value.substr(0, TagObj.value.length - 1);
            TagObj.value = TagObj.value.substr(0, length);
            TagObj.style.backgroundColor = "#FF0000";
            window.event.keyCode = null;
            window.alert(err);
            TagObj.focus()
            return false;
        }
        this.CleanErrMsg(TagObj);
        TagObj.style.backgroundColor = "";
        return true;
    },
     limitInput(TagObj,length,msg) //onKeyDown="return limitInput(this,5,'消息');"
     {
     if(TagObj.value.length>length)//判断长度
     {
     if((event.keyCode == 8) || (event.keyCode == 9) || (event.keyCode == 46)){
     window.event.keyCode=0;
     return true;
     }
     if(msg!=undefined){
     window.alert(msg);
     }
     TagObj.value=TagObj.value.substring(0,length);
     TagObj.style.backgroundColor ="#FF0000";
     TagObj.focus()
     return false;
     }
     TagObj.style.backgroundColor ="";
     }
    //正则表达式 regular expression
 */
}

