// global search variables

var refineDate = new Date();
var refineYear = refineDate.getFullYear();
var firstYear = 1954;
var myDecade = ( refineYear.toString() ).substr( 0, 3 );
var refineString = ""; // this will be refine search data that display on page
var monthsArr = new Array('January','February','March','April','May','June','July','August','September','October','November','December');

////////////////////////////////////////////////////////////////////////////

// populates date drop lists
function populate(objForm,selectIndex,mfield,dfield,yfield) {
	var daySelectedIndex = dfield.selectedIndex;
	//alert("daySelectedIndex: " + daySelectedIndex)
	timeA = new Date(yfield.options[yfield.selectedIndex].text,mfield.options[mfield.selectedIndex].value,1);
	timeDifference = timeA - 86400000;
	timeB = new Date(timeDifference);
	var daysInMonth = timeB.getDate();
	
	// all options get removed
	for (var i = 0; i < dfield.length; i++) {
		dfield.options[0] = null;
	}
	// blank option is written
	dfield.options[0] = new Option("", "");
	// options are written based on # of days in month
	for (var i = 0; i < daysInMonth; i++) {
		var value = ZeroFill( i + 1 );
		var text = ZeroFill( i + 1 );
		dfield.options[i + 1] = new Option(text, value);
	}
	// if the original daySelectedIndex exists reset as selected, if not select option[1]
	if(dfield.options[daySelectedIndex])
	{
		dfield.options[daySelectedIndex].selected = true;
	}
	else
	{
		dfield.options[1].selected = true;
	}

	//getYears(yfield);
	return true
}

//////////// INITIALIZE SEARCH FUNCTIONS /////////////

function getYears(field) {

	var years = new Array()
	var i = 0;
	for(var x=firstYear; x<=refineYear; x++)
	{
		years[i] = x;
		i = i + 1;
	}
	
	for (var i = 1; i < field.length; i++) {
		field.options[i0] = null;
	}

	for (var i = 0; i < years.length; i++) {
		field.options[i + 1] = new Option(years[i],years[i]);
	}
	field.options[0].selected=true;
}


function setAdvancedSearch(){

	if((searchNotVal != "") ||
		(searchPhraseVal != "") ||
		(searchOrVal != ""))
	{
		toggleBox("advancedSearch", "open");
		return true;
	}
	else
	{
		toggleBox("advancedSearch", "close");
	}
	return false;

}

function toggleBox(boxid, action){

	var box = document.getElementById(boxid);
	if(action == "open")
	{
		box.style.display = "";
		isAdvanced = true;
	}
	else if(action == "close")
	{
		box.style.display = "none";
		isAdvanced = false;
	}
	else
	{
		return false;
	}

}


function populateDropdown( objname, objsuffix, start, end, order ) { // generate numerical dropdowns
	var obj = cnnGetObject( objname + objsuffix );
	if( obj ) {
		if( order == "des" ) {
			for( var optCounter=start; optCounter <= end; optCounter++ ) {
				var text = ZeroFill( optCounter );
				var value = ZeroFill( optCounter );
				if( objsuffix == "m" ) {
					text = date_arr[optCounter][0];
					value = ZeroFill( optCounter + 1 );

				} else if( objname == "decade" ) {
					text = text + "0s";
					value = value + "0";
				}
				obj.options[obj.options.length] = new Option( text, value );
				
			}
		} else {
			for( var optCounter=end; optCounter >= start; optCounter-- ) {
				var text = ZeroFill( optCounter );
				var value = ZeroFill( optCounter );
				if( objsuffix == "m" ) {
					text = date_arr[optCounter][0];
					value = ZeroFill( optCounter + 1 );
				} else if( objname == "decade" ) {
					text = text + "0s";
					value = value + "0";
				}
				obj.options[obj.options.length] = new Option( text, value );
			}
		}
	}
}

//////////// END INITIALIZE SEARCH FUNCTIONS /////////////

/*
//////////////////////

	variables for search and refine search set in common/search.ftl

//////////////////////
*/

function submitRefineForm(rForm,numperpage){
	//alert("in submitRefineForm");
	var thisSearchType = searchTypeVal;
	return submitSearchForm(document.searchForm,rForm,numperpage,thisSearchType)
}

