function ACAjax() {
  this.url="";
  this.params="";
  this.method="GET";
  this.onSuccess=null;
  this.onError=function (msg) {
    alert(msg);
  }
}

ACAjax.prototype.doRequest=function() {
  if (!this.url) {
    this.onError("Es wurde kein URL angegeben. Der Request wird abgebrochen.");
    return false;
  }

  if (!this.method) {
    this.method="GET";
  } else {
    this.method=this.method.toUpperCase();
  }

  var _this = this;

  var xmlHttpRequest=getXMLHttpRequest();
  if (!xmlHttpRequest) {
    this.onError("Es konnte kein XMLHttpRequest-Objekt erstellt werden.");
    return false;
  }

  switch (this.method) {
    case "GET": xmlHttpRequest.open(this.method, this.url+"?"+this.params, true);
                xmlHttpRequest.onreadystatechange = readyStateHandler;
                xmlHttpRequest.send(null);
                break;
    case "POST": xmlHttpRequest.open(this.method, this.url, true);
                 xmlHttpRequest.onreadystatechange = readyStateHandler;
                 xmlHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
        				 xmlHttpRequest.setRequestHeader('Content-Length', this.params.length);
                 xmlHttpRequest.send(this.params);
                 break;
  }

  function readyStateHandler() {
	if(xmlHttpRequest != null) {
      if (xmlHttpRequest.readyState < 4) {
        return false;
      }
      if (xmlHttpRequest.status == 200 || xmlHttpRequest.status==304) {
        if (_this.onSuccess) {
          _this.onSuccess(xmlHttpRequest.responseText, xmlHttpRequest.responseXML);
        }
      } else if(xmlHttpRequest.status == 404) {
        if(xmlHttpRequest.responseText != "") {
          //alert(xmlHttpRequest.responseText);
          _this.onSuccess(xmlHttpRequest.responseText, xmlHttpRequest.responseXML);
        }
        else {
          //alert(xmlHttpRequest.responseText);
          _this.onError("["+xmlHttpRequest.status+" "+xmlHttpRequest.statusText+"] Es trat ein Fehler bei der Datenbertragung auf.");
          return false;
        }
      } else {
        if (_this.onError) {
          _this.onError("["+xmlHttpRequest.status+" "+xmlHttpRequest.statusText+"] Es trat ein Fehler bei der Datenbertragung auf.");
		  return false;
        }
      }
	  return true;
	}

	return false;
  }

  return true;
}

function getXMLHttpRequest()
{
  if (window.XMLHttpRequest) {
    return new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    try {
      return new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      try {
        return new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        return null;
      }
    }
  }
  return false;
}

function hasError(msg) {
  if(!msg)  return false;

  if(msg.indexOf("ERROR:") == 0)  return true;
  else                            return false;
}

function getError(msg) {
  return msg.replace(/ERROR:/,"");
}

function ltrim(s) {
  while (s.substring(0,1) == ' ')
    s = s.substring(1,s.length);

  return s;
}

function rtrim(s) {
  while (s.substring(s.length-1,s.length) == ' ') 
    s = s.substring(0,s.length-1);

  return s;
}

function trim(s) {
  return rtrim(ltrim(s));
}

function replaceLatinSpecialChars( txt ) {
  var atom = txt.toLowerCase().replace(/ß/g, 'ss');
  atom = atom.replace(/[ä]/g, 'ae');
  atom = atom.replace(/[ö]/g, 'oe');
  atom = atom.replace(/[ü]/g, 'ue');  
  return atom;
}

function preset( field ) {
  //document.getElementById(field).onkeyup();
  var NewSearchData = new SearchData( field, document.getElementById(field) );
}

function unhtmlentities( txt ) {
  var atom = txt.replace(/\&quote;/g, '"');
  atom = atom.replace(/\&gt;/g, '>');
  atom = atom.replace(/\&lt;/g, '<');
  atom = atom.replace(/\&amp;/g, '&'); 
  return atom;
}

