//******************************************************************************************
// Here are the functions responsible for the left box QuickFinder and the X buttons 
// that added after every selection made by user with select boxs.
// When select box are changed in left items select box, a call for SearchResults are made.
//******************************************************************************************



//******************************************************************************************
// Get the div for the left box (divSelectItems - Select events and items) and the div for the 
// X buttons added after every selection made by user (divProperties).
//******************************************************************************************
var divSelectItems		= document.getElementById("divSelectItems");
var divProperties		= document.getElementById("divProperties");
var divSearchResults	= document.getElementById("divSearchResults");
var divCancelButtons	= document.getElementById("divCancelButtons");
var tdSearchResults	= document.getElementById("tdSearchResults");
var divWeit			= document.getElementById("divWeit");
var divFade			= document.getElementById("divFade");


var ddlEvents;
var ddlFamily;
var ddlPriceRange;
var ddlProp1;
var ddlProp2;
var ddlProp3;
var deliveryAboard;
var cbDeliveryAbroad1;
var cbDeliveryAbroad2;
var tbPageNumber;

var quickFinderParams	= null;
var delivery_abroad		= null;
var event_list			= null;
var family				= null;
var price_range			= null;
var price_text			= null;
var prop1				= null;
var prop2				= null;
var prop3				= null;
var urlSelectItems		= null;
var urlSearchResults	= null;
var timerSelectItems	= 0;
var timerSearchResults	= 0;
var firstTime			= true;
var imageIndex			= 0;
var pageNumber			= 1;
var fromPaging			= false;

//******************************************************************************************
// This function insert dictionery values on page load.
//******************************************************************************************
function initializeDictioneryValues()
{
	//Add the text for remove button values.
	if (divCancelButtons)
	{
		createdCancelButton	= createSpan("cancelButton", cancelButton);
		divCancelButtons.appendChild(createdCancelButton);
	}
}

//******************************************************************************************
// Find the objects in the page and assign them to vars.
// If [setParams] = [true], set the parameters vars by objects values.
//******************************************************************************************
function initializeProperties(setParams)
{
	ddlEvents			= document.getElementById('ddlEvents');
	ddlFamily			= document.getElementById('ddlFamily');
	ddlPriceRange		= document.getElementById('ddlPriceRange');
	ddlProp1			= document.getElementById('ddlProp1');
	ddlProp2			= document.getElementById('ddlProp2');
	ddlProp3			= document.getElementById('ddlProp3');
	deliveryAboard		= document.getElementsByName('cbDeliveryAbroad');
	cbDeliveryAbroad1	= document.getElementById('cbDeliveryAbroad1');
	cbDeliveryAbroad2	= document.getElementById('cbDeliveryAbroad2');

	if (setParams)
	{
		//Gather and set parameters.
		delivery_abroad		= getCheckedValue(deliveryAboard);
		event_list			= ddlEvents.options[ddlEvents.selectedIndex].value;
		family				= ddlFamily.options[ddlFamily.selectedIndex].value;
		price_range			= ddlPriceRange.options[ddlPriceRange.selectedIndex].value;
		price_text			= ddlPriceRange.options[ddlPriceRange.selectedIndex].text;
		
		if (ddlProp1)
			prop1	= ddlProp1.options[ddlProp1.selectedIndex].value;
		else
			prop1	= null;
			
		if (ddlProp2)
			prop2	= ddlProp2.options[ddlProp2.selectedIndex].value;
		else
			prop2	= null;
			
		if (ddlProp3)
			prop3	= ddlProp3.options[ddlProp3.selectedIndex].value;
		else
			prop3	= null;
	}
}

//******************************************************************************************
// Disables all objects in quick finder.
//******************************************************************************************
function disableSelectBox()
{
	initializeProperties(true);

	ddlEvents.disabled			= true;
	ddlFamily.disabled			= true;
	ddlPriceRange.disabled		= true;
	cbDeliveryAbroad1.disabled	= true;
	cbDeliveryAbroad2.disabled	= true;

	if (ddlProp1)
		ddlProp1.disabled		= true;
	if (ddlProp2)
		ddlProp2.disabled		= true;
	if (ddlProp3)
		ddlProp3.disabled		= true;
}

