if(!$chk(HKM)) {
	var HKM = {};
}

/**
 * HKM.SearchController
 *
 * @classDescription HKM.SearchController
 */
HKM.SearchController = new Class({

	/**
	 * Options
	 * 
	 * @type {Object}
	 */
	options: {
        initialData: null
	},
	
	target: null,
	
	itemListContainer: null,
	
	optionListContainer: null,
	
	searchDetailDisplayLabelContainer: null,
	
	searchDetailDisplayContainer: null,
	
	showResultsButton: null,
	
	resetButton: null,
	
	randomItemButton: null,
	
	itemListData: null,
	
	selectedItems: null, 
	
	searchData: null,
	
	resultCount: 0,

	preloadImages: [
		'/shop/images/search/search_loader.gif'
	],

	/**
	 * HKM.SearchController Constructor
	 * 
	 * @param {Object} target
	 * @param {Object} options
	 */
	initialize: function(target, options) {
		this.setOptions(options);
		this.target = $(target);
		if(this.options.initialData !== null) {
			this.searchData = this.options.initialData.data;
			this.resultCount = this.searchData.productCount.toInt();
			this.options.initialData = null;

		}
		this.setUp();
	},
	
	setUp: function() {
	   
		if(this.preloadImages.length > 0) {
	   		var preloadImage = new Asset.images(this.preloadImages);
		}
		
		var searchDetailDisplayContainerCandicates = $ES('.searchDetailDisplay', this.target);
		if(searchDetailDisplayContainerCandicates.length > 0) {
			this.searchDetailDisplayContainer = searchDetailDisplayContainerCandicates[0];
		}
		
		var searchDetailDisplayLabelContainerCandicates = $ES('.searchDetailDisplay label', this.target);
		if(searchDetailDisplayLabelContainerCandicates.length > 0) {
			this.searchDetailDisplayLabel = searchDetailDisplayLabelContainerCandicates[0];
		}
		if(this.searchData !== null) {
			this.searchDetailDisplayLabel.setText(this.searchData.productCount.toString());
		}
	    
		
		// Get buttons
		this.showResultsButton =  $ES('.showResultsButton', this.target).pop();
		this.resetButton =  $ES('.resetButton', this.target).pop();
		this.randomItemButton = $ES('.randomButton', this.target).pop();

		
		// Prepare selected items
		this.selectedItems = {};
		
		// Item List
		var itemListCandidates = $ES('.itemList', this.target);
		
		if(itemListCandidates.length > 0) {
			this.itemListContainer = itemListCandidates[0];
			this.itemList = new HKM.List({onSelectedEntry: this.itemSelectedHandler.bind(this)});
			this.itemList.injectInside(this.itemListContainer);
			
			
			if(this.searchData !== null) {
				this.itemList.setData(this.searchData.searchItemList);
			}
			
			
		}
		
		// Options List
		var optionListCandidates = $ES('.optionList', this.target);

		if(optionListCandidates.length > 0) { 
			this.optionListContainer = optionListCandidates[0];
			this.optionList = new HKM.List({
											onSelectedEntry: this.optionSelectedHandler.bind(this),
											onDeselectedEntry: this.optionDeselectedHandler.bind(this), 
											allowMutipleSelection: true, 
											clickWillToggle: true
											});
			this.optionList.injectInside(this.optionListContainer);
		}            
		
		this.itemList.selectItemAtIndex(0, false);
		
		this.endLoadDisplay();
		
	},
	
	requestNewData: function() {
		
		this.startLoadDisplay();
		
		var postData = this.getQueryObject();
		
		var serviceURL = null;
		if($chk(HKM.shopConfiguration) && $chk(HKM.shopConfiguration.searchServiceURL)) {
			serviceURL = HKM.shopConfiguration.searchServiceURL;
		}
		
		var searchRequest = new HKM.SearchItemRequest({
													onData: this.newSearchDataHandler.bindAsEventListener(this),
													onDataFailed: this.newSearchFailureHandler.bindAsEventListener(this),
													serviceURL: serviceURL
													});
		searchRequest.load(postData);
	},
	
	newSearchDataHandler: function(data) {
		var currentKey = this.itemList.getSelectedItem().controller.getKey();
		this.searchData = data;
		
		this.itemList.setData(this.searchData.searchItemList);
		this.itemList.setSelectedKeys([currentKey]);
		
		var optionKeys = this.optionList.getSelectedKeys();

		this.optionList.setData(this.itemList.getSelectedItem().controller.getData().searchOptionList);
		this.optionList.setSelectedKeys(optionKeys);
		
		this.setActiveSublabel();
		this.setAllSublabels();
		
		this.resultCount = this.searchData.productCount.toInt();
		this.searchDetailDisplayLabel.setText(this.resultCount.toString());
		
		this.endLoadDisplay();
		
	}, 
	
	newSearchFailureHandler: function(message) {
		
		alert(message);
		
		this.endLoadDisplay();      
	}, 
	
	getQueryObject: function() { 
				
		var retval = [];
	   	var items = this.itemList.getItems();  
		for(var i=0;i<items.length;i++) {
			
			var itemData = {};
			itemData.key = items[i].controller.getKey();
		    itemData.searchOptionList = [];
		
			if($chk(this.selectedItems[items[i].controller.getKey().toString()])) {
			   	for(var c=0;c<this.selectedItems[items[i].controller.getKey().toString()].length;c++) {
					itemData.searchOptionList.push({key:this.selectedItems[items[i].controller.getKey().toString()][c]});
				}
			}
			if(itemData.searchOptionList.length > 0) {
				retval.push(itemData);
			}
		}
		return retval;
	},                                                       
	
	itemSelectedHandler: function(list, entry) {
		if($type(entry) == 'element') {
			entry = entry.controller;
		}
		this.optionList.setData(entry.getData().searchOptionList);
		if($chk(this.selectedItems[entry.getKey().toString()])) {
			this.optionList.setSelectedKeys(this.selectedItems[entry.getKey().toString()]);
			this.selectedItems[entry.getKey().toString()] = this.optionList.getSelectedKeys();
		}
	},
	
	optionSelectedHandler: function(list, entry) { 
	   if($type(this.itemList.getSelectedItem()) == 'element') {
		var ctrl = this.itemList.getSelectedItem().controller;
		} else {
		var ctrl = this.itemList.getSelectedItem();
		}
	   var currentItemKey = ''+ctrl.getKey();

	   if(!$chk(this.selectedItems[currentItemKey])) {
			this.selectedItems[currentItemKey] = [];
		}
		if(this.selectedItems[currentItemKey].indexOf(entry.getKey()) == -1) {
			this.selectedItems[currentItemKey].push(entry.getKey());
		}
		
		this.setActiveSublabel(list.getSelectedItem());
		this.requestNewData();
	},
	
	optionDeselectedHandler: function(list, entry) {

	   var currentItemKey = ''+this.itemList.getSelectedItem().controller.getKey();

	   if(!$chk(this.selectedItems[currentItemKey])) {
			this.selectedItems[currentItemKey] = [];
		}
		var newSelectionList = [];
		for(var i=0;i<this.selectedItems[currentItemKey].length;i++) {
			if(this.selectedItems[currentItemKey][i] != entry.getKey().toString()) {
				newSelectionList.push(this.selectedItems[currentItemKey][i]);
			}
		}
		this.selectedItems[currentItemKey] = newSelectionList;
		this.setActiveSublabel(list.getSelectedItem());
		this.requestNewData();
	},
	
	setActiveSublabel: function() {
		var items = this.optionList.getSelectedItems();
		var displayLabel = [];
		
		for(var i=0;i<items.length;i++) {
			if($type(items[i]) == 'element') {
				var itm = items[i].controller;
			} else {
				var itm = items[i];
			}
			displayLabel.push(itm.getLabel());
		} 
		displayLabel.sort();
		
		if($type(this.itemList.getSelectedItem()) == 'element') {
			var ctrl = this.itemList.getSelectedItem().controller;
		} else {
			var ctrl = this.itemList.getSelectedItem();
		}
		
		ctrl.setSubLabel(displayLabel.join(', '));
	},
	
	setAllSublabels: function() {
		
		var items = this.itemList.getItems();
		for(var i=0;i<items.length;i++) {
			var displayLabel = [];
			
			var keySet = this.selectedItems[items[i].controller.getKey().toString()];
			if($chk(keySet) && keySet.length > 0) {

				var data = items[i].controller.getData().searchOptionList;
				for(var c=0;c<data.length;c++) {
					if(keySet.indexOf(data[c].key) != -1) {
						displayLabel.push(data[c].displayName);
					}
				}
			}
			displayLabel.sort();
			items[i].controller.setSubLabel(displayLabel.join(', '));
		}
		
	},
	
	startLoadDisplay: function() {  
		
		this.itemList.disable();
		this.optionList.disable();
		this.searchDetailDisplayContainer.setStyles({'backgroundImage': 'url(/shop/images/search/search_loader.gif)'});
		
		this.deactivateResultButtons();
		
		this.resetButton.removeEvents('click');
		this.resetButton.setStyle('opacity', 0.5);

	},
	
	endLoadDisplay: function() { 
		
		this.itemList.enable();   
		this.optionList.enable();
		this.searchDetailDisplayContainer.setStyles({'backgroundImage': 'none'});
		
		if(this.resultCount > 0) {
			this.activateResultButtons();
		} else {
			this.deactivateResultButtons();
		}
		
		this.resetButton.addEvent('click', this.resetResultsHandler.bindAsEventListener(this));
		this.resetButton.setStyle('opacity', 1);

	},
	
	activateResultButtons: function() {
		
		this.showResultsButton.addEvent('click', this.showResultsHandler.bindAsEventListener(this));
		this.showResultsButton.setStyle('opacity', 1);

		this.randomItemButton.addEvent('click', this.showRandomResultsHandler.bindAsEventListener(this));
		this.randomItemButton.setStyle('opacity', 1);
	},
	
   	deactivateResultButtons: function() {
		
	 	this.showResultsButton.removeEvents('click');
		this.showResultsButton.setStyle('opacity', 0.5);

		this.randomItemButton.removeEvents('click');
		this.randomItemButton.setStyle('opacity', 0.5);
		
	},
	
	showResultsHandler: function(e) {
		HKM.showSearchResults(this.getQueryObject());
	},
	
	showRandomResultsHandler: function(e) {
		HKM.showRandomSearchResult(this.getQueryObject());
	},
	
	resetResultsHandler: function(e) {
		
		this.optionList.setSelectedKeys([]);
		
		this.startLoadDisplay();
		this.selectedItems = [];
	   	
		
	
		var serviceURL = null;
		if($chk(HKM.shopConfiguration) && $chk(HKM.shopConfiguration.searchServiceURL)) {
			serviceURL = HKM.shopConfiguration.searchServiceURL;
		}
		
		var postData = []
		var testRequest = new HKM.SearchItemRequest({
													onData: this.newSearchDataHandler.bindAsEventListener(this),
													onDataFailed: this.newSearchFailureHandler.bindAsEventListener(this),
													serviceURL: serviceURL
													});
		testRequest.load(postData);
	}

});
HKM.SearchController.implement(new Options);
HKM.SearchController.implement(new Events);


HKM.showSearchResults = function(requestData) {
	ProductSearchCallBack(Json.toString({'requestType':'SearchItemList', 'query':requestData}));
}

HKM.showRandomSearchResult = function(requestData) {
	ProductRandomCallBack(Json.toString({'requestType':'SearchItemList', 'query':requestData}));
}


HKM.SearchVars = {
	sharedController: null
}

HKM.initSearch = function() {
	
	var searchControllerTargetCandidates = $$('.hkmSearchContainer');
	if(searchControllerTargetCandidates.length > 0) {
		var options = {}
		if($chk(HKM.initialSearchData)) {
			options.initialData = HKM.initialSearchData;
		}

		HKM.SearchVars.sharedController = new HKM.SearchController(searchControllerTargetCandidates[0], options);
	}
}
    
window.addEvent('domready', HKM.initSearch); 
