/* (c) LoopNet Suggest Version 1.4 */
LNJS.__suggester=true;var Suggester={};Suggester.Base=function(){};Suggester.Base.prototype={baseInitialize:function(element,update,options){this.userKeyword="";this.element=$(element);this.update=$(update);this.hasFocus=false;this.changed=false;this.active=false;this.visible=false;this.index=0;this.entryCount=0;this.localCache={};if(this.setOptions)this.setOptions(options);else this.options=options||{};if(options.defaultindex)this.index=options.defaultindex;this.options.paramName=this.options.paramName||this.element.name;this.options.tokens=this.options.tokens||[];this.options.useLocalCache=this.options.useLocalCache||false;this.options.frequency=this.options.frequency||0.4;this.options.minChars=this.options.minChars||1;this.options.clonePosition=LNJS.isNull(this.options.clonePosition)?true:this.options.clonePosition;this.options.minAlphaChars=this.options.minAlphaChars||1;this.options.minDigitChars=this.options.minDigitChars||1;this.options.turnOffFading=this.options.turnOffFading||false;this.options.onShow=this.options.onShow||function(element,update,clone){if(!update.style.position||update.style.position=='absolute'){update.style.position='absolute';if(clone)Position.clone(element,update,{setHeight:false,offsetTop:element.offsetHeight});}if(this.turnOffFading)Element.show(update);else new LNJS.Effect.Appear(update,{duration:0.15});};this.options.onHide=this.options.onHide||function(element,update){if(this.turnOffFading)Element.hide(update);else new LNJS.Effect.Fade(update,{duration:0.15});};if(typeof(this.options.tokens)=='string')this.options.tokens=new Array(this.options.tokens);this.observer=null;this.element.setAttribute('Suggest','off');Element.hide(this.update);Event.observe(this.element,"blur",this.onBlur.bindAsEventListener(this));Event.observe(this.element,"keypress",this.onKeyPress.bindAsEventListener(this));},show:function(){if(Element.getStyle(this.update,'display')=='none')this.options.onShow(this.element,this.update,this.options.clonePosition);if(!this.iefix&&(navigator.appVersion.indexOf('MSIE')>0)&&(Element.getStyle(this.update,'position')=='absolute')){new Insertion.After(this.update,'<iframe id="'+this.update.id+'_iefix" '+'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" '+'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');this.iefix=$(this.update.id+'_iefix');}if(this.iefix)setTimeout(this.fixIEOverlapping.bind(this),50);this.visible=true;},fixIEOverlapping:function(){Position.clone(this.update,this.iefix);this.iefix.style.zIndex=1;this.update.style.zIndex=2;Element.show(this.iefix);},hide:function(){this.stopIndicator();if(Element.getStyle(this.update,'display')!='none')this.options.onHide(this.element,this.update);if(this.iefix)Element.hide(this.iefix);this.visible=false;},startIndicator:function(){if(this.options.indicator)Element.show(this.options.indicator);},stopIndicator:function(){if(this.options.indicator)Element.hide(this.options.indicator);},onKeyPress:function(event){if(this.active){switch(event.keyCode){case Event.KEY_TAB:case Event.KEY_RETURN:if(this.index>-1){this.selectEntry();if(this.options.onReturn)this.options.onReturn(event);Event.stop(event);}else{if(this.options.onReturn)this.options.onReturn(event);Event.stop(event);}                    /*//jsl:fallthru*/case Event.KEY_ESC:this.hide();if(event.keyCode==Event.KEY_ESC)this.element.value=this.userKeyword;this.active=false;if(this.index>-1)Event.stop(event);return;break;case Event.KEY_LEFT:case Event.KEY_RIGHT:return;break;case Event.KEY_UP:this.markPrevious();this.render();if(this.options.onKeyUp)this.options.onKeyUp(event);Event.stop(event);return;break;case Event.KEY_DOWN:this.markNext();this.render();if(this.options.onKeyDn)this.options.onKeyDn(event);Event.stop(event);return;break;default:break;}}else{if(event.keyCode==Event.KEY_TAB)return;if(event.keyCode==Event.KEY_RETURN){if(this.options.onReturn)this.options.onReturn(event);return;}}this.changed=true;if(this.options.onChange)this.options.onChange();this.hasFocus=true;if(this.observer)clearTimeout(this.observer);this.observer=setTimeout(this.onObserverEvent.bind(this),this.options.frequency*1000);},onHover:function(event){var element=Event.findElement(event,'LI');if(this.index!=element.SuggestIndex){this.index=element.SuggestIndex;this.render();}Event.stop(event);},onClick:function(event){var element=Event.findElement(event,'LI');this.index=element.SuggestIndex;this.selectEntry();this.hide();},onBlur:function(event){setTimeout(this.hide.bind(this),250);this.hasFocus=false;this.active=false;},render:function(){if(this.entryCount>0){for(var i=0;i<this.entryCount;i++)this.index==i?Element.addClassName(this.getEntry(i),"selected"):Element.removeClassName(this.getEntry(i),"selected");if(this.hasFocus){this.show();this.active=true;}}else this.hide();},markPrevious:function(){if(this.index>-1)this.index--;else this.index=this.entryCount-1;},markNext:function(){if(this.index<this.entryCount-1)this.index++;else this.index=-1;},getEntry:function(index){return this.update.firstChild.childNodes[index];},getCurrentEntry:function(){return this.getEntry(this.index);},selectEntry:function(){this.active=false;this.updateElement(this.getCurrentEntry());},updateElement:function(selectedElement){if(this.options.updateElement){this.options.updateElement(selectedElement);return;}this.element.value=this.getUpdateValue(selectedElement);this.element.focus();if(this.options.afterUpdateElement)this.options.afterUpdateElement(this.element,selectedElement);},updateChoices:function(choices){if(!this.changed&&this.hasFocus){Element.innerHTML(this.update,choices);Element.cleanWhitespace(this.update);Element.cleanWhitespace(this.update.firstChild);if(this.update.firstChild&&this.update.firstChild.childNodes){this.entryCount=this.update.firstChild.childNodes.length;for(var i=0;i<this.entryCount;i++){var entry=this.getEntry(i);entry.SuggestIndex=i;this.addObservers(entry);}}else{this.entryCount=0;}this.index=(this.options.defaultindex)?this.options.defaultindex:0;this.render();}},getUpdateValue:function(selectedElement){var value=Element.collectTextNodesIgnoreClass(selectedElement,'informal');var lastTokenPos=this.findLastToken();if(lastTokenPos!=-1){var newValue=this.element.value.substr(0,lastTokenPos+1);var whitespace=this.element.value.substr(lastTokenPos+1).match(/^\s+/);if(whitespace)newValue+=whitespace[0];return newValue+value;}else{return value;}},addObservers:function(element){Event.observe(element,"mouseover",this.onHover.bindAsEventListener(this));Event.observe(element,"click",this.onClick.bindAsEventListener(this));},onObserverEvent:function(){this.changed=false;var token=this.getToken();this.userKeyword=token;if(isNaN(token)){if(token.length>=Math.max(this.options.minAlphaChars,this.options.minChars)){this.startIndicator();this.getUpdatedChoices();return;}}else if(token.length>=Math.max(this.options.minDigitChars,this.options.minChars)){this.startIndicator();this.getUpdatedChoices();return;}this.active=false;this.hide();},getToken:function(){var tokenPos=this.findLastToken();if(tokenPos!=-1)ret=this.element.value.substr(tokenPos+1).replace(/^\s+/,'').replace(/\s+$/,'');else ret=this.element.value;if(this.options.filterToken)ret=this.options.filterToken(ret);return(/\n/.test(ret))?'':ret;},findLastToken:function(){var lastTokenPos=-1;for(var i=0;i<this.options.tokens.length;i++){var thisTokenPos=this.element.value.lastIndexOf(this.options.tokens[i]);if(thisTokenPos>lastTokenPos)lastTokenPos=thisTokenPos;}return lastTokenPos;},dispose:function(){Event.stopObserving(this.element,"blur",this.onBlur);Event.stopObserving(this.element,"keypress",this.onKeyPress);Event.stopObserving(this.element,"mouseover",this.onHover);Event.stopObserving(this.element,"click",this.onClick);clearTimeout(this.observer);Element.purge(this.element);Element.purge(this.update);this.localCache=null;this.element=null;this.update=null;}};
if (!LNJS.isNull(LNJS.Ajax)) { LNJS.Ajax.Suggester = Class.create(); Object.extend(Object.extend(LNJS.Ajax.Suggester.prototype, Suggester.Base.prototype), { initialize: function(element, update, url, options) { this.__className = "LNJS.Ajax.Suggester"; this.baseInitialize(element, update, options); this.options.asynchronous = true; this.options.onComplete = this.onComplete.bind(this); this.options.defaultParams = this.options.parameters || null; this.url = url; }, getUpdatedChoices: function() { var key = this.getToken(); if (this.options.useLocalCache && this.localCache[key] != null) { this.stopIndicator(); var cacheValue = this.localCache[key]; if (this.options.processResults) this.options.processResults(cacheValue); else this.updateChoices(cacheValue.xml); return; } if (this.options.ServiceSourceCode) { LNJS.ServiceSourceCode = this.options.ServiceSourceCode; } if (this.options.SOAPMethod) { entry = this.getToken(); var attribs = (this.options.SOAPRequestAttributes) ? this.options.SOAPRequestAttributes : ""; this.options.postBody = GetSoapInput('<PFRequestData ' + attribs + '><![CDATA[' + entry + ']]></PFRequestData>', this.options.SOAPMethod, this.options.SOAPNamespace); } else { entry = encodeURIComponent(this.options.paramName) + '=' + encodeURIComponent(this.getToken()); this.options.parameters = this.options.callback ? this.options.callback(this.element, entry) : entry; if (this.options.defaultParams) this.options.parameters += '&' + this.options.defaultParams; } new LNJS.Ajax.Request(this.url, this.options); }, onComplete: function(request) { this.stopIndicator(); if (this.options.processResults) { this.options.processResults(request); } else { this.updateChoices(request.responseText); } var key = this.getToken(); if (this.options.useLocalCache && this.localCache[key] == null) this.localCache[key] = request.responseXML; } }); }
Suggester.Local=Class.create();Suggester.Local.prototype=Object.extend(new Suggester.Base(),{initialize:function(element,update,array,options){this.baseInitialize(element,update,options);this.options.array=array;},getUpdatedChoices:function(){this.updateChoices(this.options.selector(this));},setOptions:function(options){this.options=Object.extend({choices:10,partialSearch:true,partialChars:2,ignoreCase:true,fullSearch:false,selector:function(instance){var ret=[];var partial=[];var entry=instance.getToken();var count=0;for(var i=0;i<instance.options.array.length&&ret.length<instance.options.choices;i++){var elem=instance.options.array[i];var foundPos=instance.options.ignoreCase?elem.toLowerCase().indexOf(entry.toLowerCase()):elem.indexOf(entry);while(foundPos!=-1){if(foundPos==0&&elem.length!=entry.length){ret.push("<li><strong>"+elem.substr(0,entry.length)+"</strong>"+elem.substr(entry.length)+"</li>");break;}else if(entry.length>=instance.options.partialChars&&instance.options.partialSearch&&foundPos!=-1){if(instance.options.fullSearch||(/\s/).test(elem.substr(foundPos-1,1))){partial.push("<li>"+elem.substr(0,foundPos)+"<strong>"+elem.substr(foundPos,entry.length)+"</strong>"+elem.substr(foundPos+entry.length)+"</li>");break;}}foundPos=instance.options.ignoreCase?elem.toLowerCase().indexOf(entry.toLowerCase(),foundPos+1):elem.indexOf(entry,foundPos+1);}}if(partial.length)ret=ret.concat(partial.slice(0,instance.options.choices-ret.length));return"<ul>"+ret.join('')+"</ul>";}},options||{});}});
