/*
 * Copyright (C) 2007 Escenic AS.
 * All Rights Reserved.  No use, copying or distribution of this
 * work may be made except in accordance with a valid license
 * agreement from Escenic AS.  This notice must be included on
 * all copies, modifications and derivatives of this work.
*/

var xmlHttp;
var simpleSearchUrl;
var advancedSearchUrl;
var searchKey;
var advancedSearchLinkText;

var UrlEncoder = {
  // public method for url encoding
  encode : function (string) {
    return escape(this._utf8_encode(string));
  },

  // public method for url decoding
  decode : function (string) {
    return this._utf8_decode(unescape(string));
  },

  // method for UTF-8 encoding
  _utf8_encode : function (string) {
    string = string.replace(/\r\n/g, "\n");
    var utftext = "";

    for (var n = 0; n < string.length; n++) {

      var c = string.charCodeAt(n);

      if (c < 128) {
        utftext += String.fromCharCode(c);
      }
      else if ((c > 127) && (c < 2048)) {
        utftext += String.fromCharCode((c >> 6) | 192);
        utftext += String.fromCharCode((c & 63) | 128);
      }
      else {
        utftext += String.fromCharCode((c >> 12) | 224);
        utftext += String.fromCharCode(((c >> 6) & 63) | 128);
        utftext += String.fromCharCode((c & 63) | 128);
      }
    }

    return utftext;
  },

  // private method for UTF-8 decoding
  _utf8_decode : function (utftext) {
    var string = "";
    var i = 0;
    var c = c1 = c2 = 0;

    while (i < utftext.length) {

      c = utftext.charCodeAt(i);

      if (c < 128) {
        string += String.fromCharCode(c);
        i++;
      }
      else if ((c > 191) && (c < 224)) {
        c2 = utftext.charCodeAt(i + 1);
        string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
        i += 2;
      }
      else {
        c2 = utftext.charCodeAt(i + 1);
        c3 = utftext.charCodeAt(i + 2);
        string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
        i += 3;
      }

    }

    return string;
  }
}

