/*
 * File: advancedQuery.js
 *
 * Advanced Query Generation and search form field validation
 *
 * Depends upon:
 *      none
 */
 
var reWhitespace = /^\s+$/;
var submitcount=0;

 
function trim(str) {
	for(var i=0;i<str.length;i++) {
		if (str.charCodeAt(i) <= 32) {
			str = str.substring(0,i) + " " + str.substr(i+1)
		}
	}
	str = str.replace(/^[\s]+/g,"");
	str = str.replace(/[\s]+$/g,"");
	return str;
}

//String.prototype.trim = function() {
//  var strThis = this;
//  strThis = strThis.replace(/^\s*(.*)/, "$1");
//  strThis = strThis.replace(/(.*?)\s*$/, "$1");
//  return strThis;
//}

//function getAll() {
//    var strResult = "";
//    strResult = document.getElementById("All").value;
//    strResult = strResult.trim();
//    if ( strResult != "" ) {
//        strResult = strResult.replace(/\s+/g, ", ");
//    }
//    return strResult;
//}

//function getExact() {
//   var strResult = "";
//    strResult = document.getElementById("Exact").value;
//    if ( strResult != "" ) {
//        strResult = '"' + strResult + '"';
//    }
//    return strResult;
//}

function getVQL() {
    var strResult = "";
    strResult = document.getElementById("SrchText").value;
    return strResult;
}

//function getAtLeastOne() {
//    var strResult = "";
//    strResult = document.getElementById("AtLeastOne").value;
//    strResult = strResult.trim();
//    if ( strResult != "" ) {
//        strResult = strResult.replace(/\s+/g, " <OR> ");
//    }
//    return strResult;
//}

//function getNone() {
//    var strResult = "";
//    strResult = document.getElementById("None").value;
//    strResult = strResult.trim();
//    if ( strResult != "" ) {
//        strResult = " " + strResult;
//        strResult = strResult.replace(/\s+/g, " <NOT> ");
//    }
//    return strResult;
//}


function getFieldOrZoneQuery(blnZoneQuery,strFieldOrZoneName) {
    var strResult = "";
    //var blnZoneQuery = true; // change this to true if zone queries are desired for title, author, summary searches, ie: name <IN> Title

    strResult = document.getElementById(strFieldOrZoneName).value;
    strResult = trim(strResult);
    if ( strResult != "" ) {
        if (blnZoneQuery) {
            strResult = "(" + strResult + ")" + " <IN> " + strFieldOrZoneName;
        }
        else {
            strResult =  strFieldOrZoneName + " <CONTAINS> " + strResult;
        }
    }
    return strResult;
}

function getFromToDate(strStartOrEnd) {
    var strResult = "";
    strResult = document.getElementById("SDate" + strStartOrEnd).value;
    strResult = trim(strResult);
    if ( strResult != "" ) {
        if ( strStartOrEnd == "From" ) {
            strResult = "SDate >= " + strResult;
        }
        else if ( strStartOrEnd == "To" ) {
            strResult = "SDate <= " + strResult;
        }
        else {
            strResult = "the argument to the javascript function getDate must be a string that equals either 'Start' or 'End'";
        }
    }
    return strResult;
}

function getDate() {
    var strResult = "";
    var DateFrom = "";
    var DateTo = "";
    var BackDate = "";
    var DateType = "";
	if (document.getElementById("advsrch").value != "2") {
		//DateType = document.getElementById("DateType").value;
		var n = getObjSel(document.srchform.datetype);
		if (n>-1){
			DateType = document.srchform.datetype[n].value;
		}
	} else {
		DateType = document.srchform.datetype.value;
	}
	
	if (n > -1){
		if (DateType.match("1m")) {
			strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
		} else if (DateType.match("3m")) {
			strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
		} else if (DateType.match("1yr")) {
			strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
		} else if (DateType.match("5yr")) {
			strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
		} 
	} else {
		
		if (document.srchform.ST.value != "BI"){
			DateFrom = mmddyyyy2ddmmyyyy(document.srchform.DateFromDD.value + "/" + mmm2mm(document.srchform.DateFromMM.value) + "/" + document.srchform.DateFromYY.value);
			DateTo = mmddyyyy2ddmmyyyy(document.srchform.DateToDD.value + "/" + mmm2mm(document.srchform.DateToMM.value) + "/" + document.srchform.DateToYY.value);		

			if ( DateFrom != "" ) {
				//if ( DateTo != "" ) {
				if ( DateTo != "" ) {
					strResult = "(SDate>=" + DateFrom + ")";
				} else {
					strResult = "(SDate=" + DateFrom + ")";
				}
			}
			if ( DateTo != "" ) {
				if ( DateFrom != "" ) {
					strResult = strResult + " <AND> (SDate<=" + DateTo + ")";
				} else {
					strResult = "(SDate<=" + DateTo + ")";
				}
			}
		} else {
			BackDate = mmddyyyy2ddmmyyyy(document.srchform.BackDD.value + "/" + mmm2mm(document.srchform.BackMM.value) + "/" + document.srchform.BackYY.value);
			if ( BackDate != "" ) {
				strResult = "(SDate=" + BackDate + ")";
			}
		}
	}
    return strResult;
}

