// --------------------------------------
//  picoAjax Engine
// --------------------------------------

function picoAjax() {
  var self = this;

  this.xreq = null;             // Http Request Objekt
  this.phpscript = '';          // Serverseitiges php-script

  this.action = '';             // Serverseitige Aktion
  this.paramobj = null;         // zu uebergebende Parameter
  this.gridobj = null;          // Grid fuer die Darstellung

  this.filter = '';             // Zu filterndes Feld
  this.filterid = 0;            // ID fuer Filterung
  this.quickfilter = false;     // True: immer gefiltert
  this.selID = 0;               // Selektierter Datensatz


  this.showload = true;         // Kreisel rechts oben
  this.xml = null;              // Response XML-Objekt
  this.text = '';               // Response Text
  this.state = 0;               // 0 = Frei; 1 = Belegt

  this.debugflag=false;         // in Endversion False

  // Erzeugen des Http Request Objektes
  this.init = function() {
    this.state = 0;

    if (self.xreq === null) {
      if (isIE) {
        try {
          self.xreq = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
          try {
            self.xreq = new ActiveXObject("Msxml2.XMLHTTP");
          } catch (E) {
            self.xreq  = null;
          }
        }
      } else {
        self.xreq = new XMLHttpRequest();
        // immer xml zurueck
        // self.xreq.overrideMimeType('text/xml');
      }
    }
  };

  //  Senden des Http-Requestes
  this.sndReq = function() {
    var uri = self.phpscript;
    var postdata="action=" + self.action;
    var dummy="";

    if (uri == '') { return false; }

    // Parameter uebergeben
    for (var feld in self.paramobj) {
      dummy = self.paramobj[feld];
      dummy = repl(dummy, '&', '~amp~');
      dummy = repl(dummy, '+', '~plus~');
      dummy = repl(dummy, '?', '~quest~');
      dummy = repl(dummy, '=', '~equal~');
      postdata += "&" + feld + "=" + dummy ;
    }
    if (self.filter !== undefined)      { postdata += "&filter=" + self.filter;}
    if (self.filterid !== undefined)    { postdata += "&filterid=" + self.filterid;}
    if (self.selID !== undefined)       { postdata += "&selID=" + self.selID;}

    // Check XML HttpRequest Object
    if (self.xreq === null) {
      this.init();
    }

    // Abfrage senden
    if (self.xreq !== null && self.state == 0) {
      // Kringel hin
      if (self.showload) { self.showloading(); }
      self.state = 1;
      self.xreq.open('POST', uri);
      self.xreq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      self.xreq.onreadystatechange = self.handleResponse;
      self.xreq.send(postdata);
    }
  };

  //  Empfang des Http-Response
  this.handleResponse = function() {

    if(self.xreq.readyState == 4){
      // Kringel wech
      if (self.showload) { self.hideloading()}
      self.state = 0;

      if (self.xreq.status == 200) {
        self.xml = self.xreq.responseXML;
        self.text = self.xreq.responseText;
        if (self.debugflag) {
          var a = document.getElementById('debug');
          a.value=pico.text;
        }
        picogetresponse();
        self.userresponse();
      } else {
        alert ("Anfragefehler Nr: "+ self.xreq.status+ " Msg: " + self.xreq.responseText);
      }

    }
  }

  // Prototyp fuer User-Response
  this.userresponse = function() {

  }

  // Darstellung des Loading Symbols Rechts Oben
  this.showloading = function () {
    var lcirc = document.getElementById('loadcircle');
    if (!lcirc) {
      lcirc = document.createElement('div');
      lcirc.id = 'loadcircle';
      lcirc.style.position = 'absolute';
      lcirc.style.top = '4px';
      lcirc.style.right = '4px';
      lcirc.style.backgroundImage = 'url("../img/loading.gif")';
      lcirc.style.width = '27px';
      lcirc.style.height = '27px';
      var bd = document.getElementsByTagName('body');
      if (bd) {
        bd.item(0).appendChild(lcirc);
      }
    }
    lcirc.style.display = 'block';
  };

  this.hideloading = function () {
    var lcirc = document.getElementById('loadcircle');
    if (lcirc) {
      lcirc.style.display = 'none';
    }
  };

} // Ende Objekt

// ------------------------------------------------
// picoAjax Hilfsfunktionen
// ------------------------------------------------