//******************************************************************************************
// Enables all objects in quick finder.
//******************************************************************************************
function enableSelectBox()
{
	initializeProperties(true);

	ddlEvents.disabled			= false;
	ddlFamily.disabled			= false;
	ddlPriceRange.disabled		= false;
	cbDeliveryAbroad1.disabled	= false;
	cbDeliveryAbroad2.disabled	= false;

	if (ddlProp1)
		ddlProp1.disabled		= false;
	if (ddlProp2)
		ddlProp2.disabled		= false;
	if (ddlProp3)
		ddlProp3.disabled		= false;
}

//******************************************************************************************
// This function invokes after N miliseconds that server didnt response [timeou] from
// Ajax call.
//******************************************************************************************
function selectItems_Timeout()
{
	enableSelectBox();

	alert("Server failed to get data for select items after 5 seconds... Please try again");
}

//******************************************************************************************
// This function invokes after N miliseconds that server didnt response [timeou] from
// Ajax call.
//******************************************************************************************
function searchResults_Timeout()
{
	alert("Server failed to get data for search results after 5 seconds... Please try again");
}

//******************************************************************************************
// This function responsible for recieveing the data returned from server request.
//******************************************************************************************
function selectItems_Callback(res)
{
	//If server returns data from call, clear timeout for [timeout error from server].
	clearTimeout(timerSelectItems);

	//Add the server result into the div.
	if (divSelectItems)
		divSelectItems.innerHTML = res;

	if (inQuickFinder)
	{
		createButtons();
		callSearchResults();
	}
}

//******************************************************************************************
// This function responsible for recieveing the data returned from server request.
//******************************************************************************************
function searchResults_Callback(res)
{
	//If server returns data from call, clear timeout for [timeout error from server].
	clearTimeout(timerSearchResults);

	//Get the current page number.		
	tbPageNumber = document.getElementById("tbPageNumber");
	
	searchEnd(res);
}

//******************************************************************************************
// This function occurs only when page load. Responsible to gather parameters from query
// if there passed from other page.
//******************************************************************************************
function callQuickFinder()
{
	//if (!divSelectItems) return;	
	urlSelectItems = "";
	urlSelectItems += pageQuickFinderSelectEvent;
	urlSelectItems += "?RootFolderID=" + rootFolderID;
	urlSelectItems += "&Lang=" + lang;
	urlSelectItems += "&Delivery_Abroad=" + ((getQueryParamValue("Delivery_Abroad") != "") ? getQueryParamValue("Delivery_Abroad") : 1);
	urlSelectItems += "&Event_List=" + getQueryParamValue("Event_List");
	urlSelectItems += "&Family=" + getQueryParamValue("Family");
	urlSelectItems += "&Price_Range=" + getQueryParamValue("Price_Range");
	urlSelectItems += "&Prop1=" + getQueryParamValue("Prop1");
	urlSelectItems += "&Prop2=" + getQueryParamValue("Prop2");
	urlSelectItems += "&Prop3=" + getQueryParamValue("Prop3");
		
	setTimeout("sendRequest(urlSelectItems, selectItems_Callback)", 0);
}


//******************************************************************************************
// This function occurs only when page load. Responsible to gather parameters from query
// if there passed from other page.
//******************************************************************************************
function reCallQuickFinder()
{
	pageNumber = 1;
	doCallQuickFinder();
}

function doCallQuickFinder()
{
	if (timerSearchResults > 0)
		clearTimeout(timerSearchResults);
		
	if (timerSelectItems > 0)
		clearTimeout(timerSelectItems);
		
	initializeProperties(true);
	
	//Clear serach results made so far.
	if (divSearchResults)
		divSearchResults.innerHTML  = "";

	var urlParams = getQuickFinderParams();

	//Disabled the select box until returns from server call.
	disableSelectBox();

	//Check if current page is QuickFind.aspx, if not, redirect to it.
	if (!inQuickFinder)
		redirectToQuickFinder();

	//Set timeout to check if server failes to recieve data from last call after X time.
	timerSelectItems = setTimeout("selectItems_Timeout()", 10000);

	searchStart();

	//Create the new url with parameters.
	urlSelectItems = "";
	urlSelectItems += pageQuickFinderSelectEvent;
	urlSelectItems += urlParams;
//window.open(urlSelectItems);
	//createButtons();
	setTimeout("sendRequest(urlSelectItems, selectItems_Callback)", 0);
}

