/* AutoCompletion */
var ac = {
  
  
  /*
  * start
  *
  * Startet die AutoCompletion
  *
  * @package  ac.js
  * @author   Sergej Müller
  * @since    10.01.2006
  * @change   10.01.2006
  * @access   public
  * @param    object  obj   Object mit Eigenschaften
  * @param    object  args  Argumente zum Weiterleiten (Format: {'key': 'value', 'key2': 'value2'})
  */
  
  'start': function(obj, args) {
    /* Leere Werte? */
    if (!obj || !obj.value) {
      ac.disable();
      return;
    }
    
    /* Sender speichern */
    ac.settings.sender = obj;
    
    /* AJAX-Request */
    new ajax(
             {
              'url':  ac.settings.url,
              'args': args,
              'call': 'ac.analyze'
             }
            );
  },
  
  
  /*
  * analyze
  *
  * Analysiert die AJAX-Antwort
  *
  * @package  ac.js
  * @author   Sergej Müller
  * @since    10.01.2006
  * @change   10.01.2006
  * @access   public
  * @param    object  obj  Object mit AJAX-Attributen
  */
  
  'analyze': function(obj) {
    /* Werte initialisieren */
    var sender = ac.settings.sender;
    var result_obj;
    var node = null;
    var parent = null;
    var offset = {
                  'top':  0,
                  'left': 0
                 };
    
    /* Antwort leer? */
    if (!obj.responseXML) {
      return;
    }
    
    /* Objekte selektieren */
    var o_arr = obj.responseXML.getElementsByTagName('data');
    
     /* Länge des Arrays */
    var length = o_arr.length;
    
    /* Keine Objekte? */
    if (length === 0) {
    	ac.disable();
      return;
    }
    
    
    result_obj = dom.element.get(ac.settings.id);
    
    if (result_obj) {
      dom.element.clean(result_obj);
    } else {
      /* Koordinaten ermitteln */
      do {
        node = (node === null) ? sender : parent;
        parent = node.offsetParent;
        
        offset.top += parseInt(parent.offsetTop);
        offset.left += parseInt(parent.offsetLeft);
      } while(parent.offsetTop > 0 || parent.offsetLeft > 0);
      
      /* Resultate als Object */
      result_obj = dom.element.add(
                                   'div',
                                   {
                                    'id':         ac.settings.id,
                                    'className':  ac.settings.style,
                                    'style.top':  parseInt(offset.top + sender.offsetTop + sender.offsetHeight) + 'px',
                                    'style.left': parseInt(offset.left + sender.offsetLeft) + 'px'
                                   }
                                  );
      
      /* Object zuweisen */
      dom.element.append(
                         dom.element.get('body', 'tag'),
                         result_obj
                        );
    }
    
    /* Objekte durchlaufen */
    for (var i = 0; i < length; i ++) {
      /* Wert speichern */
      var text = decodeURIComponent(xml.get(o_arr[i], 'name'));
      
      /* Ergebnis als Zeile */
      dom.element.append(
                         result_obj,
                         dom.element.add(
                                         'div',
                                         {
                                          'text':      text,
                                          'onclick':   "ac.write({'value': '" + text + "'})"
                                         }
                                        )
                        );
    }
  },
  
  
  /*
  * write
  *
  * Schreibt die Auswahl ins Inputfeld
  *
  * @package  ac.js
  * @author   Sergej Müller
  * @since    10.01.2006
  * @change   10.01.2006
  * @access   public
  * @param    object  obj  Object mit Eigenschaften zum Schreiben
  */
  
  'write': function(obj) {
    /* Werte initialisieren */
    var sender = ac.settings.sender;
    
    /* Wert überschreiben */
    sender.value = obj.value;
    
    /* Resultate entfernen */
    ac.disable(true);
  },
  
  
  /*
  * disable
  *
  * Deaktiviert die AutoCompletion
  *
  * @package  ac.js
  * @author   Sergej Müller
  * @since    10.01.2006
  * @change   10.01.2006
  * @access   public
  * @param    object  e  Event als Object
  */
  
  'disable': function(e) {
    /* DIV ermitteln */
    var div = dom.element.get(ac.settings.id);
    var touch;
    
    /* DIV vorhanden? */
    if (!div) {
      return;
    }
    
    /* Kein Ausblenden? */
    try {
      touch = (!e) ? event.srcElement : e.target;
      
      /* Ergebnisse angeklickt? */
      if (touch.className == ac.settings.style || touch.offsetParent.className == ac.settings.style) {
        return;
      }
    } catch(a) {}
    
    /* DIV entfernen */
    dom.element.remove(div);
  }
}
