
 var iAsearchTool = {
	 init : function(){
		 if($('search') && !this.initialized){
			 this.insertSearchControl();
		 }
	 },
	 
	 insertSearchControl : function(){
		 if($$('.asearch.secret').length <= 0){
			 return;
		 }
		 this.initialized = true;
		var div = new Element('div', {
			 'id' :'asearch-holder' 
		}).addClassName('asearch');
		this.getSearchInput().up().insert({bottom : div});
		this.setControlBody();
		this.correctControlPosition();
		this.findAndPlaceSecretInstance();
		this.resetScroll();
	 },
	 
	 correctControlPosition : function(){
		 var inputPos = this.getSearchInput().viewportOffset();
		 var holderPos = this.getHolder().viewportOffset();
		 this.getControl().setStyle({
			 left	:	inputPos.left - holderPos.left + 'px',
			 top	:	inputPos.top - holderPos.top + this.getSearchInput().getHeight() + 'px',
			 width	:	this.getSearchInput().getWidth() + 'px'
		 });
	 },
	 
	 setControlBody : function(){
		 var control = new Element('div').addClassName('control');
		 var button = new Element('div').addClassName('toogler');
		 this.toogler = button;
		 button.insert(new Element('div').addClassName('left'));
		 button.insert(new Element('div').addClassName('right'));
		 
		 this.setToogleEvent(button);
		 control.insert(button);
		 this.getHolder().insert(control);
	 },
	 
	 findAndPlaceSecretInstance : function(){
		 var inst = $$('.asearch.secret')[0];
		 this.asearchModel = inst.asearchModel;
		 this.asearchDom = inst;
		 if(this.state === false){
			 this.asearchDom.setStyle({height: 0});
			 this.getToogler().addClassName('rev');
		 }
		 this.asearchDomContent = $$('.asearch.secret .content')[0];
		 this.getControl().insert({top:inst});
		 inst.removeClassName('secret');
	 },
	 
	 setToogleEvent : function(element){
		 element.observe('click', this.toogleControl.bind(this));
	 },
	 
	 getSearchInput : function(){
		 return $('search');
	 },
	 
	 getHolder : function(){
		 return $('asearch-holder');
	 },
	 
	 getControl : function(){
		 return $$('#asearch-holder .control')[0];
	 },
	 
	 getToogler : function(){
		return this.toogler; 
	 },
	 
	 toogleControl : function(ev){
		 if(this.scrollDirection != 0){
			 this.scrollDirection = this.scrollDirection == 1 ? -1 : 1;
		 }else{
			 this.scrollDirection = this.state ? -1 : 1; 
		 }
		 
		 this.scroll(this.scrollDirection);
	 },
	 
	 scroll : function(direction){
		 if(this.scrollDirection != direction ) return;
		 
		 var newHeight = this.asearchDom.offsetHeight
		 		+ this.scrollDirection *this.scrollSpeed * this.scrollDelay;
		 this.scrollSpeed *= this.scrollAcceleration;
		 
		 if(direction == -1 && newHeight < 0){
			 newHeight = '0px';
			 this.state = false;
			 this.resetScroll();
			 this.getToogler().addClassName('rev');
		 }else if(direction == 1 && newHeight > Element.getHeight(this.asearchDomContent)/*this.asearchDomContent.clientHeight*/){
			 newHeight = '';//this.asearchDomContent.offsetHeight;
			 this.state = true;
			 this.resetScroll();
			 this.getToogler().removeClassName('rev');
		 }else{
			 newHeight = newHeight + 'px';
			 window.setTimeout(this.scroll.bind(this, direction), this.scrollDelay); 
		 }
		 
		 this.asearchDom.setStyle({
			 height: newHeight
		 });
	 },
	 
	 stopScroll : function(){
		this.scrollDirection = 0; 
	 },
	 
	 resetScroll : function(){
		 this.scrollSpeed = 0.6;
	 },
	 
	 scrollSpeed 			: 0,
	 scrollAcceleration 	: 1.15,
	 scrollDirection 		: 0,
	 scrollDelay 			: 12,
	 state 					: false,
	 
	 asearchModel 			: null,
	 asearchDom  			: null,
	 asearchDomContent		: null,
	 
	 initialized			: false
 };
 
 if(navigator.userAgent.toLowerCase().indexOf('safari') == -1){
	document.observe("dom:loaded", iAsearchTool.init.bind(iAsearchTool));
 }
 
 Event.observe(window, 'load', iAsearchTool.init.bind(iAsearchTool));
 
	function IAsearch(uid, config){
		 this.uid = uid;
		 this.config = config;
		 this.getContainer().asearchModel = this;
		 this.initDomStructure();
		 this.render();
	}
	
	IAsearch.prototype.initDomStructure = function(){
		var container = this.getContainer();
		var div = new Element('div').addClassName('content');
		var div2 = new Element('div', {'style': 'display:none;'}).addClassName('loading');
		container.update('');
		container.insert(div);
		//container.update(div);
		container.insert(div2);
	};
	
	IAsearch.prototype.getContainer = function(){
		return $(this.uid);
	};
	
	IAsearch.prototype.getFilterByRequestVar = function(requestVar){
		var result = null;
		this.config.filters.each(function(item){
			if(item.request_var == requestVar){
				result =  item;
			}
		});
		return result;
	};
	
	IAsearch.prototype.getFilterItemByValue = function(filter, value){
		var result = null;
		filter.items.each(function(item){
			if(item.value == value){
				result = item;
			}
		});
		return result;
	};
	
	IAsearch.prototype.isInState = function(filter){
		var result = false;
		this.config.state.each(function(item){
			if(item.request_var == filter.request_var){
				result = true;
			}
		});
		return result;
	};
	
	IAsearch.prototype.addToState = function(filter, fitem){
		if(filter.request_var == 'cat'){
			this.changeCategory(fitem.value);
			return;
		}
		this.config.state.push({'request_var' : filter.request_var, 'value' : fitem.value});
	};
	
	IAsearch.prototype.removeFromState = function(filter){
		var remIndex = null;
		this.config.state.each(function(item, index){
			if(item.request_var == filter.request_var){
				remIndex = index;
			}
		});
		this.config.state.splice(remIndex, 1);
	};
	
	IAsearch.prototype.changeCategory = function(categoryId){
		this.showLoading();
		new Ajax.Request(this.config.ajax_url, {
			  method: 'post',
			  parameters : {'cat' : categoryId},
			  onComplete : this.changeCategoryCallback.bind(this)
			});
	};
	
	IAsearch.prototype.changeCategoryCallback = function(transport){
		
		if(typeof(transport.responseJSON) == 'undefined' || transport.responseJSON === null){
			try{
				transport.responseJSON = transport.responseText.evalJSON(true);
			}catch(e){
				transport.responseJSON = null;
			}
		}
		
		if(transport.status != 200){ 
			this.showError('Error connection with server, please try again later.');
		}else if(typeof(transport.responseJSON) == 'undefined' || transport.responseJSON === null){
			this.showError('Server returned invalid data.');
		}else if(transport.responseJSON.error == true){
			this.showError(transport.responseJSON.errorMsg);
		}else{
			var response = transport.responseJSON;
			this.config.filters = response.filters;
			this.config.current_category = response.current_category;
			this.clearStates();
			this.render();
		}
		this.hideLoading();
	};
	
	IAsearch.prototype.clearStates = function(){
		var toDelete = [];
		this.config.state.each(function(item){
			var filter = this.getFilterByRequestVar(item.request_var);
			if(filter === null){
				toDelete.push(item.request_var);
			}else{
				var fitem = this.getFilterItemByValue(filter, item.value);
				if(fitem === null){
					toDelete.push(item.request_var);
				}
			}
		}, this);
		toDelete.each(function(item){
			this.removeFromState({'request_var' : item});
		},this);
		
	};
	
	IAsearch.prototype.setLocation = function(){
		var url = this.config.current_category.url;
		var parts = ['as=true'];
		this.config.state.each(function(item){
			parts.push(item.request_var + '=' + encodeURIComponent(item.value));
		});
		var urlparams = parts.join('&');
		if(urlparams != ''){
			url += '?' + parts.join('&');
		}
		setLocation(url);
	};
	
	
	/*RENDERING PART*/
	IAsearch.prototype.showLoading = function(){
		this.getLoadingWrapper().setStyle({display:''});
	};
	
	IAsearch.prototype.hideLoading = function(){
		this.getLoadingWrapper().setStyle({display:'none'});
	};
	
	IAsearch.prototype.showError = function(error){
		alert(error);
	};
	
	IAsearch.prototype.renderState = function(container){
		var box = this.renderBox('Currently Shopping By:');
		var shudInsert = false;
		
		var ul = new Element('ul');
		box.insert(ul);

		this.config.state.each(function(item){
			ul.insert(this.renderStateItem(item));
			shudInsert = true;
		},this);
		
		if(shudInsert){
			container.insert(box);
		}
	};
	
	IAsearch.prototype.renderStateItem = function(item){
		var filter = this.getFilterByRequestVar(item.request_var);
		var li = new Element('li');
		
		var line = new Element('div').addClassName('item');
		li.insert(line);
		
		line.insert(new Element('span').update(filter.name));
		line.insert(new Element('span').update(': '));
		var label = '';		
		label = this.getFilterItemByValue(filter, item.value).label;
		line.insert(new Element('span').update(label));
		var removeState = this.renderButton('');
		removeState.observe('click', this.onStateItemRemove.bind(this, filter));
		line.insert(removeState);
		
		return li;
	};
	
	IAsearch.prototype.renderFilters = function(container){
		var box = this.renderBox('Shopping Options:');
		var shudInsert = false;
		
		var ul = new Element('ul').addClassName('filters');
		box.insert(ul);
		
		this.config.filters.each(function(item){
			if(item.items.length <= 0 || (item.request_var != 'cat' && (this.isInState(item)))) return;
			
			var li = new Element('li').addClassName('filter');
			this.renderItem(item, li);
			ul.insert(li);
			shudInsert = true;
		},this);
		if(shudInsert){
			container.insert(box);
		}
	};
	
	IAsearch.prototype.renderItem = function(item, container){
		container.insert(new Element('div').update(item.name).addClassName('caption'));
		
		var ul = new Element('ul').addClassName('items');
		container.insert(ul);
		
		item.items.each(function(fitem){
			var li = new Element('li').addClassName('item');
			ul.insert(li);
			var a = new Element('a', {'href' : 'javascript:void(0);'}).update(fitem.label);
			a.observe('click', this.onFilterItemClick.bind(this, item, fitem));
			li.insert(a);
		},this);
	};
	
	IAsearch.prototype.getLoadingWrapper = function(){
		return $$('#' + this.uid + ' .loading')[0];
	};
	
	IAsearch.prototype.getContentContainer = function(){
		return $$('#' + this.uid + ' .content')[0];
	};
	
	IAsearch.prototype.render = function(container){
		var div = this.getContentContainer();
		div.update('');
		this.renderCategory(div);
		this.renderState(div);
		this.renderFilters(div);
		this.renderControls(div);
	};
	
	IAsearch.prototype.renderCategory = function(container){
		if(!this.config.current_category.is_root){
			var box = this.renderBox('Current category:');
			container.insert(box);
			
			var label = new Element('div').update(this.config.current_category.name).addClassName('item');
			box.insert(label);
			
			var button = this.renderButton('category');
			button.observe('click', this.onChangeCategory.bind(this, this.config.current_category.parent_id));
			label.insert(button);
		}
	};
	
	IAsearch.prototype.renderBox = function(title){
		var title = new Element('div').update(title).addClassName('title');
		var result = new Element('div').insert(title).addClassName('box'); 
		return result;
	};
	
	IAsearch.prototype.renderControls = function(container){
		if(!this.config.current_category.can_show){
			return;
		}
		var div = new Element('div').addClassName('controls');
		container.insert(div);
		var button = this.renderButton('big');
		button.insert(new Element('div').addClassName('left'));
		button.insert(new Element('div').addClassName('right'));
		button.insert(new Element('div').update('Show').addClassName('title'));
		
		button.observe('click', this.onSetView.bind(this));
		div.insert(button);
	};
	
	IAsearch.prototype.renderButton = function(className){
		var div = new Element('div').addClassName('button').addClassName(className);
		var downHandler = function(div){
			div.addClassName('active');
		};
		var upHandler = function(div){
			div.removeClassName('active');
		};
		div.observe('mousedown',downHandler.bind(this, div));
		div.observe('mouseup', upHandler.bind(this, div));
		div.observe('mouseout', upHandler.bind(this, div));
		return div;
	};
	
	/*EVENTS */
	
	IAsearch.prototype.onFilterItemClick = function(filter, fitem){
		this.addToState(filter, fitem);
		this.render();
	};
	
	IAsearch.prototype.onStateItemRemove = function(filter){
		this.removeFromState(filter);
		this.render();
	};
	
	IAsearch.prototype.onSetView = function(){
		this.setLocation();
	};
	
	IAsearch.prototype.onChangeCategory = function(categoryId){
		this.changeCategory(categoryId);
	};
	
	function IAfilter(uid, ajaxUrl){
		this.uid = uid;
		this.ajaxUrl = ajaxUrl;
		this.setObservers();
	}

 	IAfilter.prototype.getSelectCategory = function(){
		 return $$('#' + this.uid + ' .category_select')[0];
	 };

 	IAfilter.prototype.setObservers = function(){
		this.getSelectCategory().observe('change', this.changeCategory.bind(this));
	 };


 	IAfilter.prototype.changeCategory = function(){
		var categoryId = this.getSelectCategory().value;
		this.showLoading();
		new Ajax.Request(this.ajaxUrl, {
			  method: 'post',
			  parameters : {'cat' : categoryId},
			  onComplete : this.changeCategoryCallback.bind(this)
			});
	};

	IAfilter.prototype.changeCategoryCallback = function(transport){
		if(typeof(transport.responseJSON) == 'undefined' || transport.responseJSON === null){
			try{
				transport.responseJSON = transport.responseText.evalJSON(true);
			}catch(e){
				transport.responseJSON = null;
			}
		}

		if(transport.status != 200){
			this.showError('Error connection with server, please try again later.');
		}else if(typeof(transport.responseJSON) == 'undefined' || transport.responseJSON === null){
			this.showError('Server returned invalid data.');
		}else if(transport.responseJSON.error == true){
			this.showError(transport.responseJSON.error_msg);
		}else{
			var response = transport.responseJSON;
			this.setContent(response.html);
			this.setObservers();
		}
		this.hideLoading();
	};

 	IAfilter.prototype.setContent = function(content){
		 $$('#' + this.uid + ' .content .content-inner')[0].remove();
		 var d = new Element('div').addClassName('content-inner').update(content);
		 $$('#' + this.uid + ' form')[0].insert(d);
	 };

 	IAfilter.prototype.getLoadingWrapper = function(){
		 return $$('#' + this.uid + ' .loading')[0];
	 };

 	IAfilter.prototype.showLoading = function(){
		this.getLoadingWrapper().setStyle({display:''});
	};

	IAfilter.prototype.hideLoading = function(){
		this.getLoadingWrapper().setStyle({display:'none'});
	};

	IAfilter.prototype.showError = function(error){
		alert(error);
	};
	
