//Search in Array

if (false && !Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}
function arrayIndexOf(array, elt) {
  var len = array.length;

  var from = Number(arguments[1]) || 0;
  from = (from < 0)
       ? Math.ceil(from)
       : Math.floor(from);
  if (from < 0)
    from += len;

  for (; from < len; from++)
  {
    if (from in array &&
        array[from] === elt)
      return from;
  }
  return -1;
}

// create XMLHTTP-Objekt

function getXMLHTTP(){
  var res=null;
  if(window.XMLHttpRequest) // Firefoxoid
  res = new XMLHttpRequest();
  else if(window.ActiveXObject){ // Internet Explorer
    try {
      res = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        res = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e1) {
        res = null;
      }
    }
  }
  else { // XMLHttpRequest fehlgeschlagen
    alert("XMLHTTPRequest fehlgeschlagen");
  }
  return res;
}

var _documentForm=null; // init formular
var _inputField=null;   // init suchfeld
var _submitButton=null; // init submit-button
var _defaultInputText = 'Suche nach Spielen'; // default value
var _defaultInputTextColor = '#999999'; // default text color
var _activeInputTextColor = '#000000'; // active text color
var _path = ''; // Path for search
var _order_entries=new Array('titel', 'plattform', 'genre', 'partner');
var _order_cats=new Array('pcgames', 'easygames', 'Konsolengames', 'browsergames', 'freegames', 'mobilegames', 'Flatrategames', 'specials');
//vorübergehende Lösung, da "Handy" in der Fetcherklasse noch nicht eingebunden
var _fetcher_areas=null;
var _completeDivHeader = 'Suchvorschl&auml;ge';

function startAutoComplete(form,field,submit,path,fetcher_areas){
  _documentForm=form;
  _inputField=field;
  _submitButton=submit;
  _inputField.autocomplete="off";
  _path=path;
  _fetcher_areas=fetcher_areas;
//   _inputField.value = _defaultInputText;
  _inputField.style.color = _defaultInputTextColor;

  _submitButton.onclick = onClickHandler;

  createAutocompletionDiv(); // style
  _currentInputFieldValue=_inputField.value;
  _oldInputFieldValue=_currentInputFieldValue;
  cacheResults("",new Array())
  document.onkeydown=onKeyDownHandler;
  _inputField.onkeyup=onKeyUpHandler;
  _inputField.onblur=onBlurHandler;
  _inputField.onfocus=onFocusHandler;

  window.onresize=onResizeHandler;
  // Funktion startet nach 200 ms.
  setTimeout("mainLoop('start')",100)
}


var _oldInputFieldValue="";     // voriger Suchfeldwert
var _currentInputFieldValue=""; // aktueller Suchfeldwert
var _resultCache=new Object();  // Ergebnisse cachen.

// Wird alle 200 ms wieder aufgerufen, um Aenderungen abzufangen
function mainLoop(){
  //utf-8 encode for search
  //var value=unescape( encodeURIComponent(_currentInputFieldValue) );
  var value=_currentInputFieldValue;
  var type='start';
  if(_oldInputFieldValue!=_currentInputFieldValue){


    //var value=escapeURI(_currentInputFieldValue);

    //console.log(value);
    var suggestions=_resultCache[_currentInputFieldValue];
    if(suggestions){ // Das Ergebnis ist bereits im cache
      setUp(value,suggestions)
    }else{
      getSuggestionList(type, value, '');

   //callSuggestions(value) // Ergebnisfunction aufrufen.
    }
    _inputField.focus()
  }
  _oldInputFieldValue=_currentInputFieldValue;
  setTimeout("mainLoop('"+type+"')",100);
  return true
}

/**
 * gibt Liste der verfuegbaren Suchvorschlaege aus
 *
 * @param type {string} 'start' fuer Anzeige in Eingabefeld, 'result' fuer Anzeige auf Ergebnisseite
 * @param value {string} der eingegebene Suchwert
 * @path value {string} Basis-Link-URL (nur fuer Ergenbisseitenlinks)
 *
 */