//******************************************************************************************
// Responsible for get search results by given page number.
//******************************************************************************************
function moveToPage(n)
{
	pageNumber = n;
	doCallQuickFinder();
}

//******************************************************************************************
// This function responsible for calling the search results page.aspx by passing 
// parameters from select items select boxs.
//******************************************************************************************
function callSearchResults(urlParams)
{   
	if (!urlParams)
	{
		initializeProperties(true);
		urlParams = getQuickFinderParams();		
	}		
	
	//Set timeout to check if server failes to recieve data from last call after X time.
	timerSearchResults = setTimeout("selectItems_Timeout()", 10000);
	
	urlSearchResults = "";
	urlSearchResults += pageQuickFinderSearchResults;
	urlSearchResults += urlParams;
	urlSearchResults += "&lang=" + LANG;
	//alert(urlSearchResults);
	setTimeout("sendRequest(urlSearchResults, searchResults_Callback)", 10);
}

function searchStart()
{
	showLoading();
}

function searchEnd(res)
{	
   
	divFade.className		= "qf_fade";
	divWeit.style.display	= "none";
	divFade.style.display	= "inline";
	
	if (divSearchResults)
		divSearchResults.innerHTML = res;
		
	divFade.style.height = tdSearchResults.offsetHeight;
	opacitySet(100, divFade.id, 0);
	opacityChange(divFade, true, 1000);
}

function showLoading()
{
	if (divWeit)
		divWeit.style.display = "inline";
}

//******************************************************************************************
// Fade in and out effects.
//******************************************************************************************
function opacityChange(obj, fadeIn, millisec) {
	if(!fadeIn)
	{ 
		opacityHandler(obj.id, 0, 100, millisec); 
	}
	else
	{ 
		opacityHandler(obj.id, 100, 0, millisec); 
	} 
} 
function opacityHandler(id, opacityStart, opacityEnd, millisec) { 
	var speed = Math.round(millisec / 100); 
	var timer = 0; 

	if(opacityStart > opacityEnd) 
	{ 
		for(i = opacityStart; i >= opacityEnd; i--) 
		{ 
			setTimeout("opacitySet(" + i + ",'" + id + "', " + timer + ")",(timer * speed)); 
			timer++; 
		} 
	} 
	else if(opacityStart < opacityEnd) 
	{ 
		for(i = opacityStart; i <= opacityEnd; i++) 
		{ 
			setTimeout("opacitySet(" + i + ",'" + id + "')",(timer * speed)); 
			timer++; 
		} 
	} 
} 
function opacitySet(opacity, id, index)
{ 
	var object = document.getElementById(id).style; 
	object.opacity = (opacity / 100); 
	object.MozOpacity = (opacity / 100); 
	object.KhtmlOpacity = (opacity / 100); 
	object.filter = "alpha(opacity=" + opacity + ")"; 
	
	if (index >= 100)
	{
		divFade.style.display = "none";
	}
}
			
//******************************************************************************************
// This function get a value from query by given query param name.
//******************************************************************************************
function getQueryParamValue(paramName)
{
	var arrQuery = window.location.search.replace('?', '').split('&');
	var arrCurrentParam;

	for (i = 0; i < arrQuery.length; i++)
	{
		arrCurrentParam = arrQuery[i].split('=');
		if (arrCurrentParam[0] == paramName && arrCurrentParam[1] != "") return arrCurrentParam[1];
	}

	return "";
}

//******************************************************************************************
// This function responsible for gathering all the select box values and combain them
// into one string to use later in query server calls.
//******************************************************************************************
function getQuickFinderParams()
{
	quickFinderParams =	"";
	quickFinderParams += "?RootFolderID=" + rootFolderID;
	quickFinderParams += "&Language=" + lang;
	quickFinderParams += "&Delivery_Abroad=" + delivery_abroad;
	
	if (event_list)
		quickFinderParams += "&Event_List=" + event_list;
	
	if (family)
		quickFinderParams += "&Family=" + family;
	
	if (price_range)
	{
		quickFinderParams += "&Price_Range=" + price_range;
		quickFinderParams += "&Price_Text=" + price_text;
	}
		
	if (prop1 != null)
		quickFinderParams += "&Prop1=" + prop1;

	if (prop2 != null)
		quickFinderParams += "&Prop2=" + prop2;
		
	if (prop3 != null)
		quickFinderParams += "&Prop3=" + prop3;
		
	if (pageNumber > 0)
		quickFinderParams += "&PageNumber=" + ((pageNumber == 0) ? 1 : pageNumber);

	return quickFinderParams;
}

