// numeric and date field are implemented as multiple <span> elements
// each <span> becomes visible or hidden based on the selected option.
// for example, the numeric field has the following options:
// "equal", "grether then", "less then" and "from"
// when selecting the "from" option
// we show the <span id='num_from_num1' style='display:block'> and
// hide all the other <span> elements that render "equal", "grether then" and "less then"
// and also cleans all the <input> values.
//
// (*) the same applies also to date field.
function changeFieldOperator(obj)
{
	var parentDiv =  getAncestorElement(obj, "div");
	//the DateField ID

	//get reference to hiddenFields of date
	var hiddenFields = parentDiv.getElementsByTagName("INPUT");
	var equalsHiddenField = hiddenFields[0];
	var fromHiddenField = hiddenFields[1];
	var toHiddenField = hiddenFields[2];

	var fieldName = parentDiv.id;
	//the DataType can be either date or numeric
	var dataType = parentDiv.dataType;
	//selected mode
	var mode = obj.options[obj.selectedIndex].value;

	// dates/Numeric Field  reference
	var field1 = document.getElementById(dataType+"_field1_"+fieldName);
	var field2 = document.getElementById(dataType+"_field2_"+fieldName);

	// display the second "To" value selection (either To date or To numeric)
	if(mode=="From")
	{
		field1.style.display = "inline"; //show field1

		if(dataType=="Date")
			field1.inputID = "control_"+dataType+"_From_"+fieldName; //set reference to relevant hidden
		else
			field1.firstChild.name = "control_"+dataType+"_From_"+fieldName; //set HiddenInput Name

		field2.style.display = "inline"; //show field2

		if(dataType=="Date")
			field2.inputID = "control_"+dataType+"_To_"+fieldName; //set reference to relevant hidden
		else
			field2.childNodes[1].name = "control_"+dataType+"_To_"+fieldName; //set HiddenInput Name

		//reset the hiddenInput of Equals
		if(dataType=="Date")
			equalsHiddenField.value = "";

	}
	else
	{
		field1.style.display = "inline"; //show field1

		if(dataType=="Date") //Date
		{
			if(mode=="After")
			{
				field1.inputID = "control_" + dataType + "_From_" + fieldName;
				//reset the irrelevant fields
				equalsHiddenField.value = "";
				toHiddenField.value = "";
			}
			else if(mode=="Before")
			{
				field1.inputID = "control_" + dataType + "_To_" + fieldName;
				//reset the irrelevant fields
				equalsHiddenField.value = "";
				fromHiddenField.value = "";
			}
			else if(mode=="Equals")
			{
				field1.inputID = "control_" + dataType + "_Equals_" + fieldName; //set reference to relevant hidden
				//reset the irrelevant fields
				fromHiddenField.value = "";
				toHiddenField.value = "";
			}
		}
		else // Numeric
		{
			if(mode=="Greater")
			{
				field1.firstChild.name = "control_" + dataType + "_From_" + fieldName;
				//reset the irrelevant fields
				field2.value = "";
			}
			else if(mode=="Less")
			{
				field1.firstChild.name = "control_" + dataType + "_To_" + fieldName;
				//reset the irrelevant fields
				field2.value = "";
			}
			else
			{
				field1.firstChild.name = "control_" + dataType + "_Equals_" + fieldName;
				//reset the irrelevant fields
				field2.value = "";
			}

			field2.childNodes[1].name = "undef_"+fieldName;
		}

		field2.style.display = "none";  //hide field2

		if(dataType=="Date")
			field2.inputID = ""; //set reference to no hidden
	}
	//update fields values in hiddenInputs
	setDate(field1);
	setDate(field2);
}


/* this function get a date as number in the format:
*  yyyymmdd and a delimiter like '/' and returns the
*  date string as dd/mm/yyyy
*/
function getDateStr(a_date,a_delimiter)
{
	var year = a_date.substring(0,4);
	var month=a_date.substring(4,6);
	var day=a_date.substring(6,8);
	return day+a_delimiter+month+a_delimiter+year;
}

