ADD_WILDCARD_IN_FRONT = true;
ADD_WILDCARD_AT_END = true;
    	
function submitOnEnter(theElement, theEvent)
  {
    var keycode;
    if (window.event)
    {
      keycode = window.event.keyCode;
    }
    else
    {
      if (theEvent)
      {
        keycode = theEvent.which;
      }
      else
      {
        return true;
      }
    }

    if (keycode == 13)
    {
      submitSearch();
      return false;
    }
    else
    {
      return true;
    }
  }

  function deactivateFormControls()
  {
    for (var idx=0; idx < document.forms.searchForm.elements.length; idx++)
    {
      document.forms.searchForm.elements[idx].disabled = true;
    }
    for (var idx=0; idx < document.forms.searchControl.elements.length; idx++)
    {
      if (document.forms.searchControl.elements[idx].name != "showHelp")
      {
        document.forms.searchControl.elements[idx].disabled = true;
      }
    }
  }

  function activateFormControls()
  {
    for (var idx=0; idx < document.forms.searchForm.elements.length; idx++)
    {
      document.forms.searchForm.elements[idx].disabled = false;
    }
    for (var idx=0; idx < document.forms.searchControl.elements.length; idx++)
    {
      document.forms.searchControl.elements[idx].disabled = false;
    }
  }

  function initializeSearch()
  {
    document.forms.searchForm.reset();
    searchQueryVO = new SearchQueryVO();
    isInitialRequest = true;
    showSearchDialog();
  }

  function addWildcard(theValue)
  {
  	var returnValue = theValue.replace(/^[\*\s]*/,"").replace(/[\*\s]*$/g,"");

    if (returnValue.length > 3)
    {
    	if (ADD_WILDCARD_IN_FRONT == true)
    	  returnValue = "*" + returnValue;
    	if (ADD_WILDCARD_AT_END == true)
    	  returnValue = returnValue + "*";
    }
    else
    {
    	returnValue = theValue;
    }
    	
  	return returnValue;
  }

  function fillSearchQueryVO()
  {
    searchQueryVO = new SearchQueryVO();
  	if (isSearchExtended)
  	{
      if (typeof document.forms.searchForm.code != "undefined")
        searchQueryVO.setCode(document.forms.searchForm.code.value);
      if (typeof document.forms.searchForm.certificateDateMin != "undefined")
        searchQueryVO.setCertificateDateMin(document.forms.searchForm.certificateDateMin.value);
      if (typeof document.forms.searchForm.certificateDateMax != "undefined")
        searchQueryVO.setCertificateDateMax(document.forms.searchForm.certificateDateMax.value);
      if (typeof document.forms.searchForm.validityExpirationMin != "undefined")
        searchQueryVO.setValidityExpirationMin(document.forms.searchForm.validityExpirationMin.value);
      if (typeof document.forms.searchForm.validityExpirationMax != "undefined")
        searchQueryVO.setValidityExpirationMax(document.forms.searchForm.validityExpirationMax.value);
      if (typeof document.forms.searchForm.announcementDateMin != "undefined")
        searchQueryVO.setAnnouncementDateMin(document.forms.searchForm.announcementDateMin.value);
      if (typeof document.forms.searchForm.announcementDateMax != "undefined")
        searchQueryVO.setAnnouncementDateMax(document.forms.searchForm.announcementDateMax.value);
      if (typeof document.forms.searchForm.announcementNumber != "undefined")
        searchQueryVO.setAnnouncementNumber(document.forms.searchForm.announcementNumber.value);
    }
    if (typeof document.forms.searchForm.certificateNumber != "undefined")
      searchQueryVO.setCertificateNumber(addWildcard(document.forms.searchForm.certificateNumber.value));
    if (typeof document.forms.searchForm.classification != "undefined")
      searchQueryVO.setClassification(addWildcard(document.forms.searchForm.classification.value));
    if (typeof document.forms.searchForm.manufacturer != "undefined")
      searchQueryVO.setManufacturer(addWildcard(document.forms.searchForm.manufacturer.value));
    if (typeof document.forms.searchForm.deviceType != "undefined")
      searchQueryVO.setDeviceType(document.forms.searchForm.deviceType.value);
    if (typeof document.forms.searchForm.certificateType != "undefined")
      searchQueryVO.setCertificateType(document.forms.searchForm.certificateType.value);
  }

  /*
   * displayExtendedSearch: string: "true" : "false" : void - because of resource mechanism
   */
  function toggleSearchDialog(displayExtendedSearch)
  {
  	isSearchExtended = (displayExtendedSearch == "true");
    fillSearchQueryVO();
    showSearchDialog();
    renderPaging();
  }

  /*
   */
  function showSearchDialog()
  {
    var res = new com.hyperwave.res.Resource({templateKey_: "search_form"});
    res.makeRoot();
    res.readAll(cs_search_form_resource_reader);
    res.readAll(cs_text_reader);
    res.setRes("extended", isSearchExtended?"true":"false");
    res.setRes("path_to_images", path_to_images);
    res.setRes("deviceTypes", deviceTypes);
    res.setRes("certificateTypes", certificateTypes);
    document.getElementById("searchForm").innerHTML = res.toString();

    if ((typeof document.forms.searchForm.code != "undefined") &&
        (searchQueryVO.getCode() != null))
      document.forms.searchForm.code.value = searchQueryVO.getCode();
    if ((typeof document.forms.searchForm.certificateNumber != "undefined") &&
        (searchQueryVO.getCertificateNumber() != null))
      document.forms.searchForm.certificateNumber.value = searchQueryVO.getCertificateNumber();
    if ((typeof document.forms.searchForm.certificateDateMin != "undefined") &&
        (searchQueryVO.getCertificateDateMin() != null))
      document.forms.searchForm.certificateDateMin.value = searchQueryVO.getCertificateDateMin();
    if ((typeof document.forms.searchForm.certificateDateMax != "undefined") &&
        (searchQueryVO.getCertificateDateMax() != null))
      document.forms.searchForm.certificateDateMax.value = searchQueryVO.getCertificateDateMax();
    if ((typeof document.forms.searchForm.validityExpirationMin != "undefined") &&
        (searchQueryVO.getValidityExpirationMin() != null))
      document.forms.searchForm.validityExpirationMin.value = searchQueryVO.getValidityExpirationMin();
    if ((typeof document.forms.searchForm.validityExpirationMax != "undefined") &&
        (searchQueryVO.getClassification() != null))
      document.forms.searchForm.validityExpirationMax.value = searchQueryVO.getClassification();
    if ((typeof document.forms.searchForm.classification != "undefined") &&
        (searchQueryVO.getClassification() != null))
      document.forms.searchForm.classification.value = searchQueryVO.getClassification();
    if ((typeof document.forms.searchForm.manufacturer != "undefined") &&
        (searchQueryVO.getManufacturer() != null))
      document.forms.searchForm.manufacturer.value = searchQueryVO.getManufacturer();
    if ((typeof document.forms.searchForm.deviceType != "undefined") &&
        (searchQueryVO.getDeviceType() != null))
      document.forms.searchForm.deviceType.value = searchQueryVO.getDeviceType();
    if ((typeof document.forms.searchForm.certificateType != "undefined") &&
        (searchQueryVO.getCertificateType() != null))
      document.forms.searchForm.certificateType.value = searchQueryVO.getCertificateType();
    if ((typeof document.forms.searchForm.announcementDateMin != "undefined") &&
        (searchQueryVO.getAnnouncementDateMin() != null))
      document.forms.searchForm.announcementDateMin.value = searchQueryVO.getAnnouncementDateMin();
    if ((typeof document.forms.searchForm.announcementDateMax != "undefined") &&
        (searchQueryVO.getAnnouncementDateMax() != null))
      document.forms.searchForm.announcementDateMax.value = searchQueryVO.getAnnouncementDateMax();
    if ((typeof document.forms.searchForm.announcementNumber != "undefined") &&
        (searchQueryVO.getAnnouncementNumber() != null))
      document.forms.searchForm.announcementNumber.value = searchQueryVO.getAnnouncementNumber();

    if (isSearchExtended)
      initializeCalendarElements();

    var res = new com.hyperwave.res.Resource({templateKey_: "search_control"});
    res.makeRoot();
    res.readAll(cs_search_form_resource_reader);
    res.readAll(cs_text_reader);
    res.setRes("extended", isSearchExtended?"true":"false");
    res.setRes("selected", pagingSize + "");
    res.setRes("path_to_images", path_to_images);
    document.getElementById("searchControl").innerHTML = res.toString();

    showResults(csObjectCache[currentPage]);
  }

  function toggleSort(theId)
  {
    if (theId == previousSortId)
    {
      var sortCriteria = currentSortCriteria;
      sortCriteria.direction = (sortCriteria.direction == "a")? "d": "a";
    }
    else
    {
      var sortCriteria = sortCriterias[theId];
    }
    currentSortCriteria = sortCriteria;
    previousSortId = theId;

    submitSearch(0, true);
  }

  function showPreviousPage()
  {
    showPage(currentPage - 1);
  }

  function showNextPage()
  {
    showPage(currentPage + 1);
  }

  function showPage(thePage)
  {
    if (typeof csObjectCache[thePage] != "undefined")
    {
      currentPage = thePage;
      showResults(csObjectCache[currentPage]);
      renderPaging();
    }
    else
    {
      submitSearch(thePage);
    }
  }

  function renderPaging ()
  {
    var pagingRes = new com.hyperwave.res.Resource ({templateKey_: "listingPaging"});
    pagingRes.makeRoot ();
    pagingRes.readAll(cs_search_form_resource_reader);
    pagingRes.readAll(cs_text_reader);

    if ((currentPage == 0) && (!isInitialRequest))
    {
      pagingRes.setRes("isPrevPagingAvailable", "no");
    }
    else
    {
      pagingRes.setRes("isPrevPagingAvailable", "yes");
    }

    if (((parseInt(currentPage+1,10) * pagingSize) < itemCount)  && (!isInitialRequest))
    {
      pagingRes.setRes("isNextPagingAvailable", "yes");
    }
    else
    {
      pagingRes.setRes("isNextPagingAvailable", "no");
    }

    if ((itemCount > 0) && (!isInitialRequest))
    {
      var navigationPages = [];
      var pageCount = Math.ceil(itemCount / pagingSize);
      var firstPage = 0;
      var lastPage = pageCount;

      if (pageCount > (pagingRangeDown + pagingRangeUp))
      {
        firstPage = ((currentPage - pagingRangeDown) < 0)?
                      0 : currentPage - pagingRangeDown;
        lastPage  = ((currentPage + pagingRangeUp) > pageCount)?
                      pageCount : currentPage + pagingRangeUp;
      }

      for (var idx=firstPage; idx<lastPage; idx++)
      {
        var page = {};
        page.isSelected = (idx == currentPage);
        page.pageId = idx;
        page.pageLabel = idx+1;
        navigationPages.push(page);
      }
      pagingRes.setRes("navigationPages", navigationPages);
    }
    else
    {
      pagingRes.setRes("navigationPages", "");
    }

    var pagingElement = document.getElementById("pagingElement");
    if (pagingElement != null)
    {
      if ((itemCount > 0) && (navigationPages != null) && (navigationPages.length > 0))
        pagingElement.innerHTML = pagingRes.toString();
      else
      	pagingElement.innerHTML = "";
    }
  }

  function checkForEmptySearchForm()
  {
    var is_form_empty = true;
    for (var idx=0; idx < document.forms.searchForm.elements.length; idx++)
    {
      if (document.forms.searchForm.elements[idx].value != "")
      {
        is_form_empty = false;
      }
    }
    return is_form_empty;
  }

  function submitSearch(thePage, hasSortCriteriaChanged)
  {
    if (ajaxRequestPending == true)
    {
      document.forms.searchControl.pagingSize.value = pagingSize;
      return;
    }
    if (checkForEmptySearchForm())
    {
      return;
    }
    pagingSize = document.forms.searchControl.pagingSize.value;
    var res = new com.hyperwave.res.Resource({templateKey_: "listing"});
    res.makeRoot();
    res.readAll(cs_search_results_resource_reader);
    res.readAll(cs_text_reader);
    res.setRes("path_to_images", path_to_images);
    res.setRes("retrieveDataInProgress", true);
    document.getElementById("listViewElement").innerHTML = res.toString();

    var http_request = false;

    if (window.XMLHttpRequest)
    { // Mozilla, Safari, ...
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType)
      {
        http_request.overrideMimeType('text/xml');
        // See note below about this line
      }
    }
    else
    {
      if (window.ActiveXObject)
      { // IE
        try
        {
          http_request = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
          try
          {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
          }
          catch (e)
          {
          }
        }
      }
    }

    if (!http_request)
    {
      alert('Giving up :( Cannot create an XMLHTTP instance');
      return false;
    }

    http_request.onreadystatechange = function()
    {
      if (http_request.readyState == 4)
      {
      	isInitialRequest = false;
        showResponse(http_request);
      }
    };

    var search_params_vo = new SearchParamsVO();
    var sort_criteria_vo = new SortCriteriaVO();
    if (typeof thePage == "undefined")
    {
      fillSearchQueryVO();

      sort_criteria_vo.setKey(currentSortCriteria.key);
      sort_criteria_vo.setDirection(currentSortCriteria.direction);
      sort_criteria_vo.setType(currentSortCriteria.type);

      search_params_vo.setFreeIterator("true");
      search_params_vo.setCurrentPage(0);
      search_params_vo.setSortCriteria(sort_criteria_vo);
      search_params_vo.setSortCriteriaChanged("true");

      csObjectCache = {};
    }
    else
    {
      if (hasSortCriteriaChanged)
      {
        sort_criteria_vo.setKey(currentSortCriteria.key);
        sort_criteria_vo.setDirection(currentSortCriteria.direction);
        sort_criteria_vo.setType(currentSortCriteria.type);

        search_params_vo.setFreeIterator("false");
        search_params_vo.setCurrentPage(thePage);
        search_params_vo.setSortCriteria(sort_criteria_vo);
        search_params_vo.setSortCriteriaChanged("true");

        csObjectCache = {};
      }
      else
      {
        search_params_vo.setFreeIterator("false");
        search_params_vo.setCurrentPage(thePage);
        search_params_vo.setSortCriteria(sort_criteria_vo);
        search_params_vo.setSortCriteriaChanged("false");
      }
    }
    search_params_vo.setPagingSize(document.forms.searchControl.pagingSize.value);
    search_params_vo.setIteratorId(iteratorId);

    var params = new com.hyperwave.util.WebParameters();
    params.setKeyValue("type",         "search");
    params.setKeyValue("searchQuery",  searchQueryVO.serialize());
    params.setKeyValue("searchParams", search_params_vo.serialize());

    ajaxRequestPending = true;
    deactivateFormControls();
    http_request.open('GET', entrypoint_cert_search + "?" + params.getParameterString(), true);
    http_request.send(null);
  }


  function showResults(theData)
  {
    var res = new com.hyperwave.res.Resource({templateKey_: "listing"});
    res.makeRoot();
    res.readAll(cs_search_results_resource_reader);
    res.readAll(cs_text_reader);
    res.setRes("path_to_images", path_to_images);
    res.setRes("itemCount", itemCount);
    res.setRes("sortId", currentSortCriteria.id);
    res.setRes("sortDirection", currentSortCriteria.direction);
    res.setRes("displayHeaderOnly", isInitialRequest);
    if (isExactCount)
      res.setRes("isExactCount", "true");
    res.setRes("itemEntries", ((theData == null)? [] : theData));
    document.getElementById("listViewElement").innerHTML = res.toString();
  }

  function showResponse(http_request)
  {
    if (http_request.readyState == 4)
    {
      if (http_request.status == 200)
      {
        var searchResultsVO = SearchResultsVO.static_.deserialize(http_request.responseText);
        var responseData = searchResultsVO.getData();

        itemCount  = searchResultsVO.getItemCount();
        isExactCount  = searchResultsVO.getExactCount();

        var searchParamsVO = searchResultsVO.getSearchParams();
        iteratorId  = searchParamsVO.getIteratorId();
        currentPage = searchParamsVO.getCurrentPage();
        pagingSize  = searchParamsVO.getPagingSize();
        if (responseData != null)
        {
          for (var idx=0; idx<responseData.length; idx++)
          {
          	responseData[idx].certificateNumberLabel_ = cutItemContent(responseData[idx].getCertificateNumber());
          	responseData[idx].certificateDateLabel_ = responseData[idx].getCertificateDate();
          	responseData[idx].validityExpirationLabel_ = responseData[idx].getValidityExpiration();
          	responseData[idx].classificationLabel_ = cutItemContent(responseData[idx].getClassification());
          	responseData[idx].manufacturerLabel_ = cutItemContent(responseData[idx].getManufacturer());
          	responseData[idx].deviceTypeLabel_ = cutItemContent(responseData[idx].getDeviceType());
          	responseData[idx].certificateTypeLabel_ = cutItemContent(responseData[idx].getCertificateType());
          	responseData[idx].announcementDateLabel_ = responseData[idx].getAnnouncementDate();
          }
        }

        csObjectCache[currentPage] = responseData;
        showResults(responseData);
        renderPaging();
        ajaxRequestPending = false;
        activateFormControls();
      }
      else
      {
        alert('There was a problem with the request.');
      }
    }
  }