//******************************************************************************************
// This function responsible for adding the X buttons with selected properties to
// divProperties.
//******************************************************************************************
function createButtons()
{
	var createdCancelButton	= null;
	
	initializeProperties(true);
	
	clearButtons();
	
	//Show div if is invisible.
	divProperties.style.display		= 'block';
	divCancelButtons.style.display	= 'block';
	
	
	appendButton(ddlEvents);
	appendButton(ddlFamily);
	appendButton(ddlPriceRange);
	
	if (ddlProp1)
		appendButton(ddlProp1);
	
	if (ddlProp2)
		appendButton(ddlProp2);
	
	if (ddlProp3)
		appendButton(ddlProp3);
	
	//If no buttons exists in divProperties, hide div.	
	if (imageIndex == 0)
	{
		divProperties.style.display		= 'none';
		divCancelButtons.style.display	= 'none';
	}
}

function clearButtons()
{
	imageIndex					= 0;
	divProperties.innerHTML		= "";
}

//******************************************************************************************
// This function responsible foor appending the X button with the ddl selcted text
// into the divProperties.
//******************************************************************************************
function appendButton(ddlObject)
{
	var createdImage		= null;
	var createdSpan			= null;
	var createdImageSpacer	= null;
	var createdYouChoose	= null;
	
	if (ddlObject && getSelectedValue(ddlObject) != null)
	{
		//Get the text only, removes the (12) [number of items].
		var ddlSelectedText	= getSelectedText(ddlObject).split('(')[0];
		
		createdYouChoose	= createSpan("youChoose", youChoose, "qf_you_choose");
		createdImage		= createImage(ddlObject.id, "../../Images/x.gif", "qf_x");
		createdImageSpacer	= createImage(ddlObject.id, "../../Images/orange_dots_spacer.gif", "qf_spacer");
		createdSpan			= createSpan(ddlObject.id, ddlSelectedText, "qf_button_value");
		
		if (createdImage)
		{
			//Attach delegated functions to image button.
			createDelegate(createdImage, "click", reCallQuickFinder);
			createDelegate(createdImage, "click", resetSelection);
			
			//Add the text Yuo Choose: 
			if (imageIndex == 0)
				divProperties.appendChild(createdYouChoose);

			//if its nor the first image in divProperties, add spacer.
			if (imageIndex > 0)
				divProperties.appendChild(createdImageSpacer);

			//Add the button and span to divProperties.
			divProperties.appendChild(createdImage);
			divProperties.appendChild(createdSpan);
			
			imageIndex++;
		}
	}
}

//******************************************************************************************
// This function resposible for reset select box by given select box ID witch taken from
// Current event object.
//******************************************************************************************
function resetSelection()
{
	pageNumber = 1;
	
	var currentEventobject	= getEventObject();
	var ddlObject			= document.getElementById(currentEventobject.parentID);
	
	//Set the selected index in ddl to 0.
	if (ddlObject)
		ddlObject.selectedIndex = 0;
	
	//divPropertiesRemoveChildrens(currentEventobject.parentID);
	
	event.returnValue = false;
	return false;
}

//******************************************************************************************
// This function responsiblr for creating new image button and assing its properties.
// Returns null if image failed to create.
//******************************************************************************************
function createImage(parendID, imgSrc, className)
{
	var imageButton = null;
	
	try
	{
		imageButton			= document.createElement("<input class='" + className + "' parentID='parendID' type='image' name='tbProperty' /");
		imageButton.src		= imgSrc;
	}
	catch (ex)
	{
		imageButton = document.createElement("input");
		imageButton.setAttribute("type", "image");
		imageButton.setAttribute("src", imgSrc);
		imageButton.setAttribute("parentID", parendID);
		imageButton.className = className;
	}
	
	//If element successfuly created.
	if (imageButton) return imageButton;
	else return null;
}

