/*
GOOGLE FORM PARSER
------------------
Version: 2.0
Date: December 29, 2005
Author: Mehran Ahmad
*/
function parseGoogleForm(formName)
{
	var regex;

	var gs_q = "";
	var gs_as_q = "";
	var gs_as_oq = "";
	var gs_as_epq = "";
	var gs_daterange_str = "";
	var gs_daterangeF = "";
	var gs_daterangeT = "";

	if(!checkRequiredFormVars(formName)) return false;
	if(isdefined(formName, "gsf_dtFrom")) gs_daterangeF = trimText(stripHTML(formName.gsf_dtFrom.value));
	if(isdefined(formName, "gsf_dtTo")) gs_daterangeT = trimText(stripHTML(formName.gsf_dtTo.value));
	
	gs_q = trimText(stripHTML(formName.gsf_searchString.value));
	gs_as_q = trimText(stripHTML(formName.as_q.value));
	gs_as_oq = trimText(stripHTML(formName.as_oq.value));
	gs_as_epq = trimText(stripHTML(formName.as_epq.value));

	formName.q.value = "";

	// If the query string is empty, return false;
	if(gs_q == "" && gs_as_q == "" && gs_as_oq == "" && gs_as_epq == "")
	{
		alert ("Please specify search phrase");
		formName.gsf_searchString.focus();
		return false;
	}	

	// Process "daterange"
	if(dateRangeSelectionType(formName) == 1)
	{
		// Make sure daterange (if specified in text box) is filled in properly
		if(gs_daterangeF != "" || gs_daterangeT != "")
		{
			// Return an error message if the date is in wrong format
			if(gs_daterangeF == "" || verifyUNDateFormat(gs_daterangeF) == false)
			{
				alert("Invalid date format: must be dd/mm/yyyy");
				formName.gsf_dtFrom.focus();
				return false;
			}
			if(gs_daterangeT == "" || verifyUNDateFormat(gs_daterangeT) == false)
			{
				alert("Invalid date format: must be dd/mm/yyyy");
				formName.gsf_dtTo.focus();
				return false;
			}
			// If rangeFrom is > rangeTo then show error message
			if(compareUNDates(gs_daterangeF, gs_daterangeT) == 1)
			{
				alert('Invalid date range specified. [Starting date must be equal to or before ending date].');
				formName.gsf_dtFrom.focus();
				return false;
			}
			
			// Remove daterange from search query (if any) to replace with new one
			if(gs_q != "")
			{
				regexp = new RegExp("daterange:[^ ]*", 'g');
				gs_q = gs_q.replace(regex, "");
			}

			gs_daterange_str = trimText(getDateRangeString(gs_daterangeF, gs_daterangeT, ""))
		}
	}
	
	// Handle "d" and "w" as_qdr items (if no "daterange" is specified and as_qdr is)
	if(dateRangeSelectionType(formName) == 2)
	{
		// Remove daterange from search query (if any) to replace with new one
		if(gs_q != "")
		{
			regexp = new RegExp("daterange:[^ ]*", 'g');
			gs_q = gs_q.replace(regex, "");
		}

		gs_daterange_str = trimText(getDateRangeString("", "", formName.as_qdr.value));
	}
	
	// Select the appropriate search "Match" type and place the search phrase
	// inside (this will override all query/exact pharse/exclude text result fields
	if(isdefined(formName, "gsf_match"))
	{
		formName.as_epq.value = "";
		formName.as_oq.value = "";
		formName.as_q.value = "";

		if(formName.gsf_match[formName.gsf_match.selectedIndex].value == "exact")
		{
			formName.as_epq.value = gs_q;
			gs_q = "";
		}
		else if(formName.gsf_match[formName.gsf_match.selectedIndex].value == "any")
		{
			formName.as_oq.value = gs_q;
			gs_q = "";
		}
		else
		{
			formName.as_q.value = gs_q;
			formName.as_epq.value = "";
			formName.as_oq.value = "";
			gs_q = "";
		}
	}

	// Handle selection of multiple collections
	if(isdefined(formName, "gsf_site"))
	{
		var gs_colsearch = "";

		// Interate thru the site list and get the sites
		// that are selected
		for(i = 0; i < formName.gsf_site.length; i++)
		{
			if(formName.gsf_site[i].checked)
			{
				if(gs_colsearch == "")
					gs_colsearch = formName.gsf_site[i].value;
				else
					gs_colsearch += ("|" + formName.gsf_site[i].value);
			}
		}

		// If sites were chosen, restrict the search to those sites
		if(gs_colsearch.length > 0)
		{
			formName.site.value = gs_colsearch;
		}
	}

	formName.q.value = trimText(gs_q + " " + gs_daterange_str);
	return true;
}

