/*
* Plugin olvalidate
* Required jQuery framework
*/
/*
	opts = {
		input:[str|jQuery],		
	}
*/
olcheck = function(inpt, opts){		
	opts = opts || {};
	var settings = {
		chk: 'all',
		require: true,
		error: ''
	};
	if(opts) jQuery.extend(settings, opts);
	inpt = jQuery(inpt);
	if(inpt.attr("type")=="radio" || inpt.attr("type")=="checkbox") return( isChecked(inpt.attr("name")) )
	var val = inpt.val()
	if(!settings.require){
		if(val=="" || jQuery.trim(val)=="" ) return( true );
	}
	else 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_\\.]{4,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) );
}
		
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}/[2][0-9]{3}", 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);
}
/*
	var fieldsconf= [
			["#prod_name", {chk:"all",label:".."}],
			......
			["#prod_contemail", {chk:"email",label:".."}]			
	];	
	var olconf = {disp:"alert", fields: fieldsconf, action:""};
	if(checkall(olconf))
*/
checkall = function(opts){
	opts = opts || {};				
	var settings = {
		disp: 'alert', //[alert|dialog{=>target_out}|label"]
		focus_error: true,
		highl_error: true,
		target_out:'', //[str|jQuery]
		error_class:'olerr'
	};
	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];
		var inpt = jQuery(field[0]);
		if(inpt.size()==0) continue;
		
		if( !olcheck(inpt, field[1]) ){
			//jQuery(field[0]).olvalidate.doError(field[0]);
			if(settings.highl_error) inpt.addClass(settings.error_class);
			if(settings.focus_error && markselect==null) markselect = inpt;
			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{
			if(settings.highl_error) inpt.removeClass(settings.error_class);
			//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(target_out = jQuery(settings.target_out).size()>0){
					target_out.html("กรุณาตรวจสอบข้อมูลที่จำเป็น ดังนี้:<ul><li>"+errormsg.join("</li><li>")+"</li></ul>").show();
			}
			window.location="#"+target_out.attr("id");
		}else{
			alert("กรุณาตรวจสอบข้อมูลที่จำเป็น ดังนี้:\n  * "+errormsg.join("\n  * "));
		}
		if(markselect)	markselect.select();
		return(false);
	}else{
		if(settings.disp=="dialog"){
			jQuery(settings.target_out).hide();
		}
		return(true);
	}
}