function jumpUrl(pkey, fkey) {
  var uri='../';

  if (pkey ===null || pkey ===undefined) {
    pkey = primkey;
  }

  var urijump = jumps.split("|");
  var seljump=getFeldValue('seljump');
  if (seljump ===null || seljump===undefined || seljump=='') {
    seljump = 0;
  }
  uri+=urijump[seljump];
  var fid=getFeldValue(pkey);

  if (fkey ===null || fkey ===undefined) {
    fkey = pkey;
  }

  uri+='/index.php?filter='+fkey+'&filterid='+fid;

  return uri;
}

// Anfrage abschicken - Standardfunktionen
function picosend(picoaction) {
  // Was frei ?
  if (pico.state == 1) {
    return false;
  }

  switch (picoaction) {
    case 'add':
    case 'edit':
    case 'delete':
      pico.paramobj=getFormValue(pico.paramobj);
      break;

    case 'find':
    case 'queryrec':
      // Check selID
      break;

    case 'search':
      showfirst = true;
      pico.filter=getFeldValue('suchtext');
      break;
    case 'querylist':
    case 'showlist':
      // alert ("picosend: " +  pico.phpscript );
      // alert ("Filter: " + pico.filter  + " : " + pico.filterid  );

      break;
  }

  // Abfrage wegschicken
  pico.action = picoaction;
  pico.sndReq();
}

// Anfrage empfangen - Standardfunktionen
function picogetresponse() {

  if (!getXmlError(pico.xml)) {
    switch (pico.action) {
      case 'add':
      case 'edit':
      case 'delete':
        showfirst = true;
        picosend('showlist');
        break;

      case 'find':
      case 'queryrec':
        pico.paramobj=getXmlRecord(pico.paramobj, pico.xml);
        setFormValue(pico.paramobj);
        break;

      case 'search':
      case 'querylist':
      case 'showlist':
        if(pico.gridobj !== null && pico.gridobj !== undefined) {
          if (pico.quickfilter == false) {
            pico.filter = "";
            pico.filterid = "";
          }
          pico.gridobj.setXML(pico.xml);
          if (showfirst == true) {
            Grid.selID = 0;
            pico.selID = 0;
          }
          pico.gridobj.draw();
          if (showfirst == true) {
            if (Grid.rows > 0) {
              pico.selID = Grid.selID;
            } else {
              pico.selID = 0;
            }
            showfirst = false;
            picosend('find');
          }
        }
        break;
    }
  }
}

function quickfilter(pkey) {
  // Schnellfilter

  var fid=getFeldValue(pkey);

  if (fid != null && fid != undefined ) {
    if (pico.filterid != fid || pico.filter != pkey) {
      pico.selID = 0;
      pico.filter = pkey;
      pico.filterid = fid;
      pico.quickfilter = true;
      showfirst = true;
      picosend('showlist');
    }
  }

}

// ------------------------------------------------
// XML - Aufbereitung
// ------------------------------------------------

// Werte aus XML-Node auslesen
function getXmlValue(xmlobj, tag) {
  var wert='';
  var el = xmlobj.getElementsByTagName(tag)[0];
  if(el !== null && el !== undefined) {
    if (el.firstChild !== null) {
      wert=el.firstChild.nodeValue;
    }
  }
  return wert;
}

// Objektwerte aus XML-Dokument auslesen
function getXmlError(xmlobj) {
  var wert=false;

  if (xmlobj === null || xmlobj === undefined) {
    alert("Kein Objekt bei " + pico.action + "\n\n" + pico.text);
    return wert;
  }
  var info = xmlobj.getElementsByTagName("info")[0];
  if(info !== null && info !== undefined) {
    // Wir haben ein <info> Element
    pico.action  = getXmlValue(info, 'action');
    var msg = getXmlValue(info, 'error');
    if (msg != '') {
      alert("Achtung: \n"+msg);
      wert=true;
    }
  }
  return wert;
}

// Datensatz aus XML-Dokument auslesen
function getXmlRecord(obj, xmlobj) {
  var wert;

  var rec = xmlobj.getElementsByTagName("rec")[0];
  if(rec !== null && rec !== undefined) {
    // Wir haben ein <rec> Element
    for (var feld in obj) {
      // Suche element
      var elfeld = rec.getElementsByTagName(feld)[0];
      if(elfeld !== null && elfeld !== undefined) {
        if (elfeld.firstChild !== null) {
          wert=elfeld.firstChild.nodeValue;
        } else {
          wert='';
        }
        obj[feld] = wert;
      } else {
        // Feld nicht in Datensatz gefunden
        alert ("Feld nicht in Datensatz gefunden :" + feld);
      }
    }
  } //rec ok
  return obj;
}

