//version:1.0
//pfsvalidator
//form validator
(function( $ ){
	$.fn.pfsvalidator = function(options) {		
		var _de = {				 					
					submit:null,
					titleheader:{container:null,label:"Please Correct The Error's Indicated Below:"},
					errorheader:{container:null,label:"Please Correct the ff. Informaton: "}
				  };
		
		var parent = jQuery(this);
		
		
		if (options) {						
			$.extend(_de, options);			
			if(options["errorheader"]){
				if(options["errorheader"].label==undefined){					
					$.extend(_de["errorheader"],{container:options["errorheader"].container,
												label:"Please Correct the ff. informaton: "}
							);					
				}else{
					_de["errorheader"].label =options["errorheader"].label					
				}				
			}
			
			if(options["titleheader"]){
				if(options["titleheader"].label==undefined){					
					$.extend(_de["titleheader"],{container:options["titleheader"].container,
												label:"Please Correct the ff. informaton: "}
							);					
				}else{
					_de["titleheader"].label =options["titleheader"].label					
				}
				$.fn.pfsvalidator.titleheader = options["titleheader"].container;
				$.fn.pfsvalidator.titleheader.html(_de["titleheader"].label);
			}	
		}
		
		
		
		
		//initialize global property
		$.fn.pfsvalidator.parent = parent;
		$.fn.pfsvalidator.stopbinding =false;
		$.fn.pfsvalidator.errorheader =_de["errorheader"].container;
		$.fn.pfsvalidator.errormsg = _de["errorheader"]!=null?_de["errorheader"].label:"";
		$.fn.pfsvalidator.errorcl = "";
		
		$.fn.pfsvalidator.titleheader = _de["titleheader"].container;
		$.fn.pfsvalidator.titleheader_msg = _de["titleheader"]!=null?_de["titleheader"].label:"";
		
		
		//add parent to element;		
		var child = parent.find(".form-to-validate");		
		jQuery.each(child,function(i,e){
			jQuery(this).data("button_submit",_de["submit"]);
			jQuery(this).data("parent_cont",parent);
			jQuery(this).data("header_error",_de["errorheader"].container);	
			jQuery(this).data("header_title",_de["titleheader"].container);
		})
		
		//set parent container to button
		_de["submit"].data("parent_cont",parent);
		_de["submit"].data("header_error",_de["errorheader"].container);
		_de["submit"].data("header_title",_de["titleheader"].container);
		
		var submit =_de["submit"];		  
		if(!submit){submit = jQuery(parent).find(":submit")}
		
		//bind click event to submit button
		submit.click(function(){
			
			if($.fn.pfsvalidator.stopbinding) return false;
			
			$.fn.pfsvalidator.parent = jQuery(this).data("parent_cont");
			$.fn.pfsvalidator.errorheader = jQuery(this).data("header_error"); 
			$.fn.pfsvalidator.titleheader = jQuery(this).data("header_title");
			
			
			var msg = $.fn.pfsvalidator.util.executevalidation();
			var isvalid = $.fn.pfsvalidator.util.isvalid();
			
			if($.fn.pfsvalidator.errorheader){
				if(!isvalid){
					$.fn.pfsvalidator.errorheader.html($.fn.pfsvalidator.errormsg + msg);	
					$.fn.pfsvalidator.errorheader.css("display","block");
				}else{
					$.fn.pfsvalidator.errorheader.css("display","none");					
				}				
			}else{
				if(!isvalid){					
					$.fn.pfsvalidator.titleheader.fadeIn("slow");
				}else{
					$.fn.pfsvalidator.titleheader.fadeOut("slow");					
				}
			}
			
			return isvalid;
		})
		
		//bind event on input element
		var ctrl = parent.find(".form-to-validate");		
		jQuery.each(ctrl, function (i, e) {
			/*
            jQuery(this).bind("blur keyup", function () {
            	//set the current parent
            	$.fn.pfsvalidator.parent = jQuery(this).data("parent_cont");
    			$.fn.pfsvalidator.errorheader = jQuery(this).data("header_error"); 
            	
            	
                if ($.fn.pfsvalidator.util.isbind()) return true;
                var msg = $.fn.pfsvalidator.util.executevalidation({element: this });                
                if($.fn.pfsvalidator.errorheader){
                	if(msg!=""){
                		if(!jQuery(this).hasClass("errormessageinputvalidator")){
                			$.fn.pfsvalidator.errorheader.html($.fn.pfsvalidator.errormsg + msg);	                			
                		}
        				
        				$.fn.pfsvalidator.errorheader.css("display","block");
        			}else{
        				$.fn.pfsvalidator.errorheader.css("display","none");					
        			}	                	
                }
                return msg.length==0;
             
           });
		 */
			
            jQuery(this).keypress(function (e) {
                if (e.which == 13 || e.keyCode == 13) {
                	//set parent
                	$.fn.pfsvalidator.parent = jQuery(this).data("parent_cont");
        			$.fn.pfsvalidator.errorheader = jQuery(this).data("header_error"); 
        			
                    if ($.fn.pfsvalidator.util.isbind()) return true;                    
                    	var msg =  $.fn.pfsvalidator.util.executevalidation();
                    	if($.fn.pfsvalidator.errorheader){
                    		if(msg!=""){				
                 				$.fn.pfsvalidator.errorheader.html($.fn.pfsvalidator.errormsg + msg);
                 				$.fn.pfsvalidator.errorheader.css("display","block");
                 			}else{
                 				$.fn.pfsvalidator.errorheader.css("display","none");					
                 			}	                    		
                    	}                    	                    	
                    }
                
            });
        });
		
		
		 				
	}
			
	//utilities extend prototype	
	$.fn.pfsvalidator.util = {
		validatephone:function(phone){
			var phonenum =  /^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/;
			return phonenum.test(phone);
		},
		validateemail:function(email){
			var email = email
			var filter = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
			return filter.test(email);
		},
		validatestring:function(str){
				return str!='';
		},
		validatepassword:function(pw){
				return (jQuery.trim(pw).length>4 && jQuery.trim(pw).length<33);
		},
		validatezip:function(zip){
				var filter = /^\d{5}(-\d{4})?$/;
				return filter.test(zip);
		},
		validatenumber:function(n){
				var num = /^[0-9]+$/;
				return num.test(n);
		},
		validatecreditcard:function(e){
			
		},
		suspendbinding:function(){
			$.fn.pfsvalidator.stopbinding=true;
		},
		removebinding:function(e){
			e.removeClass("form-to-validate");
			e.removeClass("errormessageinputvalidator");			
			jQuery("#" + e.attr("errorcontainer")).removeClass("error-message-validator");
			jQuery("#" + e.attr("errorcontainer")).css("display","none");
		},
		addbinding:function(e){
			e.addClass("form-to-validate");
		},
		isbind:function(){
				return this.stopbinding;
		},
		continuebinding:function(){
			$.fn.pfsvalidator.stopbinding=false;
		},
		getelemerror:function(e){
			var elem = $.fn.pfsvalidator.parent.find("#" + jQuery(e).attr("errorcontainer"));
			
			if(elem.length==0){
				var _elem = jQuery(jQuery(e).attr("id") + "_err_cont");
				
				if (_elem.length>0) return _elem;
				
				elem = jQuery("<span class='textinput error-message-validator'></span>");
				elem.attr("id",jQuery(e).attr("id") + "_err_cont")
				jQuery(e).parent().append(elem);				 
			}			
			return elem;
		},
		showerror:function(e){
			var elem =$.fn.pfsvalidator.util.getelemerror(e);
			 elem.text(jQuery(e).attr("error"));
    	 	 elem.addClass("error-message-validator");
    	 	 elem.css("display","block");
		},
		removeerror:function(e){
			var elem =$.fn.pfsvalidator.util.getelemerror(e)
				elem.removeClass("error-message-validator");
				elem.css("display","none");
		},
		isvalid:function(){
			var errlen = $.fn.pfsvalidator.parent.find(".errormessageinputvalidator").length;
			return ($.fn.pfsvalidator.util.executevalidation().length + errlen) ==0;
		},
		clear:function(){
			$.fn.pfsvalidator.parent.find(".form-to-validate").removeClass("error-message-validator");
		},
		executevalidation:function(options){
		var _default = {element: null}
		
		if (options) {jQuery.extend(_default, options);}
				
		var ctrl = null;
		var parent = $.fn.pfsvalidator.parent;
		var errmsg = $.fn.pfsvalidator.errormsg;
		var errelement = "";
		
		 if (_default["element"]) {
              ctrl = jQuery(_default["element"]);
          } else {
              ctrl = parent.find(".form-to-validate");
          }
				
				 jQuery.each(ctrl, function (i, e) {
                     //check error type
                     //String validation				
                     switch (jQuery(this).attr("expression")) {
                         case 'string':                        	 
                    		 if (jQuery.trim(jQuery(this).val()) == "") {                    			 
                    			 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                    			   else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                    			 jQuery(this).addClass("errormessageinputvalidator");
                             } else {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                            	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                            	 jQuery(this).removeClass("errormessageinputvalidator");
                             } 
                        	 

                             break;
                         case 'password':
                             if (!$.fn.pfsvalidator.util.validatepassword(jQuery(this).val())) {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                    			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                            	 jQuery(this).addClass("errormessageinputvalidator");
                             } else {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                            	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                            	 jQuery(this).removeClass("errormessageinputvalidator");
                             }

                             break;
                         case 'email':
                             var email = jQuery(this).val();                             
                             if (!$.fn.pfsvalidator.util.validateemail(email)) {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                    			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                            	 jQuery(this).addClass("errormessageinputvalidator");
                             } else {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                            	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                            	 jQuery(this).removeClass("errormessageinputvalidator");
                             }

                             break;
                         case 'phone':
                             if (!$.fn.pfsvalidator.util.validatephone(jQuery(this).val())) {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                    			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                            	 jQuery(this).addClass("errormessageinputvalidator");
                             } else {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                            	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                            	 jQuery(this).removeClass("errormessageinputvalidator");
                             }
                             break;
                         case 'number':
                             if (!$.fn.pfsvalidator.util.validatenumber(jQuery(this).val())) {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                    			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                            	 jQuery(this).addClass("errormessageinputvalidator");
                             } else {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                            	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                            	 jQuery(this).removeClass("errormessageinputvalidator");
                             }
                             break;

                         case 'zip':
                             if (!$.fn.pfsvalidator.util.validatezip(jQuery(this).val())) {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                    			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                            	 jQuery(this).addClass("errormessageinputvalidator");
                             } else {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                            	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                            	 jQuery(this).removeClass("errormessageinputvalidator");
                             }                             
                             break;
                         case 'creditcard':
                             if (!$.fn.pfsvalidator.util.validatecreditcard(jQuery(this).val())) {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                    			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                            	 jQuery(this).addClass("errormessageinputvalidator");
                             } else {
                            	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                            	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                            	 jQuery(this).removeClass("errormessageinputvalidator");
                             }
                             break;
                         default:
                             var expr = jQuery(this).attr("expression");

                             if (expr.length > 0) {
                                 expr = expr.replace(/@/g, "'");
                                 var json = eval("[" + expr + "]");

                                 if (json[0].compare != undefined) {
                                     if (json[0].compare.value1.val() != json[0].compare.value2.val()) {
                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                            			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                                    	 jQuery(this).addClass("errormessageinputvalidator");
                                     }

                                     if ((json[0].compare.value1.val() == json[0].compare.value2.val())) {
                                    	 
                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                                    	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}    
                                    	 jQuery(this).removeClass("errormessageinputvalidator");
                                    	                                     	
                                         // check if type is correct
                                         if (json[0].compare.type != undefined) {
                                             switch (json[0].compare.type) {
                                                 case 'string':
                                                     if (!$.fn.pfsvalidator.util.validatestring(json[0].compare.value2.val())) {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                                            			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                                                    	 jQuery(this).addClass("errormessageinputvalidator");
                                                     } else {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                                                    	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                                                    	 jQuery(this).removeClass("errormessageinputvalidator");
                                                     }
                                                     break;
                                                 case 'password':
                                                     if (!$.fn.pfsvalidator.util.validatepassword(json[0].compare.value2.val())) {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                                            			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                                                    	 jQuery(this).addClass("errormessageinputvalidator");                                                    	 
                                                     } else {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                                                    	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                                                    	 jQuery(this).removeClass("errormessageinputvalidator");
                                                     }
                                                     break;
                                                 case 'email':
                                                     //alert('type' + json[0].compare.value2.val());
                                                     if (!$.fn.pfsvalidator.util.validateemail(json[0].compare.value2.val())) {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                                            			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                                                    	 jQuery(this).addClass("errormessageinputvalidator");                                                    	
                                                     } else {
                                                    	 if(!$.fn.pfsvalidator.util.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                                                    	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                                                    	 jQuery(this).removeClass("errormessageinputvalidator");
                                                     }
                                                     break;
                                                 case 'phone':
                                                     if (!$.fn.pfsvalidator.util.validatephone(json[0].compare.value2.val())) {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                                            			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                                                    	 jQuery(this).addClass("errormessageinputvalidator");
                                                     } else {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                                                    	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                                                    	 jQuery(this).removeClass("errormessageinputvalidator");
                                                     }
                                                     break;
                                                 case 'number':
                                                     if (!$.fn.pfsvalidator.util.validatenumber(json[0].compare.value2.val())) {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                                            			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                                                    	 jQuery(this).addClass("errormessageinputvalidator");
                                                     } else {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                                                    	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                                                    	 jQuery(this).removeClass("errormessageinputvalidator");
                                                     }
                                                     break;
                                                 case 'zip':
                                                     if (!$.fn.pfsvalidator.util.validatezip(json[0].compare.value2.val())) {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                                            			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                                                    	 jQuery(this).addClass("errormessageinputvalidator");
                                                     } else {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                                                    	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                                                    	 jQuery(this).removeClass("errormessageinputvalidator");
                                                     }
                                                     break;
                                                 case 'creditcard':
                                                     if (!$.fn.pfsvalidator.util.validatecreditcard(jQuery(this).val())) {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                                            			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                                                    	 jQuery(this).addClass("errormessageinputvalidator");
                                                     } else {
                                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                                                    	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                                                    	 jQuery(this).removeClass("errormessageinputvalidator");
                                                     }
                                                     break;

                                             }
                                         }
                                     }

                                 } else {
                                     if (eval(expr)) {
                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.showerror(this);}
                            			 else{errelement += ((errelement.length == 0) ? ' ' : ', ') + jQuery(this).attr("error");}
                                    	 jQuery(this).addClass("errormessageinputvalidator");
                                     } else {
                                    	 if(!$.fn.pfsvalidator.errorheader){$.fn.pfsvalidator.util.removeerror(this);}
                                    	 else{errelement = errelement.replace(/jQuery(this).attr("error")/g, "");}
                                    	 jQuery(this).removeClass("errormessageinputvalidator");
                                     }
                                 }
                             }
                     }
                 });
				 					 				 
				
					
						 	
					 	if(_default["element"]){					 		
					 		if($.fn.pfsvalidator.errorcl.indexOf(errelement)==-1){
					 			$.fn.pfsvalidator.errorcl += (($.fn.pfsvalidator.errorcl.length == 0) ? ' ' : ', ') + errelement;						 			
					 		}else if(jQuery.trim(errelement)==""){
					 			var str = "";
					 			str = $.fn.pfsvalidator.errorcl;					 		
					 			var strR = ctrl.attr("error");
					 			strR = ", " + ctrl.attr("error");					 			
					 			str = str.replace(strR, "");					 			
					 			strR  = ",";
					 			str = str.replace(strR, "");
					 			strR = ctrl.attr("error");
					 			str = str.replace(strR, "");
					 			$.fn.pfsvalidator.errorcl = str;					 								 			
					 		}
					 	
					 		

					 		if(jQuery.trim($.fn.pfsvalidator.errorcl).length==0){
					 			$.fn.pfsvalidator.errorcl = jQuery.trim($.fn.pfsvalidator.errorcl); 						 		
						 	}
					 		
					 		errelement = $.fn.pfsvalidator.errorcl;
					  }

					 return errelement 					 	 					 
				
				 
				 
		}
			
	}
})( jQuery );
