﻿
Hc.imageFilter=/^(jpg|jpeg|gif|png)$/i;//{jpg:true,jpeg:true,gif:true,png:true};
Hc.imageText="jpg,jpeg,gif,png";
Hc.isImage=function(file){
    var index = file.lastIndexOf(".");
    if(index != -1){
        var type=file.substring(index+1);
        //if(this.imageFilter[type]){
        if(Hc.imageFilter.test(type)){
            return true;
        }
    }
    return false;
};

Hc.flashFilter=/^(swf|flv)$/i;//{swf:true,flv:true};
Hc.flashText="swf,flv";
Hc.isFlash=function(file){
    var index = file.lastIndexOf(".");
    if(index != -1){
        var type=file.substring(index+1);
        //if(this.flashFilter[type]){
        if(Hc.flashFilter.test(type)){
            return true;
        }
    }
    return false;
};

Hc.mediaFilter=/^(avi|mp4|rm|rmvb)$/i;//{avi:true,mp4:true,rm:true,rmvb:true};
Hc.mediaText="avi,mp4,rm,rmvb";
Hc.isMedia=function(file){
    var index = file.lastIndexOf(".");
    if(index != -1){
        var type=file.substring(index+1);
        //if(this.mediaFilter[type]){
        if(Hc.mediaFilter.test(type)){
            return true;
        }
    }
    return false;
};

Hc.audioFilter=/^(mp3|wma)$/i;//{mp3:true,wma:true};
Hc.audioText="mp3,wma";
Hc.isAudio=function(file){
    var index = file.lastIndexOf(".");
    if(index != -1){
        var type=file.substring(index+1);
        //if(this.audioFilter[type]){
        if(Hc.audioFilter.test(type)){
            return true;
        }
    }
    return false;
};

function openDialog(url,size,flag){
	size=size||{};
	var w=size.w,
		h=size.h;
	w=w==null?800:w;
	h=h==null?600:h;
	var l=screen.width/2-w/2,
	    t=screen.height/2-h/2;
	if(flag){
	    window.showModalDialog(url,window,"dialogHeight:"+h+"px;dialogWidth:"+w+"px;center:yes;status:no");
	}else{
	    window.open(url,"","height="+h+",width="+w+",left="+l+",top="+t,",scrollbars=yes");
	}
}


function showMenu(num){
    //Hc.onload(function(){
        Hc.addClass(Hc.get("menu"+num),"hover");
    //});
}
//---------------------------------------------------------------------------------------------------------------------------------------
var tempFn=function(){};
function Ajax(){
	this.newAjax=function(){
		/*if(window.XMLHttpRequest){
			return new XMLHttpRequest();
		}else if(window.ActiveXObject){
			try{
				return new ActiveXObject("Msxml2.XMLHTTP");
			}catch(e){
				try{*/
					return new ActiveXObject("Microsoft.XMLHTTP");
				/*}catch(e){
					return null;
				}
			}
		}else{
			return null;
		}*/
	}

	this.send=function(url,context,_function,varAsync,isMode){
		mode=isMode;
		if(varAsync){
			this.varAsync=varAsync;
		}
		if(_function!=null){
			execute=_function;
		}
		this.url=url;
		xmlHttp.onreadystatechange=this.Call;
		xmlHttp.open("POST",this.url,this.varAsync);
		xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		xmlHttp.send(context);
	}

	this.Call=function() {
		if (xmlHttp.readyState == 4){
			if(xmlHttp.status == 200){
				//var xml=xmlHttp.responseXML;
				var str=xmlHttp.responseText;
				var xmlDom;
				switch(mode.toLowerCase()){
				    case "json":
				        xmlDom=eval("("+str+")");
				        break;
				    case "xml":
				        xmlDom = new ActiveXObject("Microsoft.XmlDom"); 
					    xmlDom.loadXML(str);
				        break;
				    default:
				        xmlDom=str;
				        break;
				}
				if(execute!=null){
					if(typeof(execute)=="function"){
						execute(xmlDom);
					}else{
						new Function(execute)(xmlDom);
					}
				}else{
					alert("_function = null");
				}
			}
			xmlHttp.onreadystatechange=tempFn;
			xmlHttp=null;
		}
   }

	var strToXML=function(XMLstr){
		var xmlDoc=null;
		if(XMLstr==null || XMLstr.length<1){
			return xmlDoc;
		}
		if(window.ActiveXObject){
			 xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
			 xmlDoc.async=false;
			 xmlDoc.loadXML(XMLstr);
		}else if(document.implementation && document.implementation.createDocument){
			 xmlDoc=document.implementation.createDocument('','',null);
			 xmlDoc.loadXML(XMLstr);
		}
		return xmlDoc;
	}
	var mode;
	this.varAsync=true;
	this.url;
	var xmlHttp=this.newAjax();
	var execute;
}

