var QUERY_DELIM = "~"
var SRCH_DELIM = "="
var ARRY_DELIM = "^"
var theDate = new Date()
var currYear = theDate.getFullYear()


function onClickAdvancedSearch ()
{
  //validate
  if (validate())
  {
    //alert("Valid")

    //set qrystr
    var archiveType = ""
    var anywords = ""
    var allwords = ""
    var excludewords = ""
    var exactphrase = ""
    var yearform = ""        
    var yearto = ""   
    var media = ""
    var loc = ""        
    var sorttype = ""
    var queryDelim = QUERY_DELIM
    var srchDelim = SRCH_DELIM
    var textValue = ""

    anywords = getTextFieldValue("anywords")
    allwords = getTextFieldValue("allwords")
    excludewords = getTextFieldValue("excludewords")
    exactphrase = getTextFieldValue("exactphrase")

    yearfrom = getTextFieldValue("yearfrom")
    yearfrom = yearfrom == "" || yearfrom == null || yearfrom == undefined ? "0" : yearfrom
    yearto = getTextFieldValue("yearto")
    yearto = yearto == "" || yearto == null || yearto == undefined ? "" + currYear : yearto

    var archiveArray = new Array("ckbAll", "ckbFunction", "ckbGroup", "ckbAgency", "ckbSeries", "ckbItem")
    //archiveType = getCheckBoxesValue(archiveArray, ARRY_DELIM)
    archiveType = resolveCheckBoxValues(archiveArray, ARRY_DELIM)

    var mediaArray = new Array("ckbpaper", "ckbdigital")

    media = resolveCheckBoxValues(mediaArray, ARRY_DELIM)

    var locArray = new Array("ckbnthmelb", "ckbbal", "ckbother")        
    //loc = getCheckBoxesValue(locArray, ARRY_DELIM)
    loc = resolveCheckBoxValues(locArray, ARRY_DELIM)

    var variant = xbGetElementById("ckbVariants")
    wordvariant = (variant.checked == true) ? "true" : "false"
    
    sorttype = getSelectSingleValue("sorttype")

    var querystr = "searchType" + srchDelim + "AdvancedSearch"
                 + queryDelim + "archiveType" + srchDelim + archiveType
                 + queryDelim + "allwords" + srchDelim + allwords
                 + queryDelim + "anywords" + srchDelim + anywords
                 + queryDelim + "excludewords" + srchDelim + excludewords
                 + queryDelim + "exactphrase" + srchDelim + exactphrase
                 + queryDelim + "yearfrom" + srchDelim + yearfrom
                 + queryDelim + "yearto" + srchDelim + yearto
                 + queryDelim + "media" + srchDelim + media
                 + queryDelim + "loc" + srchDelim + loc
                 + queryDelim + "wordvariant" + srchDelim + wordvariant
                 + queryDelim + "sortType" + srchDelim + sorttype                     

    //alert ("QryStr: " + querystr)

    var arrParams = new Array()
    var arrField = new Array()

    arrField.push(null)
    arrField.push(null)
    arrField.push("querystr")
    arrField.push(querystr)
    arrParams.push(arrField)

    virtualForm(arrParams, "daSearchResults", getFormName())
    //call virtualForm
  }
  else
  {
    //do nothing alert for testing only
    //alert("Not Valid")
  }
}
    
function validate()
{
  var valid = true       
  var chkbxsOK =  validateCheckBoxes()
  var txtFields = validateTextFields()
  var chkDateFields = validateDateFields()
  var chkMedia = validateMedia()
  var chkLoc = validateLoc()
  var chkTextLength = validateTextLength()

  valid = chkbxsOK & txtFields & chkDateFields & chkMedia & chkLoc & chkTextLength
  return valid
}
    
function validateCheckBoxes()
{
  var ret = true
  var err = xbGetElementById("advSearchValidationMsgs")
  xbSetInnerHTML(err, "")
  var chkbx = xbGetElementById("ckbAll")

  if (!chkbx.checked)
  {
    chkbx = xbGetElementById("ckbFunction")
    if (!chkbx.checked)
    {
      chkbx = xbGetElementById("ckbGroup")
      if (!chkbx.checked)
      {
        chkbx = xbGetElementById("ckbAgency")
        if (!chkbx.checked)
        {
          chkbx = xbGetElementById("ckbSeries")
          if (!chkbx.checked)
          {
            chkbx = xbGetElementById("ckbItem")
            if (!chkbx.checked)
            {
              ret = false 
              //Set error msg
              xbSetInnerHTML(err,"<ul><li>Please select at least one checkbox.</li></ul>")
            }
          }
        }
      }
    }
  }

  return ret
}
    