function getDateQuick() {
    var strResult = "";
    var DateType = "";

    //DateType = document.getElementById("DateType").value;
	var n = getObjSel(document.srchform.datetype);
	DateType = document.srchform.datetype[n].value;

	if (DateType.match("1d")) {
		strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
	} else {
		strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
	}
    return strResult;
}

function getDateSimple() {
    var strResult = "";
    var DateType = "";
	var n = getObjSelSimple(document.srchform.datetype);
	DateType = document.srchform.datetype[n].value;

	if (DateType.match("14d")) {
		strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
	} else if (DateType.match("7d")) {
		strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
	} else if (DateType.match("1m")) {
		strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
	} else if (DateType.match("3m")) {
		strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
	} else if (DateType.match("6m")) {
		strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
	} else if (DateType.match("1yr")) {
		strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
	} else if (DateType.match("2yr")) {
		strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
	} else if (DateType.match("3yr")) {
		strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
	} else if (DateType.match("5yr")) {
		strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
	} else if (DateType.match("10yr")) {
		strResult = "(SDate>="+ DateType.substr(DateType.indexOf(":")+1,DateType.length) + ")";
	} else if (DateType.match("custom")) {

        if ( DateFrom != "" ) {
            strResult = "(SDate>=" + DateFrom + ")";
        }
		if ( DateTo != "" ) {
			if ( DateFrom != "" ) {
				strResult = strResult + " <AND> (SDate<=" + DateTo + ")";
			} else {
				strResult = "(SDate<=" + DateTo + ")";
			}
        }
	}

    return strResult;
}

function getPubs(objPubs,strQueryMode) {  
	var strResult = "";
    var blnFirstTime = true;
	if (strQueryMode == "1"){
		for(var i=0; i < objPubs.length; i++) {
			if (objPubs[i].selected==true){
				if (objPubs[i].value != ""){
					if (!blnFirstTime) {
						strResult = strResult + ",";
					} else {
						blnFirstTime = false;
					}
					strResult = strResult + "PUB=" + objPubs[i].value + "";
				}
			}
		}
	} else if (strQueryMode == "3"){
		for(var i=0; i < objPubs.length; i++) {
			if (objPubs[i].value != ""){
				if (!blnFirstTime) {
					strResult = strResult + ",";
				} else {
					blnFirstTime = false;
				}
				strResult = strResult + "PUB=" + objPubs[i].value + "";
			}
		}
	} else {
		for(var i=0; i < objPubs.length; i++) {
			if (objPubs[i].selected==true){
				if (objPubs[i].value != ""){
					if (!blnFirstTime) {
						strResult = strResult + ",";
					} else {
						blnFirstTime = false;
					}
					strResult = strResult + "PUB=" + objPubs[i].value + "";
				}
			}
		}
	}
	return strResult;
}


function getObjSel(selectObject) {   
	for (var i=0; i < 4; i++) {      
		if (selectObject[i].checked==true)         
			return i;
	}   
	return -1
}

function getObjSelSimple(selectObject) {   
	for (var i=0; i < 9; i++) {      
		if (selectObject[i].selected==true)         
			return i;
	}   
	return 0;
}