function showCertificateHelp()
{
  var params = new com.hyperwave.util.WebParameters();
  params.setKeyValue("type",       "renderContent");
  params.setKeyValue("objectPath", "certificateHelp");

  var helpWin = window.open(entrypoint_cert_search + "?" + params.getParameterString(), "helpWin", "width=800,height=600");
  helpWin.focus();
}

function showCertificate(theId)
{
  var metaData = csObjectCache[currentPage][(((parseInt(theId, 10)) - 1) % pagingSize)];
  var objectPath = metaData.getObjectPath();

  var params = new com.hyperwave.util.WebParameters();
  params.setKeyValue("type",       "renderContent");
  params.setKeyValue("objectPath", objectPath);

  var certificateWin = window.open(entrypoint_cert_search + "?" + params.getParameterString(), "certificateWin", "width=800,height=600");
  certificateWin.focus();
}

function showMetaData(theId)
{
  metaDataId = theId;
  var metaDataWin = window.open(fileroot + "components/certsearch/html/metadata.htm", "metaDataWin", "width=600,height=400,left=100,top=200,status=no");
  metaDataWin.focus();
}

function getMetaData()
{
  var metaData = csObjectCache[currentPage][(((parseInt(metaDataId, 10)) - 1) % pagingSize)];
  var res = new com.hyperwave.res.Resource({templateKey_: "metaDataDialog"});
  res.makeRoot();
  res.readAll(cs_search_results_resource_reader);
  res.readAll(cs_text_reader);
  res.setRes("path_to_images", path_to_images);
  res.setRes("metaData", metaData);
  return(res.toString());
}

