var ncSearchForm=Class.create();ncSearchForm.prototype={initialize:function(query)
{this.options=Object.extend({apiKey:false,cseIdentifier:false,searchForm:undefined,searchLabel:'Search…',resultsContainer:undefined,waitingContainer:undefined,paging:true,count:10,collapse:false,resultsTemplate:'<li#{first}><a href="#{link}"#{onclick}><span class="heading">#{htmlTitle}</span><span class="url">#{link}</span><span class="summary">#{htmlSnippet}</span></a></li>'},arguments[1]||{});this.searchForm=$(this.options.searchForm);if(!this.searchForm){return;}
this.searchField=this.searchForm.down('input.search');this.searchField.writeAttribute('autocomplete','off');this.searchField.observe('focus',this.focus.bindAsEventListener(this));this.searchField.observe('blur',this.blur.bindAsEventListener(this));this.searchField.observe('keydown',this.keyDown.bindAsEventListener(this));this.searchForm.observe('submit',this.submit.bindAsEventListener(this));this.resultsContainer=$(this.options.resultsContainer);this.resultsList=this.resultsContainer.down('ol');this.waitingContainer=$(this.options.waitingContainer);this.searchCache=$H();if(query){this.searchField.setValue(query);this.search();}else{this.searchField.setValue(this.options.searchLabel);}
if(this.searchField.getValue()==this.options.searchLabel){this.searchField.addClassName('placeholder');}},keyDown:function(e)
{if(this.observer)
clearTimeout(this.observer);switch(e.keyCode){case Event.KEY_ESC:this.searchField.value='';this.close();break;case Event.KEY_RETURN:this.submit();e.stop();break;case Event.KEY_UP:this.prev();e.stop();break;case Event.KEY_DOWN:this.next();e.stop();break;default:this.observer=setTimeout(this.search.bind(this),1000);break;}},search:function()
{if(this.searchEmpty()){this.close();}else{if(!this.resultsContainer.visible()){this.showSearch();}else{this.performSearch();}}},showSearch:function()
{new Effect.BlindDown(this.resultsContainer,{duration:0.2,afterFinish:function(){this.performSearch();}.bind(this)});},performSearch:function(startIndex)
{if(this.searchEmpty()){return;}
if(!startIndex){startIndex=1;}
var value=this.searchField.getValue();if(this.currentValue==value&&startIndex<=this.currentIndex){return;}
this.currentValue=value;var searchCache=this.searchCache.get(this.currentValue+'.startIndex.'+startIndex);if(searchCache){this.populateSearch(searchCache);return;}
var cache={items:[],start:startIndex,count:0,total:0};new Ajax.JSONRequest('https://www.googleapis.com/customsearch/v1',{callbackParamName:'callback',parameters:{key:this.options.apiKey,cx:this.options.cseIdentifier,q:this.currentValue,num:this.options.count,start:startIndex},onSuccess:function(response){if(response.status===200){cache={items:response.responseJSON.items,start:parseInt(response.responseJSON.queries.request[0].startIndex),count:parseInt(response.responseJSON.queries.request[0].count),total:parseInt(response.responseJSON.queries.request[0].totalResults)}
this.currentIndex=startIndex+cache.count-1;this.searchCache.set(this.currentValue+'.startIndex.'+startIndex,cache);this.populateSearch(cache);}else{this.searchCache.set(this.currentValue+'.startIndex.'+startIndex,cache);this.populateSearch(cache);}}.bind(this),onFailure:function(response){this.searchCache.set(this.currentValue+'.startIndex.'+startIndex,cache);this.populateSearch(cache);}.bind(this)});},populateSearch:function(response)
{var more=this.resultsList.select('li.more');if(more.size()){more.invoke('remove');}
var results=new Array();if(response.items.length>0){if(response.items.length>this.options.count){response.items.length=this.options.count;}
var first=true;var resultsTemplate=new Template(this.options.resultsTemplate);response.items.each(function(result){result.first='';if(first&&response.start==1){result.first=' class="first"';first=false;}
result.onclick='';if(result.link.match(/\.pdf$/)){result.onclick=' onclick="window.open(this.href); return false;"';}
results.push(resultsTemplate.evaluate(result));});}else{results.push('<li class="first error">No results matched your query.</li>');}
if(this.options.paging&&response.total>(response.start+response.count-1)){results.push('<li class="more"><a class="clearfix" href="#show-more" rel="'+(response.start+response.count)+'"><span>Displaying first '+(response.start+response.count-1)+' results — click to show more results…</span><img src="'+_nc.baseUrl+'images/wait.gif" /></a></li>');}
if(response.start==1){this.resultsList.update(results.join(''));}else{this.resultsList.insert(results.join(''));}
more=this.resultsList.down('li.more');if(more){wait=more.down('img').setOpacity(0);more.down('a').observe('click',function(event){event.stop();more.down('a').stopObserving();more.down('a span').hide();new Effect.Opacity(wait,{to:1,duration:0.4});this.performSearch(response.start+response.count);}.bind(this));}
if(!this.resultsList.visible()){new Effect.BlindDown(this.resultsList,{duration:0.2});}
this.waitingContainer.absolutize();this.waitingContainer.hide();},focus:function(e)
{if(this.searchField.hasClassName('placeholder')){this.searchField.value='';this.searchField.removeClassName('placeholder');}else if(this.searchField.value!=''){this.search();}},blur:function(e)
{if(this.searchEmpty()){this.searchField.value='Search for it here…';this.searchField.addClassName('placeholder');}
this.closer=setTimeout(this.close.bind(this),400);},next:function()
{if(selected=this.resultsContainer.down('li.selected')){if(next=selected.next()){next.addClassName('selected');selected.removeClassName('selected');}}else{next=this.resultsContainer.down('li');if(!next.hasClassName('error')){next.addClassName('selected');}}},prev:function()
{if(selected=this.resultsContainer.down('li.selected')){selected.removeClassName('selected');if(previous=selected.previous()){previous.addClassName('selected');}}else{previous=this.resultsContainer.down('li');if(!previous.hasClassName('error')){previous.addClassName('selected');}}},close:function()
{if(!this.options.collapse){return;}
new Effect.BlindUp(this.resultsContainer,{duration:0.2,afterFinish:this.resetList.bind(this)});},submit:function()
{clearTimeout(this.closer);if(selected=this.resultsContainer.down('li.selected')){var href=selected.down('a').href;if(href.match(/^http:\/\/ncpic\.org\.au/)&&!href.match(/\.pdf$/)){window.location.href=href;}else{window.open(href);}}else{if(this.searchField.getValue()!=this.options.searchLabel&&!this.searchEmpty()){this.searchForm.submit();}}},resetList:function()
{if(this.currentValue!=this.searchField.getValue()){this.resultsList.update('');this.resultsList.hide();this.waitingContainer.relativize();this.waitingContainer.show();}},searchEmpty:function()
{if(this.searchField.getValue().strip()=='')
return true;return false;}};
