/*
 * JQuery liveform v1.0
 *
 * Copyright 2011, Gianrocco Giaquinta
 * http://www.jscripts.hostoi.com/
 *  
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 */

(function( $ ){
	
	var settings;
			
    var methods = {
		
		submit_fn: function(){ return true; },
		valid: function(){ },
		error: function(){ },
				
		validate: function(ctl){
			
			var isvalid;
			
			isvalid = true;
						
			if ( $(ctl).attr('v_attr').indexOf("r") != -1 )
			{
					if ( $(ctl).val() == "" || $(ctl).val() == $(ctl).attr('v_label') ) { methods.validateerror(1, ctl); return false; }
				
				if ( $(ctl).is(":checkbox") )
					if ( !$(ctl).is(":checked") ) { methods.validateerror(1, ctl); return false; } else { methods.checked(ctl); return true; }
								
			}
			
			if ( $(ctl).attr('v_type') && $(ctl).val() && $(ctl).val() != $(ctl).attr('v_label') )
			{
			  var str = $(ctl).attr('v_type');
			  var arg1="";
			  var arg2="";			  
			  var x = str.indexOf('\:');
			  if ( x != -1 ) { arg1 = str.substring(0,x); arg2 = str.substring(x+1); } else arg1 = str;
			 	  
			  switch( arg1 ) { 
  
  				case 'email': 
					isvalid = methods.isValidEmail( ctl );
					break;
					 
				case 'web': 
					isvalid = methods.isValidUrl( ctl );
  					break; 
				
				case 'regexp': 
					var pat = new RegExp(arg2,"g");
					isvalid = pat.test($(ctl).val());
					if (!isvalid) methods.validateerror(4, ctl);
  					break;
					 
				case 'url':
					$.get(arg2, { q: $(ctl).val() }, function(result){
 						isvalid = result;
						if (!isvalid) methods.validateerror(5, ctl);
					});				
					break;
					
				default:
					isvalid = true;				
			  }			
			}
			
			if (isvalid && $(ctl).val() && $(ctl).val() != $(ctl).attr('v_label') ) methods.checked(ctl);
			return isvalid;
		},
				
		isValidEmail: function(ctl) {
			
			if ( /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test($(ctl).val()) == false)
			{ methods.validateerror(2, ctl); return false; }
			else return true;
			},
		
		isValidUrl: function(ctl) {
						
			var vurl = $(ctl).val();
			var reg = /^(http|https|ftp)\:\/\/([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&amp;%\$\-]+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.[a-zA-Z]{2,4})(\:[0-9]+)?(\/[^\/][a-zA-Z0-9\.\,\?\'\\/\+&amp;%\$#\=~_\-@]*)*$/;
			//alert(reg.test(vurl));
			if ( reg.test(vurl) == false) {
				if ( reg.test("http://"+vurl) == false)
					{ methods.validateerror(3, ctl); return false; } else return true;
			} else return true;
		},
		
		checked: function( ctl ) {
			//methods.clear(ctl);
			$(ctl).parent().find("."+settings.val_class).show();
			settings.valid( );
		},
		
		validateerror: function(err, ctl) {
			$(ctl).addClass(settings.err_class);
			$(ctl).parent().find("."+settings.inv_class).show();	
			$(ctl).parent().find("."+settings.val_class).hide();
			$(ctl).removeClass(settings.label_class);
			var des = $(ctl).attr('v_err');
			var nume =$(ctl).attr('v_label');
			var res = { err_no: err, err_des: des };
			
			if (err ==1) des = (settings.required+nume);
			$(ctl).parent().find("."+settings.inv_tclass).html(des).show();
			settings.error( res );
		},
		
		clear: function (ctl) {
			$(ctl).removeClass(settings.err_class);
			$(ctl).parent().find("label").removeClass(settings.inv_lclass);
			$(ctl).parent().find("."+settings.inv_class).hide();	
			$(ctl).parent().find("."+settings.inv_tclass).hide();
		}
			

	}

	$.fn.liveform = function(opt) {
        
		settings = {
			'err_class'		: '',
			'inv_class' 	: '',
			'inv_tclass'	: '',
			'inv_lclass'	: '',
			'val_class' 	: '',
			'label_class'	: '',
			'required'		: 'This field is required',	
        	'live'			: true,
			'submit_fn'		: methods.submit_fn,
			'valid'			: methods.valid,
			'error'			: methods.error
		};
		
	if(opt) $.extend(settings, opt);
	
	  	$(":input[type=text], textarea", this).each(function(i, el) {						
			
			if ($(this).val().length == 0) {
            	$(this).addClass(settings.label_class);
            	$(this).val($(this).attr("v_label"));
        	}
			
        	$(this).unbind("focus").focus(function () {
            	if (($(this).val() == $(this).attr("v_label")) || ($(this).val().trim() == "")) {
                	$(this).val("");
                	$(this).removeClass(settings.label_class);
            	}
			})
             



			.blur(function () {
            	if ( $(this).val().trim() == "") {
                	$(this).val($(this).attr("v_label"));
                	$(this).addClass(settings.label_class);
				}
        	});
		
			if(settings.live)
			$(this).focusout( function() {
				methods.clear( $(this) );
				methods.validate ( $(this) );					
			});
			$(this).focusin( function() {
				methods.clear( $(this) );
				methods.validate ( $(this) );					
			$(this).next().hide();
			});
			
			$(this).next().click( function() {
			 $(this).prev().focus();
			 
			});
			
			
						
		});
		
		$(":checkbox", this).each(function(i, el) {	
			
			if ($(this).attr("v_label")) $(this).after("<span>"+$(this).attr("v_label")+"</span>");
						
			$(this).change( function() {
				methods.clear( $(this) );
				methods.validate ( $(this) );					
			});
			
		});
		
		$(this).bind('submit', function(e){
			e.preventDefault();
						
			var allvalid = true;
						
			$(":input[type=text], textarea, :input[type=checkbox]", this).each(function(i, el) {
				
				if ( !methods.validate( $(this) ) ) allvalid=false;
			});
						
			if (allvalid) {
				$(":input[type=text], textarea", this).each(function(i, el) {
					if ($(this).val() == $(this).attr('v_label') )
						 $(this).val("");
				});
				
				if (settings.submit_fn()) 
					$(this).unbind('submit').submit();
			}
		});
			
	  
	}


})( jQuery );