function validateTextFields()
{
  var ret = true
  var chkAnyWords = isFieldEmpty("anywords")        
  var chkAllWords = isFieldEmpty("allwords")
  var chkExcludeWords = isFieldEmpty("excludewords")
  var chkExactPhrase = isFieldEmpty("exactphrase")
  var chkExcludeWordsAndOtherField = false;

  if (!chkExcludeWords)
  {
    if (chkAnyWords && chkAllWords && chkExactPhrase)
    {
      chkExcludeWordsAndOtherField = true
    }
  }

  if (chkAnyWords && chkAllWords && chkExcludeWords && chkExactPhrase)
  {
    ret = false
    var err = xbGetElementById("advSearchValidationMsgs")
    var tmp = err.innerHTML           
    xbSetInnerHTML(err, "<ul><li>Please enter a word, phrase or number in at least one of the <br>following fields.</li></ul>")            
  }

  if (chkExcludeWordsAndOtherField)
  {
      ret = false
      var err = xbGetElementById("advSearchValidationMsgs")
      var tmp = err.innerHTML           
      xbSetInnerHTML(err, "<ul><li>Please enter your search text in at least one other field.</li></ul>") 
  }
  //check for unwelcome chars

  chkAnyWords = unwelcomeChars("anywords", "anywordserrmsg")
  chkAllWords = unwelcomeChars("allwords", "allwordserrmsg")
  chkExcludeWords = unwelcomeChars("excludewords", "excludewordserrmsg")
  chkExactPhrase = unwelcomeChars("exactphrase", "exactphraseerrmsg")

  if (chkAnyWords || chkAllWords ||chkExcludeWords || chkExactPhrase)
  {
    ret = false
  }

  return ret
}
  
function validateDateFields()
{
  var ret = true
  var fromNumOnly = isNumeral("yearfrom")
  var toNumOnly = isNumeral("yearto")
  var fromRange = checkRange(0, "yearfrom", currYear)
  var toRange = checkRange(0, "yearto", currYear)
  var firstObj = xbGetElementById("yearfrom")
  var firstVal = firstObj.value
  var secondObj = xbGetElementById("yearto")
  var secondVal = secondObj.value

  firstVal = firstVal == "" || firstVal == null || firstVal == undefined ? "0" : firstVal
  secondVal = secondVal == "" || secondVal == null || secondVal == undefined ? "" + currYear : secondVal   
  var chkCompare = compare(firstVal, secondVal)

  chkCompare = chkCompare < 1 ? true : false
  if (!chkCompare && fromNumOnly || !chkCompare && toNumOnly)
  {
    var err = xbGetElementById("yearfromerrmsg")
    xbSetInnerHTML(err, "<ul><li>The From date needs to be an earlier date than the To date, <br>e.g.: 1867 - 1932, or the same date, e.g.: 1932 - 1932.</li></ul>")
    err.style.display = "block"
  }

  ret = fromNumOnly & toNumOnly & fromRange & toRange & chkCompare
  return ret
}
    
function isNumeral(fieldName)
{
  var ret = true
  var err = xbGetElementById(fieldName + "errmsg")
  xbSetInnerHTML(err, "")
  err.style.display = "none"
  var field = xbGetElementById(fieldName)
  var testStr = field.value
  var p = testStr.search(/\D.*/)
  if (p > -1 )
  {
    ret = false 
    if (fieldName == "yearfrom")
    {
      xbSetInnerHTML(err, "<ul><li>This is not a valid number.  Please confirm the year you wish to <br>search from.</li></ul>")
    }

    if (fieldName == "yearto")
    {
      xbSetInnerHTML(err, "<ul><li>This is not a valid number.  Please confirm the year you wish to <br>search to.</li></ul>")
    } 
    
    if (fieldName != "yearfrom" && fieldName != "yearto")
    {
      xbSetInnerHTML(err, "<ul><li>This is not a valid number.</li></ul>")
    }
    err.style.display = "block"
  }
  return ret
}
    