function submitRefineTopicForm(rForm){
	//alert("in submitRefineTopicForm");
	var startDate = "";
	var endDate = "";
	
	var startMonth = rForm.startm.value;
	var startDay = rForm.startd.value;
	var startYear = rForm.starty.value;
	var endMonth = rForm.endm.value;
	var endDay = rForm.endd.value;
	var endYear = rForm.endy.value;
	var decade = rForm.decade.value;
	

	// build date strings from select list values
	startDate = buildDateStringTopic(startMonth,startDay,startYear);
	endDate = buildDateStringTopic(endMonth,endDay,endYear);
	
	// cannot enter both a decade and dates
	if( (decade != "" && startDate != "") || (decade != "" && endDate != ""))
	{
		alert("Please enter either a decade or start and/or end dates.")
		return false
	}
	
	// if decade value is present, start and end date values use decade field 
	if(decade != "" && startDate == "" && endDate == "")
	{
		var beginYear = parseInt(decade);
		var endYear = beginYear + 9;
			
		// set new start and end date values
		startDate = buildDateStringTopic("01", "01", beginYear);
		endDate = buildDateStringTopic("12", "31", endYear);
	}
	
	if(startDate == "")
	{
		startDate = defaultTopicBeginDate;
	}
	if(endDate == "")
	{
		endDate = defaultTopicEndDate;
	}
	if(assetSubType == "article")
	{
		sortOrder = "mdd";
	}
	if(assetSubType == 'video')
	{
		var loc = vaultServerPath + '/' + assetType + '/' + assetSubType + '/' + topic + '/' + startDate + '/' + endDate + '/' + indexsuffix;
	}
	else
	{
		var loc = vaultServerPath + '/' + assetType + '/' + assetSubType + '/' + topic + '/' + startDate + '/' + endDate + '/' + sortOrder + '/' + indexsuffix;
	}
	//alert(loc);
	window.location = loc;
	return false
}

function submitRefineCoverForm(rForm){
	var startDate = "";
	var endDate = "";
	
	var startMonth = rForm.startm.value;
	var startDay = rForm.startd.value;
	var startYear = rForm.starty.value;
	var endMonth = rForm.endm.value;
	var endDay = rForm.endd.value;
	var endYear = rForm.endy.value;
	var decade = rForm.decade.value;
	
//alert("submitRefineCoverForm decade" + decade + "\n");
	// build date strings from select list values
	startDate = buildDateStringTopic(startMonth,startDay,startYear);
	endDate = buildDateStringTopic(endMonth,endDay,endYear);
	
	// cannot enter both a decade and dates
	if( (decade != "" && startDate != "") || (decade != "" && endDate != ""))
	{
		alert("Please enter either a decade or start and/or end dates.")
		return false
	}
	
	// if decade value is present, start and end date values use decade field 
	if(decade != "" && startDate == "" && endDate == "")
	{
		var beginYear = parseInt(decade);
		var endYear = beginYear + 9;
			
		// set new start and end date values
		startDate = buildDateStringTopic("01", "01", beginYear);
		endDate = buildDateStringTopic("12", "31", endYear);
	}
	
	if(startDate == "")
	{
		startDate = defaultTopicBeginDate;
	}
	if(endDate == "")
	{
		endDate = defaultTopicEndDate;
	}

	if(assetSubType == 'select' || (assetType == 'swimsuit' && assetSubType == 'cover'))
	{
		var loc = vaultServerPath + '/' + assetType + '/' + assetSubType + '/' + startDate + '/' + endDate + '/dd/1/' + indexsuffix;
	}

	//alert(loc);
	window.location = loc;
	return false
}

