Current section

Files

Jump to
nitrogen_core priv www livevalidation.min.js
Raw

priv/www/livevalidation.min.js

var LiveValidation=function(element,optionsObj){this.initialize(element,optionsObj)},LiveValidationForm=(LiveValidation.VERSION="1.4 standalone-nitrogen",LiveValidation.TEXTAREA=1,LiveValidation.TEXT=2,LiveValidation.PASSWORD=3,LiveValidation.CHECKBOX=4,LiveValidation.SELECT=5,LiveValidation.FILE=6,LiveValidation.RADIOGROUP=7,LiveValidation.OPTIONS={validMessage:"",insertAfterWhatNode:null,onlyOnBlur:!1,wait:0,onlyOnSubmit:!1,onValid:function(){},onInvalid:function(){this.insertMessage(this.createMessageSpan()),this.addFieldClass()}},LiveValidation.massValidate=function(validations){for(var returnValue=!0,i=0,len=validations.length;i<len;++i)var valid=validations[i].validate(),returnValue=returnValue&&valid;return returnValue},LiveValidation.prototype={validClass:"LV_valid",invalidClass:"LV_invalid",messageClass:"LV_validation_message",validFieldClass:"LV_valid_field",invalidFieldClass:"LV_invalid_field",initialize:function(element,optionsObj){var self=this;if(!element)throw new Error("LiveValidation::initialize - No element reference or element id has been provided!");if(this.element=element.nodeName?element:document.getElementById(element),!this.element)throw new Error("LiveValidation::initialize - No element with reference or id of '"+element+"' exists!");this.validations=[],this.elementType=this.getElementType(),this.form=this.element.form;var temp_el,element=optionsObj||{},optionsObj=(this.validMessage=element.validMessage||!1!==element.validMessage&&LiveValidation.OPTIONS.validMessage,element.insertAfterWhatNode||LiveValidation.OPTIONS.insertAfterWhatNode||this.element);if(this.insertAfterWhatNode=optionsObj.nodeType?optionsObj:document.getElementById(optionsObj),this.onlyOnBlur=element.onlyOnBlur||LiveValidation.OPTIONS.onlyOnBlur,this.wait=element.wait||LiveValidation.OPTIONS.wait,this.onlyOnSubmit=element.onlyOnSubmit||LiveValidation.OPTIONS.onlyOnSubmit,this.beforeValidation=element.beforeValidation||LiveValidation.OPTIONS.beforeValidation||function(){},this.beforeValid=element.beforeValid||LiveValidation.OPTIONS.beforeValid||function(){},this.onValid=element.onValid||LiveValidation.OPTIONS.onValid,this.afterValid=element.afterValid||LiveValidation.OPTIONS.afterValid||function(){},this.beforeInvalid=element.beforeInvalid||LiveValidation.OPTIONS.beforeInvalid||function(){},this.onInvalid=element.onInvalid||LiveValidation.OPTIONS.onInvalid,this.afterInvalid=element.afterInvalid||LiveValidation.OPTIONS.afterInvalid||function(){},this.afterValidation=element.afterValidation||LiveValidation.OPTIONS.afterValidation||function(){},this.form&&(this.formObj=LiveValidationForm.getInstance(this.form),this.formObj.addField(this)),this.elementType==LiveValidation.RADIOGROUP&&(temp_el=this,$(this.element).children("input[type=radio]").on("focus",function(){temp_el.removeMessageAndFieldClass()})),this.oldOnFocus=this.element.onfocus||function(){},this.oldOnBlur=this.element.onblur||function(){},this.oldOnClick=this.element.onclick||function(){},this.oldOnChange=this.element.onchange||function(){},this.oldOnKeyup=this.element.onkeyup||function(){},this.element.onfocus=function(e){return self.doOnFocus(e),self.oldOnFocus.call(this,e)},!this.onlyOnSubmit)switch(this.elementType){case LiveValidation.CHECKBOX:this.element.onclick=function(e){return self.validate(),self.oldOnClick.call(this,e)};case LiveValidation.SELECT:case LiveValidation.FILE:this.element.onchange=function(e){return self.validate(),self.oldOnChange.call(this,e)};break;default:this.onlyOnBlur||(this.element.onkeyup=function(e){return self.deferValidation(),self.oldOnKeyup.call(this,e)}),this.element.onblur=function(e){return self.doOnBlur(e),self.oldOnBlur.call(this,e)}}},destroy:function(){if(this.formObj&&(this.formObj.removeField(this),this.formObj.destroy()),this.element.onfocus=this.oldOnFocus,!this.onlyOnSubmit)switch(this.elementType){case LiveValidation.CHECKBOX:this.element.onclick=this.oldOnClick;case LiveValidation.SELECT:case LiveValidation.FILE:this.element.onchange=this.oldOnChange;break;default:this.onlyOnBlur||(this.element.onkeyup=this.oldOnKeyup),this.element.onblur=this.oldOnBlur}this.validations=[],this.removeMessageAndFieldClass()},add:function(validationFunction,validationParamsObj){return this.validations.push({type:validationFunction,params:validationParamsObj||{}}),this},remove:function(validationFunction,validationParamsObj){for(var victimless=[],i=0,len=this.validations.length;i<len;i++){var v=this.validations[i];v.type!=validationFunction&&v.params!=validationParamsObj&&victimless.push(v)}return this.validations=victimless,this},deferValidation:function(e){300<=this.wait&&this.removeMessageAndFieldClass();var self=this;this.timeout&&clearTimeout(self.timeout),this.timeout=setTimeout(function(){self.validate()},self.wait)},doOnBlur:function(e){this.focused=!1,this.validate()},doOnFocus:function(e){this.focused=!0,this.removeMessageAndFieldClass()},getElementType:function(){var nt,nn=this.element.nodeName.toUpperCase();switch(nt=$(this.element).hasClass("radiogroup")?"RADIOGROUP":this.element.type.toUpperCase(),!0){case"TEXTAREA"==nn:return LiveValidation.TEXTAREA;case"INPUT"==nn&&"TEXT"==nt:case"INPUT"==nn&&("EMAIL"==nt||"URL"==nt||"TEL"==nt||"NUMBER"==nt||"RANGE"==nt||"HIDDEN"==nt):return LiveValidation.TEXT;case"INPUT"==nn&&"PASSWORD"==nt:return LiveValidation.PASSWORD;case"INPUT"==nn&&"CHECKBOX"==nt:return LiveValidation.CHECKBOX;case"INPUT"==nn&&"FILE"==nt:return LiveValidation.FILE;case"DIV"==nn&&"RADIOGROUP"==nt:return LiveValidation.RADIOGROUP;case"SELECT"==nn:return LiveValidation.SELECT;case"INPUT"==nn:throw new Error("LiveValidation::getElementType - Cannot use LiveValidation on an "+nt.toLowerCase()+" input!");default:throw new Error("LiveValidation::getElementType - Element must be an input, select, or textarea - "+nn.toLowerCase()+" was given!")}},doValidations:function(callback){var callback=callback||function(isValid){return isValid},this_=(this.validationFailed=!1,this),validateAll=function(validations,v_status,callback){var el;return 0==validations.length?(this_.validationFailed=v_status,this_.message=this_.validMessage,callback(v_status)):(el=validations.shift(),this_.validateElement(el.type,el.params,function(isValid){var val_status=v_status;return isValid?validateAll(validations,val_status,callback):callback(val_status=!1)}))},validations_copy=this.validations.slice(0);return validateAll(validations_copy,!0,callback)},validateElement:function(validationFunction,validationParamsObj,callback){callback=callback||function(isValid){return isValid};switch(validationFunction){case Validate.Presence:case Validate.Confirmation:case Validate.Acceptance:this.displayMessageWhenEmpty=!0;break;case Validate.Custom:validationParamsObj.displayMessageWhenEmpty&&(this.displayMessageWhenEmpty=!0)}var value="";if(this.elementType==LiveValidation.SELECT?0<=this.element.selectedIndex&&(value=this.element.options[this.element.selectedIndex].value):value=this.elementType==LiveValidation.RADIOGROUP?$(this.element).children("input[type=radio]:checked").val():this.element.value,validationFunction==Validate.Acceptance){if(this.elementType!=LiveValidation.CHECKBOX)throw new Error("LiveValidation::validateElement - Element to validate acceptance must be a checkbox!");value=this.element.checked}var isValid=!0;try{validationFunction(value,validationParamsObj)}catch(error){if(!(error instanceof Validate.Error))throw error;(""!==value||""===value&&this.displayMessageWhenEmpty)&&(this.validationFailed=!0,this.message=error.message.split("\n")[0],isValid=!1)}finally{return callback(isValid)}},validate:function(callback){var this_,callback=callback||function(status){return status};return this.element.disabled?callback(!0):(this.beforeValidation(),(this_=this).doValidations(function(isValid){return isValid?(this_.beforeValid(),this_.onValid(),this_.afterValid(),this_.afterValidation(),callback(!0)):(this_.beforeInvalid(),this_.onInvalid(),this_.afterInvalid(),this_.afterValidation(),callback(!1))}))},enable:function(){return this.element.disabled=!1,this},disable:function(){return this.element.disabled=!0,this.removeMessageAndFieldClass(),this},createMessageSpan:function(){var span=document.createElement("span"),textNode=document.createTextNode(this.message);return span.appendChild(textNode),span},insertMessage:function(elementToInsert){var className;this.removeMessage(),!this.validationFailed&&!this.validMessage||(!this.displayMessageWhenEmpty||this.elementType!=LiveValidation.CHECKBOX&&""!=this.element.value)&&""==this.element.value||(className=this.validationFailed?this.invalidClass:this.validClass,elementToInsert.className+=" "+this.messageClass+" "+className,className=this.insertAfterWhatNode.parentNode,this.insertAfterWhatNode.nextSibling?className.insertBefore(elementToInsert,this.insertAfterWhatNode.nextSibling):className.appendChild(elementToInsert))},addFieldClass:function(){this.removeFieldClass(),this.validationFailed?-1==this.element.className.indexOf(this.invalidFieldClass)&&(this.element.className+=" "+this.invalidFieldClass):!this.displayMessageWhenEmpty&&""==this.element.value||-1!=this.element.className.indexOf(this.validFieldClass)||(this.element.className+=" "+this.validFieldClass)},removeMessage:function(){for(var nextEl,el=this.insertAfterWhatNode;el.nextSibling;){if(1===el.nextSibling.nodeType){nextEl=el.nextSibling;break}el=el.nextSibling}nextEl&&-1!=nextEl.className.indexOf(this.messageClass)&&this.insertAfterWhatNode.parentNode.removeChild(nextEl)},removeFieldClass:function(){var cn=this.element.className;-1!=cn.indexOf(this.invalidFieldClass)&&(this.element.className=cn.split(this.invalidFieldClass).join("")),-1!=cn.indexOf(this.validFieldClass)&&(this.element.className=cn.split(this.validFieldClass).join(" "))},removeMessageAndFieldClass:function(){this.removeMessage(),this.removeFieldClass()}},function(element){this.initialize(element)}),Validate=(LiveValidationForm.instances={},LiveValidationForm.getInstance=function(element){var rand;if(element)return element=element.nodeName?element:document.getElementById(element),rand=Math.random()*Math.random(),element.id||(element.id="formId_"+rand.toString().replace(/\./,"")+(new Date).valueOf()),LiveValidationForm.instances[element.id]||(LiveValidationForm.instances[element.id]=new LiveValidationForm(element)),LiveValidationForm.instances[element.id];throw new Error("LiveValidationForm::getInstance - No element reference or element id has been provided!")},LiveValidationForm.prototype={beforeValidation:function(){},onValid:function(){},onInvalid:function(){},afterValidation:function(){},initialize:function(element){this.name=element.id,this.element=element,this.fields=[],this.oldOnSubmit=this.element.onsubmit||function(){};var self=this;this.element.onsubmit=function(e){var ret=!1;if(self.beforeValidation(),self.valid=LiveValidation.massValidate(self.fields),self.valid?self.onValid():self.onInvalid(),self.afterValidation(),!(ret=self.valid?!1!==self.oldOnSubmit.call(this,e||window.event):ret))return ret}},addField:function(newField){this.fields.push(newField)},removeField:function(victim){for(var victimless=[],i=0,len=this.fields.length;i<len;i++)this.fields[i]!==victim&&victimless.push(this.fields[i]);this.fields=victimless},destroy:function(force){return!(0!=this.fields.length&&!force||(this.element.onsubmit=this.oldOnSubmit,LiveValidationForm.instances[this.name]=null))}},{Presence:function(value,paramsObj){paramsObj=(paramsObj=paramsObj||{}).failureMessage||"Can't be empty!";return""!==value&&null!=value||Validate.fail(paramsObj),!0},Numericality:function(value,paramsObj){var suppliedValue=value,value=Number(value),minimum=(paramsObj=paramsObj||{}).minimum||0==paramsObj.minimum?paramsObj.minimum:null,maximum=paramsObj.maximum||0==paramsObj.maximum?paramsObj.maximum:null,is=paramsObj.is||0==paramsObj.is?paramsObj.is:null,notANumberMessage=paramsObj.notANumberMessage||"Must be a number!",notAnIntegerMessage=paramsObj.notAnIntegerMessage||"Must be an integer!",wrongNumberMessage=paramsObj.wrongNumberMessage||"Must be "+is+"!",tooLowMessage=paramsObj.tooLowMessage||"Must not be less than "+minimum+"!",tooHighMessage=paramsObj.tooHighMessage||"Must not be more than "+maximum+"!";switch(isFinite(value)||Validate.fail(notANumberMessage),paramsObj.onlyInteger&&(/\.0+$|\.$/.test(String(suppliedValue))||value!=parseInt(value))&&Validate.fail(notAnIntegerMessage),!0){case null!==is:value!=Number(is)&&Validate.fail(wrongNumberMessage);break;case null!==minimum&&null!==maximum:Validate.Numericality(value,{tooLowMessage:tooLowMessage,minimum:minimum}),Validate.Numericality(value,{tooHighMessage:tooHighMessage,maximum:maximum});break;case null!==minimum:value<Number(minimum)&&Validate.fail(tooLowMessage);break;case null!==maximum:value>Number(maximum)&&Validate.fail(tooHighMessage)}return!0},Format:function(value,paramsObj){var value=String(value),message=(paramsObj=paramsObj||{}).failureMessage||"Not valid!",pattern=paramsObj.pattern||/./,paramsObj=paramsObj.negate||!1;return paramsObj||pattern.test(value)||Validate.fail(message),paramsObj&&pattern.test(value)&&Validate.fail(message),!0},Email:function(value,paramsObj){paramsObj=(paramsObj=paramsObj||{}).failureMessage||"Must be a valid email address!";return Validate.Format(value,{failureMessage:paramsObj,pattern:/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i}),!0},Length:function(value,paramsObj){var value=String(value),minimum=(paramsObj=paramsObj||{}).minimum||0==paramsObj.minimum?paramsObj.minimum:null,maximum=paramsObj.maximum||0==paramsObj.maximum?paramsObj.maximum:null,is=paramsObj.is||0==paramsObj.is?paramsObj.is:null,wrongLengthMessage=paramsObj.wrongLengthMessage||"Must be "+is+" characters long!",tooShortMessage=paramsObj.tooShortMessage||"Must not be less than "+minimum+" characters long!",tooLongMessage=paramsObj.tooLongMessage||"Must not be more than "+maximum+" characters long!";switch(!0){case null!==is:value.length!=Number(is)&&Validate.fail(wrongLengthMessage);break;case null!==minimum&&null!==maximum:Validate.Length(value,{tooShortMessage:tooShortMessage,minimum:minimum}),Validate.Length(value,{tooLongMessage:tooLongMessage,maximum:maximum});break;case null!==minimum:value.length<Number(minimum)&&Validate.fail(tooShortMessage);break;case null!==maximum:value.length>Number(maximum)&&Validate.fail(tooLongMessage);break;default:throw new Error("Validate::Length - Length(s) to validate against must be provided!")}return!0},Inclusion:function(value,paramsObj){var message=(paramsObj=paramsObj||{}).failureMessage||"Must be included in the list!",caseSensitive=!1!==paramsObj.caseSensitive;if(!paramsObj.allowNull||null!=value){paramsObj.allowNull||null!=value||Validate.fail(message);var within=paramsObj.within||[];if(!caseSensitive){for(var lowerWithin=[],j=0,length=within.length;j<length;++j){var item=within[j];"string"==typeof item&&(item=item.toLowerCase()),lowerWithin.push(item)}within=lowerWithin,"string"==typeof value&&(value=value.toLowerCase())}for(var found=!1,i=0,length=within.length;i<length;++i)within[i]==value&&(found=!0),paramsObj.partialMatch&&-1!=value.indexOf(within[i])&&(found=!0);(!paramsObj.negate&&!found||paramsObj.negate&&found)&&Validate.fail(message)}return!0},Exclusion:function(value,paramsObj){return(paramsObj=paramsObj||{}).failureMessage=paramsObj.failureMessage||"Must not be included in the list!",paramsObj.negate=!0,Validate.Inclusion(value,paramsObj),!0},Confirmation:function(value,paramsObj){if(!paramsObj.match)throw new Error("Validate::Confirmation - Error validating confirmation: Id of element to match must be provided!");var message=(paramsObj=paramsObj||{}).failureMessage||"Does not match!",match=paramsObj.match.nodeName?paramsObj.match:document.getElementById(paramsObj.match);if(match)return value!=match.value&&Validate.fail(message),!0;throw new Error("Validate::Confirmation - There is no reference with name of, or element with id of '"+paramsObj.match+"'!")},Acceptance:function(value,paramsObj){paramsObj=(paramsObj=paramsObj||{}).failureMessage||"Must be accepted!";return value||Validate.fail(paramsObj),!0},Custom:function(value,paramsObj){var against=(paramsObj=paramsObj||{}).against||function(){return!0},args=paramsObj.args||{},message=paramsObj.failureMessage||"Not valid!";if(3==against.length)against(value,args,function(status){status||Validate.fail(message)});else{if(against(value,args))return!0;Validate.fail(message)}return!1},now:function(validationFunction,value,validationParamsObj){if(!validationFunction)throw new Error("Validate::now - Validation function must be provided!");var isValid=!0;try{validationFunction(value,validationParamsObj||{})}catch(error){if(!(error instanceof Validate.Error))throw error;isValid=!1}finally{return isValid}},fail:function(errorMessage){throw new Validate.Error(errorMessage)},Error:function(errorMessage){this.message=errorMessage,this.name="ValidationError"}});