function quickSearch(formElement,queryElement,resultsElement,searchUrl){this.formElement=document.getElementById(formElement);this.queryElement=document.getElementById(queryElement);this.resultsElement=document.getElementById(resultsElement);this.searchUrl=searchUrl;this.highlight=0;this.total=0;this.lastQuery='';this.queryElement.setAttribute('autocomplete','off');ccms.event.attach(this.queryElement,"keydown",this.keyWatch,this,true);ccms.event.attach(this.queryElement,"keyup",this.doSearch,this,true);ccms.event.attach(this.queryElement,"onchange",this.doSearch,this,true);}
quickSearch.prototype.keyWatch=function(event){switch(event.keyCode){case 13:if(this.highlight>0&&document.getElementById('searchResultUri'+this.highlight)){window.location=document.getElementById('searchResultUri'+this.highlight).getAttribute('href');return ccms.event.killEvent(event);}
break;}}
quickSearch.prototype.doSearch=function(event){var query=this.queryElement.value;switch(event.keyCode){case 32:return false;break;case 40:case 38:if(current=document.getElementById('searchResult'+this.highlight)){current.className='item '+(this.highlight%2==1?'row2':'row1');}
switch(event.keyCode){case 40:this.highlight=(this.highlight<this.total)?this.highlight+1:0;break;case 38:this.highlight=(this.highlight>0)?this.highlight-1:this.total;break;}
if(highlight=document.getElementById('searchResult'+this.highlight)){highlight.className='item highlight';}
return ccms.event.killEvent(event);break;case 27:this.reset();return ccms.event.killEvent(event);break;}
if(query.length>2){if(query!=this.lastQuery){this.lastQuery=query;ccms.async.http({method:'GET',url:this.searchUrl+'?query='+encodeURIComponent(query),onSuccess:this.processResults,self:this});}}
else{this.updateResults('');}}
quickSearch.prototype.updateResults=function(theHTML){if(theHTML==''){this.resultsElement.style.display='none';}
else{this.resultsElement.style.display='block';}
this.resultsElement.innerHTML=theHTML;}
quickSearch.prototype.reset=function(){this.updateResults('');this.lastQuery='';this.highlight=0;this.queryElement.value='';}
quickSearch.prototype.processResults=function(req){var groups=req.responseXML.getElementsByTagName("group");var items=req.responseXML.getElementsByTagName("item");var theHTML='';if(groups.length){theHTML+=this.self.renderGroups(groups);}
else{theHTML+=this.self.renderItems(items);}
if(theHTML!=''){theHTML+='<p class="controls">[Esc] Close, [Up/Dn] Move, [Enter] Submit</p>';}
else{theHTML+='<div class="items"><p class="sorry"><em>Sorry, no results match your query - perhaps try some different keywords?</em></p></div>';}
this.self.updateResults(theHTML);}
quickSearch.prototype.renderGroups=function(groups){var theHTML='';if(groups.length>0){for(var i=0;i<groups.length;i++){var group=groups[i];items=group.getElementsByTagName("item");theHTML+='<div class="group group-'+group.getAttribute('label')+'"><h2 class="heading">'+group.getAttribute('label')+'</h2>';theHTML+='<div class="items '+group.getAttribute('label').toLowerCase()+'">'+this.renderItems(items)+'</div>';theHTML+='<div class="info">';if(group.getAttribute('total')>0){if(group.getAttribute('uri')){var pages=Math.ceil(group.getAttribute('total')/18);theHTML+='<ul class="paginate">';for(x=1;x<=pages&&x<4;x++){theHTML+='<li><a'+(x==1?' class="active"':'')+' href="'+group.getAttribute('uri')+'&page='+x+'">'+x+'</a></li>';}
if(pages>1){theHTML+='<li><a href="'+group.getAttribute('uri')+'&page=2">Next &raquo;</a></li>';}
theHTML+='</ul>';}
theHTML+='<p class="count"><strong>Showing</strong> 1 to '+items.length+' of '+group.getAttribute('total')+'</p>';if(group.getAttribute('uri')){theHTML+='<p class="show-all"><a href="'+group.getAttribute('uri')+'">Show All '+group.getAttribute('label')+'</a></p>';}}
theHTML+='</div>';theHTML+='</div>';}}
return theHTML;}
quickSearch.prototype.renderItems=function(items){this.total=items.length;var theHTML='';if(items.length>0){for(var i=0;i<items.length;i++){var item=items[i];url=item.getElementsByTagName('url')[0];rowClass=this.highlight==(i+1)?'highlight':((i+1)%2==1?'row2':'row1');theHTML+='<div id="searchResult'+(i+1)+'" class="item '+rowClass+'">\n';if(desc=item.getElementsByTagName('description')[0]){if(icon=item.getElementsByTagName('icon')[0]){theHTML+='<div class="left"><a href="'+url.firstChild.data+'"><img class="framed" src="'+icon.firstChild.data+'" width="'+icon.getAttribute('width')+'" height="'+icon.getAttribute('height')+'" alt="" /></a></div>\n';}
if(title=item.getElementsByTagName('title')[0]){theHTML+='<h2 class="item-heading"><a id="searchResultUri'+(i+1)+'" href="'+url.firstChild.data+'">'+title.firstChild.data+'</a></h2>\n';}
theHTML+='<p><strong>'+desc.firstChild.data+'</strong></p>\n';}
else{if(icon=item.getElementsByTagName('icon')[0]){theHTML+='<a href="'+url.firstChild.data+'"><img class="framed" src="'+icon.firstChild.data+'" width="'+icon.getAttribute('width')+'" height="'+icon.getAttribute('height')+'" alt="" /></a><br />\n';}
if(title=item.getElementsByTagName('title')[0]){theHTML+='<a id="searchResultUri'+(i+1)+'" href="'+url.firstChild.data+'">'+title.firstChild.data+'</a>\n';}}
theHTML+='<div class="clear"></div>\n';theHTML+='</div>\n';}
theHTML='<div class="items">'+theHTML+'</div>';}
return theHTML;}