/************************************************************************
 * jQuery Form
 *	>> input class definitions:
 *		>> 'required' >> set required inputs
 *		>> 'phone', 'date', 'email', 'number' >> validate input
 *	>> options:
 *		*elements can be a jquery object or any valid jquery expression
 *		>> error >> element to display error
 *		>> processing >> element to display when processing form
  *		>> status >> element to display status messages
 *
 ************************************************************************/
(function(A){A.fn.extend({centerOn:function(C){var B=A(C).eq(0);if(B.length===0||B.is(":hidden")){return this;}if((/static/i).test(B.css("position"))){B.css({position:"relative"});}var D=B.position();D.height=B.height();D.width=B.width();if(D.top===0&&!isFinite(parseInt(B.css("top")))){var F=parseInt(B.css("margin-top"));if(F>0){D.top=F;}}if(D.left===0&&!isFinite(parseInt(B.css("left")))){var E=parseInt(B.css("margin-left"));if(E>0){D.left=E;}}return this.each(function(){var J=A(this);var G=J.parent()[0]===B[0];var H=G?0:D.top;var I=G?0:D.left;J.css({position:"absolute",top:(H+0.5*(D.height-J.outerHeight(true)))+"px",left:(I+0.5*(D.width-J.outerWidth(true)))+"px"});});},form:function(C){var B=this;B.defaults={classes:{error:"error",processing:"processing",status:"status"}};B.opts=A.extend({},{error:"."+B.defaults.classes.error,processing:"."+B.defaults.classes.processing,status:"."+B.defaults.classes.status,preSubmitCallback:null},C);B.lock=function(F,E){var D=A(F);if(D.length===0){return false;}F.__locked__=true;D.find(":input").attr("disabled","disabled");if(E){A(E).removeAttr("disabled");}return true;};B.unlock=function(E){var D=A(E);if(D.length===0){return false;}D=D.eq(0);E.__locked__=false;D.find(":input").not(":submit").removeAttr("disabled");if(E.__valid__){D.find(":submit").removeAttr("disabled");}return true;};B.showError=function(I,K,E){if(!K){return false;}var J=I.__$err__;if(J.length===0){alert(K);return true;}J.css({position:"absolute",height:"auto","z-index":"999",overflow:"hidden"});J.html(K);if(E&&A(E).is(":visible")){var F=A(E);var G=F.position();G.outerWidth=F.outerWidth();G.outerHeight=F.outerHeight();G.marginTop=parseInt(F.css("margin-top"));var H={top:(G.top+G.outerHeight+G.marginTop),left:G.left,width:G.outerWidth};J.css({top:H.top+"px",left:H.left+"px",width:H.width+"px"});var D=G.outerWidth-(J.outerWidth()-G.outerWidth);if(D>0){J.css({width:D+"px"});}}else{J.css({top:"0px",left:"0px",width:"100px"});}J.show();};B.clearError=function(D){D.__$err__.hide();};B.showStatus=function(E){if(E.__statusIsAuto__){var D=A(E);var F=D.find(":submit");if(F.length>0){E.__$status__.centerOn(F);}}E.__$status__.show();};return this.each(function(){var D=this;D.__valid__=false;D.__$required__=A(D).find(":input.required").not(":submit");D.__$err__=A(B.opts.error).filter(function(){if(A(this).parent()[0]===D){return true;}return false;});if(D.__$err__.length>0){D.__$err__=D.__$err__.eq(0);}else{D.__$err__=A("<div>").addClass(B.defaults.classes.error).appendTo(D);}D.__$err__.hide();D.__$proc__=A(B.opts.processing).filter(function(){if(A(this).parent()[0]===D){return true;}return false;});if(D.__$proc__.length>0){D.__$proc__=D.__$proc__.eq(0);}else{D.__$proc__=A("<div>").addClass(B.defaults.classes.processing).appendTo(D);}D.__$proc__.hide();D.__$status__=A(B.opts.status).filter(function(){if(A(this).parent()[0]===D){return true;}return false;});if(D.__$status__.length>0){D.__statusIsAuto__=false;D.__$status__=D.__$status__.eq(0);}else{D.__statusIsAuto__=true;D.__$status__=A("<div>").addClass(B.defaults.classes.status).appendTo(D).hide();}A(D).find(":submit").attr("disabled","disabled").end().find(":reset").click(function(){A(this.form).trigger("reset");return false;}).end().bind("error",function(F,G,E){if(!G){return false;}B.lock(this,E);B.showError(this,G,E);this.__$status__.html("Input Error !");B.showStatus(this);}).bind("clearError",function(){B.clearError(this);B.unlock(this);}).bind("update",function(G){var F=this.__$required__.length;var E=this.__$required__.filter(".valid").filter(function(){return(/\S/).test(A(this).val());}).length;this.__valid__=F==E;var H=A(this).find(":submit");if(this.__valid__){H.removeAttr("disabled");if(this.__statusIsAuto__){this.__$status__.hide();}}else{H.attr("disabled","disabled");if(!this.__locked__){this.__$status__.html((F-E)+" required fields pending");B.showStatus(this);}}}).bind("reset",function(E){A(this).find(":input").not(":button, :submit").val("").trigger("blur");}).submit(function(E){var F=A(this);if(this.__key__&&this.__key__==13){return false;}if(B.opts.preSubmitCallback&&!B.opts.preSubmitCallback(E,this)){return false;}B.clearError(this);this.__$proc__.show();return true;}).find(":input").not(":button, :submit").bind("error",function(E,F){A(this).addClass("invalid").removeClass("valid").each(function(){this.hasError=true;if(this.errorCount===undefined){this.errorCount=1;}else{this.errorCount++;}var H=this.errorCount;var G=A(this);A(this.form).trigger("error",[H>1?F+" - try("+(H-1)+") has failed":F,G]);});}).bind("clearError",function(E){A(this).removeClass("invalid").each(function(){if(this.hasError){this.hasError=false;this.errorCount=0;A(this.form).trigger("clearError");}});}).bind("validate",function(G,E,F){var I=A(this);if(!E){return true;}var H=I.val();if(H!=""&&!E(H)){I.trigger("error",[(F||"An error has occurred")]);return false;}else{I.trigger("clearError");return true;}}).focus(function(){A(this).addClass("selected");}).blur(function(){var E=A(this);E.removeClass("selected");if((/\S/).test(E.val())&&!E.hasClass("invalid")){E.addClass("valid");}else{E.removeClass("valid");}A(this.form).trigger("update");}).filter(":text").keydown(function(E){this.form.__key__=E.which;return true;}).blur(function(){this.form.__key__=null;}).end().filter(":text, textarea").filter(".phone").change(function(){return A(this).trigger("validate",[function(E){return(/^((?:\(\d{3}\)|\d{3})[-\.\s]?\d{3}[-\.\s]?\d{4}(?:\s*(?:x|ext)\s*\d+)?){0,1}$/i).test(E.replace(/\s/g,""));},"invalid phone number!"]);}).end().filter(".date").change(function(){return A(this).trigger("validate",[function(E){return(/^([\d]|1[0,1,2]|0[1-9])(\-|\/|\.)([0-9]|[0,1,2][0-9]|3[0,1])(\-|\/|\.)\d{4}$/).test(E.replace(/\s/g,""));},"invalid date!"]);}).end().filter(".email").change(function(){return A(this).trigger("validate",[function(E){return(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*([,;]\s*\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*$/).test(E);},"invalid email!"]);}).end().filter(".number").change(function(){return A(this).trigger("validate",[function(E){return(/^([\+\-]?(?:\d+(?:\.{1}\d*)?|\d*(?:\.{1}\d*){1})(?:[Ee][\+\-]?\d+)*){1}$/).test(E.replace(/[\s\,]/g,""));},"invalid number!"]);}).end().end().each(function(){A(this).trigger("blur");}).end();});}});})(jQuery);