function getDateRangeString(gs_daterangeF, gs_daterangeT, qdr_val)
{
	var dateMin, dateMax;
	
	// Parse the daterange in the form
	if(gs_daterangeF != "" && gs_daterangeT != "")
	{
		var dateMinA = gs_daterangeF.split("/");
		var dateMaxA = gs_daterangeT.split("/");

		// Determine the julian dates of start and end
		dateMin = julDate(parseFloat(dateMinA[2]), parseFloat(dateMinA[1]), parseFloat(dateMinA[0]));
		dateMax = julDate(parseFloat(dateMaxA[2]), parseFloat(dateMaxA[1]), parseFloat(dateMaxA[0]));

		// return a string consisting of the date range
		return  "daterange:" + dateMin + "-" + dateMax;
	}
	// Otherwise, check if user chose week or days to search and append the proper daterange string
	else if(qdr_val.charAt(0) == "d" || qdr_val.charAt(0) == "w")
	{
			var n = parseInt(qdr_val.substring(1));
			
			// If we are calculating weeks, multiply by 7
			if(qdr_val.charAt(0) == "w") n *= 7;

			// Get today's date
			var date1 = new Date();
			
			// Get the date n days before
			var date2 = offsetDays(date1, (n * -1));

			// Determine the julian dates of start and end
			dateMax = julDate(date1.getFullYear(), date1.getMonth()+1, date1.getDate());
			dateMin = julDate(date2.getFullYear(), date2.getMonth()+1, date2.getDate());

			// return a string consisting of the date range
			return  "daterange:" + dateMin + "-" + dateMax;
	}
	else
	{
		return "";
	}
}

// Returns the type of datarange selection
// 0 = none
// 1 = daterange
// 2 = as_qdr
function dateRangeSelectionType(formName)
{
	if(isdefined(formName, "gsf_searchDateRange2"))
	{
		if(isdefined(formName, "gsf_dtTo") && isdefined(formName, "gsf_dtFrom"))
			return 1;
		else
			return 0;
	}

	if(!isdefined(formName, "gsf_searchDateRange")) return 0;

	if(isarray(formName.gsf_searchDateRange))
	{
		if(formName.gsf_searchDateRange[0].checked)
		{
			if(isdefined(formName, "as_qdr"))
				return 2;
			else
				return 0;
		}
		else if(formName.gsf_searchDateRange[1].checked)
		{
			if(isdefined(formName, "gsf_dtTo") && isdefined(formName, "gsf_dtFrom"))
				return 1;
			else
				return 0;
		}
	}
	else
	{
		if(formName.gsf_searchDateRange.value == "")
		{
			if(isdefined(formName, "as_qdr"))
				return 2;
			else
				return 0;
		}
		else if(formName.gsf_searchDateRange.value == "range")
		{
			if(isdefined(formName, "gsf_dtTo") && isdefined(formName, "gsf_dtFrom"))
				return 1;
			else
				return 0;
		}
	}
	
	return 0;
}

// this function makes sure that the form contains all the required variables
function checkRequiredFormVars(formName)
{
	var strAlert = "";
	if(!isdefined(formName, "gsf_searchString")) strAlert = "gsf_searchString";
	else if(!isdefined(formName, "site")) strAlert = "site";
	else if(!isdefined(formName, "as_q")) strAlert = "as_q";
	else if(!isdefined(formName, "as_oq")) strAlert = "as_oq";
	else if(!isdefined(formName, "as_epq")) strAlert = "as_epq";
	else if(isdefined(formName, "gsf_searchDateRange"))
	{
		if(isdefined(formName, "gsf_dtFrom") && !isdefined(formName, "gsf_dtTo")) strAlert = "gsf_dtTo";
		else if(isdefined(formName, "gsf_dtTo") && !isdefined(formName, "gsf_dtFrom")) strAlert = "gsf_dtFrom";
	}
	else if(isdefined(formName, "gsf_searchDateRange2"))
	{
		if(!isdefined(formName, "gsf_dtTo")) strAlert = "gsf_dtTo";
		else if(!isdefined(formName, "gsf_dtFrom")) strAlert = "gsf_dtFrom";
	}
	
	if(strAlert != "")
	{
		alert(strAlert + " needs to be defined");
		return false;
	}
	else
	{
		return true;
	}
}

function isdefined(object, variable)
{
	return (typeof(eval(object)[variable]) != 'undefined');
}

function isarray(object)
{
  return (typeof(object) == 'object' && isdefined(object, "length"));
}