function createXMLHttpRequest() {
  // todo make the xmlHttp creation more robust
  if (navigator.appName == 'Microsoft Internet Explorer') {
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else if (window.XMLHttpRequest) {
    xmlHttp = new XMLHttpRequest();
  }
}

function sendSearchRequest(form, simpleUrl, advancedUrl, linkText) {
  // first check if we have a keyword specified
  var searchString = form['searchString'].value;

  if (isEmpty(searchString)) {
    showErrorMessage();
    hideResultDiv();
    return;
  } else {
    hideErrorMessage();
  }

  simpleSearchUrl = simpleUrl;
  advancedSearchUrl = advancedUrl;
  advancedSearchLinkText = linkText;

  var searchOptions = form['searchOption'];
  var selectedOption = "";
  for (var i = 0; i < searchOptions.length; i++) {
    if (searchOptions[i].checked) {
      selectedOption = searchOptions[i].value;
      break;
    }
  }

  if (selectedOption == 'hallingdolen') {
    sendSiteSearchRequest(form);
  } else if (selectedOption == 'google') {
    sendGoogleSearchRequest(form);
  } else if (selectedOption == 'paperVersion') {
    //sendPaperVersionSearchRequest(form);
  } else if (selectedOption == 'telephoneCatalog') {
    var phoneBookSearchUrlPrefix = document.getElementById("phone-book-search-url-prefix").innerHTML;
    searchString = this.escape(searchString);
    window.location = phoneBookSearchUrlPrefix + searchString;
  } else {
    sendSiteSearchRequest(form);
  }
}

function sendSiteSearchRequest(form) {
  var publicationId = form['publicationId'].value;
  var articleTypes = form['articleType'];
  var includeSectionId = form['includeSectionId'].value;
  var pageLength = form['pageLength'].value;
  var sortString = form['sortString'].value;
  var optimized = form['optimized'].value;
  var stemType = form['stemType'].value;
  var searchEngineName = form['searchEngineName'].value;
  var searchString = form['searchString'].value;
  var includeSubSections = form['includeSubSections'].value;
  searchString = UrlEncoder.encode(searchString);
  searchKey = searchString;
  var params = "publicationId=" + publicationId + "&includeSectionId="
    + includeSectionId + "&includeSubSections=" + includeSubSections + "&pageLength=" + pageLength +
               "&sortString=" + sortString + "&optimized=" + optimized +
               "&stemType=" + stemType + "&searchEngineName=" + searchEngineName + "&searchString=" + searchString;

  if (articleTypes.length != undefined && articleTypes.length > 0) {
    for (var i = 0; i < articleTypes.length; i++) {
      params += "&articleType=" + articleTypes[i].value;
    }
  } else {
    params += "&articleType=" + articleTypes.value;
  }

  createXMLHttpRequest();
  xmlHttp.onreadystatechange = handleStateChange;

  xmlHttp.open("POST", simpleSearchUrl, true);
  xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  xmlHttp.setRequestHeader("Content-length", params.length);
  xmlHttp.setRequestHeader("Connection", "close");
  xmlHttp.send(params);
}

function sendGoogleSearchRequest(form) {
  var searchString = form['searchString'].value;

  // Create a search control
  var searchControl = new GSearchControl();

  // add the set of searchers
  searchControl.addSearcher(new GwebSearch());
  searchControl.addSearcher(new GnewsSearch());
  searchControl.addSearcher(new GimageSearch());

  var resultListDiv = document.getElementById('search-result-list-div');

  // tell the searcher to draw itself and tell it where to attach
  searchControl.draw(resultListDiv);

  // execute an inital search
  searchControl.execute(searchString);

  // update the styles of the divs as required
  var searchResultTitleDiv = document.getElementById('search-result-title-div');
  searchResultTitleDiv.innerHTML = 'Search results';

  var searchResultFooterDiv = document.getElementById('search-result-footer-div');
  searchResultFooterDiv.style.display = 'none';

  resultListDiv.style.paddingBottom = '0px';

  // display the container div for results
  var resultDiv = document.getElementById('search-result-div');
  resultDiv.style.display = 'block';
}

function sendPaperVersionSearchRequest(form) {
  // todo implement it
}

function sendTelephoneCatalogSearchRequest(form) {
  // todo implement it
}

function handleStateChange() {
  if (xmlHttp.readyState == 4) {
    if (xmlHttp.status == 200) {
      showSiteSearchResult(xmlHttp.responseXML);
    }
  }
}

var noResultsFound = false;
function showSiteSearchResult(xmlDoc) {
  // get the div where result will be shown
  var resultListDiv = document.getElementById('search-result-list-div');
  var searchResultFooterDiv = document.getElementById('search-result-footer-div');

  var resultCountNode = xmlDoc.getElementsByTagName("resultCount")[0];
  var resultCount = resultCountNode.childNodes[0].nodeValue;

  var articleParentNode = xmlDoc.getElementsByTagName("articles")[0];
  var articleNodes = articleParentNode.getElementsByTagName("article");
  var resultHTML = "";

  // update the title
  var searchResultTitleDiv = document.getElementById('search-result-title-div');
  var searchResultMessageContainer1 = document.getElementById("simple-search-result-found-message-part1");
  var searchResultMessageContainer2 = document.getElementById("simple-search-result-found-message-part2");
  searchResultTitleDiv.innerHTML = searchResultMessageContainer1.innerHTML + ' ' +resultCount + ' ' +
                                   searchResultMessageContainer2.innerHTML;

  if (resultCount == 0) {
    // update the display accordingly
    
    resultListDiv.style.paddingBottom = '0px';
    searchResultFooterDiv.style.display = 'none';
    noResultsFound = true;
  } else {
    resultListDiv.style.paddingBottom = '10px';
    resultListDiv.style.paddingTop = '10px';
    searchResultFooterDiv.style.display = 'block';
    noResultsFound = false;

    for (var i = 0; i < articleNodes.length; i++) {
      var articleNode = articleNodes[i];
      var titleNode = articleNode.childNodes[0];
      var urlNode = articleNode.childNodes[1];
      var publicationDateNode = articleNode.childNodes[2];
      var homeSectionNameNode = articleNode.childNodes[3];
      var homeSectionUrlNode = articleNode.childNodes[4];

      var title = titleNode.childNodes[0].nodeValue;
      var url = urlNode.childNodes[0].nodeValue;
      var publicationDate = publicationDateNode.childNodes[0].nodeValue;
      var homeSectionName = homeSectionNameNode.childNodes[0].nodeValue;
      var homeSectionUrl = homeSectionUrlNode.childNodes[0].nodeValue;

      resultHTML += "<p><a href='" + url + "'>" + title + "</a>" + "<br />" +
                    publicationDate + " - " + "<a href='" + homeSectionUrl + "'>" + homeSectionName + "</a>" +
                    "</p>";
    }
  }

  // change the content of the link to advanced search form
  var advancedSearchLink = document.getElementById("advanced-search-link");

  if (!isEmpty(searchKey) && resultCount > 0) {
    advancedSearchUrl = advancedSearchUrl + "&simpleSearch=" + searchKey;
    advancedSearchLink.innerHTML = "<a href='" + advancedSearchUrl + "'>" + advancedSearchLinkText + "</a>";
  } else {
    advancedSearchLink.innerHTML = "<a href='" + advancedSearchUrl + "'>" + advancedSearchLinkText + "</a>";
  }

  // update the target div to show the result
  resultListDiv.innerHTML = resultHTML;

  var resultDiv = document.getElementById('search-result-div');
  resultDiv.style.display = 'block';
}

function isEmpty(s) {
  return s == null || s == '';
}

function showErrorMessage() {
  var errorMessageDiv = document.getElementById("simple-search-error-message");
  errorMessageDiv.style.display = 'block';
}

function hideErrorMessage() {
  var errorMessageDiv = document.getElementById("simple-search-error-message");
  errorMessageDiv.style.display = 'none';
}

function hideResultDiv() {
  // hide previous result as well
  var resultDiv = document.getElementById('search-result-div');
  resultDiv.style.display = 'none';
}

function setSearchSectionIdParam(sectionId) {
  var spanId = document.getElementById('include-section-id-span');
  spanId.innerHTML = '<input type="hidden" name="includeSectionId" value="' + sectionId + '"/>';
  unselectPaperVersionSearch();
}

var isPaperVersionSearchOptionSelected = false;

function selectPaperVersionSearch(){
  if(isPaperVersionSearchOptionSelected == true) {
    return false;
  }

  var searchResultDiv = document.getElementById("search-result-div");

  var searchResultTitleDiv = document.getElementById("search-result-title-div");
  var searchResultTitleDivContent = searchResultTitleDiv.innerHTML;  

  var searchResultFooterDiv = document.getElementById("search-result-footer-div");
  var searchResultFooterDivContent = searchResultFooterDiv.innerHTML;

  var searchResultListDiv = document.getElementById("search-result-list-div");
  var searchResultListDivContent = searchResultListDiv.innerHTML;

  searchResultDiv.innerHTML = '<div id="search-result-list-div" class="search-result-list-paper">'+
                              '<div id="search-result-title-div" class="search-result-title-paper">'+
                               searchResultTitleDivContent+'' +
                              '</div>' +
                              searchResultListDivContent +
                              '</div>' +
                              '<div id="search-result-footer-div" class="search-result-footer-paper">' +
                              searchResultFooterDivContent +
                              '</div>' +
                              '<div style="display:none" id="search-result-list-div-content-holder">'+
                              searchResultListDivContent +
                              '</div>';
  isPaperVersionSearchOptionSelected = true;
  polish();
}

function unselectPaperVersionSearch(){
  if (isPaperVersionSearchOptionSelected == false) {
    return false;
  }
  var searchResultDiv = document.getElementById("search-result-div");

  var searchResultTitleDiv = document.getElementById("search-result-title-div");  
  var searchResultTitleDivContent = "";


  var performedPaperSearch = false;
  /*
    Search retult title div can be null at following scenario:
      User selects paperVersion option (so the title div goes into the list div)
      User presses search [So, the title div is erased]

   */
  if(searchResultTitleDiv != null){
    searchResultTitleDivContent = searchResultTitleDiv.innerHTML;
  } else {
    performedPaperSearch = true;
  }

  var searchResultFooterDiv = document.getElementById("search-result-footer-div");
  var searchResultFooterDivContent = searchResultFooterDiv.innerHTML;

  var searchResultListDiv = document.getElementById("search-result-list-div");
  var searchResultListDivContent = searchResultListDiv.innerHTML;

  var savedSearchResultListDiv = document.getElementById("search-result-list-div-content-holder");
  var savedSearchResultListDivContent = savedSearchResultListDiv.innerHTML;
  if (performedPaperSearch == false) {
    searchResultListDivContent = savedSearchResultListDivContent;
  }

  searchResultDiv.innerHTML = '<div id="search-result-title-div" class="search-result-title">'+
                               searchResultTitleDivContent+'' +
                              '</div>' +
                              '<div id="search-result-list-div" class="search-result-list">'+

                              searchResultListDivContent +
                              '</div>' +
                              '<div id="search-result-footer-div" class="search-result-footer">' +
                              searchResultFooterDivContent +
                              '</div>' +
                              '<div style="display:none" id="search-result-list-div-content-holder">'+
                              searchResultListDivContent +
                              '</div>';
  if (performedPaperSearch == true) {
    searchResultListDiv = document.getElementById("search-result-list-div");
    searchResultListDiv.style.paddingTop = '0px';
  }
  isPaperVersionSearchOptionSelected = false;
  polish();
}

function polish(){
   /*
    Backword compatibility ;)
    In simple site search / google search, if no results are found, this divs paddingBottom becomes 0px
    (see, showSiteSearchResult())
   */
  var  resultList = document.getElementById("search-result-list-div");
  var searchResultFooterDiv = document.getElementById("search-result-footer-div");
  if (noResultsFound == true){
    resultList.style.paddingBottom = '0px';
    searchResultFooterDiv.style.display = 'none';
  } else {
    resultList.style.paddingBottom = '10px';
    searchResultFooterDiv.style.display = 'block';
  }
}

function modifyAdvancedeSearchLink(){
  var anchr =document.getElementById("advanced-search-link-in-simple-search-form"); 
  var advancedSearchLink = anchr.href;
  var searchString = document.getElementById("searchString").value;

  if (searchString != null && searchString.length>0){
    anchr.href=advancedSearchLink+"&simpleSearch="+searchString;
    return false;
  }  
}