// ------------------------------------------------
// Formulare bearbeiten
// ------------------------------------------------

// Objektwerte aus Form auslesen
function getFormValue(obj) {

  for (var feld in obj) {
    // Suche element
    var el = document.getElementById(feld);
    if(el !== null) {
      var wert = '';
      if(el.value !== undefined) {
        wert = el.value;
      } else {
        wert = el.innerHTML;
      }
      // Checkboxen
      if(el.type !== undefined) {
        if(el.type == 'checkbox') {
          if(el.checked) {
            wert = 1;
          } else {
            wert = 0;
          }
          // wert = el.checked;
        }
      }
      obj[feld] = wert;
    }
  }
  return obj;
}

// Feldwert aus Form auslesen
function getFeldValue(feld) {
  var wert = '';

  // Suche element
  var el = document.getElementById(feld);
  if(el !== null) {
    if(el.value !== undefined) {
      wert = el.value;
    } else {
      wert = el.innerHTML;
    }
    // Checkboxen
    if(el.type !== undefined) {
      if(el.type == 'checkbox') {
        if(el.checked) {
          wert = 1;
        } else {
          wert = 0;
        }
        // wert = el.checked;
      }
    }
  }
  return wert;
}

// Objektwerte in Form schreiben
function setFormValue(obj) {
  var el, feld;

  for (var feld in obj) {
    // Suche element
    var el = document.getElementById(feld);
    if(el !== null) {
      if(el.value != undefined) {
        el.value = obj[feld];
      } else {
        el.innerHTML = obj[feld];
      }
      // Checkboxen
      if(el.type !== undefined) {
        if(el.type == 'checkbox') {
          // el.checked = obj[feld];
          if (obj[feld] == 'true' || obj[feld] == 1 || obj[feld] == true) {
            el.checked = true;
          } else {
            el.checked = false;
          }
        }
      }
    }
  } // objekte
}

// Auswahlliste loeschen
function clearSelList(id) {
  var sellist = document.getElementById(id);
  if (sellist !== undefined) {
    while (sellist.length > 0) {
      sellist.remove(0);
    }
  }
}

// Auswahlliste mit XML Zeilen anzeigen
function showSelList(id, xmlobj) {
  var wert, content;
  var sellist = document.getElementById(id);

  // Alle Row Elemente => SelectListe
  var rows = xmlobj.getElementsByTagName("row");
  if (rows !== undefined) {
    for (var i=0;i<rows.length;i++) {
      var feld = rows[i].getElementsByTagName("feld");

      // Wert
      if (feld[0].firstChild !== null) {
        wert=feld[0].firstChild.nodeValue;
      } else {
        wert='';
      }
      // Inhalt
      if (feld[1].firstChild !== null) {
        content=feld[1].firstChild.nodeValue;
      } else {
        content='';
      }
      SelectAddItem(sellist, wert, content);
    }
  }

}

function SelectAddItem(sellist, wert, content) {

  var optItem = document.createElement('option');
      optItem.value = wert;

  if(document.all){
    /* Sonderbehandlung fuer IE */
    sellist.options.add(optItem);
    optItem.innerText = content;
  } else {
    optItem.appendChild(document.createTextNode(content));
    sellist.appendChild(optItem);
  }
}

// ------------------------------------------------
// picoAjax Initialisieren
// ------------------------------------------------

// picoAjax Engine starten
pico = new picoAjax();
pico.init();

function search_onclick(){
  picosend('search');
}

function add_onclick(){
  picosend('add');
}

function edit_onclick(){
  picosend('edit');
}

function del_onclick(){
  var mgsbox=confirm(unescape("Soll der Eintrag wirklich gel%F6scht werden %3F"));
  if(mgsbox==true){
    picosend('delete');
  }
}

function logout_onclick(){
  var uri = '../index.php?action=logoff';
  window.location.href = uri;
}

function print_onclick(){
  var uri = 'report.php';
  // alert ("Filter:" + pico.filter + "  filterid = "+pico.filterid  );
  uri +='?filter='+pico.filter+'&filterid='+pico.filterid;

  report = window.open(uri, "myreport", "width=800,height=600");
  report.focus();

}