function submitSearchForm(form,refineform,numperpage,rfsearchtype){
	var startDate = "";
	var endDate = "";
	var query = "";
	var exactClause = "";
	var notClause = "";
	var orClause = "";
	var allClause = "";
	var currentPage = "1";
	var npp = numperpage; 	
	var startIndex = "1";
	var searchType = "mag_article"; // this type of search will always return the article view
	
	var searchUrl = form.action; // this is the url to submit the form
	if(rfsearchtype && rfsearchtype != "")
	{
		var searchType = rfsearchtype;
		searchUrl = vaultServerPath + '/' + assetType + '/' + assetSubType  + '/' + indexsuffix;
		//alert(searchUrl);
	}
	
	query = form.query.value;	
	
	// if advanced search fields are open, get field values
	if(isAdvanced)
	{
		//alert("is advanced");
		exactClause = form.exactClause.value;
		notClause = form.notClause.value;
		orClause = form.orClause.value;
	}
	
	/*
	 	change for IDOL search upgrade
	 	if any advanced search terms are used, we need to populate the allClause with the query value
	 	IDOL does not look at the query param when performing an advanced search
	*/
	
	if( exactClause != "" || 
		notClause != "" ||
		orClause != "")
	{
		allClause = query;
	}
	
	// check for refine search existence and data 
	if(refineform != "no")
	{
		if(refineform.elements[0])
		{
			var refineForm = refineform;
			var startMonth = refineForm.startm.value;
			var startDay = refineForm.startd.value;
			var startYear = refineForm.starty.value;
			var endMonth = refineForm.endm.value;
			var endDay = refineForm.endd.value;
			var endYear = refineForm.endy.value;
			var decade = refineForm.decade.value;
	
			// build date strings from select list values
	
			startDate = buildDateString(startMonth,startDay,startYear);
			endDate = buildDateString(endMonth,endDay,endYear);
			
			// if decade value is present, start and end date values use decade field 
			if(decade != "" && startDate == "" && endDate == "")
			{
				var beginYear = parseInt(decade);
				var endYear = beginYear + 9;
				//alert(beginYear + "  " + endYear);
				
				// set new start and end date values
				startDate = buildDateString("01", "01", beginYear);
				endDate = buildDateString("12", "31", endYear);
			}
		}
	}
	
	
	
	var formValueArray = new Array();
		formValueArray['searchType'] = searchType;
		formValueArray['query'] = query;
		formValueArray['exactClause'] = exactClause;
		formValueArray['notClause'] = notClause;
		formValueArray['orClause'] = orClause;
		formValueArray['startDate'] = startDate;
		formValueArray['endDate'] = endDate;
		formValueArray['currentPage'] = currentPage;
		formValueArray['npp'] = npp;
		formValueArray['start'] = startIndex;
		formValueArray['allClause'] = allClause;

	//alert("startDate: " + startDate + " endDate: " + endDate);
	
	if(	validateRequired(formValueArray) &&
		validateQueryChars(formValueArray) &&
		validateEndDate(startDate,endDate))
	{
	
		var queryString = buildQueryString(formValueArray, searchType);
		window.location = searchUrl + queryString;
	}
	return false
}

function submitBottomSearchForm(form,numperpage){
	//alert('submitBottomSearchForm');
	//alert(isAdvanced);
	var startDate = "";
	var endDate = "";
	var query = "";
	var exactClause = "";
	var notClause = "";
	var orClause = "";
	var currentPage = "1"; 		// search always returns page 1
	var npp = numperpage; 		// number per page
	var startIndex = "1";
	var searchType = "mag_article"; // this type of search will always return the article view
	
	query = form.queryb.value;
	
	// if advanced search fields are open, get field values
	if(isAdvanced)
	{
		exactClause = form.exactClauseb.value;
		notClause = form.notClauseb.value;
		orClause = form.orClauseb.value;
	}
	var formValueArray = new Array();
		formValueArray['searchType'] = searchType;
		formValueArray['query'] = query;
		formValueArray['exactClause'] = exactClause;
		formValueArray['notClause'] = notClause;
		formValueArray['orClause'] = orClause;
		formValueArray['startDate'] = startDate;
		formValueArray['endDate'] = endDate;
		formValueArray['currentPage'] = currentPage;
		formValueArray['npp'] = npp;
		formValueArray['start'] = startIndex;
		
	//alert("about to validate");
	if(validateRequired(formValueArray)&&
	   validateQueryChars(formValueArray))
	{
		var queryString = buildQueryString(formValueArray, searchType);
		//alert(queryString);
		window.location = form.action + queryString;

	}

	return false
}


//////////// POPULATE FIELDS FUNCTIONS /////////////

function populateTextSearchFields(){
	
	var searchAll = document.getElementById('querytop');
	var searchNot = document.getElementById('notClause');
	var searchPhrase = document.getElementById('exactClause');
	var searchOr = document.getElementById('orClause');
	
	searchAll.value = searchAllVal;
	searchNot.value = searchNotVal;
	searchPhrase.value = searchPhraseVal;
	searchOr.value = searchOrVal;
}