SearchData = function(fieldID, cType, attrID) {  
  var obj = obj || false;
  this.field = document.getElementById(fieldID);
  this.resultSet = new Array();
  this.matchState = 0;
  this.tmpValue = "";
  this.fieldID = fieldID;
  this.cTypeID = cType;
  this.attrID = attrID;
  this.offset = 0;
  this.limit = 20;
  this.acLimit = null;
  this.showAddButton = false;
  this.addButtonText = 'hinzufügen';
  //this.noMatchesText = 'no matches found';
  this.noMatchesText = 'Kein Eintrag gefunden';
  //this.toManyMatchesText = 'To many matches';
  this.toManyMatchesText = 'zu viele gefunden';
  this.addButtonCallFN = 'SearchData.addButtonCall';
  active = null;

  var sd = this;

  eval("this.last_"+this.field.id+" = '';");
  eval("this.current_"+this.field.id+" = '';");

  if(document.getElementById("results_all_"+fieldID) && document.getElementById("all_"+fieldID)) {
    var allButton = document.getElementById("all_"+fieldID);
    allButton.onclick=function(e) { 
      if(document.getElementById("results_all_"+fieldID).className == "autocatalogAll") {
        sd.offset = 0;
        document.getElementById("results_all_"+fieldID).className = "hidden";
        return false;
      }       

      sd.getAll(); return false; 
    };
  }

  this.field.onkeyup=function(e) { sd.onKeyUp(e, this); };  
  this.field.onkeydown=function(e) { sd.onKeyDown(e, this); };
  this.field.onblur=function(e) { sd.onBlur(e, this); };
  //document.body.onclick=function(e) { alert("mausklick"); };
}

SearchData.addButtonCall = function() {
  /*alert("You've clicked me!");*/
}

SearchData.prototype.displayAddButton = function( param ) {
  this.showAddButton = param;
}

SearchData.prototype.setAllLimit = function( limit ) {
  if(!isNaN(limit) && limit >= 0)
    this.limit = limit;
}

SearchData.prototype.setLimit = function( limit ) {
  if((!isNaN(limit) && limit >= 0) || limit == null)
    this.acLimit = limit;
}

SearchData.prototype.setAddButtonText = function( param ) {
  this.addButtonText = param;
}

SearchData.prototype.setNoMatchesText = function( param ) {
  this.noMatchesText = param;
}

SearchData.prototype.setAddButtonCallFN = function( param ) {
  this.addButtonCallFN = trim(param);
}

SearchData.prototype.setToManyMatchesText = function( param ) {
  this.toManyMatchesText = param;
}

SearchData.checkCombined = function(current) {
  var combinedFields = new Array();
  return combinedFields;
}

SearchData.atomize = function(txt) {
  var atom = replaceLatinSpecialChars( trim(txt.toLowerCase()) );
  return atom.replace(/[^a-z0-9]/g, '_');
}

SearchData.prototype.arraySearch = function(id, search) {
  var resultSubSet = new Array();

  if(this.resultSet.length > 0) {
    for(var ID in this.resultSet) {
      if(this.resultSet[ID]["Text"].toLowerCase().indexOf(search.toLowerCase()) >= 0) {
        resultSubSet[ID] = this.resultSet[ID];
      }
    }
  }

  return resultSubSet;
}

SearchData.prototype.getAll = function() {
  var _this = this;

  var ajax = new ACAjax();
  ajax.method = 'POST';
  ajax.url = 'index.php';
  ajax.params = 'pageID=599&action=ac&option=all&objID='+this.fieldID+'&ctype='+this.cTypeID+'&attrID='+this.attrID+'&offset='+this.offset+'&limit='+this.limit+'&fwd=true';

  ajax.onSuccess = function(txt,xml) {
    if(hasError(txt))
      ajax.onError(getError(txt));
    else {
      var response = trim(txt);
      document.getElementById("results_all_"+_this.fieldID).innerHTML = response;
      document.getElementById("results_all_"+_this.fieldID).className = "autocatalogAll";   

      if(document.getElementById("ac_"+_this.fieldID+"_"+_this.cTypeID+_this.attrID+"_Next")) {
        var buttonNext = document.getElementById("ac_"+_this.fieldID+"_"+_this.cTypeID+_this.attrID+"_Next");
        buttonNext.onclick=function(e) { _this.getNext(); return false; };
      }

      if(document.getElementById("ac_"+_this.fieldID+"_"+_this.cTypeID+_this.attrID+"_Previous")) {
        var buttonNext = document.getElementById("ac_"+_this.fieldID+"_"+_this.cTypeID+_this.attrID+"_Previous");
        buttonNext.onclick=function(e) { _this.getPrevious(); return false; };
      }
    }

    return false;
  }

  ajax.doRequest(); 
}

SearchData.prototype.getNext = function() {
  this.offset = Math.max((this.offset+this.limit), 0);
  this.getAll();
}

SearchData.prototype.getPrevious = function( objID, attrID, cType, offset ) {
  this.offset = Math.max((this.offset-this.limit), 0);
  this.getAll();
}

