
/********************************/
/* date: 13-09-2007, rev: 0.0.1 */
/* Michel Roovers DRecomm R-dam */
/********************************/

window.advancedSearch = new Object();

window.advancedSearch.init = function()
{
	window.advancedSearch.fielList			= new Array();
	window.advancedSearch.forceBrandDisplay	= true;
	window.advancedSearch.render			= true;
	window.advancedSearch.debug				= false;
	window.advancedSearch.formName			= "advanced_search_box";
	window.advancedSearch.ajaxServerPage	= "";
	window.advancedSearch.divName			= "";
	window.advancedSearch.formAction		= "";
	window.advancedSearch.loadingTopOffset  = 20;
	window.advancedSearch.fieldIndex		= 0;
	window.advancedSearch.itemJump			= 21;

	window.advancedSearch.openFieldLabel	= "Open zoek veld: "
	window.advancedSearch.brandLabel		= "Verfijn merk:";
	window.advancedSearch.catLabel			= "Selecteer eerst een rubriek";
	window.advancedSearch.defaultText		= "Alles";
	window.advancedSearch.subCatLabel		= "Verfijn [CAT_NAME]:";
	window.advancedSearch.specsLabel		= "Verfijn [SPEC_NAME]:";
	window.advancedSearch.searchButtonLabel	= "Zoek";

	window.advancedSearch.setDivID('advanced_search_box');
	window.advancedSearch.state				= new Object();
	window.advancedSearch.state.brandName	= '';
};

window.advancedSearch.submitForm = function()
{
	if(window.advancedSearch.formName != "")
	{
		window.document.getElementById(window.advancedSearch.formName + "_submit_id").submit();
		return true;
	}
	return false;
};

/**
 * function checkField checks if a form field has been assignd to this object
 * @param fieldName name of the field to check for
 * @return boolean true is field is alreaddy assignd
 **/
window.advancedSearch.checkField = function(fieldName)
{
	for(var I = 0; I < window.advancedSearch.fielList.length; I++)
	{
		if(window.advancedSearch.fielList[I] == fieldName)
			return true;
	}
	return false;
};

/**
 * function addField used for adding a form field to this object
 * @param fieldName name of the field to add
 * @return boolean true if the fiels has been added to the object
 **/
window.advancedSearch.addField = function(fieldName)
{
	if(!window.advancedSearch.checkField(fieldName))
	{
		window.advancedSearch.fielList.push(fieldName);
		return true;
	}
	return false;
};

/**
 * function removeField used for removing a form field from this object
 * @param fieldName name of the field to remove
 * @return boolean true is the field has been removed from the object
 **/
window.advancedSearch.removeField = function(fieldName)
{
	var tempArray = new Array();

	for(var I = 0; I < window.advancedSearch.fielList.length; I++)
	{
		if(window.advancedSearch.fielList[I] != fieldName)
			tempArray.push(window.advancedSearch.fielList[I]);
	}

	if(window.advancedSearch.fielList.length == tempArray.length)
		return false;
	window.advancedSearch.fielList = tempArray;
	return true;
};

/**
 * function fieldDataWrapper
 * @param name of the field
 * @param value of the field
 * @return void
 **/
window.advancedSearch.fieldDataWrapper = function(name, value)
{
	this.name  = name;
	this.value = value;
};

/**
 * function fetchFields used for grabing data from the form
 * @return void
 **/
window.advancedSearch.fetchFields = function()
{
	var output = new Array();
	for(var I = 0; I < window.advancedSearch.fielList.length; I++)
		output.push((new window.advancedSearch.fieldDataWrapper(window.advancedSearch.fielList[I], window.document.getElementById(window.advancedSearch.fielList[I]).value)));
	return output;
};

/**
 * function addSelectFieldToUI
 * @param name of the select field to add
 * @param text caption for the field
 * @param values array of values for the select
 * @return boolean true if the field has been created
 **/
