// JavaScript Document

var ajaxSearchManager = Class.create({
	
	
	options : {
			cookieName : 'ajaxSearchOption',
			requestUrl : './searchResult.html',
			conditionBox : '',
			selectedClass : 'selected',
			
			page : 0,
			sort : 0,
			parameter : []
			
	},
	
	initialize : function(inElement, inSearchParams, inOptions){
		this.element = inElement;
		this.paramsIdentifire = inSearchParams;
		this.params = {};
		this.cookies = new CookieJar();
		
		var myCookie = this.cookieGet(this.options.cookieName);
		this.options = Object.extend(this.options, myCookie || {});
		this.options = Object.extend(this.options, inOptions || {});
		
		if(!Object.isArray(this.options.parameter)){
			this.options.parameter = [];
		}
		
		Event.observe(window, "load", this.initializeSearchParams.bind(this, inOptions));
		//this.replacePage();
		
		this.clearSearchOption();
	},
	
	initializeSearchParams : function(inOptions){
		var targetElements = $$(this.paramsIdentifire);
		
		if(Object.isArray(targetElements)){
			var paramLength = targetElements.length;
			for(i=0; i< paramLength; i++){
				if(Prototype.Browser.Gecko){
					this.params[targetElements[i].getAttribute("value")] = {
							text : targetElements[i].textContent,
							element : targetElements[i]
						}
				}else{
					this.params[targetElements[i].getAttribute("value")] = {
							text : targetElements[i].innerText,
							element : targetElements[i]
						}
				}
				
				if(this.options.parameter.indexOf(targetElements[i].getAttribute("value")) >= 0){
					this.setSelectedParam(targetElements[i].getAttribute("value"));
					this.addConditionString(targetElements[i].getAttribute("value"));
				}
				this.observeSearchParam(targetElements[i].getAttribute("value"));
			}
		}
		
		if(Object.isArray(inOptions.parameter)){
			this.options.parameter = [];
			var myParams = inOptions.parameter.length;
			for(var i=0; i<myParams; i++){
				this.toggleSearchOption(inOptions.parameter[i]);
			}
		}
	},
	
	observeSearchParam : function(inValue){
		Event.observe(this.params[inValue].element, "click", this.toggleSearchOption.bind(this, inValue));
	},
	
	cookiePut : function(inName, inValue){
		return this.cookies.put(inName, inValue);
	},
	
	cookieRemove : function(inName){
		return this.cookies.remove(inName);
	},
	
	cookieGet : function(inName){
		return this.cookies.get(inName);
	},
	
	cookieEmpty : function(){
		return this.cookies.empty();
	},
	
	cookieGetPack : function(){
		return this.cookies.getPack();
	},
	
	cookieGetKeys : function(){
		return this.cookies.getKeys();
	},
	
	toggleSearchOption : function(inValue){
		if(this.options.parameter.indexOf(parseInt(inValue))<0){
			this.addSearchOption(inValue);
		}else{
			this.removeSearchOption(inValue);
		}
	},
	
	addSearchOption : function(inValue){
		if(this.options.parameter.indexOf(parseInt(inValue))<0){
			this.options.parameter.push(parseInt(inValue));
			if(this.params[inValue]){
				var elm = this.params[inValue].element;
				
				this.addConditionString(inValue);
				
				var effectTo = $(this.options.conditionBox);
				if(Object.isElement($(this.options.conditionBox).lastChild)){
					effectTo = $(this.options.conditionBox).lastChild;
				}
				this._moveEffect(elm, effectTo);
				
			}
			this.setSelectedParam(inValue);
			this.replacePage({ "page" : 0 });
		}
		
		return false;
	},
	
	removeSearchOption : function(inValue){
		if(this.options.parameter.indexOf(parseInt(inValue))>=0){
			this.options.parameter = this.options.parameter.without(parseInt(inValue));
			
			var elm = this.params[inValue].element;
			this._moveEffect(this.params[inValue].conditionNode, elm);
			this.removeSelectedParam(inValue);
			this.removeConditionString(inValue);
			this.replacePage({ "page" : 0 });
		}
	},
	
	clearSearchOption : function(){
		this.options.parameter = [];
		var elms = $$("."+this.options.selectedClass);
		if(Object.isArray(elms)){
			var elmLength = elms.length;
			for(var i=0; i<elmLength; i++){
				this.removeSelectedParam(elms[i].getAttribute("value"));
			}
		}
		
		if(this.options.conditionBox != "" && $(this.options.conditionBox)){
			$(this.options.conditionBox).innerHTML = '&nbsp;';
		}
		
		this.replacePage({ "page" : 0 });
		
		return false;
	},
	
	undoSearchOption : function(){
		this.options.parameter.pop();
		this.replacePage({ "page" : 0 });
		
		return false;
	},
	
	addConditionString : function(inValue){
		if(this.options.conditionBox != "" && $(this.options.conditionBox)){
			var cloneElement = this.params[inValue].element.cloneNode(true);
				
			if(Object.isElement(cloneElement)){
				$(this.options.conditionBox).appendChild(cloneElement);
				this.params[inValue].conditionNode = cloneElement;
				if(!Prototype.Browser.IE){
					Event.observe(cloneElement, "click", this.toggleSearchOption.bind(this, inValue));
				}
			}
		}
	},
	
	removeConditionString : function(inValue){
		if(this.options.conditionBox != "" && $(this.options.conditionBox)
			&& Object.isElement(this.params[inValue].conditionNode)){
			$(this.options.conditionBox).removeChild(this.params[inValue].conditionNode);
			this.params[inValue].conditionNode = '';
		}
	},
	
	replacePage : function(inOption){
		if(typeof inOption == "object"){
			Object.extend(this.options, inOption || {});
		}
		
		var cookieParam = {
			page : this.options.page,
			sort : this.options.sort,
			parameter : this.options.parameter
		};
		
		this.cookiePut(this.options.cookieName, cookieParam);
		//window.location.href="#searchContentsTop"
		if($(this.element)){
			$(this.element).innerHTML = '<div align="center"><img src="/images/loadingIndicator.gif" /></div>';
		}
		
		if(typeof mySmoothScrolling.scrollingFunction != "undefined" && typeof inOption.doMove == "undefined"){
			mySmoothScrolling.scrollingFunction(mySmoothScrolling, $("searchArea"));
			mySmoothScrolling.interval = setInterval(mySmoothScrolling.scrolling, mySmoothScrolling.option.interval);
		}
		
		setTimeout(function(){ new Ajax.Updater(this.element, this.createRequestUrl(inOption), this.createRequestOption()); }.bind(this), 100);
	},
	
	setSelectedParam : function(inValue){
		if(this.params[inValue]){
			this.params[inValue].element.addClassName(this.options.selectedClass);
		}
	},
	
	removeSelectedParam : function(inValue){
		this.params[inValue].element.removeClassName(this.options.selectedClass);
	},
	
	createRequestUrl : function(inOption){
		return this.options.requestUrl;
	},
	
	createRequestOption : function(){
		return { parameters : "opt="+Object.toJSON(this.options.parameter) };
	},
	
	_moveEffect : function(inFrom, inTo){
		if(this.options.conditionBox != "" && $(this.options.conditionBox)
			&& Object.isElement(inFrom) && Object.isElement(inTo)){
			var clone = inFrom.cloneNode(true);
			var strong = document.createElement("strong");
			strong.appendChild(clone);
			clone = strong;
			
			if(Prototype.Browser.Gecko){
				clone.style.position = 'absolute';
				Element.clonePosition(clone, inFrom);
				inFrom.parentNode.appendChild(clone);
			}else{
				inFrom.parentNode.appendChild(clone);
				Element.clonePosition(clone, inFrom);
				clone.style.position = 'absolute';
			}
			
			var toOffset = Element.cumulativeOffset(inTo);
			var fromOffset = Element.cumulativeOffset(clone);
			var offsetX = toOffset.left - fromOffset.left;
			var offsetY = toOffset.top - fromOffset.top;
			
			new Effect.Parallel(
				[
					new Effect.Move(clone, { sync: true, x: offsetX, y: offsetY }), 
					new Effect.Opacity(clone, { sync: true, from: 1, to: 0 })
				],
				{
					duration: 0.6,
					afterFinish : function(){
						var parent = clone.parentNode;
						parent.removeChild(clone);
					}
				}
			);
		}
	}
	
});