function getSuggestionList(type, value, path){

  //call to ESEMOS
  $.getJSON(_path+"?callback=?",
        {
            q:value
        },
        function(data) {
          var counter=1;
          var list=new Array();
          var out='';
          var temp=data['suggestions']['Suggests'];
          if(temp){
            jQuery.each(temp, function() {
                var string='';
                if(type=='start'){
                  //FIXME: Hack wegen Umlauten utf-8->latin
                  var tmp=escape(this['suggest'][0]).replace(/%u0178/g, "%9F");
                  tmp=tmp.replace(/%u2013/g, "%B6");
                  tmp=tmp.replace(/%u201E/g, "%A4");
                  tmp=tmp.replace(/%u0153/g, "%BC");
                  tmp=tmp.replace(/%u201E/g, "%A4");
                  if(this['suggest'][4]=='titel'){
                    var areas=formatAreas(this['suggest'][5]);

                    //console.log(decodeURIComponent(tmp));
                     string+='<span>'+decodeURI(tmp)+'</span><span class="green"> '+areas+' </span><span style="display:none" class="cat">q</span>';
                     //decodeURIComponent( escape( s ) );
                  }
                  else{string+='<span>'+decodeURI( tmp)+'</span><span style="display:none" class="cat">'+this['suggest'][4]+'</span>';}
                  list.push(string);
                }
                else if(type=='result'){
                  tmp=escape(this['suggest'][2]).replace(/%u0178/g, "%9F");
                  tmp=tmp.replace(/%u2013/g, "%B6");
                  tmp=tmp.replace(/%u201E/g, "%A4");
                  tmp=tmp.replace(/%u0153/g, "%BC");
                  tmp=tmp.replace(/%u201E/g, "%A4");
                  if(counter<=5 && value!= decodeURIComponent( escape(tmp))){
                    var searchparameter=this['suggest'][4];
                    if(this['suggest'][4]=='titel'){
                      searchparameter='q';
                    }
                    if(out.length>0){
                      out+='<span>,&nbsp;</span>';
                    }
                    out+='<a class="link_suggestion" href="'+path+'?'+searchparameter+'='+decodeURI(tmp)+'&sd=descending&suggest=dym">'+unescape(decodeURI(tmp))+'</a>';
                    counter++;
                  }
                }
            });
          }
          if(type=='start'){
            cacheResults(value,list)
            setUp(value,list)
          }
          else if(type=='result'){
            if(out.length>0){
              $('#suggest_list').append(out);
              $('#suggest_list').parent().css('display', 'block');
            }
          }
    });
}


/**
 *formatiert den von der Suche zurückgegebenen
 *String der verschiedenen Bereiche eines Treffers in der Form
 *wert1[, wert2][, wert3/und weitere]
 *
 *@param string, bereiche mit ";" getrennt
 *@return string, wie oben formatiert und mit Werten aus der Fetcherklasse ersetzt
 */
function formatAreas(area_string){
  area_string=area_string.split(';');
  area_string_new=new Array();
  var out='';

  for(var i=0; i<area_string.length; i++){
    var tmp='';
    //map tag and text to display
    for(var j=0; j<_fetcher_areas.length;j++){
      if(area_string[i]==_fetcher_areas[j][0]){
        tmp=_fetcher_areas[j][1];
      }
    }
    area_string_new.push(new Array(tmp, arrayIndexOf(_order_cats, area_string[i])))

  }
  //sort according to index in _order_cats
  area_string_new.sort(AreaSort);
  out=' in '+area_string_new[0][0];
  if(area_string_new.length>1){
      out+=', '+area_string_new[1][0];
      if(area_string_new.length==3){
        out+=', '+area_string_new[2][0];
      }
      else if(area_string_new.length>3) {
        out+=' und weitere';
      }
  }
  return out;
}

function AreaSort (a, b) {
  return a[1] - b[1];
}