// get ancestor element by tag name
// find the first <tagName> element that contains the <srcObj>
function getAncestorElement(srcObj, tagName)
{
	while( srcObj.tagName.toLowerCase() != tagName.toLowerCase() )
	{
		srcObj = srcObj.parentNode;
	}

	return srcObj;
}

// the date field has visible <select> options.
// when a value is selected in one of day/month/year
// this function is called and it takes the 3 selected values (day, month, year)
// and creates from them the format yyyymmdd and set it to the hidden <input>
// that is sent by the form to the action.
function setDate(fieldContainer)
{
	var parentDiv;
	//if no container for the date/Numeric fields was given take the parent of the eventElement as parent
	if(!fieldContainer)
	{
		obj = event.srcElement; //get the last changed select tag
	    parentDiv =  obj.parentElement; //get the date container div

	}
	else
	{
		parentDiv = fieldContainer;
	}

	// get the day, month and year data
	var divChildren = parentDiv.getElementsByTagName("select"); //get the day/month/year fields
	var day=0;
	var month=0;
	var year=0;
	for(var i = 0; i < divChildren.length; i++)
	{
		var value = divChildren[i].options[divChildren[i].selectedIndex].value;
		if( divChildren[i].id == 'day')
		{
			day=value;
		}
		else if( divChildren[i].id == 'month')
		{
			month=value;
		}
		else if( divChildren[i].id == 'year')
		{
			year=value;
		}
	}
	// set the date element leading zero
	// 1 become 01 etc.
	if (day.length == 1)
		day = "0" + day;
	if (month.length == 1)
		month = "0" + month;
	var date = year+month+day;

	//check if it's a valid date
	if(date.length!=8)
		return false;

	//update the relevant hiddenInput with the date value
	dateHiddenInputField = document.getElementById(parentDiv.inputID);
	dateHiddenInputField.value = date;
}

function openTermsWindow (ID,formName,a_title)
{
	var currentTime = new Date();
	var time = currentTime.getTime();
	var url = "ShowTerms.do?termFieldId=" + ID + "&formName=" + formName + "&title=" + a_title ;
	var fieldValue = document.getElementById(ID).value;
	if (fieldValue != "")
		url += "&prefix=" + fieldValue;
	url = URLUtil.getVerifiedUrl(url,version);

	window.open(url+"&popup=true",ID + "_Terms_" +  time ,"height=350,width=320,status=no,toolbar=no,menubar=no,location=no,scrollbars=no,resizable=no,dependent=yes");
}


function createSelect(a_id, a_class, a_onChangeFunc)
{
	var selectField = document.createElement("SELECT");
	selectField.className = a_class;
	selectField.id = a_id;
	selectField.onchange = a_onChangeFunc;
	return selectField;
}

function buildDateField(a_containerID,a_value,a_class,a_onchangeEvent)
{
	var startYear = 1980;
	var endYear   = 2099;
	var container = document.getElementById(a_containerID);

	//define inital values
	var selYear = -1;
	var selMonth= -1;
	var selDay  = -1;
	if(a_value!='')
	{
		selYear = a_value.substring(0,4);
		selMonth = a_value.substring(4,6);
		if(selMonth.indexOf("0")==0)
			selMonth = selMonth.substring(1);
		selDay = a_value.substring(6,8);
		if(selDay.indexOf("0")==0)
			selDay = selDay.substring(1);
	}


	//create days select
    daysSelect = createSelect("day", a_class, a_onchangeEvent)
	//add empty day
	daysSelect.options[0] = new Option(Message.DateTag_Day,"");
	//add days
	for(days=1; days<=31; days++)
	{
		daysSelect.options[days] = new Option(days,days);
		if(days==selDay)
			daysSelect.options[days].selected=true;
	}
	container.appendChild(daysSelect);


	//create months select
	var monthSelect = createSelect("month", a_class, a_onchangeEvent)
	//add empty month
	monthSelect.options[0] = new Option(Message.DateTag_Month,"");
	//add months
	for(months=1; months<=12; months++)
	{
		monthSelect.options[months] = new Option(monthsArr[months-1],months);
		if(months==selMonth)
			monthSelect.options[months].selected=true;
	}
	container.appendChild(monthSelect);

	//create years select
	var yearSelect = createSelect("year", a_class, a_onchangeEvent)
	//add empty year
	yearSelect.options[0] = new Option(Message.DateTag_Year,"");
	//add years
	for(years=startYear; years<=endYear; years++)
	{
		yearSelect.options[years-startYear+1] = new Option(years,years);
		if(years==selYear)
			yearSelect.options[years-startYear+1].selected=true;
	}
	container.appendChild(yearSelect);
}