var mySearchManager = Class.create(ajaxSearchManager, {
	
	createRequestUrl : function(inOption){
		var params = [
			this.options.page
			, this.options.sort
		];
		params = params.concat(this.options.parameter);
		
		return './searchResult_'+params.join("_")+'.html';
	},
	
	createRequestOption : function(){
		return { onCreate : this.loading.bind(this), onComplete : this.loaded.bind(this) };
		//return { parameters : "opt="+Object.toJSON(this.options.parameter)+"&page=" + this.options.page + "&sort=" + this.options.sort };
	},
	
	loading : function(){
		//$(this.element).innerHTML = '<div style="text-align:center;"><img src="/cms/cmsImage/loading.gif">Now Loading...</div>';
		Element.addClassName($("searchStatus"), "loading");
	},
	
	loaded : function(){
		Element.removeClassName($("searchStatus"), "loading");
	}
	
});


var myShopSearchManager = Class.create(mySearchManager, {
	
	createRequestUrl : function(inOption){
		var params = [
			this.options.page
			, this.options.sort
		];
		params = params.concat(this.options.parameter);
		
		return '/culture/searchResult_'+params.join("_")+'.html';
	}
});







var searchTab = Class.create({
	
	initialize : function(){
		this.tabs = arguments;
		
		if(this.tabs.length > 0){
			tabs = this.tabs.length;
			for(i=0; i<tabs; i++){
				Event.observe($('searchTabSelecter_'+this.tabs[i]), "click", this.selectTab.bind(this, this.tabs[i]));
			}
		}
	},
	
	selectTab : function(inIdentifire){
		tabs = this.tabs.length;
		for(i=0; i<tabs; i++){
			Element.setStyle($('searchTab_'+this.tabs[i]), { display : 'none', visibility : 'hidden' });
		}
		
		Element.setStyle($('searchTab_'+inIdentifire), { display : 'block', visibility : 'visible' });
	}
		
});