SearchData.prototype.onBlur = function(e, input) {
  /*var field = document.getElementById(this.field.id+"ID");
  var resultField = document.getElementById("results_"+this.field.id);

  if((trim(field.value) == "" || !isNaN(trim(field.value))) && resultField.className == "autocatalog") {
    
  }*/
}

SearchData.prototype.onKeyDown = function(e, input) {
  this.tmpValue = SearchData.atomize(this.field.value);
}

SearchData.prototype.onKeyUp = function(e, input) {
  if(trim(this.field.value) == '')
    this.resultSet = new Array();   
  
  var _this = this;
  var searchTxt = this.field.value;
  var search = SearchData.atomize(this.field.value); 
  var combinedSearch = SearchData.checkCombined(this.field.id);
  var isCombined = (combinedSearch.length > 0) ? true : false;
  var searchID = this.field.id;  

  var e = e || window.event;
  if(window.captureEvents) {
    var pressed = e.which;
  } else {
    var pressed = e.keyCode;
  }

  var subDir = search.substr(0,1);
  var attrDirArray = this.field.id.split("_");
  var attrDir = attrDirArray[attrDirArray.length-1];

  var ajax = new ACAjax();
  ajax.method = 'GET';
  ajax.url = 'cache/autocatalog/'+this.attrID+'/'+subDir+"/"+search+".dat";

  ajax.onSuccess = function(txt,xml) {
    if(hasError(txt))
      ajax.onError(getError(txt));
	  else {      
      eval("_this.last_"+searchID+" = search;");
      _this.parseResult(txt);      
      _this.showResults( null, searchID );      
    }

    return false;
  }

  switch (pressed) {
    case 16: // shift
    case 17: // ctrl
    case 18: // alt
    case 20: // caps lock
    case 33: // page up
    case 34: // page down
    case 35: // end
    case 36: // home
    case 37: // left arrow
    case 38: // up arrow
    case 39: // right arrow
    case 40: // down arrow
    case 13: // enter
      return false;

    case 9:  // tab    
    case 27: // esc
      SearchData.hideAll(this.field.id);
      return false;

    default:
      if(this.tmpValue != SearchData.atomize(this.field.value))
        document.getElementById(this.field.id+"ID").value = "";

      if(search.length > 1) {   
        eval("var lastSearch = this.last_"+this.field.id+";");

        if(((lastSearch.length > 0 && search.substr(0, lastSearch.length) == lastSearch)) && this.resultSet.length > 0) {
          this.showResults(this.arraySearch(this.field.id, trim(this.field.value)), this.field.id);
        }
        else {
          if(!isCombined)
            this.resultSet = new Array();

          ajax.doRequest();
        }
      }
      else {
        this.resultSet = new Array();
        SearchData.hideAll(this.field.id);
      }
  }

  return false;
}

SearchData.setDataWC = function(objID, field, keyID, cType, attrID, inhalt) {
        document.getElementById(field).value = inhalt;
		//  document.getElementById("button").disabled=true;
		  SearchData.setDataWC2(objID, field, keyID, cType, attrID);
}


SearchData.setDataWC2 = function(objID, field, keyID, cType, attrID, mkeyID) {
    var mkeyID = mkeyID || null;
    var ajax = new ACAjax();
    ajax.method = 'POST';
    ajax.url = 'index.php';
    if(mkeyID == null)
      ajax.params = 'pageID=599&action=ac&field='+field+'&keyID='+keyID+'&ctype='+cType+'&attrID='+attrID+'&fwd=true';
    else
      ajax.params = 'pageID=599&action=ac&field='+field+'&mkeyID='+keyID+'&ctype='+cType+'&attrID='+attrID+'&fwd=true';

    ajax.onSuccess = function(txt,xml) {
      if(hasError(txt))
        ajax.onError(getError(txt));
      else {
        var response = trim(txt);
        if(isNaN(response)) {
          if(response == "") {
            document.getElementById(field).value = unhtmlentities(trim(document.getElementById(objID+"A").innerHTML));
            document.getElementById(field+'ID').value = response;
            SearchData.hideAll(field);
          }
          else {
            document.getElementById("results_"+field).innerHTML = response;
            document.getElementById("results_"+field).className = "autocatalogAll";
          }
        }
        else {
          document.getElementById(field).value = unhtmlentities(trim(document.getElementById(objID+"A").innerHTML));
          document.getElementById(field+'ID').value = response;
          SearchData.hideAll(field);
        }
      }

      return false;
    }
  
    ajax.doRequest();
}