function processDateData(smfield, sdfield, syfield, sdate, emfield, edfield, eyfield, edate){
	var smonth = "";
	var sday = "";
	var syear = "";
	var emonth = "";
	var eday = "";
	var eyear = "";
	if(sdate != "")
	{
		var smonth = getMonth(sdate);
		var sday = getDay(sdate);
		var syear = getYear(sdate);
	}
	if(edate != "")
	{
		var emonth = getMonth(edate);
		var eday = getDay(edate);
		var eyear = getYear(edate);
		// if the end year is later than the current year, use current year
		// this would happen if no end date was selected in refine search box
		if(eyear > refineDate.getFullYear())
		{
			eyear = refineDate.getFullYear();
		}
	}
	var isDecade = checkDateForDecade(smonth,sday,syear,emonth,eday,eyear)
	if(isDecade) // populate decade field
	{
		populateDecadeData(sdate);
	}
	else // populate date fields
	{
		//alert('this is not a decade');
		createRefineString(smonth, sday, syear, sdate, emonth, eday, eyear, edate);
		populateDateData(smfield, sdfield, syfield, sdate, smonth, sday, syear);
		populateDateData(emfield, edfield, eyfield, edate, emonth, eday, eyear);
	}
}

/* 
	createRefineString and writeRefineString
	writes out red date range, or decade, above the refine search box
*/
function createRefineString(smonth, sday, syear, sdate, emonth, eday, eyear, edate){
	var dStart = "";
	var dEnd = "";
	if(sdate != "")
	{
		var dStartMonth = monthsArr[setArrIndex(smonth)];
		var dStart = dStartMonth + " " + sday + ", " + syear;
	}
	if(edate != "")
	{
		var dEndMonth = monthsArr[setArrIndex(emonth)];
		var dEnd = " to " + dEndMonth + " " + eday + ", " + eyear;
		if(sdate == "")
		{
			dEnd = "August 16, 1954 " + dEnd; // 08/16/54 is date of first SI issue
		}
	}
	refineString = dStart + dEnd
	if(refineString != "")
	{
		writeRefineString();
	}
}

function writeRefineString (){
	if(assetType != "cover" && assetSubType != "select")
	{
  	var theBox = document.getElementById('refineData');
  	theBox.innerHTML = refineString;
  	theBox.style.display = "";
	}
}

function setArrIndex(str){
	if(str.charAt(0) == '0')
	{
		str = str.substr(1);
	}
	strIndex = parseInt(str) - 1;
	return strIndex;
}

function checkDateForDecade(sm, sd, sy, em, ed, ey){
	// check to see if start year ends with 0
	if(sy.substr(3) == '0')
	{
		var syear = parseInt(sy);
		var eyear = parseInt(ey);
		
		if( (syear + 9) == eyear)
		{
			if((sm == "01") && (sd == "01") && (em == "12") && (ed == "31"))
			{
				return true;
			}
		}
	} 
	return false;
}

function populateDecadeData(date){
	
	var decade = date.substr(0,3);
	var decadeValue = decade + "0";
	var decadeField = document.getElementById('decade');
	for(var x = 0; x < decadeField.options.length; x++)
	{
		if(decadeField.options[x].value == decadeValue)
		{
			decadeField.options[x].selected=true;
			// set refineString variable which will display on page
			refineString = decadeField.options[x].text;  
			writeRefineString();
			return x;
			break;
		}
	}
	return;
}

function populateDateData (mfield, dfield, yfield, date, m, d, y){
	if(date != "")
	{
		var month = m;
		var day = d;
		var year = y;
		
		var monthIndex = populateMonth(mfield,month);
		populateYear(yfield,year);
		// run populate script to get correct days for month and year
		populate("",monthIndex,mfield,dfield,yfield);
		populateDay(dfield,day);

	}
	else 
	{
		return false;
	}
}

function populateMonth(mfield,month){
	
	for(var x = 0; x < mfield.options.length; x++)
	{
		if(mfield.options[x].value == month)
		{
			mfield.options[x].selected=true;
			return x;
			break;
		}
	}
	return;
}

function populateDay(dfield,day){

	for(var x = 0; x < dfield.options.length; x++)
	{
		if(dfield.options[x].value == day)
		{
			dfield.options[x].selected=true;
			break;
		}
	}
	return;

}

function populateYear(yfield,year){

	for(var x = 0; x < yfield.options.length; x++)
	{
		if(yfield.options[x].value == year)
		{
			yfield.options[x].selected=true;
			//return x;
			break;
		}
	}
	return;

}

function getMonth(date){
	var dateParts = new Array()
	//dateParts = date.split('/');
	dateParts = date.split('-');
	return dateParts[1];
}

function getDay(date){
	
	var dateParts = new Array()
	//dateParts = date.split('/');
	dateParts = date.split('-');
	return dateParts[2];
}

function getYear(date){
	var dateParts = new Array()
	//dateParts = date.split('/');
	dateParts = date.split('-');
	return dateParts[0];
}

////////////////////////////////////////////////////


////// SUBMIT FORM FUNCTIONS///////////////////////