function generateQuery(strQueryMode) {
			if (strQueryMode != "3" && strQueryMode != "4") {
				if (!validateform(strQueryMode)){
					return false;
				}
			}

			var strResult = "";
            // begin generate the new query
            var blnFirstTime = true;
            var strNewQueryArr = new Array();
			
			if (document.srchform.SrchText != undefined) {
				strNewQueryArr[strNewQueryArr.length] = getVQL();            
			}
			//strNewQueryArr[strNewQueryArr.length] = getAll();
            //strNewQueryArr[strNewQueryArr.length] = getExact();
            //strNewQueryArr[strNewQueryArr.length] = getAtLeastOne();
            //strNewQueryArr[strNewQueryArr.length] = getNone();
			/*if (document.getElementById("advsrch").value == "1") {*/
				if (document.srchform.byline != undefined){
					strNewQueryArr[strNewQueryArr.length] = getFieldOrZoneQuery(true,"byline");
				}
				if (document.srchform.edn != undefined){
					strNewQueryArr[strNewQueryArr.length] = getFieldOrZoneQuery(false,"edn");
				}
				if (document.srchform.page != undefined){
					strNewQueryArr[strNewQueryArr.length] = getFieldOrZoneQuery(false,"page");
				}
				if (document.srchform.head != undefined){
					strNewQueryArr[strNewQueryArr.length] = getFieldOrZoneQuery(true,"head");
				}
				if (document.srchform.caption != undefined){
					strNewQueryArr[strNewQueryArr.length] = getFieldOrZoneQuery(true,"caption");
				}
				if (document.srchform.section != undefined){
					strNewQueryArr[strNewQueryArr.length] = getFieldOrZoneQuery(true,"section");
				}
			/*}*/

			if (strQueryMode == "1") {
				strNewQueryArr[strNewQueryArr.length] = getPubs(document.srchform.pubsel,strQueryMode);
				strNewQueryArr[strNewQueryArr.length] = getDate();
			} else if (strQueryMode == "3"){
				strNewQueryArr[strNewQueryArr.length] = getPubs(document.srchform.pubsel,strQueryMode);
				strNewQueryArr[strNewQueryArr.length] = getDateQuick();
			} else {
				strNewQueryArr[strNewQueryArr.length] = getPubs(document.srchform.pubsel,strQueryMode);
				strNewQueryArr[strNewQueryArr.length] = getDateSimple();
			}
            //strNewQueryArr[strNewQueryArr.length] = getDate("Start");
            //strNewQueryArr[strNewQueryArr.length] = getDate("End");

			for(var i=0; i < strNewQueryArr.length; i++) {
                if (strNewQueryArr[i] != "") {
                    if (!blnFirstTime) {
                        strResult = strResult + " <AND> ";
                    }
                    else {
                        blnFirstTime = false;
                    }
                    strResult = strResult + "(" + strNewQueryArr[i] + ")";
                }
            }

			// end generate the new query
		document.getElementById("QueryText").value = strResult;

		//window.document.srchform.submit();
	return true;
}

function validateform(strQueryMode){
	if ( submitcount == 0) {

		if (document.getElementById("advsrch").value != "2") {
		// Validate search date interval
			if (!validateComplete(document.srchform,strQueryMode)){
				return false;
			}
		} else {
			if (!validateQComplete(document.srchform,strQueryMode)){
				return false;
			}
		}
		submitcount++;
		return true;
	} else {
		alert("You have already submitted a search request, please wait ...");
		return false;
	}
}

function validateComplete(formObj,strQueryMode){

	reCustom = / /i;

	//if (emptyField(formObj.SrchText)) {
	//	if (emptyField(formObj.head) && emptyField(formObj.byline) && emptyField(formObj.caption) && emptyField(formObj.edn) && emptyField(formObj.page)){
	//		alert("Please enter keywords");
	//		return false;
	//	}
	//}
	// custom date interval
	if ( formObj.DateFromYY.value != "Year" || formObj.DateFromMM.value != "Month" || formObj.DateFromDD.value != "Day" || formObj.DateToMM.value != "Month" || formObj.DateToDD.value != "Day" || formObj.DateToYY.value != "Year") {
		if (formObj.DateFromDD.value == "Day"){
			alert("Please select search start Day");
		} else if (formObj.DateFromMM.value == "Month"){
			alert("Please select search start Month");
		} else if (formObj.DateFromYY.value == "Year"){
			alert("Please select search start Year");
		} else if (formObj.DateToDD.value == "Day"){
			alert("Please select search end day");
		} else if (formObj.DateToMM.value == "Month"){
			alert("Please select search end month");
		} else if (formObj.DateToYY.value == "Year"){
			alert("Please select search end Year");
		} else if ( !validInterval(formObj.DateFromDD.value+"/"+formObj.DateFromMM.value+"/"+formObj.DateFromYY.value,formObj.DateToDD.value+"/"+formObj.DateToMM.value+"/"+formObj.DateToYY.value)) {
			alert("Invalid search interval, start date must precede end date");
		} else {
			DeselectDateInterval(formObj.datetype)
			return true;
		}

		return false;
	}

	if (formObj.DateFromYY.value == "Year" && formObj.DateFromMM.value == "Month" && formObj.DateFromDD.value == "Day" &&
		formObj.DateToMM.value == "Month" && formObj.DateToDD.value == "Day" && formObj.DateToYY.value == "Year" && 
		formObj.BackMM.value == "Month" && formObj.BackDD.value == "Day" && formObj.BackYY.value == "Year" && 
		formObj.datetype[0].checked == 0 && formObj.datetype[1].checked == 0 && formObj.datetype[2].checked == 0  && formObj.datetype[3].checked == 0  ){
		alert("Mising search date interval");
		return false;
	}
	
	return true;
}