function checkRange(lowerBound, fieldName, upperBound)
{
  var ret = true
  var field = xbGetElementById(fieldName)
  var fieldValue = parseInt(field.value)    
  if (lowerBound > fieldValue || fieldValue > upperBound)
  {
    ret = false
    var err = xbGetElementById(fieldName + "errmsg")
    xbSetInnerHTML(err, "<ul><li>You cannot enter future dates.</li></ul>")
    err.style.display = "block"
  }

  return ret
}
    
function compare(firstVal, secondVal)
{
  var ret 

  if (firstVal < secondVal)
  {
    ret = -1
  }
  else if (secondVal < firstVal)
  {
    ret = 1
  }
  else if (firstVal = secondVal)
  {
    ret = 0
  }
  return ret
}

function validateMedia()
{
  //At least one check box selected if All or item are selected
  var ret = true
  var allChkBx = xbGetElementById("ckbAll")
  var itemChkBx = xbGetElementById("ckbItem")

  if (allChkBx.checked || itemChkBx.checked)
  {
    var err = xbGetElementById("mediaErrorMsgs")
    err.style.display = "none"
    var chkBx = xbGetElementById("ckbpaper")
    if (!chkBx.checked)
    {
      chkBx = xbGetElementById("ckbdigital")
      if (!chkBx.checked)
      {
        ret = false
        xbSetInnerHTML(err, "<ul><li>Please select at least one format.</li></ul>")
        err.style.display = "block"
      }
    }
  }
  return ret    
}
    
function validateLoc()
{
  var ret = true
  //At least one if media is physical
  var chkBxPhysical = xbGetElementById("ckbpaper")

  if (chkBxPhysical.checked)
  {
    var err = xbGetElementById("LocErrorMsgs")
    err.style.display = "none"
    var chkBx = xbGetElementById("ckbnthmelb")
    if (!chkBx.checked)
    {
      chkBx = xbGetElementById("ckbbal")
      if (!chkBx.checked)
      {
        chkBx = xbGetElementById("ckbother")
        if (!chkBx.checked)
        {
          ret = false
          xbSetInnerHTML(err, "<ul><li>Please select at least one location.</li></ul>")
          err.style.display = "block"
        }
      }
    }
  }

  return ret
}
    
/**
* fieldNames is an array of checkboxes to amalgamate into an delimited string
*/
function getCheckBoxesValue(fieldNames, delimiter)
{
  var ret = ""
  var tmpArray = new Array()
  var c = fieldNames.length
  for (var i = 0; i < c; i++)
  {
    var field = xbGetElementById(fieldNames[i])
    if (field.checked)
    {
      tmpArray.push(field.id)                
    }        
  }
  ret = tmpArray.join(delimiter)
  return ret
}

/**
* Validate field length
*/
function validateTextLength()
{
  var ret = true
  var l_anyWords = xbGetElementById("anywords").value        
  var l_allWords = xbGetElementById("allwords").value
  var l_excludeWords = xbGetElementById("excludewords").value
  var l_exactPhrase = xbGetElementById("exactphrase").value

  if (l_anyWords.length > 255)
  {
    ret = false
    err = xbGetElementById("anywordserrmsg")
    xbSetInnerHTML(err, "<ul><li>The maximum length is 255 characters</li></ul>")
    err.style.display = "block"
  }

  if (l_allWords.length > 255)
  {
    ret = false
    err = xbGetElementById("allwordserrmsg")
    xbSetInnerHTML(err, "<ul><li>The maximum length is 255 characters</li></ul>")
    err.style.display = "block"
  }

  if (l_excludeWords.length > 255)
  {
    ret = false
    err = xbGetElementById("excludewordserrmsg")
    xbSetInnerHTML(err, "<ul><li>The maximum length is 255 characters</li></ul>")
    err.style.display = "block"
  }

  if (l_exactPhrase.length > 255)
  {
    ret = false
    err = xbGetElementById("exactphraseerrmsg")
    xbSetInnerHTML(err, "<ul><li>The maximum length is 255 characters</li></ul>")
    err.style.display = "block"
  }

  return ret
}