window.advancedSearch.addSelectFieldToUI = function(name, text, values, triggerEvent, selectedItem, customIDs)
{
	if(window.advancedSearch.divName != "")
	{
		if(triggerEvent == null)
			triggerEvent = true;

		var newDiv = window.document.createElement('div');
			newDiv.setAttribute('id', 'advanced_search_field_' + name);
			newDiv.setAttribute('class', 'advanced_search_field');
			newDiv.setAttribute('className', 'advanced_search_field');
		
		var filedText = window.document.createTextNode(text);

		var filedTextDiv = window.document.createElement('div');
			filedTextDiv.setAttribute('class', 'advanced_search_field_text');
			filedTextDiv.setAttribute('className', 'advanced_search_field_text');
			filedTextDiv.appendChild(filedText);
			newDiv.appendChild(filedTextDiv);

		if(triggerEvent)
		{
			try
			{
				var newSelect = window.document.createElement('<select onChange="window.advancedSearch.handleOnChange(\'' + name + '\');">');
			}
			catch(e)
			{
				var newSelect = window.document.createElement('select');
				newSelect.setAttribute('onChange', 'window.advancedSearch.handleOnChange(\'' + name + '\');');
			}
		}
		else
			var newSelect = window.document.createElement('select');

		newSelect.setAttribute('name', name);
		newSelect.setAttribute('id', name);
		newSelect.setAttribute('class', 'advanced_search_selectbox');
		newSelect.setAttribute('className', 'advanced_search_selectbox');
		
		var newOption = window.document.createElement('option');
			newOption.setAttribute('value', window.advancedSearch.defaultText);
		var optionText = window.document.createTextNode(window.advancedSearch.defaultText);

		newOption.appendChild(optionText);
		newSelect.appendChild(newOption);
		
		for(var I = 0; I < values.length; I++)
		{
			var newOption = window.document.createElement('option');
			if(customIDs != null)
			{
				newOption.setAttribute('value', customIDs[I]);
				if(selectedItem == customIDs[I])
					newOption.setAttribute('selected', 'selected');
			}
			else
			{
				newOption.setAttribute('value', values[I]);
				if(selectedItem == values[I])
					newOption.setAttribute('selected', 'selected');
			}

				newOption.innerHTML = values[I];
				newSelect.appendChild(newOption);
		}

		newDiv.appendChild(newSelect);
		
		if(window.advancedSearch.addField(name))
		{
			window.document.getElementById(window.advancedSearch.divName).appendChild(newDiv);
			return true;
		}
	}
	return false;
};

/**
 * function removeFieledFromUI
 * @param name of the field to remove
 * @return boolean true if the field has been removed
 **/
window.advancedSearch.removeFieldFromUI = function(name)
{
	if(window.advancedSearch.removeField(name))
	{
		var oldDiv = window.document.getElementById('advanced_search_field_' + name);
		window.document.getElementById(window.advancedSearch.divName).removeChild(oldDiv);
		return true;
	}
	return false;
};

/**
 * function setDivID
 * @param divName name of the div
 * @return boolean true if the divName is set
 **/
window.advancedSearch.setDivID = function(divName)
{
	if(window.advancedSearch.divName == divName)
		return false;
	window.advancedSearch.divName = divName;
	return true;
};

/**
 * function renderDisplay
 * @param parentDiv id of the element the advanced search display should be rendered
 * @return boolean true is the element is rendered
 **/