// Special-character bearbeiten.
function escapeURI(string){
  if(encodeURIComponent) {
    return encodeURIComponent(string);
  }
  if(escape) {
    return escape(string)
  }
}

var _xmlHttp = null; // init xmlHttpRequest
if(window.location.hostname == "toi-gload-staging.odmedia.net"){
  var _fastsearch = "http://toi-gload-staging.odmedia.net/de/suche/reader.php"; // Adresse des Scripts zur Berechnung von Vorschlaegen
} else {
  var _fastsearch = "/de/suche/reader.php"; // Adresse des Scripts zur Berechnung von Vorschlaegen
}
//old suggestion-search function
function callSuggestions(value){
  if(_xmlHttp&&_xmlHttp.readyState!=0){
    _xmlHttp.abort()
  }
  _xmlHttp=getXMLHTTP();
  if(_xmlHttp){
    // Vorschlagsseite aufrufen
    _xmlHttp.open("GET",_fastsearch+"?start="+value,true);
    _xmlHttp.onreadystatechange=function() {
      if(_xmlHttp.readyState==4&&_xmlHttp.responseXML) {
        var list = prepareXmlSuggestions(_xmlHttp.responseXML)
        cacheResults(value,list)
        setUp(value,list)
      }
    };
    // Abfrage schicken
    _xmlHttp.send(null)
  }
}

// caching der Ergebnisse
function cacheResults(start,suggestions){
  _resultCache[start]=suggestions
}

// XML to select-field
function prepareXmlSuggestions(xmlDoc) {
  var options = xmlDoc.getElementsByTagName('option');
  var optionsList = new Array();
  for (var i=0; i < options.length; ++i) {
    optionsList.push(options[i].firstChild.data);
  }
  return optionsList;
}

// CSS-rules einfuegen
function insertCSS(nom,regle){
  if (document.styleSheets) {
    var I=document.styleSheets[0];
    if(I.addRule){ // IE-Methode
      I.addRule(nom,regle)
    }else if(I.insertRule){ // DOM-Methode
      I.insertRule(nom+" { "+regle+" }",I.cssRules.length)
    }
  }
}

function initStyle(){
  /*
  var AutoCompleteDivListeStyle="font-size: 13px; font-family: arial,sans-serif; word-wrap:break-word;";
  var AutoCompleteDivStyle="display: block; padding-left: 3; padding-right: 3; height: 16px; overflow: hidden; background-color: #white;";
  var AutoCompleteDivActStyle="background-color: #4c8600; color: white ! important; ";

  var AutoCompleteDivListeStyle="word-wrap:break-word;";
  var AutoCompleteDivStyle="display: block; padding: 0 5px; overflow: hidden; background-color: white;";
  var AutoCompleteDivActStyle="background-color: #75ab00; padding: 0 5px; color: white ! important; ";

  insertCSS(".AutoCompleteDivListeStyle",AutoCompleteDivListeStyle);
  insertCSS(".AutoCompleteDiv",AutoCompleteDivStyle);
  insertCSS(".AutoCompleteDivAct",AutoCompleteDivActStyle);
  */
}

function setStyleElement(c,name){
  c.className=name;
}

// offset links
function calculateOffsetLeft(r){
  return calculateOffset(r,"offsetLeft")
}

// offset oben
function calculateOffsetTop(r){
  return calculateOffset(r,"offsetTop")
}

function calculateOffset(r,attr){
  var kb=0;
  while(r){
    kb+=r[attr];
    r=r.offsetParent
  }
  return kb
}

// Feldbreite
function calculateWidth(){
  return _inputField.offsetWidth-2*1
}

function setCompleteDivSize(){
  if(_completeDiv){
    _completeDiv.style.left=calculateOffsetLeft(_inputField)+"px";
    _completeDiv.style.top=calculateOffsetTop(_inputField)+_inputField.offsetHeight-1-119+"px";
    _completeDiv.style.width=calculateWidth()+"px"
  }
}

