// SpryValidationTextarea.js - version 0.15 - Spry Pre-Release 1.6 // // Copyright (c) 2007. Adobe Systems Incorporated. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Adobe Systems Incorporated nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. var Spry;if(!Spry)Spry={};if(!Spry.Widget)Spry.Widget={};Spry.Widget.BrowserSniff=function(){var b=navigator.appName.toString();var up=navigator.platform.toString();var ua=navigator.userAgent.toString();this.mozilla=this.ie=this.opera=r=false;var re_opera=/Opera.([0-9\.]*)/i;var re_msie=/MSIE.([0-9\.]*)/i;var re_gecko=/gecko/i;var re_safari=/safari\/([\d\.]*)/i;if(ua.match(re_opera)){r=ua.match(re_opera);this.opera=true;this.version=parseFloat(r[1]);}else if(ua.match(re_msie)){r=ua.match(re_msie);this.ie=true;this.version=parseFloat(r[1]);}else if(ua.match(re_safari)){this.safari=true;this.version=1.4;}else if(ua.match(re_gecko)){var re_gecko_version=/rv:\s*([0-9\.]+)/i;r=ua.match(re_gecko_version);this.mozilla=true;this.version=parseFloat(r[1]);} this.windows=this.mac=this.linux=false;this.Platform=ua.match(/windows/i)?"windows":(ua.match(/linux/i)?"linux":(ua.match(/mac/i)?"mac":ua.match(/unix/i)?"unix":"unknown"));this[this.Platform]=true;this.v=this.version;if(this.safari&&this.mac&&this.mozilla){this.mozilla=false;}};Spry.is=new Spry.Widget.BrowserSniff();Spry.Widget.ValidationTextarea=function(element,options){options=Spry.Widget.Utils.firstValid(options,{});this.flags={locked:false};this.options={};this.element=element;this.init(element);if(!this.isBrowserSupported()){return;} options.useCharacterMasking=Spry.Widget.Utils.firstValid(options.useCharacterMasking,true);options.hint=Spry.Widget.Utils.firstValid(options.hint,'');options.isRequired=Spry.Widget.Utils.firstValid(options.isRequired,true);options.additionalError=Spry.Widget.Utils.firstValid(options.additionalError,false);Spry.Widget.Utils.setOptions(this,options);Spry.Widget.Utils.setOptions(this.options,options);if(options.additionalError) this.additionalError=this.getElement(options.additionalError);var validateOn=['submit'].concat(Spry.Widget.Utils.firstValid(this.options.validateOn,[]));validateOn=validateOn.join(",");this.validateOn=0;this.validateOn=this.validateOn|(validateOn.indexOf('submit')!=-1?Spry.Widget.ValidationTextarea.ONSUBMIT:0);this.validateOn=this.validateOn|(validateOn.indexOf('blur')!=-1?Spry.Widget.ValidationTextarea.ONBLUR:0);this.validateOn=this.validateOn|(validateOn.indexOf('change')!=-1?Spry.Widget.ValidationTextarea.ONCHANGE:0);if(Spry.Widget.ValidationTextarea.onloadDidFire){this.attachBehaviors();}else{Spry.Widget.ValidationTextarea.loadQueue.push(this);}};Spry.Widget.ValidationTextarea.ONCHANGE=1;Spry.Widget.ValidationTextarea.ONBLUR=2;Spry.Widget.ValidationTextarea.ONSUBMIT=4;Spry.Widget.ValidationTextarea.INITIAL='Initial';Spry.Widget.ValidationTextarea.REQUIRED='Required';Spry.Widget.ValidationTextarea.INVALID='Invalid Format';Spry.Widget.ValidationTextarea.MINIMUM='Minimum Number of Chars Not Met';Spry.Widget.ValidationTextarea.MAXIMUM='Maximum Number of Chars Exceeded';Spry.Widget.ValidationTextarea.VALID='Valid';Spry.Widget.ValidationTextarea.prototype.init=function(element) {this.element=this.getElement(element);this.event_handlers=[];this.requiredClass="textareaRequiredState";this.invalidCharsMaxClass="textareaMaxCharsState";this.invalidCharsMinClass="textareaMinCharsState";this.validClass="textareaValidState";this.focusClass="textareaFocusState";this.hintClass="textareaHintState";this.textareaFlashClass="textareaFlashState";this.isMaxInvalid=false;this.isMinInvalid=false;this.isRequireInvalid=false;this.safariClicked=false;this.state=Spry.Widget.ValidationTextarea.INITIAL;};Spry.Widget.ValidationTextarea.prototype.destroy=function(){if(this.event_handlers) for(var i=0;i=5&&Spry.is.windows||Spry.is.mozilla&&Spry.is.v>=1.4||Spry.is.safari||Spry.is.opera&&Spry.is.v>=9;};Spry.Widget.ValidationTextarea.prototype.attachBehaviors=function() {if(this.element){if(this.element.nodeName=="TEXTAREA"){this.input=this.element;}else{this.input=Spry.Widget.Utils.getFirstChildWithNodeNameAtAnyLevel(this.element,"TEXTAREA");}} if(this.options&&this.options.counterType&&(this.options.counterType=='chars_count'||this.options.counterType=='chars_remaining')){this.counterEl=document.getElementById(this.options.counterId);this.counterChar();} if(this.input){this.input.setAttribute("AutoComplete","off");this.putHint();this.cursorPosition=new Spry.Widget.SelectionDescriptor(this.input);var self=this;this.event_handlers=[];if(this.useCharacterMasking){if(Spry.is.ie){this.event_handlers.push([this.input,"propertychange",function(e){return self.onKeyEvent(e||event);}]);this.event_handlers.push([this.input,"drop",function(e){return self.onDrop(e||event);}]);this.event_handlers.push([this.input,"keypress",function(e){return self.onKeyPress(e||event);}]);}else{this.event_handlers.push([this.input,"keydown",function(e){return self.onKeyDown(e);}]);this.event_handlers.push([this.input,"keypress",function(e){return self.safariKeyPress(e);}]);this.event_handlers.push([this.input,"keyup",function(e){return self.safariValidate(e);}]);if(Spry.is.safari){this.event_handlers.push([this.input,"mouseup",function(e){return self.safariMouseUp(e);}]);this.event_handlers.push([this.input,"mousedown",function(e){return self.safariMouseDown(e);}]);}else{this.event_handlers.push([this.input,"dragdrop",function(e){return self.onKeyEvent(e);}]);this.event_handlers.push([this.input,"dragenter",function(e){self.removeHint();return self.onKeyDown(e);}]);this.event_handlers.push([this.input,"dragexit",function(e){return self.putHint();}]);}} this.event_handlers.push([this.input,"keydown",function(e){return self.onKeyDown(e||event);}]);} this.event_handlers.push([this.input,"focus",function(e){return self.onFocus(e||event);}]);this.event_handlers.push([this.input,"mousedown",function(e){return self.onMouseDown(e||event);}]);this.event_handlers.push([this.input,"blur",function(e){return self.onBlur(e||event);}]);if(this.validateOn&Spry.Widget.ValidationTextarea.ONCHANGE){if(Spry.is.ie){this.event_handlers.push([this.input,"propertychange",function(e){return self.onChange(e||event);}]);this.event_handlers.push([this.input,"drop",function(e){return self.onChange(e||event);}]);}else{this.event_handlers.push([this.input,"keydown",function(e){return self.onKeyDown(e);}]);this.event_handlers.push([this.input,"keypress",function(e){return self.safariChangeKeyPress(e);}]);this.event_handlers.push([this.input,"keyup",function(e){return self.safariChangeValidate(e);}]);if(Spry.is.safari){this.event_handlers.push([this.input,"mouseup",function(e){return self.safariChangeMouseUp(e);}]);this.event_handlers.push([this.input,"mousedown",function(e){return self.safariMouseDown(e);}]);}else{this.event_handlers.push([this.input,"dragdrop",function(e){return self.onChange(e);}]);this.event_handlers.push([this.input,"dragenter",function(e){self.removeHint();return self.onKeyDown(e);}]);this.event_handlers.push([this.input,"dragexit",function(e){return self.putHint();}]);}}} if(!(this.validateOn&Spry.Widget.ValidationTextarea.ONCHANGE)&&!this.useCharacterMasking){if(Spry.is.ie){this.event_handlers.push([this.input,"propertychange",function(e){return self.counterChar();}]);this.event_handlers.push([this.input,"drop",function(e){return self.counterChar();}]);}else{this.event_handlers.push([this.input,"keypress",function(e){return self.counterChar();}]);this.event_handlers.push([this.input,"keyup",function(e){return self.counterChar();}]);if(Spry.is.safari){this.event_handlers.push([this.input,"mouseup",function(e){return self.counterChar();}]);}else{this.event_handlers.push([this.input,"dragdrop",function(e){return self.counterChar();}]);}}} for(var i=0;i0&&ret){if(val.length>this.options.maxChars&&((!Spry.Widget.Utils.isSpecialKey(e)&&this.cursorPosition.start==this.cursorPosition.end)||(Spry.Widget.Utils.isSpecialKey(e)&&val!=this.initialValue)||this.cursorPosition.start!=this.cursorPosition.end)){this.flags.locked=true;var initial=this.initialValue;var start=this.initialCursor.start;var end=this.initialCursor.end;if(initial.length&&this.initialCursor.end0&&this.isRequireInvalid&&(!this.hint||(this.hint&&!this.flags.hintOn)||(this.hint&&val!=this.hint))){this.switchClassName(this.validClass);this.setState(Spry.Widget.ValidationTextarea.VALID);this.isRequireInvalid=false;}else if((val.length==0||!(!this.hint||(this.hint&&!this.flags.hintOn)||(this.hint&&val!=this.hint)))&&(!this.isRequireInvalid||oldInvalid)){if(this.notFireMinYet||Spry.is.ie){this.switchClassName(this.requiredClass);this.setState(Spry.Widget.ValidationTextarea.REQUIRED);} this.isRequireInvalid=true;this.isMinInvalid=false;}} if(this.input&&this.options&&this.options.minChars>0&&!this.isRequireInvalid){if(val.length>=this.options.minChars&&(!this.hint||(this.hint&&!this.flags.hintOn)||(this.hint&&val!=this.hint))&&this.isMinInvalid){this.switchClassName(this.validClass);this.setState(Spry.Widget.ValidationTextarea.VALID);this.isMinInvalid=false;}else if((val.length0){if(this.flags.hintOn){this.setCounterElementValue(this.options.maxChars);}else{if(this.options.maxChars>this.input.value.length){this.setCounterElementValue(this.options.maxChars-this.input.value.length);}else{this.setCounterElementValue(0);}}}}else{if(this.flags.hintOn){this.setCounterElementValue(0);}else{if(this.useCharacterMasking&&typeof this.options.maxChars!='undefined'&&this.options.maxChars0&&!this.useCharacterMasking){if(val.length<=this.options.maxChars||(this.hint&&this.hint==val&&this.flags.hintOn)){this.switchClassName(this.validClass);this.setState(Spry.Widget.ValidationTextarea.VALID);this.isMaxInvalid=false;}else{this.switchClassName(this.invalidCharsMaxClass);this.setState(Spry.Widget.ValidationTextarea.MAXIMUM);this.isMaxInvalid=true;}} ret=ret&&!this.isMaxInvalid;if(ret){this.switchClassName(this.validClass);} this.counterChar();return ret;};Spry.Widget.ValidationTextarea.prototype.setState=function(newstate){this.state=newstate;};Spry.Widget.ValidationTextarea.prototype.getState=function(){return this.state;};Spry.Widget.ValidationTextarea.prototype.removeHint=function() {if(this.flags.hintOn) {this.flags.locked=true;this.input.value="";this.flags.locked=false;this.flags.hintOn=false;this.removeClassName(this.hintClass);}};Spry.Widget.ValidationTextarea.prototype.putHint=function() {if(this.hint&&this.input.value==""){this.flags.hintOn=true;this.input.value=this.hint;this.addClassName(this.hintClass);}};Spry.Widget.ValidationTextarea.prototype.redTextFlash=function() {var self=this;this.addClassName(this.textareaFlashClass);setTimeout(function(){self.removeClassName(self.textareaFlashClass)},200);};Spry.Widget.ValidationTextarea.prototype.onKeyPress=function(e) {if(Spry.is.ie&&Spry.is.windows&&e.keyCode==13){if((this.initialCursor.length+this.options.maxChars-this.input.value.length)<2){Spry.Widget.Utils.stopEvent(e);return false;}}};Spry.Widget.ValidationTextarea.prototype.onKeyDown=function(e) {this.saveState();this.keyCode=e.keyCode;return true;};Spry.Widget.ValidationTextarea.prototype.onKeyEvent=function(e){if(e.type=='propertychange'&&e.propertyName!='value'){return true;} var allow=this.onTyping(e);if(!allow){Spry.Widget.Utils.stopEvent(e);}};Spry.Widget.ValidationTextarea.prototype.onChange=function(e){if(Spry.is.ie&&e&&e.type=='propertychange'&&e.propertyName!='value'){return true;} if(this.flags.drop){var self=this;setTimeout(function(){self.flags.drop=false;self.onChange(null);},0);return true;} if(this.flags.hintOn){return true;} this.onKeyEventOn=true;var answer=this.validate();this.onKeyEventOn=false;return answer;};Spry.Widget.ValidationTextarea.prototype.onMouseDown=function(e) {if(this.flags.active){this.saveState();}};Spry.Widget.ValidationTextarea.prototype.onDrop=function(e) {this.flags.drop=true;this.removeHint();if(Spry.is.ie){var rng=document.body.createTextRange();rng.moveToPoint(e.x,e.y);rng.select();} this.saveState();this.flags.active=true;this.addClassName(this.focusClass);};Spry.Widget.ValidationTextarea.prototype.onFocus=function(e) {if(this.flags.drop){return;} this.removeHint();this.saveState();this.flags.active=true;this.addClassName(this.focusClass);};Spry.Widget.ValidationTextarea.prototype.onBlur=function(e){this.removeClassName(this.focusClass);if(this.validateOn&Spry.Widget.ValidationTextarea.ONBLUR){this.onBlurOn=true;this.validate();this.onBlurOn=false;} this.flags.active=false;var self=this;setTimeout(function(){self.putHint();},10);};Spry.Widget.ValidationTextarea.prototype.safariMouseDown=function(e){this.safariClicked=true;};Spry.Widget.ValidationTextarea.prototype.safariChangeMouseUp=function(e){if(!this.safariClicked){this.onKeyDown(e);return this.safariChangeValidate(e,false);}else{this.safariClicked=false;return true;}};Spry.Widget.ValidationTextarea.prototype.safariMouseUp=function(e){if(!this.safariClicked){this.onKeyDown(e);return this.safariValidate(e,false);}else{this.safariClicked=false;return true;}};Spry.Widget.ValidationTextarea.prototype.safariKeyPress=function(e){this.safariFlag=new Date();return this.safariValidate(e,true);};Spry.Widget.ValidationTextarea.prototype.safariValidate=function(e,recall) {if(e.keyCode&&Spry.Widget.Utils.isSpecialKey(e)&&e.keyCode!=8&&e.keyCode!=46){return true;} var answer=this.onTyping(e);if(new Date()-this.safariFlag<1000&&recall){var self=this;setTimeout(function(){self.safariValidate(e,false);},1000);} return answer;};Spry.Widget.ValidationTextarea.prototype.safariChangeKeyPress=function(e){this.safariChangeFlag=new Date();return this.safariChangeValidate(e,true);};Spry.Widget.ValidationTextarea.prototype.safariChangeValidate=function(e,recall){if(e.keyCode&&Spry.Widget.Utils.isSpecialKey(e)&&e.keyCode!=8&&e.keyCode!=46){return true;} var answer=this.onChange(e);if(new Date()-this.safariChangeFlag<1000&&recall){var self=this;setTimeout(function(){self.safariChangeValidate(e,false);},1000-new Date()+this.safariChangeFlag);} return answer;};Spry.Widget.ValidationTextarea.prototype.saveState=function(e){if(this.options.maxChars>0&&this.input.value.length>this.options.maxChars){return;} this.cursorPosition.update();if(!this.flags.hintOn){this.initialValue=this.input.value;}else{this.initialValue='';} this.initialCursor=this.cursorPosition;return true;};Spry.Widget.ValidationTextarea.prototype.checkClassName=function(ele,className){if(!ele||!className){return false;} if(typeof ele=='string'){ele=document.getElementById(ele);if(!ele){return false;}} if(!ele.className){ele.className=' ';} return ele;};Spry.Widget.ValidationTextarea.prototype.switchClassName=function(className){var classes=[this.invalidCharsMaxClass,this.validClass,this.requiredClass,this.invalidCharsMinClass];for(var k=0;k0){this.range.setEndPoint("EndToEnd",ta_range);}}else if(this.element.nodeName=="INPUT"){this.range=this.element.ownerDocument.selection.createRange();this.range.move("character",-10000);this.start=this.range.moveStart("character",start);this.end=this.start+this.range.moveEnd("character",end-start);} this.range.select();}else{this.start=start;try{this.element.selectionStart=start;}catch(err){} this.end=end;try{this.element.selectionEnd=end;}catch(err){}} this.ignore=true;this.update();};if(!Spry.Widget.Form)Spry.Widget.Form={};if(!Spry.Widget.Form.onSubmitWidgetQueue)Spry.Widget.Form.onSubmitWidgetQueue=[];if(!Spry.Widget.Form.validate){Spry.Widget.Form.validate=function(vform){var isValid=true;var isElementValid=true;var q=Spry.Widget.Form.onSubmitWidgetQueue;var qlen=q.length;for(var i=0;i