/**
 * Version: 1.0 Alpha-1 
 * Build Date: 2008-10-01
 * Copyright (c) 2007-2008, feng_sundy (http://blog.csdn.net/feng_sundy/). All rights reserved.
 * License: Licensed under The MIT License. 
 * Website: http://blog.csdn.net/feng_sundy/
 */
var InvalidForm = Class.create();
InvalidForm.prototype = {
  initialize: function() {
	  if (arguments!=null){
		  if (arguments[0]!=null){
        this.msg = arguments[0].evalJSON();
			}
		}
		this.msgPrefix = "{text:'',textarea:'',radio:'',checkbox:'',select:'',email:'',number_length_rang:'',number_min_length_rang:'',number_max_length_rang:'',length_rang:'',min_length_rang:'',max_length_rang:'',exts:''}".evalJSON();
  },
	init: function(msg){
		if (Object.isString(msg)){
  	  this.msg = eval('(' + msg + ')');
		}else{
			this.msg = msg;
		}
	},
	initAdvance: function (msg){
	  if (Object.isString(msg)){
	    this.advanceMsg = eval('(' + msg + ')');
	  }else{
	    this.advanceMsg = msg;
	  }
	},
	startInvalid: function (){
		for (var i = 0 ; i<this.msg.length;i++){
			var f = this.getObject(this.msg[i].id);
			var t = this._getFormType(f);
			var isPass = true;
			var alertMsg = "";
			var value = "";
			if (t=='file' || t=='password' || t=='text' || t=='textarea' || t=='select'){
				value = f.value.strip();
				if (value==''){
				  isPass = false;
				  alertMsg = this.getMsgPrefix(t) + this.msg[i].msg; 
				}else if (f.invalidType=='secondarydomain'){
				  isPass = !this.checkSecondaryDomain(value);
				  alertMsg = this.msg[i].msg;
				}else if (f.invalidType=='domain'){
					isPass = !this.checkDomain(value);
					alertMsg = this.msg[i].msg;
				}else if (f.invalidType=='email'){
				  isPass = !this.checkEmail(value);
				  alertMsg = this.msgPrefix.email;
				}else if (f.invalidType=='int' || f.invalidType=='+int' || f.invalidType=='-int' || f.invalidType=='number' || f.invalidType=='+number' || f.invalidType=='-number'){
					if (!this.isNumber(value)){
					  isPass = false;
					  alertMsg = f.label + this.msgPrefix.number;
					}else if (f.minlen && f.maxlen){
					  isPass = parseFloat(value)<f.minlen || parseFloat(value)>f.maxlen;
					  alertMsg = f.label + this.msgPrefix.number_length_rang.replace("(min)",f.minlen).replace("(max)",f.maxlen);
					}else if (f.minlen){
					  isPass = parseFloat(value)<f.minlen;
					  alertMsg = f.label + this.msgPrefix.number_min_length_rang.replace("(min)",f.minlen);
					}else if (f.maxlen){
					  isPass = parseFloat(value)<f.maxlen;
					  alertMsg = f.label + this.msgPrefix.number_max_length_rang.replace("(max)",f.maxlen);
					}
				}else if (t=='file' && f.exts){
				  isPass = !this.checkExt(value,f.exts);
				  alertMsg = this.msgPrefix.exts;
				}else if (f.minlen || f.maxlen){
				  isPass = this._length(value)<parseInt(f.minlen) || this._length(value)>parseInt(f.maxlen);
				  alertMsg = f.label + this.msgPrefix.length_rang.replace("(min)",f.minlen).replace("(max)",f.maxlen);
				}else if (f.minlen){
				  isPass = this._length(value)<f.minlen;
				  alertMsg = f.label + this.msgPrefix.min_length_rang.replace("(min)",f.minlen);
				}else if (f.maxlen){
					isPass = this._length(value)<f.maxlen;
					alertMsg = f.label + this.msgPrefix.max_length_rang.replace("(max)",f.maxlen);
				}
			}else if (t=='checkbox' || t=='radio'){
				isPass = !this.checkSelected(f);
				alertMsg = this.getMsgPrefix(t) + this.msg[i].msg;
			}
			if (!isPass){
        alert(alertMsg);
				this.getFocus(f);
				return false;
			}
		}
		return true;
	},
	setMsgPrefix: function (prefix){
	  this.msgPrefix = prefix.evalJSON();
	},
	getMsgPrefix: function (type){
	  if (type=='text' || type=='password'){
	    return this.msgPrefix.text;
	  }else if (type=='textarea'){
	    return this.msgPrefix.textarea;
	  }else if (type=='radio'){
	    return this.msgPrefix.radio;
	  }else if (type=='checkbox'){
	    return this.msgPrefix.checkbox;
	  }else if (type=='select' || type=='file'){
	    return this.msgPrefix.select;
	  }else if (type=='email'){
	    return this.msgPrefix.email;
	  }else{
	    return this.msgPrefix.text;
	  }
	},
  getObject:function(n, d) { //v4.01
		var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
		d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
		if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
		for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=this.getObject(n,d.layers[i].document);
		if(!x && d.getElementById) x=d.getElementById(n); return x;
	},
	_getFormType:function(obj){
		if (obj != null){
			if(obj.length==null){
				return obj.type;
			}else{
			  if(obj.length==0){
			    if(obj.type=='select-one'){
			      return "select";
			    }
			    return obj.type;
			  }else{
				  if (obj[0].parentNode.type=='select-one'){
				    return "select";
				  }
					return obj[0].type;
				}
			}
		}
	},
	_length: function(obj){
		return obj.replace(/[^\x00-\xff]/g,'**').length;
	},
	_getKeyCode: function(e){
		var code;
		if (!e) var e = window.event;
		if (e.keyCode){
			code = e.keyCode;
		}else if (e.which){
			code = e.which;
		}
		return code;
	},
	//-2.36onkeypress
	checkFloat:function(obj,e)	{
		var code = this._getKeyCode(e);
		if ((code<45 || code>57 || code==47) && code!=45 && code!=9 && code!=8) return false;
		if(code==46 && obj.value.indexOf(".")>-1) return false;
		return true;
	},	
	//325onkeypress
	checkInt: function(obj,e)	{
		var code = this._getKeyCode(e);
		if ((code<48 || code>57) && code!=45 && code!=9 && code!=8) return false;
		return true;
	},
	//tag--int,-int,+int
	isInt:function(n,tag){
	  //if (!isNaN(n)) return false;
		if(!n) return false;
		var tag = tag;
		if (tag==null){
		  tag = 'int';
		}
		var regStr = /^[\+|\-|\d?](\d+)?$/;
		if (tag=='-int'){
		  regStr = /^[\-]\d+$/;
		}else if (tag=='+int'){
		  regStr = /^[\+|\d]\d*$/;
		}
		
		if(!regStr.test(n)) return false;
		try{
			if(parseFloat(n)!=n) return false;
		}catch(ex){
			return false;
		}
	  return true;
	},
	//tag--number,-number,+number
  isNumber:function(n,tag){
		//if (!isNaN(n)) return false;
		if(!n) return false;
		var tag = tag;
		if (tag==null){
		  tag = 'number';
		}
		var regStr=/^[\+|\-]\d+(\.\d+)?$/;
		if (tag=='-number'){
		  regStr = /^[\-]\d+(\.\d+)?$/;
		}else if (tag=='+number'){
		  regStr = /^[\+|\d]\d*(\.\d+)?$/;
		}
		if(!regStr.test(n)) return false;
		try{
			if(parseFloat(n)!=n) return false;
		}catch(ex){
			return false;
		}
		return true;
	},
	checkEmail:function (mail) { 
		return(new RegExp(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(mail)); 
	},
	checkSecondaryDomain:function (secondaryDomain){
    var regStr = /^[A-Z|a-z|0-9]+$/;
		return regStr.test(secondaryDomain);
	},
	checkDomain: function(domain){
	  var regStr = /^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9](\.[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9])+\.?$/;
	  return regStr.test(domain);
	},
	checkExt:function(path,extList){
    var ext = this.getFileExt(path);
    extList = extList.toUpperCase();
    var cExt = extList.indexOf("," + ext + ",");
    if (ext == "") return -1;
    if (cExt==-1){
			return 0;
    }else{
			return 1;
    }
  },
	selectText:function(obj){
		if (obj.type=='text' || obj.type=='textarea'){
			obj.select();
		}
	},
	getFullName:function (path){
		var tmp = path;
		var pos = -1;
		pos = tmp.lastIndexOf("\\");
		if (pos==-1){
			pos = tmp.lastIndexOf("/");
		}
		if (pos==-1){
			return path;
		}else{
			return tmp.substring(pos+1);
		}
	},
	getFileExt:function(path){
    var tmp = path;
    tmp = tmp.substring(tmp.lastIndexOf(".")+1);
    return tmp.toUpperCase();
  },
	formatNumber:function(as_str,ai_digit,as_type){
		var fdb_tmp = 0;
		var fi_digit = 0;
		var fs_digit = "1";
		var fs_str = "" + as_str;
		var fs_tmp1 = "";
		var fs_tmp2 = "";
		var fi_pos = 0;
		var fi_len = 0;
		fdb_tmp = parseFloat(isNaN(parseFloat(fs_str))?0:fs_str);
		
		switch (true) {
			case (ai_digit==null)://
				fdb_tmp = fdb_tmp;
				break;
			case (ai_digit==0)://
				fdb_tmp = Math.round(fdb_tmp);
				break;
			case (ai_digit>0)://
				for (var i=0;i<ai_digit;i++) fs_digit +="0";
				fi_digit = parseInt(fs_digit);
				fdb_tmp = Math.round(fdb_tmp * fi_digit) / fi_digit;
				if (as_type=="str"){
					fs_tmp1 = fdb_tmp.toString();
					fs_tmp1 +=((fs_tmp1.indexOf(".")!=-1)?"":".") + fs_digit.substr(1);
					fi_pos = fs_tmp1.indexOf(".") + 1 + ai_digit;
					fdb_tmp = fs_tmp1.substr(0,fi_pos);
				}
				break;
		}
		return fdb_tmp;
	},
	clearSelected:function(obj,index){
		if (obj != null){
			if(obj.length==null){
				if (index==-1) obj.checked = false;
			}else{
				for (i = 0 ; i< obj.length ; i++){
					if (index!=-1 && index==i){
						obj[i].checked = true;
					}else{
						obj[i].checked = false;
					}
				}
			}
		}
	},
	selectedAll:function(obj){
		if (obj != null){
			if(obj.length==null){
				obj.checked = true;
			}else{
				for (i = 0 ; i< obj.length ; i++){
					obj[i].checked = true;
				}
			}
		}
	},
	getFocus:function(obj){
		if (obj != null){
			if(obj.length==null){
				obj.focus();
			}else{
			  if (obj.length==0){
			    obj.focus();
			  }else{
				  obj[0].focus();
				}
			}
		}	
	},
	checkSelected:function(obj,qty){
		var ischeck = false;
		var qty = qty;
		var qtyCounter = 0;
		if (qty==null) qty = 1;
		if (obj != null){
			if(obj.length==null){
				if (obj.checked == true) ischeck = true;
			}else{
				for (i = 0 ; i< obj.length ; i++){
					if (obj[i].checked == true){
						qtyCounter++;
						if (qtyCounter >=qty){
						  ischeck = true;
						  break;
						}
					}
				}
			}
		}
		return ischeck;
	},
	setSelectOption:function(ddl,v){
	  var t = this._getFormType(ddl);
	  if (t == 'checkbox' || t=='radio'){
	    if (!ddl.length){
	      if (ddl.value==v) ddl.checked = true;
	    }else{
		    for (var i = 0; i< ddl.length;i++){
		      if (ddl[i].value==v){
		        ddl[i].checked = true;
		        break;
		      }
		    }
	    }
	  }else if (t == 'select'){
			for (var i = 0 ; i<ddl.options.length;i++){
				if (ddl.options[i].value==v){
					ddl.options[i].selected = true;
					break;
				}
			}
		}
	},
	operateSelect: function(sel,ddl,imageBox){
		var selectType;
		var obj = this.getObject(sel);
		try{
			selectType = ddl.value
			ddl.options[0].selected=true;
		}catch(e){
			selectType = ddl
		}
		if(obj){
			if(obj.length==null){
				if (!obj.disabled){
				  var box = this.getObject(imageBox + '0');
					switch (selectType){
						case "all":obj.checked=true;$(box).addClassName("select");break;
						case "invert":obj.checked=!obj.checked;if (obj.checked){$(box).addClassName("select");}else{$(box).removeClassName("select");}break;
						case "none":obj.checked=false;$(box).removeClassName("select");break;
					}
				}
			}else{
				for (var i = 0 ; i< obj.length ; i++){
					if (!obj[i].disabled){
					  var box = this.getObject(imageBox + i); 
						switch (selectType){
							case "all":obj[i].checked=true;$(box).addClassName("select");break;
							case "invert":obj[i].checked=!obj[i].checked;if (obj[i].checked){$(box).addClassName("select");}else{$(box).removeClassName("select");}break;
							case "none":obj[i].checked=false;$(box).removeClassName("select");break;
						}
				  }
				}
			}
		}
	},
	Null2Space: function (varValue){
	  if (typeof varValue == 'undefined'){
	    return '';
	  }
	  if (varValue==null){
	    return '';
	  }else{
	    return varValue;
	  }
	},
	InvalidFile: function(id,exts,msg,notNull){
	  return this.InvalidCustom(id,"file",msg,notNull,exts);
	},
	InvalidNotNull: function(id,invalidType,msg,minNumber,maxNumber){
	  return this.InvalidCustom(id,invalidType,msg,true,"",minNumber,maxNumber);
	},
	checkNull: function (id){
	  var f = this.getObject(id);
	  var value = f.value.strip();
	  var len = this._length(value);
	  return !(len > 0 );
	},
	Invalid: function(id,invalidType,msg,minNumber,maxNumber){
	  return this.InvalidCustom(id,invalidType,msg,false,"",minNumber,maxNumber);
	},
	start: function(){
		for (var i = 0 ; i<this.advanceMsg.length;i++){
			if (!this.InvalidCustom(this.advanceMsg[i].id,this.advanceMsg[i].invalidType,this.advanceMsg[i].msg,this.advanceMsg[i].notNull,this.advanceMsg[i].exts,this.advanceMsg[i].minNumber,this.advanceMsg[i].maxNumber)){
			  return false;break;
			}
		}
		return true;
	},
	/**
	 * invalidType:file,string,int,number,length,email,secondarydomain,domain,
	 */
	InvalidCustom: function(id,invalidType,msg,notNull,exts,minNumber,maxNumber){
		var minNumber = minNumber;
		var maxNumber = maxNumber;
		var notNull = notNull;
		var invalidType = invalidType;
		if (minNumber == null) minNumber = -1;
		if (maxNumber == null) maxNumber = -1;
		if (notNull==null) notNull = false;
		if (invalidType == null) invalidType = "string";
		var f = this.getObject(id);
		var t = this._getFormType(f);
		var value = "";
		if (t=='file' || t=='password' || t=='text' || t=='textarea' || t=='select'){
		  value = f.value.strip();
			if (notNull && value=='') return true; 
    	if (invalidType=='string'){
				var len = this._length(value);
				if ((minNumber!=-1 && maxNumber!=-1 && (len < minNumber || len > maxNumber)) || 
						 (minNumber!=-1 && maxNumber==-1 && (len < minNumber)) || 
						 (minNumber==-1 && maxNumber!=-1 && (len > maxNumber)) ||
						 (len == 0)){
					alert(msg);
					this.getFocus(f);
					return false;
				}
			}else if (invalidType=='int' || invalidType=='+int' || invalidType=='-int' || invalidType=='number' || invalidType=='+number' || invalidType=='-number'){
				var v = this.formatNumber(value);
				var isTrue = false;
				if (invalidType=='int' || invalidType=='+int' || invalidType=='-int'){
				  isTrue = !this.isInt(value,invalidType);
				}else if (invalidType=='number' || invalidType=='+number' || invalidType=='-number'){
				  isTrue = !this.isNumber(value,invalidType)
				}
				
				if ((minNumber!=-1 && maxNumber!=-1 && (v < minNumber || v > maxNumber)) || 
						 (minNumber!=-1 && maxNumber==-1 && (v < minNumber)) || 
						 (minNumber==-1 && maxNumber!=-1 && (v > maxNumber)) ||
						 (value == '') || isTrue){
					alert(msg);
					this.getFocus(f);
					return false;
				}
			}else if (invalidType=='email'){
			  if (!this.checkEmail(value)){
				  alert(msg);
					this.getFocus(f);
			    return false;
				} 
			}else if (invalidType=='secondaydomain'){
			  var regStr = /^[A-Z|a-z|0-9]+$/;
			  if (!regStr.test(value)){
			    alert(msg);
			    this.getFocus(f);
			    return false;
			  }
			}else if (invalidType=='domain'){
			  var regStr = /^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9](\.[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9])+\.?$/;
			  if (!regStr.test(value)){
			    alert(msg);
			    this.getFocus(f);
			    return false;
			  }
			}else if (invalidType=='file'){
			  if (!this.checkExt(value,exts)){
			    alert(msg);
			    this.getFocus(f);
			    return false;
			  }
			}
		}else if (t=='checkbox' || t=='radio'){
		  if (notNull && !this.checkSelected(f)) return true;
		  if (minNumber == -1) minNumber = 1;
			if (!this.checkSelected(f,minNumber)){
				alert(msg);
				this.getFocus(f);
				return false;
			}
		}
		return true;		
	}
}
var objInvalid = new InvalidForm();
if (typeof msgPrefix!='undefined'){
  objInvalid.setMsgPrefix(msgPrefix);
}