function createAutocompletionDiv() {
  initStyle();
  _completeDiv=document.createElement("DIV");
  _completeDiv.id="completeDiv";
  /*
  var borderLeftRight=1;
  var borderTopBottom=1;
  _completeDiv.style.borderRight="black "+borderLeftRight+"px solid";
  _completeDiv.style.borderLeft="black "+borderLeftRight+"px solid";
  _completeDiv.style.borderTop="black "+borderTopBottom+"px solid";
  _completeDiv.style.borderBottom="black "+borderTopBottom+"px solid";
  _completeDiv.style.zIndex="1";
  _completeDiv.style.paddingRight="0";
  _completeDiv.style.paddingLeft="0";
  _completeDiv.style.paddingTop="0";
  _completeDiv.style.paddingBottom="0";
  */
  //setCompleteDivSize();

  _completeDiv.style.visibility="hidden";
  document.getElementById('portal_search').appendChild(_completeDiv);
  setStyleElement(_completeDiv,"AutoCompleteDivListeStyle");

}

function setUp(value, list){
  while(_completeDiv.childNodes.length>0) {
    _completeDiv.removeChild(_completeDiv.childNodes[0]);
  }
  var newDiv=document.createElement("SPAN");
  //console.log(_completeDivHeader);
  newDiv.id='completeDivHeader';
  newDiv.innerHTML=_completeDivHeader;
  _completeDiv.appendChild(newDiv);
  //_completeDiv.appendChild('<div class="completeDivHeader">'+_completeDivHeader+'</div>');
  //console.log(_completeDiv.children);
  // Vorschlaege aufsetzen
  for(var f=0; f<list.length; ++f){
    var newDiv=document.createElement("DIV");
    newDiv.onmousedown=divOnMouseDown;
    newDiv.onmouseover=divOnMouseOver;
    newDiv.onmouseout=divOnMouseOut;
    setStyleElement(newDiv,"AutoCompleteDiv");
    var newSpan=document.createElement("SPAN");
    newSpan.innerHTML=unescape(list[f]); // Suggestions-Text
    newDiv.appendChild(newSpan);
    _completeDiv.appendChild(newDiv)
  }
  otherPush();
  if(_completeDivRows>0) {
    _completeDiv.height=16*_completeDivRows+4;
  } else {
    hideCompleteDiv();
  }

}

var _lastKeyCode=null;

var onKeyDownHandler=function(event){
  // event-access, kompatibel IE/Firefox
  if(!event&&window.event) {
    event=window.event;
  }
  // keycode speichern
  if(event) {
    _lastKeyCode=event.keyCode;
  }
}

var _eventKeycode = null;

var onKeyUpHandler=function(event){
  // event-access, kompatibel IE/Firefox
  if(!event&&window.event) {
    event=window.event;
  }
  _eventKeycode=event.keyCode;
  if(_eventKeycode==40||_eventKeycode==38) {
    blurThenGetFocus();
  }
  // Groesse selektiertes Element
  var N=rangeSize(_inputField);
  // Textgroesse vor der Selektion
  var v=beforeRangeSize(_inputField);
  // Suchfeld-Inhalt
  var V=_inputField.value;
  if(_eventKeycode!=0){
    if(N>0&&v!=-1) {
      V=V.substring(0,v);
    }
    if(_eventKeycode==13||_eventKeycode==3){
      var d=_inputField;
      if(_inputField.createTextRange){
        var t=_inputField.createTextRange();
        t.moveStart("character",_inputField.value.length);
        _inputField.select()
      } else if (d.setSelectionRange){
        _inputField.setSelectionRange(_inputField.value.length,_inputField.value.length)
      }
    } else {
      if(_inputField.value!=V) {
        _inputField.value=V
      }
    }
  }


  if(_eventKeycode!=40&&_eventKeycode!=38) {
  	_currentInputFieldValue=V;
  }
  if(handleCursorUpDownEnter(_eventKeycode)&&_eventKeycode!=0) {
    otherPush();
  }
}