function validateQComplete(formObj){

	if ( Number(howMany(formObj.pubsel)) > 1){
		alert("Maximum number of publications allowed per a free search is 1, please change your selection");
		return false;
	}

	if ( Number(howMany(formObj.pubsel)) == 0){
		alert("No publications have been selected");
		return false;
	}
	
	return true;
}

function isValidDate(dateStr) {

	var datePat = /^(\d{1,2})(\/)(\d{1,2})\2(\d{2,4})\s*$/;
	var matchArray = dateStr.match(datePat); // is the format ok?
	if (matchArray == null) {
		alert("Date is not in a valid format.")
		return false;
	}
	month = matchArray[3];
	day = matchArray[1];
	year = matchArray[4];
	if (month < 1 || month > 12) { // check month range
		alert("Month must be between 1 and 12.");
		return false;
	}
	if (day < 1 || day > 31) {
		alert("Day must be between 1 and 31.");
		return false;
	}
	if ((month==4 || month==6 || month==9 || month==11) && day==31) {
		alert("Month "+month+" doesn't have 31 days!")
		return false
	}
	if (month == 2) { // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day>29 || (day==29 && !isleap)) {
			alert("February " + year + " doesn't have " + day + " days!");
			return false;
		}
	}
	return true;  // date is valid
}

function mmddyyyy2ddmmyyyy2(dateStr) {
	var newDate;
	var datePat = /^(\d{1,2})(\/)(\d{1,2})\2(\d{2,4})\s*$/;
	var matchArray = dateStr.match(datePat); // given date format ok
	month = matchArray[3];
	day = matchArray[1];
	year = matchArray[4];
	newDate = Number(month) + "/" + Number(day) + "/" + year;  // dd/mm/yyyy
	return newDate;
}

function mmddyyyy2ddmmyyyy(dateStr) {
	var newDate;
	var datePat = /^(\d{1,2})(\/)(\d{1,2})\2(\d{2,4})\s*$/;
	var matchArray = dateStr.match(datePat); // given date format ok
	month = matchArray[3];
	day = matchArray[1];
	year = matchArray[4];
	//var yy = /^(\d{4})$/;
	//var matchYearArray = year.match(yy); // given date format ok
	//if (matchYearArray == null) {
	//{
	if (year < 100){
		if ( year >= 0  && year <= 10 ){
			year = "20" + year;
		} else {
			year = "19" + year;
		}
	}
	//}
	
	newDate = Number(month) + "/" + Number(day) + "/" + year;  // dd/mm/yyyy
	return newDate;
}

function validInterval(DateFrom, DateTo){

// ensure that start date always precede end date
	var datePat = /^(\d{1,2})(\/)(\d{1,2})\2(\d{2,4})\s*$/;
	var matchArray = DateFrom.match(datePat);
	var FromMM = matchArray[3];
	var FromYY = matchArray[4];
	var FromDD = matchArray[1];

	var matchArray = DateTo.match(datePat);
	var ToMM = matchArray[3];
	var ToYY = matchArray[4];
	var ToDD = matchArray[1];

	//if ( Number(FromYY) > Number(ToYY) ) {
	//	return false;
	//} else if ( Number(FromYY) == Number(ToYY) && Number(FromMM) > Number(ToMM)){
	if ( Number(FromYY) == Number(ToYY) && Number(FromMM) > Number(ToMM)){
		return false;
	} else if ( Number(FromYY) == Number(ToYY) && Number(FromMM) == Number(ToMM) && Number(FromDD) > Number(ToDD)){
		return false;
	}

	return true;
}

function howMany(selectObject) {   
	var numberSelected=0   
	for (var i=0; i < selectObject.options.length; i++) {      
		if (selectObject.options[i].selected==true && selectObject.options[i].value != "")         
			numberSelected++   
	}   
	return numberSelected
}

function emptyField(textObj){
	if (textObj.value.length==0) return true;
	for (var i=0; i<textObj.value.length; ++i) {
		var ch = textObj.value.charAt(i);
		if (ch != ' ' && ch != '\t') return false;
	}
	return true;
}