SearchData.setData = function(objID, field, keyID, cType, attrID, mkeyID) {
    var mkeyID = mkeyID || null;
    var ajax = new ACAjax();
    ajax.method = 'POST';
    ajax.url = 'index.php';
    if(mkeyID == null)
      ajax.params = 'pageID=599&action=ac&field='+field+'&keyID='+keyID+'&ctype='+cType+'&attrID='+attrID+'&fwd=true';
    else
      ajax.params = 'pageID=599&action=ac&field='+field+'&mkeyID='+keyID+'&ctype='+cType+'&attrID='+attrID+'&fwd=true';

    ajax.onSuccess = function(txt,xml) {
      if(hasError(txt))
        ajax.onError(getError(txt));
      else {
        var response = trim(txt);
        if(isNaN(response)) {
          if(response == "") {
            document.getElementById(field).value = unhtmlentities(trim(document.getElementById(objID+"A").innerHTML));
            document.getElementById(field+'ID').value = response;
            SearchData.hideAll(field);
          }
          else {
            document.getElementById("results_"+field).innerHTML = response;
            document.getElementById("results_"+field).className = "autocatalog";
          }
        }
        else {
          document.getElementById(field).value = unhtmlentities(trim(document.getElementById(objID+"A").innerHTML));
          document.getElementById(field+'ID').value = response;
          SearchData.hideAll(field);
        }
      }

      return false;
    }
  
    ajax.doRequest();
}


SearchData.setDataGer = function(objID, field, keyID, cType, attrID, inhalt) {
        document.getElementById(field).value = inhalt;
		//  document.getElementById("button").disabled=true;
		  SearchData.setData(objID, field, keyID, cType, attrID);
}

SearchData.prototype.parseResult = function(txt, combined) {
  var matches = txt.split("\n");
  var combined = combined || false;
  var tmp = new Array();

  function getTags(txt) {
    var foundOpenTags = txt.match(/\{([^\}]*)\}/g);
    var foundCloseTags = txt.match(/\{\/([^\}]*)\}/g);

    var foundTags = new Array();
    if(foundOpenTags && foundCloseTags) {
      for (var i=0; i<foundOpenTags.length; i++) {
        for(var j=0; j<foundCloseTags.length; j++) {
          if(trim(foundOpenTags[i]) == trim(foundCloseTags[j]))
            foundTags.push(foundCloseTags[j].substring(2, foundCloseTags[j].length-1));
        }
      }
    }

    return foundTags;
  }

  function parseID(txt) {
    var found = txt.match(/\{([0-9]*)\}/);
    if(found && found.length > 1)
      return found[1];
    else
      return "";
  }
  
  function parseData(txt, tag) {
    var start = txt.indexOf("{"+tag+"}");
    var end = txt.indexOf("{/"+tag+"}");

    if(start > 0 && end > 0) {
      var found = txt.substring((start+tag.length+2), end);
      return found;
    }
    else
      return "";    
  }

  if(matches[0] == "[STATE 1]") { this.matchState = 1; }
  else if(matches[0] == "[STATE 0]") { this.matchState = 0; }
  else {
    this.matchState = 0;

    if(combined)
      var tempSet = new Array();

    var foundTags = getTags( matches[0] );   

    if(foundTags.length > 0) {
      for(var i=0; i<matches.length; i++) {
        if(trim(matches[i]) != "") {
          var ID = parseID(matches[i]);

          if(ID != "") {
            var text = new Array();
            for(var cc=0; cc<foundTags.length; cc++)
              text.push(trim(parseData(matches[i], foundTags[cc])));

            if(!combined) {
              this.resultSet[ID] = new Object();
              this.resultSet[ID]["ID"] = ID;
              this.resultSet[ID]["Text"] = text.join(" - ");
            }
            else {
              if(this.resultSet[ID])
                tempSet[ID] = this.resultSet[ID];
            }
          }
        }
      }
    }
    else {
      this.resultSet = new Array();
    }
  }
}

SearchData.getTextBlocks = function(txt, blocks) {  
  var blocks = blocks || new Array();

  var i = 0;
  while(i<txt.length) {
    var temp = txt.substr(i, 3);
    if(temp.length < 3)
      temp = temp+".dat";

    blocks.push(temp);

    if((i+3) >= txt.length && temp.length == 3)
      blocks.push("default.dat");
    i+=3;
  }
  
  return blocks;  
}