window.advancedSearch.renderDisplay = function(parentDiv)
{
	if(!window.advancedSearch.render)
		return;

	if((window.advancedSearch.divName != "") && (window.advancedSearch.formName != ""))
	{
		var newForm = window.document.createElement('form');
			newForm.setAttribute('name', window.advancedSearch.formName);
			newForm.setAttribute('method', 'POST');
			newForm.setAttribute('id', window.advancedSearch.formName + "_submit_id");
			newForm.setAttribute('action', window.advancedSearch.formAction);

		var newDiv = window.document.createElement('div');
			newDiv.setAttribute('id', window.advancedSearch.divName);
		newForm.appendChild(newDiv);
		
		var hiddenVar = window.document.createElement('input');
			hiddenVar.setAttribute('type', 'hidden');
			hiddenVar.setAttribute('name', 'ajax_advanced_search_form');
		newForm.appendChild(hiddenVar);
		
		var hiddenVar = window.document.createElement('input');
			hiddenVar.setAttribute('type', 'hidden');
			hiddenVar.setAttribute('name', 'default_label');
			hiddenVar.setAttribute('value', window.advancedSearch.defaultText);
		newForm.appendChild(hiddenVar);
		
		var hiddenVar = window.document.createElement('input');
			hiddenVar.setAttribute('type', 'hidden');
			hiddenVar.setAttribute('name', 'cPath');
			hiddenVar.setAttribute('id', 'cPath');
		newForm.appendChild(hiddenVar);
		
		var hiddenVar = window.document.createElement('input');
			hiddenVar.setAttribute('type', 'hidden');
			hiddenVar.setAttribute('name', 'specList');
			hiddenVar.setAttribute('id', 'specList');
		newForm.appendChild(hiddenVar);
		
		var newDiv = window.document.createElement('div');
			newDiv.setAttribute('className', 'AJAX_advanced_search_loading_indicator');
			newDiv.setAttribute('class',	 'AJAX_advanced_search_loading_indicator');
			newDiv.setAttribute('id',		 'AJAX_advanced_search_loading_indicator');
			newDiv.style.display = 'none';
		newForm.appendChild(newDiv);

		var newDiv = window.document.createElement('div');
			newDiv.setAttribute('class', 'advanced_search_open_field');
			newDiv.setAttribute('className', 'advanced_search_open_field');

		try
		{
			var newInput = window.document.createElement('<input onkeyup="window.advancedSearch.setField();" onfocus="window.advancedSearch.openFieldFocus();" onblur="window.advancedSearch.openLoseFieldFocus();"/>');
		}
		catch(e)
		{
			var newInput = window.document.createElement('input');
				newInput.setAttribute('onfocus', 'window.advancedSearch.openFieldFocus();');
				newInput.setAttribute('onblur', 'window.advancedSearch.openLoseFieldFocus();');
				newInput.setAttribute('onkeyup', 'window.advancedSearch.setField();');
		}
				newInput.setAttribute('type', 'text');
				newInput.setAttribute('value', " " + window.advancedSearch.defaultText);
				newInput.setAttribute('name', 'fld[productname_upc]');
				newInput.setAttribute('id', 'advanced_search_open_field_text_box');
				newInput.setAttribute('class', 'advanced_search_open_field_text_box');
				newInput.setAttribute('className', 'advanced_search_open_field_text_box');

		var newText    = window.document.createTextNode(window.advancedSearch.openFieldLabel);
		var newTextDiv = window.document.createElement('div');
			newTextDiv.setAttribute('class', 'advanced_search_field_text');
			newTextDiv.setAttribute('className', 'advanced_search_field_text');
		newTextDiv.appendChild(newText);
		newDiv.appendChild(newTextDiv);
		newDiv.appendChild(newInput);
		newForm.appendChild(newDiv);
		
		var hiddenVar = window.document.createElement('input');
			hiddenVar.setAttribute('id', 'productname');
			hiddenVar.setAttribute('type', 'hidden');
			hiddenVar.setAttribute('name', 'fld[productname]');
		newForm.appendChild(hiddenVar);

		var newBR = window.document.createElement('br');
			newForm.appendChild(newBR);

		var newDiv = window.document.createElement('div');
			newDiv.setAttribute('className', 'advanced_search_submit');
			newDiv.setAttribute('class',	 'advanced_search_submit');

		try
		{
			var newButton = window.document.createElement('<input onClick="window.advancedSearch.submitForm();"/>');
		}
		catch(e)
		{
			var newButton = window.document.createElement('input');
				newButton.setAttribute('onClick', 'window.advancedSearch.submitForm();');
		}
				newButton.setAttribute('type', 'button');
				newButton.setAttribute('value', window.advancedSearch.searchButtonLabel);
				newButton.setAttribute('class', 'form_button');
				newButton.setAttribute('className', 'form_button');
		
		newDiv.appendChild(newButton);
		newForm.appendChild(newDiv);
			
		
		window.document.getElementById(parentDiv).appendChild(newForm);
		window.advancedSearch.render = false;
		return true;
	}
	return false;
};

window.advancedSearch.showLoadingScreen = function(itemCount)
{
	if(itemCount == null)
		itemCount = 0;
	window.document.getElementById('AJAX_advanced_search_loading_indicator').style.display = "";
	var top  = window.advancedSearch.loadingTopOffset;
		top += window.advancedSearch.itemJump * itemCount;
	window.document.getElementById('AJAX_advanced_search_loading_indicator').style.top = top;
};

window.advancedSearch.hideLoadingScreen = function()
{
	window.document.getElementById('AJAX_advanced_search_loading_indicator').style.display = "none";
};

/**
 * function openFieldFocus handles the onfocus of the open text field
 * @return void
 **/
window.advancedSearch.openFieldFocus = function()
{
	if(window.document.getElementById('advanced_search_open_field_text_box').value == " " + window.advancedSearch.defaultText)
		window.document.getElementById('advanced_search_open_field_text_box').value = "";
	window.advancedSearch.setField();
}

/**
 * function openLoseFieldFocus handles the onblurr of the open text field
 * @return void
 **/
window.advancedSearch.openLoseFieldFocus = function()
{
	if(window.document.getElementById('advanced_search_open_field_text_box').value == "")
		window.document.getElementById('advanced_search_open_field_text_box').value = " " + window.advancedSearch.defaultText;
	window.advancedSearch.setField();
};

/**
 * function setField....
 * @return void
 **/
window.advancedSearch.setField = function()
{
	window.document.getElementById('productname').value = window.document.getElementById('advanced_search_open_field_text_box').value;
};


/**
 * function removeFieldsFromField used for removeing multiple fields in order
 * @param fieldName name of the field to start from
 * @return boolean true if fields have been removed
 **/