function post(url,context,_function,varAsync,json){
	var xml=new Ajax();
	xml.send(url,context,_function,varAsync,json);
}


//--------------------------------------------------------------------------------------------------------------------------------
Hc.Validate = {
	ErrorItem : [document.forms[0]],
	existentMessage:[],
	ErrorMessage : ["以下原因导致提交失败："],
	classList:new Array(),
	validate : function(theForm){
		var obj = theForm || event.srcElement;
		if(typeof obj =='string'){
			obj=document.getElementById(obj);
		}
		var count = obj.elements.length;
		this.ErrorMessage.length = 1;
		this.existentMessage.length=0;
		this.ErrorItem.length = 1;
		this.ErrorItem[0] = obj;
		for(var i=0;i<count;i++){
			with(obj[i]){
				var args = getAttribute("dataType");
				if(!args) continue;
				if(args.indexOf('NotNull') == -1 && value=="") continue;
				args=args.split(',');
				var _dataType=args[0];
				if(!_dataType)  continue;
				switch(_dataType){
					case "MT":
						if(!this.Mobile.test(value) && !this.Phone.test(value)){
							this.AddError(i, getAttribute("msg"));
						}
						break;
					case "Date":
					case "Repeat":
					case "Range":
					case "RangeWithin":
					case "Compare":
					case "Custom":
					case "Group": 
					case "Limit":
					case "LimitB":
					case "SafeString":
						if(!eval(this[_dataType])){
							this.AddError(i, getAttribute("msg"));
						}
						break;
					default :
						if(!this[_dataType].test(value)){
							this.AddError(i, getAttribute("msg"));
						}
						break;
				}
			}
		}
		if(this.ErrorMessage.length > 1){
			var errCount = this.ErrorItem.length;
			Hc.Message.error(this.ErrorMessage.join("<br>"));
			try{
				this.ErrorItem[1].focus();
			}catch(e){}
			return false;
		}
		return true;
	},
	limit:function(len,min, max){
		min = min || 0;
		max = max || Number.MAX_VALUE;
		return min <= len && len <= max;
	},
	LenB : function(str){
		return str.replace(/[^\x00-\xff]/g,"**").length;
	},
	AddError : function(index, str){
	    if(this.existentMessage.indexOf(str)==-1){
		    this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
		    this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
		    this.existentMessage.push(str);
		}
	},
	Exec : function(op, reg){
		return new RegExp(reg,"g").test(op);
	},
	compare : function(op1,operator,op2){
		switch (operator) {
			case "NotEqual":
				return (op1 != op2);
			case "GreaterThan":
				return (op1 > op2);
			case "GreaterThanEqual":
				return (op1 >= op2);
			case "LessThan":
				return (op1 < op2);
			case "LessThanEqual":
				return (op1 <= op2);
			default:
				return (op1 == op2);            
		}
	},
	MustChecked : function(name, min, max){
		var groups = document.getElementsByName(name);
		var hasChecked = 0;
		min = min || 1;
		max = max || groups.length;
		for(var i=groups.length-1;i>=0;i--)
			if(groups[i].checked) hasChecked++;
		return min <= hasChecked && hasChecked <= max;
	},
	IsDate : function(op, formatString){
		formatString = formatString || "ymd";
		var m, year, month, day;
		switch(formatString){
			case "ymd" :
				m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
				if(m == null ) return false;
				day = m[6];
				month = --m[5];
				year =  (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
				break;
			case "dmy" :
				m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
				if(m == null ) return false;
				day = m[1];
				month = --m[3];
				year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
				break;
			default :
				break;
		}
		if(!parseInt(month)) return false;
		month = month==12 ?0:month;
		var date = new Date(year, month, day);
        return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate());
		function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
	},
	
	//Require : /.+/,
	'NotNull':	/.+/,
	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}\-))?1\d{10}$/,
	IdCard : /^\d{15}(\d{2}[A-Za-z0-9])?$/,
	Currency : /^\d+(\.\d+)?$/,
	Number : /^\d+$/,
	F2:/^[0-9]+(.{1}[0-9]{1,2})?$/,
	Zip : /^\d{6}$/,
	QQ : /^[1-9]\d{4,8}$/,
	Integer : /^[-\+]?\d+$/,
	Double : /^[-\+]?\d+(\.\d+)?$/,
	EN:/^[A-Za-z0-9]+$/,
	English : /^[A-Za-z]+$/,
	Chinese :  /^[\u0391-\uFFE5]+$/,
	IsSafe : function(str){return !this.UnSafe.test(str);},
	SafeString : "this.IsSafe(value)",
	Limit : "this.limit(value.length,getAttribute('min'),  getAttribute('max'))",
	LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
	Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
	Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
	RangeWithin : "(!getAttribute('min') || parseInt(getAttribute('min')) < value) && (!getAttribute('max') || value < parseInt(getAttribute('max')))",
	Range : "(!getAttribute('min') || parseInt(getAttribute('min')) <= value) && (!getAttribute('max') || value <= parseInt(getAttribute('max')))",
	Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
	Custom : "this.Exec(value, getAttribute('regexp'))",
	Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
	UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
	Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/
 };
 