SearchData.hideAll = function( field ) {
  if(document.getElementById("results_"+field)) {
    document.getElementById("results_"+field).innerHTML = "";
    document.getElementById("results_"+field).className = "hidden";  
  }

  if(document.getElementById("results_all_"+field)) {
    document.getElementById("results_all_"+field).innerHTML = "";
    document.getElementById("results_all_"+field).className = "hidden";  
  }

  var selectElements = document.getElementsByTagName("select");
  if(selectElements && selectElements.length > 0) {
    for(var i=0; i<selectElements.length; i++) {
      var classes = selectElements[i].className;
      var classesArray = classes.split(" ");
      for(var j=0; j<classesArray.length; j++) {
        if(trim(classesArray[j]) == "autocatalogHide")
          selectElements[i].style.visibility = 'visible';
      }
    }
  }
}

SearchData.prototype.showResults = function(results, resultField) {  
  var results = results || this.resultSet;
  if(results == null)
    results = this.resultSet;

  var field = document.getElementById("results_"+resultField);
  field.innerHTML = "";

  //if(results.length > 0 || this.showAddButton) {
  var ul = document.createElement('ul');
  var ulAttr = document.createAttribute("class");
  ulAttr.nodeValue = "autocatalog";
  ul.setAttributeNode(ulAttr);   
  //}
  
  if(!results || results.length <= 0) {    
    var li = document.createElement('li');
    var liAttr = document.createAttribute("class");
    liAttr.nodeValue = "autocatalogItem";
    li.setAttributeNode(liAttr); 

    if(this.matchState == 1)
      var liText = document.createTextNode(this.toManyMatchesText);
    else
      var liText = document.createTextNode(this.noMatchesText);
      
    li.appendChild(liText);
    ul.appendChild(li);
  }

  if(results.length > 0) {
    var counter = 0;
    for(var ID in results) {
      if(this.acLimit != null && counter >= this.acLimit)
        break;

      var itemID = "acItem_"+this.attrID+this.cTypeID+results[ID]["ID"];
      var li = document.createElement('li');
      var a = document.createElement('a');
      var liAttr = document.createAttribute("id");
      liAttr.nodeValue = itemID;
      li.setAttributeNode(liAttr);

      liAttr = document.createAttribute("class");
      liAttr.nodeValue = "autocatalogItem";
      li.setAttributeNode(liAttr); 

      

      var aAttr = document.createAttribute("href");
      aAttr.nodeValue = "javascript:SearchData.setDataGer('"+itemID+"', '"+resultField+"', "+results[ID]["ID"]+", "+this.cTypeID+", "+this.attrID+",'"+results[ID]["Text"]+"');";
      a.setAttributeNode(aAttr);

	  var aText = document.createTextNode(results[ID]["Text"]);
      var aAttr = document.createAttribute("id");
      aAttr.nodeValue = itemID+"A";
      a.setAttributeNode(aAttr);

      a.appendChild(aText);
      li.appendChild(a);
      ul.appendChild(li);

      counter++;      
    }    
  }

  if(this.showAddButton) {
    var li = document.createElement('li');
    var a = document.createElement('a');
    var liAttr = document.createAttribute("id");
    liAttr.nodeValue = "addButton_"+resultField;
    li.setAttributeNode(liAttr);

    var aAttr = document.createAttribute("href");
    aAttr.nodeValue = "#";
    a.setAttributeNode(aAttr);

    aAttr = document.createAttribute("id");
    aAttr.nodeValue = "addButton_"+resultField+"A";
    a.setAttributeNode(aAttr);

    var aText = document.createTextNode(this.addButtonText);
    a.appendChild(aText);
    li.appendChild(a);
    ul.appendChild(li);
  }

  //if(results.length > 0 || this.showAddButton) {
  field.appendChild(ul);
  field.className = "autocatalog";

  var selectElements = document.getElementsByTagName("select");
  if(selectElements && selectElements.length > 0) {
    for(var i=0; i<selectElements.length; i++) {
      var classes = selectElements[i].className;
      var classesArray = classes.split(" ");
      for(var j=0; j<classesArray.length; j++) {
        if(trim(classesArray[j]) == "autocatalogHide")
          selectElements[i].style.visibility = 'hidden';
      }
    }
  }
  //}

  if(document.getElementById("addButton_"+resultField+"A")) {
    _this = this;
    var buttonAdd = document.getElementById("addButton_"+resultField+"A");
    buttonAdd.onclick=function(e) { eval(_this.addButtonCallFN+"();"); return false; };
  }  

  /*if(trim(field.innerHTML) != "") {
    SearchData.hideAll(resultField);
  }*/
}