function getMetaDataTitle()
{
  return(csObjectCache[currentPage][(((parseInt(metaDataId, 10)) - 1) % pagingSize)].getCertificateNumber());
}

function initializeCalendarElements()
{
  Calendar.setup(
                  {
                    inputField  : "certificateDateMin",       // ID of the input field
                    ifFormat    : "%Y/%m/%d",            // the date format
                    button      : "certificateDateMinChooser" // ID of the button
                  }
                );

  Calendar.setup(
                  {
                    inputField  : "certificateDateMax",       // ID of the input field
                    ifFormat    : "%Y/%m/%d",                // the date format
                    button      : "certificateDateMaxChooser" // ID of the button
                  }
                );

  Calendar.setup(
                  {
                    inputField  : "validityExpirationMin",       // ID of the input field
                    ifFormat    : "%Y/%m/%d",                // the date format
                    button      : "validityExpirationMinChooser" // ID of the button
                  }
                );

  Calendar.setup(
                  {
                    inputField  : "validityExpirationMax",       // ID of the input field
                    ifFormat    : "%Y/%m/%d",                // the date format
                    button      : "validityExpirationMaxChooser" // ID of the button
                  }
                );

  Calendar.setup(
                  {
                    inputField  : "announcementDateMin",       // ID of the input field
                    ifFormat    : "%Y/%m/%d",                // the date format
                    button      : "announcementDateMinChooser" // ID of the button
                  }
                );

  Calendar.setup(
                  {
                    inputField  : "announcementDateMax",       // ID of the input field
                    ifFormat    : "%Y/%m/%d",                // the date format
                    button      : "announcementDateMaxChooser" // ID of the button
                  }
                );
}

function cutItemContent (theItemContent)
{
	if (theItemContent != null)
	  if (theItemContent.length > 20)
      return theItemContent.substring(0, 20) + "...";
    else
    	return theItemContent;
	else
		return "";
}
