// Catalog Search
var CatalogSearch = (function() {
	var XML_HELPER = new XMLHelper();
	
	function CatalogSearch() {};

	// {url, level, parent, max[, asynchronous][, onEmpty][, onComplete][, onPopulateSelect][, emptyOpt]}
	CatalogSearch.prototype.updateCategories = function(parameters) {
		if (parameters.level != null && parameters.level != "") {
			// Execute only if not in restore mode
			if (!(parameters.onRestore)) {
				// Save selected value into hidden field for restoring
				save_select_value(document.getElementById("itemCategoryLevel"+(parameters.level-1)+"ID"));
				
				// Set default behavior if not set
				if (parameters.onEmpty == null) {
					parameters.onEmpty = function(i, select, parameters) {
						clear_select_options(select);
						select.disabled = true;
						if (parameters.emptyOpt != null) {
							select.options[0] = new Option(parameters.emptyOpt.text, parameters.emptyOpt.value);
						}
						// Save selected value into hidden field for restoring
						save_select_value(select);
					};
				}
				
				// Clear other select elements less than given level
				for (var i = parameters.level; i <= parameters.max; i++) {
					var select = document.getElementById("itemCategoryLevel"+i+"ID");
					if (select != null) {
						parameters.onEmpty(i, select, parameters);
					}
				}
			}
			
			var target = document.getElementById("itemCategoryLevel"+parameters.level+"ID");
			if (target != null && parameters.parent != null && parameters.parent != "") {
				parameters.url += getSessionID();
				parameters.params = "level="+parameters.level+"&parentId="+parameters.parent;
				parameters.target = target;
				parameters.target.disabled = true;
				getCategories(parameters);
			}
		}
	};
	
	// {url, params, target[, asynchronous][, emptyOpt]}
	function getCategories(parameters) {
		var _ajax = new SmartAjax.Request(parameters.url, {
			onComplete: function(request, obj) {
				// Remove any options from target/select element
				clear_select_options(obj.target);
			
				// Populate the target/select element with options
				populate_select_options(request, obj);
				
				// Execute the on populate select code if any
				if (obj.onPopulateSelect) {
					obj.onPopulateSelect(obj);
				}
			
				// Re-enabling target element if it has any options
				if (obj.target.options.length > 0) {
					obj.target.disabled = false;
				}
			
				// Execute the restore code if any
				if (obj.onRestore) {
					obj.onRestore(obj, obj.target, 
						document.getElementById("hid_"+obj.target.id));
				}
			
				// Execute the custom code if any
				if (obj.onComplete) {
					obj.onComplete(obj);
				}
			}, 
			method: "get", 
			parameters: parameters.params
		}, parameters);
	};
	
	// {url, form, min, max[, onEmpty][, onComplete][, emptyOpt]}
	CatalogSearch.prototype.restoreCategories = function(parameters) {
		parameters.url += getSessionID();
		for (var i = parameters.min; i < parameters.max; i++) {
			var sel = document.getElementById("itemCategoryLevel"+i+"ID");
			var hid = document.getElementById("hid_itemCategoryLevel"+i+"ID");
			if (sel != null && hid != null && hid.value != "") {
				var _parameters = parameters.clone(false);
				_parameters.level = (i+1);
				_parameters.parent = hid.value;
				_parameters.onRestore = function(parameters, sel, hid) {
					// Restore the selected value once the ajax call is done
					for (var j = 0; j < sel.options.length; j++) {
						if (sel.options[j].value == hid.value) {
							sel.options[j].selected = true;
							break;
						}
					}
				};
				this.updateCategories(_parameters);
			}
		}
	}
	
	CatalogSearch.prototype.clearSelect = function(select) {
		clear_select_options(select);
	}
	//
	function clear_select_options(select) {
		if (select != null && select.options) {
			for (var i = select.options.length - 1; i >= 0; i--) {
				select.options[i] = null;
			}
		}
	};
	
	CatalogSearch.prototype.saveSelectValue = function(select) {
		save_select_value(select);
	}
	// Save selected value into hidden field for restoring
	function save_select_value(select) {
		var hid = document.getElementById("hid_"+select.id);
		if (select != null && hid != null) {
			hid.value = select.value;
		}
	};
	
	// 
	function populate_select_options(request, obj) {
		// Check if the target element is specified and if it is a select
		if (obj != null && obj.target != null && obj.target.options != null) {
			// Add the default option if any
			if (obj.emptyOpt) {
				obj.target.options[0] = new Option(obj.emptyOpt.text, obj.emptyOpt.value);
			}
			
			if (request.status == 200 /*OK*/ && request.responseXML != null) {
				// Convert XML document into associative objects
				var data = XML_HELPER.convert(request.responseXML);
				if (data.options != null) {
					for (var i = 0; i < data.options.length; i++) {
						obj.target.options[obj.target.options.length] = new Option(data.options[i].label, data.options[i].value);
					}
				} else if (data.label != null && data.value != null) {
					obj.target.options[obj.target.options.length] = new Option(data.label, data.value);
				}
			}
		}
	};
	
	return CatalogSearch;
})();	//simultaneously define and call
