// JavaScript Document
/************
	// Date
	//
	// fd_(chk|mn)_[id]_[code]_[requide]
	*///////////////	
	
	/*-----------------------------------------------------------------------------------------*/
	var FreedomCheck = Class.create();
	FreedomCheck.prototype = {
		version: 1.0,
		type: "check",
		initialize: function(args) {//name, type(num),require, msg{}
			this.obj = $(document.getElementsByName(args[0])[0]);
			this.pattern = args[1];
			this.require = args[2];
			this.msg = args[3];
			lbid = "lbv_"+args[0];
			//if( this.obj.type!="hidden") this.obj.addClassName('ol-input');
			//alert(this.obj.parentNode.className.indexOf('group'))
			if(this.obj.parentNode.className.indexOf('group')>-1) new Insertion.After(this.obj.parentNode, "<span id='"+lbid+"'>"+((this.msg._nr)?this.msg._nr:"")+"</span>");			
			else{	
				new Insertion.After(this.obj, "<span id='"+lbid+"'>"+((this.msg._nr)?this.msg._nr:"")+"</span>");
				this.obj.addClassName('ol-input');
			}
			this.lb=$(lbid);			
			this.lb.className = this.stateDefault = ((!this.require)? FreedomValidate.norequire : FreedomValidate.require);
			$A(document.getElementsByName(args[0])).each((function(o){
				Event.observe(o, "focus", (function(){
					this.setState("focus");
				}).bind(this));
				Event.observe(o, "blur", (function(){
					this.check();
				}).bind(this));	
			}).bind(this));
		},
		check: function(){
			//addLog("check")			
			if(FreedomValidate.itemCheck(this.obj, this.pattern, this.require)){
				//this.lb.className=(this.require)? FreedomValidate.pass : FreedomValidate.norequire;
				(this.require)? this.setState("pass") : this.setState("default");
			}else{
				//this.lb.className=FreedomValidate.err;
				this.setState("error");
			}
			
		},
		setState: function(state, msg){
			//addLog(state)
			
			//var lb = $(this.options._chk_lb);
			var lb = this.lb;
			switch(state){
				case "focus":
					lb.className = FreedomValidate.onfocus;
					break;
				case "error":
					lb.className = FreedomValidate.error;
					if(this.msg._err) lb.update(this.msg._err);
					break;
				case "pass":
					lb.className = FreedomValidate.pass;
					lb.update(this.msg._nr)
					break;
				case "default":
					//addLog(this.stateDefault)
					lb.className =  this.stateDefault;
					lb.update(this.msg._nr)
					break;
			}
			
		}
	}
	/*-----------------------------------------------------------------------------------------*/
	var FreedomValidate = Class.create();
	FreedomValidate.require="lb-require";
	FreedomValidate.norequire="lb-norequire";
	FreedomValidate.error="lb-err";
	FreedomValidate.pass="lb-ss";
	FreedomValidate.onfocus="lb-focus";
	FreedomValidate.prototype = {
		version:1.0,
		postState:false,
		initialize: function(idForm, ctrlButton, ctrlLoading) {
			this.objForm = $(idForm);
			this.ctrlButton = (ctrlButton)? $(ctrlButton) : null;
			this.ctrlLoading = (ctrlLoading)? $(ctrlLoading): null;
			this.arrFD = new Array();
			Event.observe(this.objForm, "submit", (function(e){
				this.doPost();
				Event.stop(e);
			}).bind(this));
		},
		add: function(){ //name, type(num),require, msg{}
			//addLog(arguments[3])
			//alert(arguments[0]);
			if($(document.getElementsByName(arguments[0]))) this.arrFD.push(new FreedomCheck(arguments));
		},
		addManual:function(){ //"ww", require, msg ,func
			var args = new Array();
			args[0] = arguments[0];
			args[1] = null;
			args[2] = arguments[1];
			args[3] = arguments[2];
			
			var fc = new FreedomCheck(args);
			Object.extend(fc, {
				type: "ajax",
				check: arguments[3]
			});
			this.arrFD.push(fc);
		},
		doPost: function(){
			this.postState=true;
			this.checkall()
		},
		checkall: function(){
			for(var i=0; i<this.arrFD.length; i++){
				this.arrFD[i].setState("default")
				//alert(this.arrFD[i].obj.id)
				this.arrFD[i].check();
			}
			this.tricker( true );
		},
		tricker: function(f){			
			if(this.postState){
				var err = this._countError()
				//alert(err.nr+", "+err.mn)
				if(err.total==0){
					this.setLoading(true);
					this._post();
				}
				else if(err.nr==0 && err.mn>0){
					if(f){
						alert("f=true");
						this.setLoading(true);
					}else{
						this.setLoading(false);
					}
				}else{
					this.postState=false;
					this.setLoading(false);
					alert("Please Enter input.")
				}
			}else{
				this.setLoading(false);
			}
		},
		_post: function(){
			//alert("?")
			this.objForm.submit();
		},
		_countError: function(){
			var err = {
				nr:0,
				mn:0,
				total:0
			};			
			for(var i=0; i<this.arrFD.length; i++){
				//alert(this.arrFD[i][1].options._chk_lb);
				c = this.arrFD[i].lb.className;
				if(c!=FreedomValidate.pass && c!=FreedomValidate.norequire  ){
					//alert(this.arrFD[i].obj.id+", "+this.arrFD[i].type+" : "+c);
					if(this.arrFD[i].type=="ajax") err.mn++;
					else err.nr++;
				}
			}
			err.total = ( err.nr+err.mn );
			return(err);
		},
		setLoading:function(f){
			//alert(f)
			if(f){
				if(this.ctrlButton) this.ctrlButton.hide();				
				if(this.ctrlLoading) this.ctrlLoading.show()
			}else{
				if(this.ctrlButton) this.ctrlButton.show();
				if(this.ctrlLoading) this.ctrlLoading.hide()	
			}
		}
		
		
	}
	/*-----------------------------------------------------------------------------------------*/
	FreedomValidate.itemCheck = function(obj, pattern, require){ //this.obj, this.lb, this.pattern, this.require
		if(obj.type=="radio" || obj.type=="checkbox") return FreedomValidate.chkChecked(obj.name);
		else return FreedomValidate.chkSyn(obj.value, pattern, require)
	}
	/*-----------------------------------------------------------------------------------------*/
	FreedomValidate.chkChecked = function( objName ){
		var obj = document.getElementsByName(objName);
		//alert(objName+":"+obj.length);
		for(var i=0;i<obj.length;i++){
			//alert(obj[i].checked);
			if(obj[i].checked==true) return(true);
		}
		return(false);
	}
	/*-----------------------------------------------------------------------------------------*/
	FreedomValidate.chkSyn = function( val, pattern ,require){
		//addLog(code)
		this.isUrl = function(s) {
			var regexp = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
			return regexp.test(s);
		}
	
		this.isEmail = function(tfld){
			var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
			if (!email.test(tfld)) return false;
	
			var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/  ;
			if (!email2.test(tfld)) return false;
		  
			return true;
		}
		this.isReal = function( val ){
			var pattern = /^((\d+)|((\d*\.)?\d+))$/;
			if (!pattern.test(val)) return false;
			return true;
		}
		this.isDate = function( val ){
			if(!this.chkSyn(val,"[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}")) return false; //
			//alert("aa")
			sp_date = val.split("/");
			sp_date[0] = parseInt(sp_date[0]);
			sp_date[1] = parseInt(sp_date[1]);
			sp_date[2] = parseInt(sp_date[2]);
			if(sp_date[1]>12){
				return false;
			}else if(sp_date[1]==4 || sp_date[1]==6 || sp_date[1]==9 || sp_date[1]==11 ){
				if( sp_date[0] >30){ // 
					return false;
				}
			}
			else if ( sp_date[1]==2){		
				if ((sp_date[2]%4==0 && sp_date[2]%100!=0) || sp_date[2]%400==0){
					if (sp_date[0]>29)	{ //
						return false;
					}
				}
				else if(sp_date[0]>28){
					return false;
				}
			}
			else if ( sp_date[0] >31 ){	//
				return false;
			}
			return true;
		}
		/*start here*/
		if(val==""){
			if(require){ //not blank
				//alert("1.1")
				return(false);
			}else{
				return(true);
			}
		}
		var rx = new RegExp("(\\w+)\\(?(\\w+)?,?(\\w+)?\\)?", "ig");
		var mat = rx.exec( pattern );
		if(mat == null){
			code = pattern;
			//addLog("match error | pattern:"+pattern);
			//return(false);
		}else{
		//addLog("mat: "+mat)		
			var code = mat[1];
			var vmin = parseInt( mat[2] );
			var vmax = parseInt( mat[3] );
		}
		//addLog("vmin: "+vmin)
		switch ( code )
		{
		case "postcode":
				code="[0-9]{5}";
				break;
		case "idcard":
				code="[0-9]{13}";
				break;
		case "char":
				code="(\\w|\\W){1,"+mat[2]+"}";
				break;
		case "year":
				code = "[0-9]{4}";
				break;
		case "num":
				code = (mat[2])? "\\d{1,"+mat[2]+"}" : "(\\d+)";
				break;
		case "float":
				return(this.isReal( val ));
				break;
		case "username":
				code=(mat[2])? "[0-9a-zA-Z_]{"+mat[1]+","+mat[2]+"}" : "[0-9a-zA-Z_\\.]{4,20}";
				//alert(code);
				break;
		case "password":
				code=(mat[2])? "[0-9a-zA-Z_]{"+mat[1]+","+mat[2]+"}" : "[0-9a-zA-Z_\\.]{8,20}";
				//alert(code);
				break;
		case "email":
				return(this.isEmail( val ));
				break;
		case "url":
				return(this.isUrl( val ));
				break;
		case "date":
				//alert(this.isDate( val ))
				return(this.isDate( val ));
				break;
		case "all":
				if(val=="" || val.substr(0,1)==" ") return(false);
				return(true);
				break;
		default:
			code = pattern;
		}

		//addLog("code: "+code+", val :"+val)
		var rx = new RegExp(code, "ig");
		var mat = rx.exec(val);
		//addLog("mat: "+mat)
		if(mat==null || mat[0] != val ){
			//addLog("error Sytax")
			//alert(mat[0]);
			return false;
		}
		return true;
	}
	/*-----------------------------------------------------------------------------------------*/