/**
 * Pod1 Factfinder extension
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Open Software License (OSL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/osl-3.0.php
 *
 *
 * @category   Pod1
 * @package    Pod1_Factfinder
 * @copyright  Copyright (c) 2010 Pod1 (http://www.pod1.com)
 * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */

FactFinder=Class.create();FactFinder.prototype={initialize:function(){this.storage={};this.callbacks={};},destroy:function(){this.storage={};this.callback={};},register:function(key,value){this.storage[key]=value;},registry:function(key){return this.storage[key];},unregister:function(key){delete this.storage[key];},isRegistered:function(){return(typeof(this.storage[key])!=='undefined');},addCallback:function(context,object,method,params){if(typeof(this.callbacks[context])=='undefined'){this.callbacks[context]=[];}
var ffEvent={};ffEvent.object=object;ffEvent.method=method;ffEvent.params=params;this.callbacks[context].push(ffEvent);},_dispatchEvent:function(event,params){if(typeof(this.callbacks[event])!='undefined'){for(var i=0;i<this.callbacks[event].length;i++){var callback=this.callbacks[event][i];if(callback.object&&callback.method&&typeof(callback.object[callback.method])!='undefined'){var rParams=Object.extend(params||{},callback.params||{});callback.object[callback.method](rParams);}}}}}
FactFinder.Navigation=Class.create(FactFinder,{initialize:function($super,config,url,seoUrl,params,constants,submit){$super();this.config=Object.extend({nContainer:'#fact-finder',lContainer:'#fact-finder-list',items:'#fact-finder .filter',clear:'.fact-finder-clear',form:'.fact-finder-form',priceSlider:'price-slider',noResults:'<p>There were no results matching your search.</p><p>Please <a href="#{clearUrl}" class="noresults-clearall" rel="all">clear your filters</a> to search again.</p>'},config||{});this.nContainer=$$(this.config.nContainer)[0];this.lContainer=$$(this.config.lContainer)[0];this.url=url;this.seoUrl=seoUrl;this.submit=submit;this.loadEvent='factfinder:load';this.isLoading=false;this.priceSlider=null;this.loader=new Element('p');this.loader.addClassName('factfinder-loader').update('Loading...').hide();var message=new Template(this.config.noResults);this.noResults=new Element('div');this.noResults.addClassName('fact-finder-noresults').update(message.evaluate({clearUrl:this.getClearAllUrl()}));delete message;if(this.lContainer){this.lContainer.insert({before:this.loader});}
this.queryParams=params||{};this.constants=constants||{};this.init();},init:function(){factfinder.register('navigation',this);$$(this.config.items).each(this.addFilterItem.bind(this));$$(this.config.clear).each(this.addFilterClear.bind(this,false));$$(this.config.form).each(this.addFormSubmit.bind(this));if(this.getPriceSlider()){this.getPriceSlider().bindNavigation(this);}
if(this.noResults){this.noResults.select('a').each(this.addFilterClear.bind(this,true));}},destroy:function(){factfinder.unregister('navigation');$$(this.config.items).each(this.removeFilterItem.bind(this));$$(this.config.clear).each(this.removeFilterClear.bind(this,false));$$(this.config.form).each(this.removeFormSubmit.bind(this));if(this.getPriceSlider()){this.resetPriceSlider();}
if(this.noResults){this.noResults.select('a').each(this.removeFilterClear.bind(this,true));}},sortIt:function(data){var sorted={};var keys=Object.keys(data).sort();for(var i=0;i<keys.length;i++){sorted[keys[i]]=data[keys[i]];}
delete data;delete keys;return sorted;},getQueryParams:function(){for(var prop in this.constants){if(!this.queryParams[prop]){this.queryParams[prop]=this.constants[prop];}}
this.queryParams=this.sortIt(this.queryParams);return this.queryParams;},getPriceSlider:function(){if(!this.priceSlider){this.priceSlider=factfinder.registry(this.config.priceSlider);}
return this.priceSlider;},resetPriceSlider:function(){if(this.priceSlider){this.priceSlider.destroy();this.priceSlider=null;}},setConstant:function(param,value){this.constants[param]=value;},evalWindowLoadScripts:function(content){this.removeLoadObservers();var scripts=content.extractScripts();if(scripts){for(var i=0;i<scripts.length;i++){var script=scripts[i];var replace=script.gsub(/Event\.observe[\s\n\r]*\([\s\n\r]*window,[\s\n\r]*\'load\'/,"Event.observe(document, '%s'".replace('%s',this.loadEvent));replace=replace.gsub(/document\.observe[\s\n\r]*\([\s\n\r]*\'dom:loaded\',[\s\n\r]/,"Event.observe(document, '%s',".replace('%s',this.loadEvent));content=content.replace(script,replace);}}
return content;},removeLoadObservers:function(){Event.stopObserving(document,this.loadEvent);return this;},evalTransport:function(transport){try{response=eval('('+transport.responseText+')')}catch(e){response={}}
return response;},addFilterItem:function(item){if(!item.hasClassName('static')){Event.observe(item,'click',this.filter.bindAsEventListener(this));}},removeFilterItem:function(item){Event.stopObserving(item,'click');},addFilterClear:function(allOnly,clear){if(!allOnly||clear.rel=='all'){Event.observe(clear,'click',this.clear.bindAsEventListener(this));}},removeFilterClear:function(allOnly,clear){if(!allOnly||clear.rel=='all'){Event.stopObserving(clear,'click');}},getClearAllUrl:function()
{var url='#';var items=$$(this.config.clear);for(var i=0;i<items.length;i++){if(items[i].rel=='all'){url=items[i].href;}}
return url;},toggleClearAll:function(display){$$(this.config.clear).each(function(item){if(item.rel=='all'){if(display){item.show();}else{item.hide();}}});},addFormSubmit:function(form){Event.observe(form,'submit',this.fSubmit.bindAsEventListener(this));},removeFormSubmit:function(form){Event.stopObserving(form,'submit');},showLoader:function(){if(this.loader){this.loader.show();}},hideLoader:function(){if(this.loader){this.loader.hide();}},_query:function(){if(true==this.isLoading){return false;}
this.isLoading=true;var request=new Ajax.Request(this.url,{method:'get',parameters:this.getQueryParams(),onCreate:this.showLoader.bindAsEventListener(this),onSuccess:this.hideLoader.bindAsEventListener(this),onComplete:this.update.bindAsEventListener(this)});this.nContainer.setStyle({opacity:0.5});this.lContainer.setStyle({opacity:0.5});},toggleFilterItem:function(item){if(item){item.toggleClassName('selected');var input=item.previous('input');if(input){input.checked=(true==input.checked)?false:true;if(true===this.submit){delete this.queryParams[input.name.replace('[]','')];}}}},filter:function(event){event.stop();if(true==this.isLoading){return false;}
var element=Event.findElement(event,'a');this.queryParams=element.href.toQueryParams();this.toggleFilterItem(element);if(true!==this.submit){this._query();}},clear:function(event){event.stop();var element=Event.findElement(event,'a');var rel=element.rel;if(rel){if(rel=='all'){this.queryParams=element.href.toQueryParams();this.queryParams.q='*';}else{this.queryParams=element.href.toQueryParams();}
this._query();}},fSubmit:function(event){event.stop();var form=Event.findElement(event,'form');var query=Form.serialize(form);this.queryParams=Object.extend(this.queryParams,query.toQueryParams());this._query();},pSubmit:function(params){this.queryParams['filterprice']=escape(params.values.join(' - '));if(true!==this.submit){this._query();}},update:function(transport){var response=this.evalTransport(transport);this.isLoading=false;this._beforeLoad();if(response.count>0){var nContent=this.evalWindowLoadScripts(response.navigation).gsub(this.url,this.seoUrl);}else{var nContent=this.noResults;response.showClearAll=true;}
var lContent=this.evalWindowLoadScripts(response.listing).gsub(this.url,this.seoUrl);this.nContainer.update(nContent).setStyle({opacity:1});this.lContainer.update(lContent).setStyle({opacity:1});this.toggleClearAll(response.showClearAll);this._afterLoad();},_beforeLoad:function(){this.destroy();this._dispatchEvent('loadBefore');},_afterLoad:function(){Event.fire(this.nContainer,this.loadEvent,null,false);Event.fire(this.lContainer,this.loadEvent,null,false);this._dispatchEvent('loadAfter');this.init();}});FactFinder.PriceSlider=Class.create(FactFinder,{initialize:function($super,container,params,config){$super();this.config=Object.extend({slideMin:'slide-min',slideMax:'slide-max',slideTrack:'slide-track',labelMin:'label-min',labelMax:'label-max',labelTemplate:null,axis:'horizontal',navigation:'navigation'},config||{});this.params=Object.extend({min:0,max:100,currentMin:0,currentMax:100},params||{});var position={position:'absolute'}
this.container=$(container).setStyle(position);this.slideMin=$(this.config.slideMin).setStyle(position);this.slideMax=$(this.config.slideMax).setStyle(position);this.slideTrack=$(this.config.slideTrack).setStyle(position);this.labelMin=$(this.config.labelMin).setStyle(position);this.labelMax=$(this.config.labelMax).setStyle(position);this.navigation=null;if(!this.config.labelTemplate){this.config.labelTemplate=new Template('#{count}');}
this.initSlider();},destroy:function($super){$super();if(this.slider){this.slider.dispose();this.slider=null;}
factfinder.unregister('price-slider');},initSlider:function(){var handles=[this.config.slideMin,this.config.slideMax];this.slider=new Control.Slider(handles,this.container,{axis:this.config.axis,range:$R(this.params.min,this.params.max),restricted:true,sliderValue:[this.params.currentMin,this.params.currentMax],spans:[this.config.slideTrack],onChange:this.updateFilter.bind(this),onSlide:this.updateLabels.bind(this)});this.updateLabels([this.params.currentMin,this.params.currentMax]);if(this.getNavigation()){this.bindNavigation(this.getNavigation());}
factfinder.register('price-slider',this);},getNavigation:function(){if(!this.navigation){this.navigation=factfinder.registry(this.config.navigation);}
return this.navigation;},bindNavigation:function(navigation){this.addCallback('updateFilter',navigation,'pSubmit');},getHandlePositions:function(values){var minOffset=this.slideMin.positionedOffset();var maxOffset=this.slideMax.positionedOffset();return{min:minOffset,max:maxOffset}},updateLabels:function(values){var pos=this.getHandlePositions(values);if(this.labelMin){var style={}
if('horizontal'==this.config.axis)style.left=pos.min.left+'px';else style.top=pos.min.top+'px';this.labelMin.setStyle(style).update(this.config.labelTemplate.evaluate({count:values[0].toFixed(0)}));}
if(this.labelMax){var style={}
if('horizontal'==this.config.axis)style.left=pos.max.left+'px';else style.top=pos.max.top+'px';this.labelMax.setStyle(style).update(this.config.labelTemplate.evaluate({count:values[1].toFixed(0)}));}},updateFilter:function(values){var clean=[values[0].toFixed(0),values[1].toFixed(0)];this._dispatchEvent('updateFilter',{values:clean});}});var factfinder=new FactFinder();

