/*
* Plugin olvalidate
* Require jQuery framework
* History
*  - 2008-04-30 release version 1.0
*  - 2008-05-15 added type = dialog
*  - 2008-06-07 added _dialog_inner
*  - 2008-06-25 opts.action fixed javascript blocked
*/
	jQuery.fn.olcheck = function(opts){		
		opts = opts || {};
		var settings = {
			chk: 'all',
			require: true,
			error: ''
		};
		if(opts) jQuery.extend(settings, opts);
		
		if(this.attr("type")=="radio" || this.attr("type")=="checkbox") return( isChecked(this.attr("name")) )
		var val = this.val();
		
		if(!settings.require) if(val=="" || jQuery.trim(val)=="" ) return( true );
		else if(settings.require) if(val=="" || jQuery.trim(val)=="" ) return( false );
		
		var rx = new RegExp("(\\w+)\\(?(\\w+)?,?(\\w+)?\\)?", "ig");
		var mat = rx.exec( settings.chk );
		if(mat == null){
			code = settings.chk;
		}else{
			var code = mat[1];
			var vmin = parseInt( mat[2] );
			var vmax = parseInt( mat[3] );
		}
		switch ( code ){
			case "compare":
					if(val!=$("#"+opts.target).val()) return(false);
					return(true);
			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 "real":
			case "float":
					return(isReal( val ));
					break;
			case "password":
			case "username":
					code=(mat[2])? "[0-9a-zA-Z_]{"+mat[1]+","+mat[2]+"}" : "[0-9a-zA-Z_\\.]{6,20}";
					//alert(code);
					break;
			case "email":
					return(isEmail( val ));
					break;
			case "url":
					return(isUrl( val ));
					break;
			case "date":
					return(isDate( val ));
					break;
			case "all":
					if(val=="" || val.substr(0,1)==" ") return(false);
					return(true);
					break;
			default:
				code = settings.chk;
		}
		
		return( doCheck(code, val) )
		
		/**
		* Inner function
		*/
		function doCheck(code, val){
			var rx = new RegExp(code, "ig");
			var mat = rx.exec(val);
			if(mat==null || mat[0] != val ){
				return(false);
			}
			return(true);
		}
		function isChecked(obj_name){
			var objs = jQuery("[name="+obj_name+"]").get();
			for(var i=0;i<objs.length;i++){
				if(objs[i].checked==true) return(true);
			}
			return(false);
		}
		function isUrl(s) {
			var regexp = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
			return regexp.test(s);
		}
		function isEmail(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);
		}
		function isReal( val ){
			var pattern = /^((\d+)|((\d*\.)?\d+))$/;
			if (!pattern.test(val)) return(false);
			return(true);
		}
		function isDate( val ){
			if( !doCheck("[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}", val) ) return(false);			
			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);
		}
	}
	/**
	*  disp: ['alert'|'label'|'dialog']
	*/
	new function(){
		jQuery.fn.olvalidate = {
			settings: {form: 'form1',disp: 'alert', error: false},
			init: function(opts) {
				
				opts = opts || {};	
				var settings = this.settings;
				if(opts) jQuery.extend(settings, opts);
				if(typeof(opts.action)!="undefined") jQuery("#"+opts.form).attr("action",opts.action);
				jQuery.each(settings.fields, function(i, val){
					var sel = jQuery("[name="+val[0]+"]");
					sel.blur(function(){
						if( !jQuery(this).olcheck(val[1]) ){
							jQuery(this).olvalidate.doError(val[0]);
						}else{
							jQuery(this).olvalidate.doSeccess(val[0]);
						}
					}).focus(function(){
						jQuery(this).olvalidate.doFocus(val[0]);						
					})
					.filter("[type!=radio]")
					.addClass("ol-input");
					if(settings.disp=="label"){
						if(sel.parent().attr("class")=="group"){
							sel.parent().after('<span id="lb'+val[0]+'" class="'+((val[1].require)?'lb-require':'lb-norequire')+'">'+val[1].label+'</span>');
						}else if(sel.parent().parent().attr("class")=="group"){
							sel.parent().parent().after('<span id="lb'+val[0]+'" class="'+((val[1].require)?'lb-require':'lb-norequire')+'">'+val[1].label+'</span>');
						}else{
							sel.after('<span id="lb'+val[0]+'" class="'+((val[1].require)?'lb-require':'lb-norequire')+'">'+val[1].label+'</span>');
						}
					}
					//
				});
			},
			checkall: function(opts){
				opts = opts || {};				
				var  settings = this.settings;
				if(opts) jQuery.extend(settings, opts);
				var fields = settings.fields;
				var markselect = null;
				var errormsg = new Array();
				for(var i=0; i<fields.length; i++){
					var field = fields[i];
					//alert(jQuery(""+field[0]).olcheck(field[1]))
					if( !jQuery("[name="+field[0]+"]").olcheck(field[1]) ){
						jQuery(field[0]).olvalidate.doError(field[0]);
						if(markselect==null) markselect = field[0];
						if(field[1].error) errormsg.push(field[1].error); //+= "\n  * "+field[1].error;
						else errormsg.push(field[1].label); //errormsg += "\n  * "+field[1].label;
					}else{
						jQuery(field[0]).olvalidate.doSeccess(field[0]);
					}
				}
				if(errormsg.length>0){
					if(settings.disp=="label") alert("Please check and complete all required fields.");
					else if(settings.disp=="dialog"){
						alert("กรุณาตรวจสอบข้อมูลที่จำเป็น ให้ครบถ้วนด้วยครับ");						
						if(jQuery("#"+settings.form+"_dialog_inner").size()>0){
								jQuery("#"+settings.form+"_dialog_inner").html("กรุณาตรวจสอบข้อมูลที่จำเป็น ดังนี้:<ul><li>* "+errormsg.join("</li><li>* ")+"</li></ul>");
								jQuery("#"+settings.form+"_dialog").show();
						}else{
							jQuery("#"+settings.form+"_dialog").html("กรุณาตรวจสอบข้อมูลที่จำเป็น ดังนี้:<ul><li>* "+errormsg.join("</li><li>* ")+"</li></ul>").show();
						}
						window.location="#"+settings.form+"_dialog";
					}
					else alert("กรุณาตรวจสอบข้อมูลที่จำเป็น ดังนี้:.\n  * "+errormsg.join("\n  * "));
					if(markselect)	jQuery("#"+markselect).select();
					return(false);
				}else{
					if(settings.disp=="dialog"){
						jQuery("#"+settings.form+"_dialog").hide();
					}
					return(true);
				}
			},
			doError: function(obj_name){
				jQuery('#lb'+obj_name).removeClass("lb-ss lb-require lb-norequire lb-focus").addClass("lb-err");
			},
			doSeccess: function(obj_name){				
				jQuery('#lb'+obj_name).removeClass("lb-err lb-require lb-norequire lb-focus").addClass("lb-ss");
			},
			doFocus:  function(obj_name){				
				jQuery('#lb'+obj_name).removeClass("lb-err lb-require lb-norequire lb-ss").addClass("lb-focus");
			}
		}
	};
/*
	var fieldsconf= [
			["name", {chk:"num",label:"Postdate"}],
			["lastname", {chk:"num",label:"Postdate"}],
			["password", {chk:"password",label:"Postdate"}],
			["password2", {chk:"compare", target:"password",label:"Postdate"}],
			["sex", {label:"Postdate"}],
			["textarea", {label:"Postdate"}]
	];
	var olconf = {disp:"label", fields: fieldsconf};
	$(document).ready(function(){
		$("#form1").olvalidate.init(olconf);
		$("#form1").submit(function(){
			return( $(this).olvalidate.checkall(olconf) );
		});
	});

*/