function handleCursorUpDownEnter(eventCode){
  if(eventCode==40){
    highlightNewValue(_highlightedSuggestionIndex+1);
    return false
  }else if(eventCode==38){
    highlightNewValue(_highlightedSuggestionIndex-1);
    return false
  }else if(eventCode==13||eventCode==3){
    return false
  }
  return true
}

var _completeDivRows = 0;
var _completeDivDivList = null;
var _highlightedSuggestionIndex = -1;
var _highlightedSuggestionDiv = null;

// Andere Tasten (weder up noch down noch enter)
function otherPush(){
  _highlightedSuggestionIndex=-1;
  var suggestionList=_completeDiv.getElementsByTagName("div");
  var suggestionLength=suggestionList.length;
  _completeDivRows=suggestionLength;
  _completeDivDivList=suggestionList;
  if(_currentInputFieldValue==""||suggestionLength==0){
    hideCompleteDiv()
  }else{
    showCompleteDiv()
  }
  var found=false;
  if(_currentInputFieldValue.length>0){
    var index;
    for(index=0; index<suggestionLength; index++){
      if(getSuggestion(suggestionList.item(index)).toUpperCase().indexOf(_currentInputFieldValue.toUpperCase())==0) {
        found=true;
        break
      }
    }
  }
  // Alle Vorschlaege ausschalten
  for(var i=0; i<suggestionLength; i++) {
    setStyleElement(suggestionList.item(i),"AutoCompleteDiv");
  }
  // Wenn es Uebereinstimmung mit user-Eintrag gibt
  if(found){
    _highlightedSuggestionIndex=index;
    _highlightedSuggestionDiv=suggestionList.item(_highlightedSuggestionIndex);
  }else{
    _highlightedSuggestionIndex=-1;
    _highlightedSuggestionDiv=null
  }
  //don't autohighlight
  var supprSelection=true;

  switch(_eventKeycode){
    case 8:
    case 33:
    case 34:
    case 35:
    case 35:
    case 36:
    case 37:
    case 39:
    case 45:
    case 46:
      supprSelection=true;
      break;
    default:
      break
  }
  //console.log(supprSelection);
  if(!supprSelection&&_highlightedSuggestionDiv){

    setStyleElement(_highlightedSuggestionDiv,"AutoCompleteDivAct");
    var z;
    if(found) {
      z=getSuggestion(_highlightedSuggestionDiv).substr(0);
    } else {
      z=_currentInputFieldValue;
    }
    if(z!=_inputField.value){
      if(_inputField.value!=_currentInputFieldValue) {
        return;
      }
      /*
       * Hier wuerde das inputfeld automatisch mit
       * vorhandenen Vorschlaegen erweitert werden.
       * Auf Wunsch von Kunde ausgeschaltet

      if(_inputField.createTextRange||_inputField.setSelectionRange) {
        _inputField.value=z;
      }
      if(_inputField.createTextRange){
        var t=_inputField.createTextRange();
        t.moveStart("character",_currentInputFieldValue.length);
        t.select()
      }else */
      if(_inputField.setSelectionRange){
        _inputField.setSelectionRange(_currentInputFieldValue.length,_inputField.value.length);
      }
    }
  }else{
    _highlightedSuggestionIndex=-1;
  }
}

var _cursorUpDownPressed = null;

function blurThenGetFocus(){
  _cursorUpDownPressed=true;
  _inputField.blur();
  setTimeout("_inputField.focus();",10);
  return
}

function rangeSize(n){
  var N=-1;
  if(n.createTextRange){
    var fa=document.selection.createRange().duplicate();
    N=fa.text.length
  }else if(n.setSelectionRange){
    N=n.selectionEnd-n.selectionStart
  }
  return N
}

function beforeRangeSize(n){
  var v=0;
  if(n.createTextRange){
    var fa=document.selection.createRange().duplicate();
    fa.moveEnd("textedit",1);
    v=n.value.length-fa.text.length
  }else if(n.setSelectionRange){
    v=n.selectionStart
  }else{
    v=-1
  }
  return v
}