window.advancedSearch.removeFieldsFromField = function(fieldName)
{
	var tempArray   = new Array();
	var passedField = false;
	var fieldIndex  = -1;

	for(var I = 0; I < window.advancedSearch.fielList.length; I++)
	{
		if(passedField)
			tempArray.push(window.advancedSearch.fielList[I]);
		else
		{
			if(window.advancedSearch.fielList[I] == fieldName)
			{
				window.advancedSearch.fieldIndex = I;
				passedField = true;
				fieldIndex  = I;
			}
		}
	}
	
	for(var I = 0; I < tempArray.length; I++)
		window.advancedSearch.removeFieldFromUI(tempArray[I]);

	if(fieldIndex >= 0)
		return true;
	return false;
};

/**
 * function handleOnChange
 * @param fieldName name of the field calling a onchange event
 * @return void
 **/
window.advancedSearch.handleOnChange = function(fieldName)
{
	try
	{
		window.advancedSearch.state.brandName = window.document.getElementById('brand_list').value;
	}
	catch(e){}

	if(window.advancedSearch.removeFieldsFromField(fieldName))
	{
		var data = window.advancedSearch.fetchFields();
		window.advancedSearch.createServerQuery(data);
	}
};

/**
 * function createServerQuery used for creating the server query
 * @param data
 * @return void
 **/
window.advancedSearch.createServerQuery = function(data)
{
	if(window.advancedSearch.ajaxServerPage == "")
		return;

	var g_oADTL = new ADTL();
		g_oADTL.addDataListener('handleResponse', window.advancedSearch.handleServerResponse);

	var l_aData = new Array();
	var l_aFunctionCall				  = new Array();
		l_aFunctionCall['identifier'] = 'handleResponse';
		l_aFunctionCall['func']		  = "categories::create_chained_caregory_list";
		l_aFunctionCall['params']	  = new Array();

		l_aFunctionCall['params'].push((new Array('field_count', data.length)));
		l_aFunctionCall['params'].push(new Array('default_label', window.advancedSearch.defaultText));

	for(var I = 0; I < data.length; I++)
		l_aFunctionCall['params'].push((new Array(data[I].name, data[I].value)));

	l_aData['functionCall'] = new Array(l_aFunctionCall);
	g_oADTL.fetchData(l_aData, window.advancedSearch.ajaxServerPage);
	window.advancedSearch.showLoadingScreen(window.advancedSearch.fieldIndex);
};

/**
 * function handleServerResponse used for updating the UI
 * @param responseData from the server
 * @return void
 **/
window.advancedSearch.handleServerResponse = function(responseData)
{
	window.advancedSearch.hideLoadingScreen();
	if(window.advancedSearch.debug)
		alert(debug(responseData));
	
	try
	{
		var valuesArray  = new Array();
		if(responseData['sub_categorys'].length > 0)
		{
			for(var I = 0; I < responseData['sub_categorys'].length; I++)
				valuesArray.push(responseData['sub_categorys'][I]['name']);
		
			subCatName = window.advancedSearch.subCatLabel.replace('[CAT_NAME]', responseData['cat_name']);
			window.advancedSearch.addSelectFieldToUI('cPath=' + responseData['cPath'], subCatName, valuesArray, true, '');
		}
	}
	catch(e){}

	var specIDList = new Array();
	
	try
	{
		for(var I = 0; I < responseData['spec_list'].length; I++)
		{
			var valuesArray = new Array();
			var specIDArray = new Array();
	
			for(var X = 0; X < responseData['spec_array'][responseData['spec_list'][I]].length; X++)
			{
				valuesArray.push(responseData['spec_array'][responseData['spec_list'][I]][X]['specs_values_description']);
				specIDArray.push(responseData['spec_array'][responseData['spec_list'][I]][X]['spec_values_id']);
			}
			
			if(valuesArray.length > 1)
			{
				var specID	 = responseData['spec_array'][responseData['spec_list'][I]][0]['spec_id'];
				specListName = window.advancedSearch.specsLabel.replace('[SPEC_NAME]', responseData['spec_list'][I]);
				window.advancedSearch.addSelectFieldToUI('specID=' + specID, specListName, valuesArray, false, '', specIDArray);
				specIDList.push(specID);
			}
		}
	}
	catch(e){}

	try
	{
		if(responseData['brand_list'].length > 0)
		{
			var brandNamesArray = new Array();
			var brandIDArray	= new Array();
			for(var I = 0; I < responseData['brand_list'].length; I++)
			{
				brandNamesArray.push(responseData['brand_list'][I]['name']);
				brandIDArray.push(responseData['brand_list'][I]['id']);
			}

			if((brandNamesArray.length > 1) || (window.advancedSearch.forceBrandDisplay))
				window.advancedSearch.addSelectFieldToUI('brand_list', window.advancedSearch.brandLabel, brandNamesArray, false, window.advancedSearch.state.brandName, brandIDArray);
		}
	}
	catch(e){}
	
	if(specIDList.length > 0)//set specs displayed
		window.document.getElementById('specList').value = specIDList.join(',');

	//set selected cPath
	window.document.getElementById('cPath').value = responseData['cPath'];

};
