(function($){$.clone=function(myObj){if(typeof(myObj)!="object"||myObj==null){return myObj}var myNewObj={};for(var i in myObj){myNewObj[i]=$.clone(myObj[i])}return myNewObj};$.isAncestor=function(p,c){var p=p.get(0);var c=c.get(0);var parent=c.parentNode;while(parent){if(parent==p){return true}else{if(!parent.tagName||parent.tagName.toUpperCase()=="HTML"){return false}}parent=parent.parentNode}return false};$.validateBox=function(options){this.init(options)};$.validateBox.prototype={doQuery:function(value){this.cmbBox.loadIndicator(true);var $this=this;var ajaxObj={type:"GET",url:$this.cmbBox.storeUrlValidate,dataType:"json",cache:false,success:function(a){$this.store=a;$this.onLoad()},error:function(){$this.onLoad()},data:{}};ajaxObj.data[$this.cmbBox.optsStore.urlValidate.queryText]=$this.cmbBox.getRawValue();this.cmbBox.ajaxValidationCall=$.ajax(ajaxObj)},onLoad:function(){this.cmbBox.ajaxValidationCall=null;if(this.getCount()==1){var cmbBoxValue=this.cmbBox.getRawValue();this.cmbBox.setValue({text:this.store.results[0].label,value:this.store.results[0].value,source:"0"});this.cmbBox.largeWrapper.highlight();this.cmbBox.renderUndoLabel(cmbBoxValue)}else{if(this.getCount()>1){this.renderList();this.expand()}else{this.onEmptyResults()}}this.cmbBox.loadIndicator(false);this.cmbBox.stillValidatingMsg.fadeOut()},onEmptyResults:function(){this.collapse();this.cmbBox.markInvalid()},isExpanded:function(){return(this.addrBox.css("display")!="none")},expand:function(){if(this.isExpanded()){return}this.cmbBox.collapse();this.addrBox.show();var $this=this},collapseIf:function(e,$this){if(!$.isAncestor($this.addrBox,$(e.target))){$this.onEmptyResults()}},collapse:function(){if(!this.isExpanded()){return}this.addrBox.hide();var $this=this;$(document).unbind("mousedown")},getCount:function(){return this.store.length},renderList:function(){if(this.getCount()>0){var s=this.store;var inputBox=this.el;var li="";for(var item in s){if(item!="length"){$.each(s[item],function(i,j){li+="<li value='"+j.value+'\'><input type="radio" name="'+inputBox.attr("id")+'Radiogroup" id="'+inputBox.attr("id")+"Radio-"+j.value+'"/><label for="'+inputBox.attr("id")+"Radio-"+j.value+'">'+j.label+"</label></li>"})}}li+='<li none=\'true\'><input type="radio" name="'+inputBox.attr("id")+'Radiogroup" id="'+inputBox.attr("id")+'Radio-NONE"/><label for="'+inputBox.attr("id")+'Radio-NONE">None of above</label></li>';this.list.html(li);this.initListEvents()}},initListEvents:function(){this.listItems=this.list.find("li");var $this=this;this.listItems.hover(function(){$(this).addClass("hover");$(this).find("label").addClass("hover")},function(){$(this).removeClass("hover");$(this).find("label").removeClass("hover")}).click(function(){$this.onViewClick()})},doQuote:function(){},onViewClick:function(){var li=this.list.find("li.hover:first");var $this=this;if($(li).text()){if($(li).attr("none")=="true"){this.onEmptyResults();$.ajax({type:"GET",url:$this.storeUrlSelect,dataType:"text",cache:false,success:function(){},error:function(){},data:{id:-1}})}else{this.cmbBox.setValue({value:(typeof($(li).attr("value"))=="undefined"?"0":$(li).attr("value")),text:$(li).text(),source:"0"})}}},init:function(opts){var $this=this;this.cmbBox=opts.cmbBox;this.addrBox=this.cmbBox.componentWrapper.find("div.cmbAddrBox:last");this.list=this.addrBox.find("ul");this.el=this.cmbBox.el;this.hiddenField=this.cmbBox.hiddenField;this.store={};this.source=this.cmbBox.source}};$.cmbBox=function(options){var options=options||{};var inputBox=$(options.el);inputBox.attr("autocomplete","off");if(options.wrap==true){inputBox.wrap("<div class='cmbWrapper' id='"+inputBox.attr("id")+"cmbWrapper'><div class='cmbInputWrapper'></div></div>").after("<div 	class='cmbArrow' >&nbsp;</div>").addClass("cmbInputBox").parent().after("<div class = 'cmbAddrBox'><div class = 'cmbAddrExplanation'>Select one from a list of found addresses:</div><ul class='cmbAddr'></ul><div class='cmbCloseAddrBox'>close <strong>X</strong>&nbsp;</div></div><div class='cmbSuggestionBox'><div class='cmbHistoryBaloon'>History<br>list</div><ul class='cmbSuggestions'></ul></div>")}var wrapper=(inputBox.parent());this.init({wrapper:wrapper,inputBox:inputBox,historyData:options.historyData,corners:options.corners,store:options.store,emptyText:options.emptyText||"Enter address",source:options.source||null,airportBox:options.airportBox||null})};$.cmbBox.prototype={validate:function(){this.validateBox.doQuery(this.getRawValue())},isValid:function(){},clearInvalid:function(){this.el.removeClass("addrNotFound")},markInvalid:function(){this.el.addClass("addrNotFound")},clearValid:function(){this.el.removeClass("addrFound")},markValid:function(){this.el.addClass("addrFound")},collapseIf:function(e,$this){if(!$.isAncestor($this.componentWrapper,$(e.target))){$this.collapse()}},getEl:function(){return this.el},getStillValidatingMsg:function(){return this.stillValidatingMsg},collapse:function(){if(!this.isExpanded()){return}this.wrapper.hide();this.list.find("li.hover").removeClass("hover");$(document).unbind("mousedown")},isExpanded:function(){return(this.wrapper.css("display")!="none")},getEmptyText:function(){return this.emptyText},getIsAirport:function(){return this.isAirport},toggleExpand:function(){if(this.isExpanded()){this.collapse()}else{this.expand()}},expand:function(){if(this.isExpanded()||this.getCount()<1||!this.hasFocus){return}this.wrapper.show();this.select(++this.selectedIndex);var $this=this;$(document).mousedown(function(e){$this.collapseIf(e,$this)})},init:function(opts){var $this=this;this.componentWrapper=opts.wrapper;this.largeWrapper=opts.wrapper.parent();this.arrow=opts.wrapper.find(".cmbArrow").eq(0);this.cmbInputWrapper=opts.wrapper.find(".cmbInputWrapper");this.stillValidatingMsg=opts.wrapper.find(".cmbStillValidating");this.el=opts.inputBox;this.list=opts.wrapper.find("ul.cmbSuggestions").eq(0);this.wrapper=opts.wrapper.find(".cmbSuggestionBox").eq(0);this.emptyText=opts.emptyText||"Enter text";this.hiddenField=$("<input name='"+this.el.attr("name")+"Value' style='display:none' type='hidden'/>").insertAfter(this.el);this.selectedIndex=-1;this.source=opts.source||null;this.optsStore=opts.store;this.helpLabel=opts.wrapper.find(".helpLabel");this.helpLabelText=this.helpLabel.text();this.isAirport=false;this.airportBox=opts.airportBox||null;this.timeOut=100;this.validateBox=new $.validateBox({cmbBox:this});if(this.optsStore.mode=="remote"){this.mode="remote";this.store={};this.storeUrlValidate=this.optsStore.urlValidate.url;this.storeUrlAddresses=this.optsStore.urlAddresses.url;this.storeUrlSelect=this.optsStore.urlSelect.url}else{if(this.optsStore.mode=="local"){this.mode="local";this.store=opts.store.data}else{throw ("Fatal error initializing store!!!")}}if(!this.el.val().length||this.el.val()==this.emptyText){this.applyEmptyText()}this.initEvents()},applyEmptyText:function(){this.el.val(this.emptyText).addClass("defaultText");this.clearInvalid();this.clearValid();this.hiddenField.attr("value","")},initEvents:function(){var $this=this;this.el.focus(function(){if($this.getRawValue()==""){$this.setValue({text:"",value:"",source:""})}if($this.ajaxSuggestCall){$this.ajaxSuggestCall.abort()}$this.hasFocus=true;$this.loadIndicator(false);$this.validateBox.collapse();$(this).removeClass("defaultText")}).blur(function(e){$this.onBlur()}).keydown(function(e){switch(e.keyCode){case 9:break;case 27:$this.collapse();break;case 38:$this.selectPrev();break;case 40:if(!$this.isExpanded()){$this.onTriggerClick()}else{$this.selectNext()}break;case 13:$this.onViewClick();e.preventDefault();break}}).keyup(function(e){switch(e.keyCode){case 9:case 16:case 27:case 38:case 39:case 37:case 40:case 13:break;default:if($this.getRawValue()!=""){if($this.airportBox){$this.airportBox.collapse();if($this.airportBox.infoLabel.css("display")!="none"){$this.airportBox.clearInfoLabel()}}$this.isAirport=false;$this.clearUndoLabel();$this.clearValue();if($this.ajaxSuggestCall){$this.ajaxSuggestCall.abort()}setTimeout(function(){$this.doQuery($this.getRawValue())},$this.timeOut)}else{$this.collapse()}break}});this.arrow.click(function(e){e.preventDefault();$this.el.focus();$this.onTriggerClick();return false})},initListEvents:function(){this.listItems=this.list.find("li:not('.category')");var $this=this;this.listItems.hover(function(){$this.listItems.filter(".hover").removeClass("hover");$(this).addClass("hover")},function(){}).mousedown(function(e){$this.mouseDown=true}).click(function(){if(!$(this).hasClass("editHistory")){$this.onViewClick()}})},renderList:function(params){if(this.getCount()>0){var store=this.store;var li="";for(var key in store){if(key!="length"&&(this.mode=="remote"?store[key].length>0:true)){li+="<LI class='category'>"+key+"</LI>";$.each(store[key],function(i,j){li+="<LI value="+j.value+">"+j.label+"</LI>"})}}if(typeof params=="object"&&params.historyAddresses==true){li+="<LI class='editHistory'><a href = 'userAddress.do'>Edit history addresses...</a></LI>"}this.list.html(li);this.selectedIndex=-1;this.initListEvents()}},renderUndoLabel:function(cmbBoxValue){if(typeof cmbBoxValue=="undefined"){throw"fatal error rendering undo Label.";return}var $this=this;this.undoHandlerSelector=this.el.attr("id")+"UndoHandler";var html="<span style='color:#55bb55'>Address validated.</span>If address is not correct,<a href='#' id='"+this.undoHandlerSelector+"'>click here.</a>";this.helpLabel.html(html);$("#"+this.undoHandlerSelector).click(function(){$this.el.val(cmbBoxValue);$this.clearUndoLabel();$this.validateBox.onEmptyResults();if($this.airportBox){$this.airportBox.clearInfoLabel()}$this.isAirport=false;$.ajax({type:"GET",url:$this.storeUrlSelect,dataType:"text",cache:false,success:function(){},error:function(){},data:{id:-1}})})},clearUndoLabel:function(){if(this.undoHandlerSelector){$("#"+this.undoHandlerSelector).unbind();this.undoHandlerSelector=false;this.helpLabel.html(this.helpLabelText)}},getCount:function(){return this.store.length},setValue:function(params){this.el.removeClass("defaultText").val(params.text);if(params.text!=""&&!isNaN(parseInt(params.value))){this.markValid();this.hiddenField.attr("value",params.value);this.onValueSet(params.source)}},clearValue:function(){this.hiddenField.attr("value","");this.clearInvalid();this.clearValid()},getValue:function(){var value=this.hiddenField.attr("value");return((isNaN(parseInt(value))||typeof value=="undefined"||value===null)?"":value)},getRawValue:function(){var v=this.el.val();if(v===this.emptyText){v=""}return v},doQuery:function(value){var filteredRows=0;if(this.mode=="local"){if(typeof this.snapshot!="object"){this.snapshot=$.clone(this.store)}this.store=$.clone(this.snapshot);var store=this.store;for(var key in store){var found=false;if(key!="length"){$.each(store[key],function(i,j){var position=j.label.toLowerCase().indexOf(value.toLowerCase(),0);if(position>-1){filteredRows++;found=true}else{delete store[key][i]}});if(!found){delete store[key]}}}this.store.length=filteredRows;this.onLoad()}else{if(this.mode=="remote"){this.storeLoad({value:value,loadIndicator:true})}}},storeLoad:function(options){if(typeof options.loadIndicator=="undefined"){options.loadIndicator=true}if(options.loadIndicator){this.loadIndicator(true)}var $this=this;var ajaxObj={type:"GET",url:$this.storeUrlAddresses,dataType:"json",cache:false,success:function(a){$this.store=a;$this.onLoad()},error:function(){$this.onLoadError()},data:{}};ajaxObj.data[$this.optsStore.urlAddresses.queryText]=options.value;this.ajaxSuggestCall=$.ajax(ajaxObj)},loadIndicator:function(flag){if(flag){this.el.addClass("loading")}else{this.el.removeClass("loading")}},onViewClick:function(){var li=this.list.find("li.hover:first");if($(li).text()){this.setValue({text:$(li).text(),value:(typeof($(li).attr("value"))=="undefined"?"0":$(li).attr("value")),source:"1"});this.el.focus()}},onBlur:function(){if(this.mouseDown){this.mouseDown=false;return}this.mouseDown=false;this.hasFocus=false;this.collapse();this.loadIndicator(false);if(this.ajaxSuggestCall){this.ajaxSuggestCall.abort()}if(isNaN(parseInt(this.getValue()))&&this.getRawValue()!=""){this.validate()}else{if(this.getRawValue()==""){this.applyEmptyText()}}},onTriggerClick:function(){if(!this.isExpanded()){this.loadIndicator(true);var $this=this;var ajaxObj={type:"GET",url:$this.storeUrlAddresses,dataType:"json",cache:false,success:function(a){$this.store=a;$this.onLoad({historyAddresses:true})},error:function(){$this.onLoadError()},data:{query:""}};$.ajax(ajaxObj)}else{this.collapse()}},onLoad:function(params){this.selectedIndex=-1;this.loadIndicator(false);this.ajaxSuggestCall=null;this.collapse();if(this.getCount()>0){this.renderList(params);this.expand()}else{this.onEmptyResults()}},onLoadError:function(){this.loadIndicator(false);this.markInvalid()},onEmptyResults:function(){this.collapse()},onValueSet:function(source){var $this=this;var ajaxObj={type:"GET",url:$this.storeUrlSelect+"?source="+source,dataType:"text",cache:false,success:function(s){$this.collapse();$this.validateBox.collapse();var results=eval("("+s+")");if(results.category=="AIRPORT"){$this.isAirport=true}else{$this.isAirport=false}if($this.airportBox&&results.category=="AIRPORT"&&$.cmbBox.prototype.displayFlightDetails){$this.airportBox.clearFields();$this.airportBox.render()}},error:function(){},data:{}};ajaxObj.data[$this.optsStore.urlSelect.queryText]=this.getValue();$.ajax(ajaxObj);this.clearInvalid();this.markValid();this.collapse();this.validateBox.collapse()},select:function(index){this.selectedIndex=index;this.listItems.removeClass("hover").eq(index).addClass("hover")},selectNext:function(){var ct=this.getCount();if(ct>0){if(this.selectedIndex==-1){this.select(0)}else{if(this.selectedIndex<ct-1){this.select(++this.selectedIndex)}}}},selectPrev:function(){var ct=this.getCount();if(ct>0){if(this.selectedIndex==-1){this.select(0)}else{if(this.selectedIndex!=0){this.select(--this.selectedIndex)}}}}}})(jQuery);