function cursorAfterValue(n){
  if(n.createTextRange){
    var t=n.createTextRange();
    t.moveStart("character",n.value.length);
    t.select()
  } else if(n.setSelectionRange) {
    n.setSelectionRange(n.value.length,n.value.length)
  }
}


function getSuggestion(elem){
  if(!elem) {
    return null;
  }
  if(elem.getElementsByTagName('span')[0].firstChild.innerHTML.length>0){
    var tmp=elem.getElementsByTagName('span')[0].firstChild.innerHTML;
    var tmp=tmp.replace(/<b>/g, "");
    var tmp=tmp.replace(/<B>/g, "");
    tmp=tmp.replace(/<\/b>/g, "");
    tmp=tmp.replace(/<\/B>/g, "");
    tmp=tmp.replace(/&amp;/g, "&");
    return trimCR(tmp);
    //return trimCR(elem.getElementsByTagName('span')[0].firstChild.data);
  }
  else return '';
}

function trimCR(string){
  for(var f=0,newstring='',zb='\n\r'; f<string.length; f++) {
    if (zb.indexOf(string.charAt(f))==-1) {
      newstring+=string.charAt(f);
    }
  }
  newstring+='';
  return newstring;
}

function hideCompleteDiv(){
  _completeDiv.style.visibility="hidden";
}

function showCompleteDiv(){
  _completeDiv.style.visibility="visible";
  //setCompleteDivSize();
}

function highlightNewValue(C){
  if(!_completeDivDivList||_completeDivRows<=0) {
    return;
  }
  showCompleteDiv();
  if(C>=_completeDivRows){
    C=_completeDivRows-1
  }
  if(_highlightedSuggestionIndex!=-1&&C!=_highlightedSuggestionIndex){
    setStyleElement(_highlightedSuggestionDiv,"AutoCompleteDiv");
    _highlightedSuggestionIndex=-1;
  }
  if(C<0){
    _highlightedSuggestionIndex=-1;
    _inputField.focus();
    return
  }
  _highlightedSuggestionIndex=C;
  _highlightedSuggestionDiv=_completeDivDivList.item(C);
  setStyleElement(_highlightedSuggestionDiv,"AutoCompleteDivAct");
  _inputField.value=getSuggestion(_highlightedSuggestionDiv);
}

var onResizeHandler=function(event){
  //setCompleteDivSize();
};

var onBlurHandler=function(event){
  if(!_cursorUpDownPressed){
    hideCompleteDiv();
    if(_lastKeyCode==9){
      _submitButton.focus();
      _lastKeyCode=-1;
    }
  }
  if(_inputField.value == ''){
    _inputField.value = _defaultInputText;
    _inputField.style.color = _defaultInputTextColor;
  }
  _cursorUpDownPressed=false;
};

var onFocusHandler=function(event){
  if(_inputField.value == _defaultInputText){
    _inputField.value = '';
    _inputField.style.color = _activeInputTextColor;

  }
};

var onClickHandler=function(){
  if(_inputField.value == _defaultInputText) _inputField.value='*';
  if(_inputField.value == '') _inputField.value='*';
  //filter some strange input
  if(_inputField.value!='unknown'
     && _inputField.value !='pics favicon ico' && _inputField.value !='robots.txt'
     && _inputField.value !='favicon ico'){
    document.such_formular.submit();
    return true;
  }
  else {
    return false;
  }
};

var divOnMouseDown=function(){
  _inputField.value=getSuggestion(this);
  $(_inputField).attr('name', $('.cat', this).text());
  //add information "suggest" in header.inc
  //$('#such_formular').append('<input type="hidden" name="suggest" value="on" />');
  //$('#suggestValue').val('on');
  document.such_formular.onsubmit();
};

var divOnMouseOver=function(){
  if(_highlightedSuggestionDiv) {
    setStyleElement(_highlightedSuggestionDiv,"AutoCompleteDiv");
  }
  setStyleElement(this,"AutoCompleteDivAct");
};

var divOnMouseOut = function(){
  setStyleElement(this,"AutoCompleteDiv");
};