//******************************************************************************************
// This function responsiblr for creating new span and assing its properties and text.
// Returns null if span failed to create.
//******************************************************************************************
function createSpan(parentID, text, className)
{
	var span = null;
	
	try
	{
		span	= document.createElement("<span class='" + className + "' parentID='" + parentID + "' id='spnProperty' />");
	}
	catch (ex)
	{
		span = document.createElement("span");
		span.setAttribute("parentID", parentID);
		span.id = 'spnProperty';
		span.className = className;
	}

	if (span)
	{
		span.innerHTML = text;
		
		//If element successfuly created.
		return span;
	}
	else return null;
}

//******************************************************************************************
// This function responsiblr for creating new div and assing its properties and text.
// Returns null if div failed to create.
//******************************************************************************************
function createDiv(parentID, text, className)
{
	var div = null;
	
	try
	{
		div	= document.createElement("<div class='" + className + "' parentID='" + parentID + "' id='divProperty' />");
	}
	catch (ex)
	{
		div = document.createElement("div");
		div.setAttribute("parentID", parentID);
		div.id = 'divProperty';
		div.className = className;
	}

	if (div)
	{
		div.innerHTML = text;
		
		//If element successfuly created.
		return div;
	}
	else return null;
}

//******************************************************************************************
// This function responsible for attaching delegated function to given object.
// The eventName indicates event like onclick. You only need to pass "click" without "on"
//******************************************************************************************
function createDelegate(elementObj, eventName, eventHandlerFunctionName)
{
	//Other browsers
	if (elementObj.addEventListener)
		elementObj.addEventListener(eventName, eventHandlerFunctionName, false);
	
	//IE6 or higher
	else if (elementObj.attachEvent)
		elementObj.attachEvent('on' + eventName, eventHandlerFunctionName);
	
	else
	{
		//Older browsers
		var currentEventHandler = elementObj['on' + eventName];
		if (currentEventHandler == null)
		{
			elementObj['on' + eventName] = eventHandlerFunctionName;
		}
		else
		{
			elementObj['on' + eventName] = function(e) { currentEventHandler(e); eventHandlerFunctionName(e); }
		}
	}
}

//******************************************************************************************
// This function removes all children from object when given parentID is match
// to child parentID.
//******************************************************************************************
function divPropertiesRemoveChildrens(parentID)
{
	for (i = divProperties.children.length; i > 0; i--)
	{
		if (divProperties.children[i-1].parentID == parentID)
			divProperties.removeChild(divProperties.children[i-1]);			
	}
}

//******************************************************************************************
// Gets the current event target object.
//******************************************************************************************
function getEventObject()
{ 
	return (this.event.target != null) ? this.event.target : this.event.srcElement;
}


//******************************************************************************************
// Responsible to redirect user to QuickFinder.aspx page with selecte data.
//******************************************************************************************
function redirectToQuickFinder()
{
	initializeProperties(true);

	//Create the new url with parameters.
	urlSelectItems = "";
	urlSelectItems += quickFinderURL;
	urlSelectItems += getQuickFinderParams();

	window.location.href = urlSelectItems;
}

//******************************************************************************************
// Get value\text from radio button.
//******************************************************************************************
function getCheckedValue(obj)
{
	for (i = 0; i < obj.length; i++)
		if (obj[i].checked) return obj[i].value;
		
	return 0;
}
function getCheckedText(obj)
{
	for (i = 0; i < obj.length; i++)
		if (obj[i].checked) return obj[i].text;
		
	return 0;
}

//******************************************************************************************
// Get value\text from select box.
//******************************************************************************************
function getSelectedValue(obj)
{
	for (i = 0; i < obj.length; i++)
		if (obj.options[i].selected && obj.options[i].value != "") return obj.options[i].value;
	
	return null;
}
function getSelectedText(obj)
{
	for (i = 0; i < obj.length; i++)
		if (obj.options[i].selected) return obj.options[i].text;
	
	return null;
}



//******************************************************************************************
// Here we call to QuickFinderSelectBox once by this function.
// Initizlized dictionery values from server.
//******************************************************************************************
initializeDictioneryValues();
callQuickFinder();