Hc.Validate.inputNumber=function(event,min,max,callback){
    var keyCode=event.keyCode;
    if(keyCode==37 || keyCode==39){
        return;
    }
    if((keyCode>=48 && keyCode<=57) || (keyCode>=96 && keyCode<=105) || keyCode==8 || keyCode ==46){
        var o=event.srcElement,
        minFlag=(typeof min == "number"),
        maxFlag=(typeof max == "number"),
        frontValue=parseInt(o.value) || 0;
        setTimeout(function(){
            var value=o.value;
            if(value!=""){
                if(minFlag && maxFlag){
                    value=Math.min(Math.max(value,Math.min(min,max)),Math.max(min,max));
                }else if(minFlag){
					value=Math.max(value,min);
                }else if(maxFlag){
                    value=Math.min(value,max);
                }
            }
            o.value=value;
            if(typeof(callback)=="function" && frontValue != value){
                callback(value,frontValue);
            }
        });
    }else{
        event.returnValue = false;
        return;
    }
};
//---------------------------------------------------------------------------------------------------------------------------------------

//---------------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------------------------
Hc.openWindow=function(url,size,dialog){
	size=size||{};
	var w=size.w,
		h=size.h;
	w=w==null?800:w;
	h=h==null?600:h;
	var l=screen.width/2-w/2,
	    t=screen.height/2-h/2;
	if(dialog){
	    window.showModalDialog(url,window,"dialogHeight:"+h+"px;dialogWidth:"+w+"px;center:yes;status:no");
	}else{
	    window.open(url,"","height="+h+",width="+w+",left="+l+",top="+t,",scrollbars=yes");
	}
};

(function(){
    var hash = {
        0:-1,
        1:1
    };
    
    Hc.mouseOverDouble = function(target){
        //var tr = target.parentNode.rowindex
        //while()
        var tr = target.offsetParent.rows[target.rowIndex + hash[target.rowIndex%2]];
        target.className = "hc-grid-row-over";
        tr.className = "hc-grid-row-over";
        if(target.onmouseout){
            return;
        }
        target.onmouseout = mouseOutDouble;
        tr.onmouseout = mouseOutDouble;
    };
    
    function mouseOutDouble(){
        var tr = this.offsetParent.rows[this.rowIndex + hash[this.rowIndex%2]];
        this.className = "";
        tr.className = "";
    };
})();
