
function Telligent_PatternedTextBox(varName,stateId,pattern,allowBlanks,blankCharacter,validationFunction)
{this._variableName=varName;this._state=document.getElementById(stateId);this._patterns=new Array();this._validationFunction=validationFunction;this._allowBlanks=allowBlanks;this._blankCharacter=blankCharacter;this._initialized=false;this._matchRE=null;this._delayedValue=null;this._cursorSetTimeout=null;this._initialize(pattern);}
Telligent_PatternedTextBox.prototype.GetPatternValues=function()
{var values=new Array();for(var i=0;i<this._patterns.length;i++)
{if(!this._patterns[i].IsStatic())
{values[values.length]=this._patterns[i].GetValue();}}
return values;}
Telligent_PatternedTextBox.prototype.SetPatternValues=function(values)
{var j=0;for(var i=0;i<this._patterns.length&&j<values.length;i++)
{if(!this._patterns[i].IsStatic())
{if(this._patterns[i]._patternType=='range')
{var tempValue=new String(values[j]);while(tempValue.length<this._patterns[i]._minLength)
tempValue="0"+tempValue;this._patterns[i].ParseValue(tempValue);}
else
this._patterns[i].ParseValue(values[j]);j++;}}
this.Refresh();}
Telligent_PatternedTextBox.prototype._getPatternByIndex=function(index)
{var j=0;for(var i=0;i<this._patterns.length;i++)
{if(!this._patterns[i].IsStatic())
{if(j==index)
return this._patterns[i];else
j++;}}}
Telligent_PatternedTextBox.prototype._getPatternDataAtIndex=function(index)
{if(!this._initialized)
return;var totalString='';var matches=this._matchRE.exec(this._state.value);var patternData=new Object();if(matches)
{for(var i=1;i<matches.length&&i-1<this._patterns.length;i++)
{totalString+=matches[i];if((index<totalString.length||(index==totalString.length&&(matches[i].length<this._patterns[i-1]._maxLength||i==this._patterns.length)))&&!this._patterns[i-1].IsStatic())
{if(!patternData.currentPattern)
{patternData.currentPattern=this._patterns[i-1];patternData.currentPatternStartIndex=totalString.length-matches[i].length;patternData.currentPatternEndIndex=totalString.length;}
else
{patternData.nextPattern=this._patterns[i-1];patternData.nextPatternStartIndex=totalString.length-matches[i].length;patternData.nextPatternEndIndex=totalString.length;return patternData;}}
else if(!this._patterns[i-1].IsStatic())
{patternData.previousPattern=this._patterns[i-1];patternData.previousPatternStartIndex=totalString.length-matches[i].length;patternData.previousPatternEndIndex=totalString.length;}}}
return patternData;}
Telligent_PatternedTextBox.prototype.Refresh=function()
{if(this._initialized)
{var value='';for(var i=0;i<this._patterns.length;i++)
{value+=this._patterns[i].GetValue();}
this._state.value=value;}}
Telligent_PatternedTextBox.prototype.SetValue=function(value)
{if(!this._initialized)
return;var matches=this._matchRE.exec(value);if(matches)
{for(var i=1;i<matches.length&&i-1<this._patterns.length;i++)
{this._patterns[i-1].ParseValue(matches[i]);}
this._processExternalValidation();}
this.Refresh();}
Telligent_PatternedTextBox.prototype._processExternalValidation=function(patternChanged,movement)
{if(this._validationFunction)
{var regions=new Array();var modifiedIndex=-1;if(!movement)
movement='set';for(var i=0;i<this._patterns.length;i++)
{if(!this._patterns[i].IsStatic())
{regions[regions.length]=this._patterns[i].GetValue();if(patternChanged==this._patterns[i])
modifiedIndex=regions.length-1;}}
regions=this._validationFunction(regions,movement,modifiedIndex);if(regions)
this.SetPatternValues(regions);}}
Telligent_PatternedTextBox.prototype.GetValue=function(value)
{if(this._initialized)
{var value='';for(var i=0;i<this._patterns.length;i++)
{if(!this._patterns[i].IsStatic()&&!this._patterns[i].HasValue())
return null;else
value+=this._patterns[i].GetValue();}
return value;}
else
return null;}
Telligent_PatternedTextBox.prototype._initialize=function(pattern)
{if(this._state)
{var initialValue=this._state.value;if(window.opera)
this._state.onkeypress=new Function('event','return '+this._variableName+'._keyPress(event);');this._state.onkeyup=new Function('event','return '+this._variableName+'._keyUp(event);');this._state.onfocus=new Function('event','return '+this._variableName+'._focus(event);');this._state.onkeydown=new Function('event','return '+this._variableName+'._keyDown(event);');this._state.onchange=new Function('event','return '+this._variableName+'._change(event);');var patternRE=new RegExp('<([^<>]{1,}?)>','ig');var matches;var lastIndex=0;var matchPattern='^';while(matches=patternRE.exec(pattern))
{if(matches.index>lastIndex)
{this._patterns[this._patterns.length]=new Telligent_TextPattern(pattern.substr(lastIndex,matches.index-lastIndex),this._blankCharacter,this._allowBlanks,true);matchPattern+='('+this._patterns[this._patterns.length-1].GetRegExpPattern()+')';}
this._patterns[this._patterns.length]=new Telligent_TextPattern(matches[1],this._blankCharacter,this._allowBlanks,false);matchPattern+='('+this._patterns[this._patterns.length-1].GetRegExpPattern()+')';lastIndex=patternRE.lastIndex;}
if(lastIndex<pattern.length)
{this._patterns[this._patterns.length]=new Telligent_TextPattern(pattern.substr(lastIndex,pattern.length-lastIndex),this._blankCharacter,this._allowBlanks,true);matchPattern+='('+this._patterns[this._patterns.length-1].GetRegExpPattern()+')';}
matchPattern+='$';this._matchRE=new RegExp(matchPattern,'i');this._initialized=true;this.SetValue(initialValue);}}
Telligent_PatternedTextBox.prototype._focus=function(event)
{if(!event)
event=window.event;var patternData;if(event.shiftKey)
patternData=this._getPatternDataAtIndex(this._state.value.length);else
patternData=this._getPatternDataAtIndex(0);if(patternData.currentPattern)
Telligent_Common.SetCurrentCursorSelection(this._state,patternData.currentPatternStartIndex,patternData.currentPatternEndIndex,false);}
Telligent_PatternedTextBox.prototype._change=function(event)
{if(!this._initialized)
return false;if(!event)
event=window.event;this.SetValue(this._state.value);}
Telligent_PatternedTextBox.prototype._keyDown=function(event)
{if(!this._initialized)
return false;if(!event)
event=window.event;if(event.keyCode==38||event.keyCode==40||event.keyCode==37||event.keyCode==39||event.keyCode==9||event.keyCode==8)
{var index=Telligent_Common.GetCurrentCursorIndex(this._state);if((event.keyCode==37||event.keyCode==8)&&index>0)
index--;if(event.keyCode==39&&index<this._state.value.length)
index++;var patternData=this._getPatternDataAtIndex(index);if(patternData.currentPattern)
{if(event.keyCode==38)
{patternData.currentPattern.Next();this._processExternalValidation(patternData.currentPattern,'next');this.Refresh();patternData=this._getPatternDataAtIndex(index);if(patternData.currentPattern)
Telligent_Common.SetCurrentCursorSelection(this._state,patternData.currentPatternStartIndex,patternData.currentPatternEndIndex,true);}
else if(event.keyCode==40)
{patternData.currentPattern.Previous();this._processExternalValidation(patternData.currentPattern,'previous');this.Refresh();patternData=this._getPatternDataAtIndex(index);if(patternData.currentPattern)
Telligent_Common.SetCurrentCursorSelection(this._state,patternData.currentPatternStartIndex,patternData.currentPatternEndIndex,true);}
else if(event.keyCode==9)
{if(event.shiftKey)
{if(patternData.previousPattern)
Telligent_Common.SetCurrentCursorSelection(this._state,patternData.previousPatternStartIndex,patternData.previousPatternEndIndex,true,this._state.value);else
return true;}
else
{if(patternData.nextPattern)
Telligent_Common.SetCurrentCursorSelection(this._state,patternData.nextPatternStartIndex,patternData.nextPatternEndIndex,true,this._state.value);else
return true;}}
else if(event.keyCode==37||event.keyCode==8)
{if(index<patternData.currentPatternStartIndex&&patternData.previousPattern)
Telligent_Common.SetCurrentCursorSelection(this._state,patternData.previousPatternEndIndex-1,patternData.previousPatternEndIndex,true,this._state.value);else if(index>patternData.currentPatternStartIndex&&index<=patternData.currentPatternEndIndex)
Telligent_Common.SetCurrentCursorSelection(this._state,index,patternData.currentPatternEndIndex,true,this._state.value);else
Telligent_Common.SetCurrentCursorSelection(this._state,patternData.currentPatternStartIndex,patternData.currentPatternEndIndex,true,this._state.value);}
else if(event.keyCode==39)
{if(index>patternData.currentPatternEndIndex&&patternData.nextPattern)
Telligent_Common.SetCurrentCursorSelection(this._state,patternData.nextPatternStartIndex,patternData.nextPatternEndIndex,true,this._state.value);else if(index>patternData.currentPatternStartIndex&&index<=patternData.currentPatternEndIndex)
Telligent_Common.SetCurrentCursorSelection(this._state,index,patternData.currentPatternEndIndex,true,this._state.value);else
Telligent_Common.SetCurrentCursorSelection(this._state,patternData.currentPatternStartIndex,patternData.currentPatternEndIndex,true,this._state.value);}
else
Telligent_Common.SetCurrentCursorSelection(this._state,index,index,true,this._state.value);}
else
Telligent_Common.SetCurrentCursorSelection(this._state,index,index,true,this._state.value);event.cancelBubble=true;if(event.preventDefault)
event.preventDefault();if(event.stopProgagation)
event.stopPropagation();return false;}
else
return true;}
Telligent_PatternedTextBox.prototype._keyPress=function(event)
{if(!this._initialized)
{event.cancelBubble=true;if(event.preventDefault)
event.preventDefault();if(event.stopProgagation)
event.stopPropagation();return false;}
if(!event)
event=window.event;return true;}
Telligent_PatternedTextBox.prototype._keyUp=function(event)
{if(!this._initialized)
{event.cancelBubble=true;if(event.preventDefault)
event.preventDefault();if(event.stopProgagation)
event.stopPropagation();return false;}
if(!event)
event=window.event;if(event.keyCode!=38&&event.keyCode!=40&&event.keyCode!=37&&event.keyCode!=39&&event.keyCode!=9&&event.keyCode!=8)
{var index=Telligent_Common.GetCurrentCursorIndex(this._state);this.SetValue(this._state.value);var patternData=this._getPatternDataAtIndex(index);if(patternData.currentPattern)
{if(index>patternData.currentPatternStartIndex&&index<=patternData.currentPatternEndIndex)
Telligent_Common.SetCurrentCursorSelection(this._state,index,patternData.currentPatternEndIndex,true);else
Telligent_Common.SetCurrentCursorSelection(this._state,patternData.currentPatternStartIndex,patternData.currentPatternEndIndex,true);}
else
Telligent_Common.SetCurrentCursorSelection(this._state,index,index,true);}
return true;}
function Telligent_TextPattern(pattern,blankCharacter,allowBlanks,isStatic)
{this._minLength=0;this._maxLength=0;this._options=new Array();this._rangeStart=0;this._rangeEnd=0;this._patternType='';this._currentValue='';this._placeholder=blankCharacter;this._allowBlanks=allowBlanks;if(isStatic)
{this._patternType='static';this._minLength=this._maxLength=pattern.length;this._currentValue=pattern;}
else if(pattern.match(/^[0-9]{1,}\-[0-9]{1,}$/))
{var range=pattern.split('-');this._rangeStart=parseInt(range[0],10);this._rangeEnd=parseInt(range[1],10);this._patternType='range';this._minLength=new String(range[0]).length;this._maxLength=new String(range[1]).length;if(!this._allowBlanks)
{this._currentValue=new String(this._rangeStart);while(this._currentValue.length<this._minLength)
this._currentValue="0"+this._currentValue;}}
else
{this._options=pattern.split(',');this._patternType='option';this._minLength=new String(this._options[0]).length;this._maxLength=new String(this._options[0]).length;for(var i=0;i<this._options.length;i++)
{var length=new String(this._options[i]).length;if(length>this._maxLength)
this._maxLength=length;if(length<this._minLength)
this._minLength=length;}
if(!this._allowBlanks)
this._currentValue=this._options[0];}}
Telligent_TextPattern.prototype.IsStatic=function()
{return this._patternType=='static';}
Telligent_TextPattern.prototype.Next=function()
{if(this._patternType=='static')
{}
else if(this._patternType=='range')
{if(this._currentValue=='')
{this._currentValue=new String(this._rangeStart);while(this._currentValue.length<this._minLength)
this._currentValue="0"+this._currentValue;}
else
{var value=parseInt(this._currentValue,10);if(value<this._rangeEnd)
{this._currentValue=new String(value+1);while(this._currentValue.length<this._minLength)
this._currentValue="0"+this._currentValue;}
else
{this._currentValue=new String(this._rangeStart);while(this._currentValue.length<this._minLength)
this._currentValue="0"+this._currentValue;}}}
else if(this._patternType=='option')
{if(this._currentValue=='')
this._currentValue=this._options[0];else
{for(var i=0;i<this._options.length;i++)
{if(this._options[i]==this._currentValue)
{if(i<this._options.length-1)
this._currentValue=new String(this._options[i+1]);else
this._currentValue=new String(this._options[0]);break;}}}}}
Telligent_TextPattern.prototype.Previous=function()
{if(this._patternType=='static')
{}
else if(this._patternType=='range')
{if(this._currentValue=='')
{this._currentValue=new String(this._rangeEnd);while(this._currentValue.length<this._minLength)
this._currentValue="0"+this._currentValue;}
else
{var value=parseInt(this._currentValue,10);if(value>this._rangeStart)
{this._currentValue=new String(value-1);while(this._currentValue.length<this._minLength)
this._currentValue="0"+this._currentValue;}
else
{this._currentValue=new String(this._rangeEnd);while(this._currentValue.length<this._minLength)
this._currentValue="0"+this._currentValue;}}}
else if(this._patternType=='option')
{if(this._currentValue=='')
this._currentValue=this._options[this._options.length-1];else
{for(var i=0;i<this._options.length;i++)
{if(this._options[i]==this._currentValue)
{if(i>0)
this._currentValue=new String(this._options[i-1]);else
this._currentValue=new String(this._options[this._options.length-1]);break;}}}}}
Telligent_TextPattern.prototype.ParseValue=function(value)
{if(this._patternType=='static')
return;value=new String(value).replace(new RegExp(Telligent_Common.EscapeForRegExp(this._placeholder),'g'),'');if(this._allowBlanks&&value==''&&isNaN(parseInt(value,10)))
{this._currentValue='';return this._currentValue;}
else if(this._patternType=='range')
{if(value.length>this._maxLength)
value=value.substr(0,this._maxLength);else
{while(value.length<this._minLength)
{value+="0";}}
value=parseInt(value,10);if(isNaN(value))
value=0;var foundValue=false;var newValue;if(value>=this._rangeStart&&value<=this._rangeEnd)
{newValue=value;foundValue=true;}
if(!foundValue&&value<this._rangeStart&&value>0)
{var tempValue=value;while(tempValue<this._rangeStart&&(new String(tempValue)).length<=this._maxLength&&!foundValue)
{tempValue*=10;if(tempValue>=this._rangeStart&&tempValue<=this._rangeEnd)
{newValue=tempValue;foundValue=true;}}}
if(!foundValue&&value>this._rangeEnd&&this._rangeEnd!=0)
{var tempValue=value;while(tempValue>this._rangeEnd&&tempValue>=this._rangeStart&&!foundValue)
{tempValue=Math.round(tempValue/10);if(tempValue>=this._rangeStart&&tempValue<=this._rangeEnd)
{newValue=tempValue;foundValue=true;}}}
if(!foundValue)
{if(value<this._rangeStart)
newValue=this._rangeStart;else
newValue=this._rangeEnd;}
this._currentValue=new String(newValue);while(this._currentValue.length<this._minLength)
this._currentValue="0"+this._currentValue;return this._currentValue;}
else if(this._patternType=='option')
{value=value.toLowerCase();while(value.length>0)
{for(var i=0;i<this._options.length;i++)
{if(this._options[i].substr(0,value.length).toLowerCase()==value)
{this._currentValue=new String(this._options[i]);return this._currentValue;}}
if(value.length>0)
value=value.substr(0,value.length-1);}
return this._currentValue;}}
Telligent_TextPattern.prototype.GetValue=function()
{if(this._patternType=='static')
{return this._currentValue;}
else
{if(this._currentValue==''&&isNaN(parseInt(this._currentValue,10)))
{var value='';while(value.length<this._minLength)
{value+=this._placeholder;}
return value;}
else
return this._currentValue;}}
Telligent_TextPattern.prototype.HasValue=function()
{return!(this._currentValue==''&&isNaN(parseInt(this._currentValue,10)));}
Telligent_TextPattern.prototype.GetRegExpPattern=function()
{if(this._patternType=='range')
return'[0-9'+Telligent_Common.EscapeForRegExp(this._placeholder)+']{0,'+(this._maxLength+1)+'}';else if(this._patternType=='option')
return'.{0,'+(this._maxLength+1)+'}';else
return Telligent_Common.EscapeForRegExp(this._currentValue);};