function submitForm(a_searchForm)
{
	// array of empty input elements. All these elements should be removed before submit.
	// In this way we can decrease url string length
	//(to avoid using "post" and reloading problems as a result)
	var elsToRemove = new Array();
	var j = 0;
	var isRelevanceRanking = false;

	var isEmpty = true;
	var inputControls = a_searchForm.getElementsByTagName("input");
	// check that at least one is selected
	for(var i = 0; i < inputControls.length; i++)
	{
		var controlName = inputControls[i].name;

		// check if this is a search control
		if( controlName.length > 0 && controlName.substring(0,8) == "control_" )
		{
			// it is a search control, if it is not empty submit the form
			if( inputControls[i].value.length > 0)
				isEmpty = false;
			else
				elsToRemove[j++] = inputControls[i];

			//check if its a numeric control and if its range is valid
			if(controlName.indexOf("control_Numeric_")!=-1)
			{
				//get numeric field name
				fieldName = controlName.substring(controlName.indexOf("_",16)+1,controlName.length);

				//get the from field and value
				fromContainer = document.getElementById("Numeric_field1_"+fieldName);
				var fromValue = "";
				if(fromContainer.style.display!="none")
					fromValue = fromContainer.childNodes[0].value;

				//get the to field and value
				toContainer = document.getElementById("Numeric_field2_"+fieldName);
				var toValue = "";
				if(toContainer.style.display!="none")
					toValue = toContainer.childNodes[1].value;

				//check if the from-to range is valid
				if(fromValue!="" && toValue!="" && parseInt(fromValue)>parseInt(toValue) )
				{
					alert("The numeric range is not valid. ("+fromValue+" - "+toValue+")");
					return false;
				}
			}

			if(controlName.indexOf("control_Date_")!=-1)
			{
				//get Date field name
				fieldName = controlName.substring(controlName.indexOf("_",13)+1,controlName.length);
				var fromDate = a_searchForm["control_Date_From_"+fieldName].value;
				var toDate = a_searchForm["control_Date_To_"+fieldName].value;
				if(fromDate!="" && toDate!="" && parseInt(fromDate)>parseInt(toDate))
				{
					alert("The date range is not valid. ("+getDateStr(fromDate,'/')+" - "+getDateStr(toDate,'/')+")");
					return false;
				}
			}
			
			


		}
	// check if this is a RelevanceRanking control
		if( controlName.length > 0 && controlName == "relevanceRanking" )
		{
			// it is a search control, if it is not empty submit the form
			if( inputControls[i].checked)
			{
				isRelevanceRanking = true;
				inputControls[i+1].name="";
				inputControls[i+2].name="";
			}
			else
			{
				inputControls[i+1].value="A";
				inputControls[i+2].value="TITLE";
			}
		}
	}

	if( isEmpty )
		alert("Please enter a search query");
	else
	{
		// remove the name of the empty inputs to get
		// short string for bookmark attribute(queryBean)
		while (j > 0)
			elsToRemove[--j].name="";

		a_searchForm.submit();
	}
}

function resetForm()
{
/*
	//reset the form
	document.forms[0].reset();
	//get all input fields
	inputElements = document.getElementsByTagName("input");
	//get all select fields
	SelectElements = document.getElementsByTagName("select");

	//reset all input field from the type text
	for(i=0;i<inputElements.length;i++)
	{
		var controlName = inputElements[i].name;
		if(controlName.indexOf("control_")==0 )
			inputElements[i].value = "";
	}

	//set all select fields to first option
	//and activate the onChange event of each field which has it
	for(j=0;j<SelectElements.length;j++)
	{
		SelectElements[j].selectedIndex = 0;
		if(SelectElements[j].onchange!=null)
			SelectElements[j].onchange();
	}
	*/
	document.location = 'ClearQueryFromSession.do';
}