function buildQueryString(arr, type){
	//the query string cannot start with searchType
	//compositing is looking for a match on '&searchType'
	//do not move location of query and searchType
	var queryString = "?query=" + escape(arr['query']);
	queryString += "&searchType=" + type;
	queryString += "&allClause=" + escape(arr['allClause']);
	queryString += "&exactClause=" + escape(arr['exactClause']);
	queryString += "&notClause=" + escape(arr['notClause']);
	queryString += "&orClause=" + escape(arr['orClause']);
	queryString += "&startDt=" + arr['startDate'];
	queryString += "&endDt=" + arr['endDate'];
	queryString += "&shootId=";
	queryString += "&sortBy=date"; // always sort by date when submitting form
	queryString += "&currentPage=" + arr['currentPage'];
	queryString += "&npp=" + arr['npp'];
	queryString += "&start=" + arr['start'];

	//alert("buildQueryString search.js " + queryString);
	
	return queryString;

}



// need to date later than from date validation

function validateEndDate(sdate,edate){
	// if dates have not value, do not run validate function
	if(sdate != "" && edate != "")
	{
		var sMonth = getMonth(sdate);
		var sDay = getDay(sdate);
		var sYear = getYear(sdate);
		var eMonth = getMonth(edate);
		var eDay = getDay(edate);
		var eYear = getYear(edate);
		
		//alert("sMonth: " + sMonth + " eMonth: " + eMonth);
		
		// month must be the index value of js month array
		jsSMonth = setMonth(sMonth);
		jsEMonth = setMonth(eMonth);
		
		var startTime = new Date(sYear,jsSMonth,sDay);
		var endTime = new Date(eYear,jsEMonth,eDay);
		//alert("start time: " + startTime + "<br/>end time: " + endTime);
		if(endTime < startTime)
		{
			alert("Search Through Date must be later than Search From Date");
			return false;
		}
	}
	return true;
}

function validateRequired(fArr){

	if(	(fArr['query'] == "") &&
		(fArr['exactClause'] == "") &&
		(fArr['notClause'] == "") &&
		(fArr['orClause'] == ""))
	{
		alert("At least one text field is required for a search.");
		return false;
	}
	else
	{
		return true;
	}
	
}

function validateQueryChars(fArr){
	var mask = new RegExp("^[ \\-,_'.a-zA-Z0-9]*$");
	
	if(	mask.test(fArr['query']) &&
		mask.test(fArr['exactClause']) &&
		mask.test(fArr['notClause']) &&
		mask.test(fArr['orClause']))
	{
		return true;
	}
	else
	{
		alert("Your search contains invalid characters.\nPlease enter only letters, numbers, commas, hyphens, underscores, periods and apostrophes.");
		return false;
	}
}


////////////////////////////////////////////////////

///// UTILITY FUNCTIONS ///////////////////////////

function ZeroFill( num ) { // returns one digit numbers as two digits
	return ( ( num <= 9 ) ? ( "0" + num ) : num );
	
}

function cnnGetObject( id ) {
	var object = null;
	if ( document.getElementById ) { object = document.getElementById( id ); }
	else if ( document.all ) { object = document.all[ id ]; }
	return object;
}

function buildDateString(m,d,y){
	var fullDateString = "";
	//alert("buildDateString" + m + d + y);
	if(	(m != "") && 
		(d != "") &&
		(y != ""))
	{
		//fullDateString = m + "/" + d + "/" + y;
		fullDateString = y + "-" + m + "-" + d;
	}
	//alert("fullDateString: " + fullDateString);
	return fullDateString;
	
}

function buildDateStringTopic(m,d,y){
	var fullDateString = "";
	//alert("buildDateString" + y + m + d);
	if(	(m != "") && 
		(d != "") &&
		(y != ""))
	{
		//fullDateString = m + "/" + d + "/" + y;
		fullDateString = y + "-" + m + "-" + d;
	}
	return fullDateString;
	
}

function setMonth(str){
	var theMonth = str;
  	if(str.length==2)
	{
		if(str.charAt(0)=='0')
		{
			var theMonth = theMonth.substring(1)
		}
  	}
	var jsMonth = theMonth-1;
  return jsMonth
}

// clears search dates in form when selecting a new Decade 
function clearSearchDates(rForm) {
	rForm.startm.value = '';
	rForm.startd.value = '';
	rForm.starty.value = '';	
	rForm.endm.value = '';
	rForm.endd.value = '';
	rForm.endy.value = '';
}

function clearDecade(rForm){
	rForm.decade.value = '';
}