/////////////////////////////////////////////////////////
//
// AJAX / DOM acarsd Database Editor / Database Lookup
// Written by Kai-jens Meyer aka KjM <kjm@kjm.hu>
// Copyright 2005 by INLINE Internet Online Dienste GmbH
//
// Eine Verwendung dieses Sourcecodes, auch auszugsweise
// ist eine Copyright Verletzung und wird bestraft.
/////////////////////////////////////////////////////////
//
// Document Shortcut
var dcm = document;

// Wrapper for getElementById
function gE(id) {return dcm.getElementById(id);};

// Wrapper for createTextNode
function cN(tx) {return dcm.createTextNode(tx);};

// Wrapper for getElementsByTagName
function eB(o,t,e) {var r = o.getElementsByTagName(t); return (e==null)?r:r[e];};

// AppendChild wrapper
function aC(c,t) {c.appendChild(t);};

// Wrapper for createElement 
function cE(el) {return dcm.createElement(el);};

// Wrapper for setTimeout
function sT(f,v) {return setTimeout(f,v);};

// Database Object
var DB = {

  // Version
  version: "1.05 15 Apr 2006",

  // Short monthnames
  mnames: new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),

  // Microsoft product and XML lib id
  ismsie: false,
  msobject: null,
  msindex: -1,

  // XML Handle
  dbhandle: null,
  pload: null,

  // System loaded
  loaded: false,
  notback: false,

  // Alle Klicks deaktivieren
  dontclick: false,

  // Available databases
  databases: null,

  // Current selected DB
  curdb: null,

  // Last search result
  lastsrch: null,

  // Latest updates
  latestupd: null,

  // Popin is currently open
  popopen: false,

  // Available countries
  country: null,

  // User has logged in?
  loggedin: false,
  u_login: null,
  u_pwd: null,

  // Submit next entry
  autosubmit: false,

  // Last update index
  lastupdateid: 0,

  //
  // MSIE XML2.0 3.0 Fix
  //
  msiefix: function(o) {

    // Re-Init oder Objekt direkt weitergeben
    if (DB.ismsie && DB.msindex > 1) 
      return new ActiveXObject(DB.msobject);
    else return o;
  },

  //
  // Get latest installed XML lib
  //
  pickLib: function() {

    // Mögliche Libs
    var l = new Array("Msxml2.XMLHTTP.5.0","Msxml2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP");

    // Alle möglichen Libs testen
    for (var i = 0; i < l.length; i++) {
      try {
        var t = new ActiveXObject(l[i]);
	DB.msindex = i; return l[i];
      } catch (e) { }
    }

    // Nichts gefunden
    return null;
  },

  //
  // Klasse zuweisen (Crossbrowser Version)
  //
  setclass: function(o, c) { if (DB.ismsie) o.setAttribute("className",c); else o.setAttribute("class",c); },

  //
  // Infofenster wieder schliessen
  // 
  ok: function(id) { 
    var d = gE(id); DB.dontclick = false;
    if (d) { d.parentNode.removeChild(d); DB.warnopen = false; }
  },

  //
  // Infofenster erstellen (alert Ersatz)
  // 
  infowin: function(a,t,timed) {

    // Die Seite wurde noch nicht vollständig geladen oder eine
    // Warnung ist noch auf dem Bildschirm
    if ((typeof DB.loaded == 'undefined') || (DB.warnopen)) {
      sT("DB.infowin('"+a+"','"+t+"',"+timed+")",50); return;
    }

    // Containerelement (DIV) erstellen
    var w1 = cE("div"); w1.id = "warning";

    // Header erstellen (DIV)
    var w2 = cE("div"); 

    // Content Element erstellen (DIV)
    var w3 = cE("div"); 

    // Klassen zuweisen
    DB.setclass(w1,"warning"); DB.setclass(w2,"warnhead");
    DB.setclass(w3,"warncontent");

    // Headline zuweisen
    aC(w2,cN(a));

    // Content in das Content Fenster schreiben
    w3.innerHTML = t+"<p style='padding:5px 2px;text-align:right; margin:0px;'><a style='color:#0000f0' id='wwcls' href='javascript:DB.ok(\"warning\")'>[ close ]</a></p>";

    // Fenster zusammenfügen und oberstes zurückgeben
    aC(w1,w2); aC(w1,w3); aC(eB(dcm,"body",0),w1); 

    // Nach Zeit entfernen?
    if (timed != null) sT("DB.ok('warning')",timed*1000); else DB.dontclick = true;

    // Fenster markieren
    DB.warnopen = true; return;
  },

  //
  // Shop initialisieren
  //
  load: function() {

    // Kein DOM Support
    if (!dcm.getElementById || !dcm.getElementsByTagName || !dcm.createElement) {
      alert("Ihr Browser ist zu alt\nYou browser is too old");
      return;
    } 

    // MSIE?
    if (!window.opera && navigator.userAgent.indexOf("MSIE") !=-1)
      DB.ismsie = true;

    // XML Support anfragen
    if (DB.ismsie) {

      // Installierte XML Lib finden
      DB.msobject = DB.pickLib();
      if (DB.msobject != null) {
        DB.dbhandle = new ActiveXObject(DB.msobject);
        DB.pload    = new ActiveXObject(DB.msobject);
        DB.cty      = new ActiveXObject(DB.msobject);
      } else {

        // Warnmeldung anzeigen
        DB.infowin("Please install XML support in your browser","Your browser doesnt have XML support. Please install XML support from the following link <a style='text-decoration:underline' href='http://www.microsoft.com/downloads/details.aspx?familyid=3144b72b-b4f2-46da-b4b6-c5d7485f2b42&displaylang=en'>Bitte installieren Sie die XML Core Services für Windows</a><br>After installation you can use the system without problem.");
       return;
      }
    } else {

      // XML Objekt erstellen
      DB.dbhandle = new XMLHttpRequest();
      DB.pload    = new XMLHttpRequest();
      DB.cty      = new XMLHttpRequest();
    }

    // Show program version
    gE("pversion").innerHTML = DB.version;

    // Load DB types
    DB.availdb(true);    
  },

  //
  // URL für eine XML Anfrage wird erstellt
  //
  buildURL: function(o,u,g,p,c,i) {

    // Eindeutige ID bilden
    var d = new Date();

    // Infotext anzeigen
    if (i!=null) DB.popin(i);
    
    // GET od. POST
    if (c!=null) {
      try {
        o.onreadystatechange = c;
      } catch (e) { 
        DB.infowin("Error sending request","Unable to send the following request<br>URL: "+u);
      }
    }

    // GET oder POST Operation
    if (g) {
      try {
        o.open("GET",u+"?t="+d.getTime()+"&"+p,true); 
        o.send(null);
      } catch (e) {
        DB.infowin("GET error","Get request failed.<br>GET: "+u);
      }
    } else {
      try {
        o.open("POST",u,true); 
        o.setRequestHeader("Method","POST "+u+" HTTP/1.1");
        o.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        o.send(p);
      } catch (e) {
        DB.infowin("POST error","POST request failed.<br>POST: "+u);
      }
    }
  },

  //
  // Popin Infofenster anzeigen
  //
  popin: function(t,b) {

    // Show popin
    if (DB.popopen || !gE("popin")) return; 
    gE("popin").style.display = "block";
    gE("popintext").innerHTML = t; 
    DB.popopen = true;
  },

  //
  // PopIn Fenster schliessen
  //
  closepopin: function() {
    if (DB.popopen) gE("popin").style.display = "none";
    DB.popopen = false;
  },

  //
  // Login into DB editor
  // 
  login: function(cb) {

    // Callback entry
    if (cb==null) {
      if (DB.dbhandle.readyState == 4) {

        // Close popin
        DB.closepopin();

        // Sind Fehler aufgetreten?
        var d = DB.dbhandle.responseXML; 

        // MSIE Fix
        DB.dbhande = DB.msiefix(DB.dbhandle);
        if ((!d) || (d.length == 0)) return;

        // Get state of success
        var F = eB(gE("content"),"form",0);
        if (DB.get(d,"Success",true)==0) {
          DB.infowin("Login error","Your login cannot be proceed.<br>Maybe you have entered a wrong id or your password was wrong.<br>The password check is <i>case sensitive</i>");
          F.elements[2].disabled = false; return;
        }

        // Change text and link of login option
        gE("r_login").innerHTML = "<a href='javascript:DB.logout()'>Logout</a>";

        // Create Updates navbar
        var v = cE("div"); DB.setclass(v,"reiteroff");
        v.id = "r_updates"; var a = cE("a"); 
        a.href = "javascript:DB.ronoff('updates'); DB.updates(true)";
        aC(a,cN("Updates")); aC(v,a); aC(gE("reiter"),v);

        // Set internal values
        DB.u_login = F.elements[0].value;
        DB.u_pwd   = F.elements[1].value;

        DB.loggedin = true; DB.ronoff("help");
        sT("DB.loadpage(true,'welcome');",100);
      }
      return;
    }

    // Get form
    var F = eB(gE("content"),"form",0);
    var l = F.elements[0].value; var p = F.elements[1].value;
    if (!l.length || !p.length) {
      DB.infowin("Login error","Please enter your login id and your password before pressing the login button");
      return;
    }

    // Send logindata
    DB.buildURL(DB.dbhandle,"./login.php",false,"id="+escape(l)+"&pwd="+escape(p),DB.login,"Sending login...");
    F.elements[2].disabled = true;
  },

  //
  // Logout
  //
  logout: function() {
    gE("r_login").innerHTML = "<a href='javascript:DB.login(true);DB.ronoff(\"login\");'>Login</a>";
    DB.loggedin = false; gE("r_updates").style.display="none";
    DB.loadpage(true,"help");
  },

  //
  // Prepare Updates
  //
  onupd: function(id,mode,db,eid) {

    // Remove or accept update request
    if (!mode) {

      // Delete this entry
      DB.notback = false;
      DB.buildURL(DB.dbhandle,"./updates.php",true,"upid="+id+"&mode="+mode+"&id="+escape(DB.u_login)+"&pwd="+escape(DB.u_pwd),DB.updates,"Sending request to database...");
      DB.lastupdateid = 0;
    } else if (mode==1) {

      // Accept update request
      DB.lastupdateid = eid;
      DB.autosubmit = true; DB.dbedit(db,null,id);

    } else {

      // Start editor
      DB.ronoff(db); DB.dbedit(db,null,id);
      DB.notback = true;

      // Delete this entry
      DB.buildURL(DB.dbhandle,"./updates.php",true,"upid="+eid+"&mode=0&id="+escape(DB.u_login)+"&pwd="+escape(DB.u_pwd),DB.updates,"Sending request to database...");
    }
  },

  //
  // Show or hide buttons
  //
  buttons: function(hide) {
    gE("keys").style.display=(hide)?"none":"block";
  },

  //
  // trim Funktion
  //
  trim: function(s) { return s.replace(/^\s+|\s+$/g, ""); },

  //
  // Edit or make lookups
  //
  dbedit: function(db,num,fu) {

    // Get fields for the selected DB
    var f = DB.getfields(db,true); if (f==null) return;

    // Create mask with the available fields
    // Using innerHTML instead of creating new element mit cE()
    var h = "<form method='post' action='javascript:void(null)' name='edit'>";

    // Load entry from database?
    var e = null;
    if (num!=null && DB.lastsrch) {
      var e = DB.trim(DB.get(eB(DB.lastsrch,"Found",num),"Item")).split("\t");
    } 

    // Get entry from updates
    if (fu!=null && DB.latestupd) {
      var e  = DB.get(eB(DB.latestupd,"Item",fu),"String").split(";");
    }

    // Get fields from this database
    var l = eB(eB(f,"FieldList",0),"Field"); var hk = false;
    for (var j = 0;j<l.length;j++) {

      // Get field descriptors
      var fd = DB.get(l[j],"Desc");
      var fn = DB.get(l[j],"Name");
      var fo = DB.get(l[j],"LongName");
      var fl = DB.get(l[j],"Length",true);
      var fx = DB.get(l[j],"MaxLength",true);
      var fm = DB.get(l[j],"Needed");
      var fr = DB.get(l[j],"RegEx");
      var fk = DB.get(l[j],"Key");
      var fi = DB.get(l[j],"List");
      var fr = DB.get(l[j],"References");
      var fc = DB.get(l[j],"DConvert",true);

      // Close keyfields
      if (fk!=1 && hk) {
        h+="</div>"; hk = false;
      }

      // Create field
      if (fk>0 && j==0) {
        h+="<div class='keyarea'>"; hk = true;
      }

      // Description
      if (fd.length)
        h+="<span class='desc'>"+fd.replace(/\n/g,"<br>")+"<br></span>";

      // Field description
      h+="<span class='lab' for='"+fn+"'>"+((fo.length)?fo:fn)+"<br></span>";

      // Create form field (Select or Input)
      if (fr.length) {

        eval("var v = DB."+fr+";");
        h+="<select name='"+fn.toLowerCase()+"'>";
        for (var i = 0;i<v.length;i++) {
          if ((e) && (typeof e[j] != 'undefined') && (e[j] == DB.get(v[i],"Code")))
            var s = " selected";
          else var s = "";
          h+="<option value='"+DB.get(v[i],"Code")+"'"+s+">"+DB.get(v[i],"Name")+"</option>\n";
        }
        h+="</select>";
      } else if (fi.length) {

        h+="<select name='"+fn.toLowerCase()+"'>";
        var v = fi.split(";");
        for (var i = 0;i<v.length;i++) {
          var l = v[i].split("-");
          if ((e) && (typeof e[j] != 'undefined') && (e[j] == l[0]))
            var s = " selected";
          else var s = "";
          h+="<option value='"+l[0]+"'"+s+">"+l[1]+"</option>\n";
        }
        h+="</select>";

      } else {

        h+="<input type='text' value='"+((e==null || typeof e[j] == 'undefined')?"":e[j])+"' class='"+((fk>0)?"key":"nkey")+"' size='"+fl+"' maxlength='"+((!fx)?fl:fx)+"' name='"+fn.toLowerCase()+"'>";
      }

      h+="<br>\n";
    }

    // Append available keys
    var k = "<div id='keys'><input type='button' value='Search' onclick='DB.dbsearch(\""+db+"\")'> &nbsp; <input type='button' onclick='DB.dbsubmit(\""+db+"\")' value='Submit changes'"+((DB.loggedin)?"":" disabled")+"> &nbsp; <input type='button' onclick='DB.delentry(\""+db+"\")' value='Delete this entry'"+((DB.loggedin)?"":" disabled")+"> &nbsp;</div>";

    // Replace HTML 
    gE("content").innerHTML = h+k+"</form>";
    var F = eB(gE("content"),"form",0);
    F.elements[0].focus();

    // Set current DB
    DB.curdb = db;

    // Autosubmit this entry?
    if (DB.autosubmit) {
      var r = DB.dbsubmit(db);
      if (r==-1) DB.autosubmit = false;
      return;
    }

    // Add keydown listener
    DB.eH(F,"keydown",DB.kbdhandler,false);
  },

  //
  // Get event object - Crossbrowser version
  //
  getEvent: function(e) {
    if (typeof e == 'undefined') e = window.event;
    if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
    if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
    return e;
  },

  //
  // Keyboard Handler
  //
  kbdhandler: function(ev) {

    // Get event object
    var e = DB.getEvent(ev);
    var t = e.target?e.target:e.srcElement;
    if (e && e.which) {
      var k = e.which;
    } else if (e && e.keyCode) {
      var k = e.keyCode;
    } else if (window.event && window.event.keyCode) {
      var k = window.event.keyCode;
    } else return true;

    // Clear all input fields
    if (k==27) {
      DB.clearfields(); return;
    }

    // Not return key
    if (k!=13) return true;
    DB.dbsearch(DB.curdb);
  },

  //
  // Empty all input fields
  //
  clearfields: function() {

    // Recall this form
    var F = eB(gE("content"),"form",0);
    for (var i=0;i<F.elements.length-3;i++) {
      if (F.elements[i].type == "select-one")
        F.elements[i].selectedIndex = 0;
      else
        F.elements[i].value="";
    }
  },

  //
  // Delete entry from the database
  //
  delentry: function(db) {

    // Callback entry
    if (db==null) {
      if (DB.dbhandle.readyState == 4) {

        // Close popin
        DB.closepopin();

        // Sind Fehler aufgetreten?
        var d = DB.dbhandle.responseXML; 

        // MSIE Fix
        DB.dbhande = DB.msiefix(DB.dbhandle);
        if ((!d) || (d.length == 0)) {
          DB.buttons(false); return;
        }

        // Delete ok?
        if (!DB.get(d,"Code",true)) {
          DB.infowin("Error deleting entry","We are unable to delete the selected entry from our database.");
          DB.buttons(false); return;
        } 

        DB.clearfields(); DB.buttons(false); F.elements[0].focus();
      }
      return;
    }

    // Get fields for the selected DB
    var f = DB.getfields(db,true); if (f==null) return;

    // Get form
    var F = eB(gE("content"),"form",0);

    // Get fields from this database
    var l = eB(eB(f,"FieldList",0),"Field"); 
    var r = ""; var o = 0;
    for (var j = 0;j<l.length;j++) {
      if (DB.get(l[j],"Key",true)>0) {
        if (!F.elements[j].value.length) {
          o--; continue;
        }

        // Append information
        if (r.length) r+="&";
        r+=DB.get(l[j],"DBName")+"="+escape(F.elements[j].value);
      }
    }

    // Not all keys available
    if (o < 0) {
      DB.infowin("Missing key entry","We are unable to delete this entry, because the key definition for entry was not found");
      return;
    }

    // Sure?
    if (!confirm("Delete this entry now?" )) return;

    // Hide buttons
    DB.buttons(true);

    // Send searchrequest
    DB.buildURL(DB.dbhandle,"./delete.php",false,"db="+escape(db)+"&"+r,DB.delentry,"Deleting entry from database...");
  },

  //
  // Search within database
  //
  dbsearch: function(db) {

    // Get fields for the selected DB
    var f = DB.getfields(db,true); if (f==null) return;

    // Get form
    var F = eB(gE("content"),"form",0);

    // Get fields from this database
    var l = eB(eB(f,"FieldList",0),"Field"); var o = "";
    for (var j = 0;j<l.length;j++) {
      if (!F.elements[j].value.length) continue;
      F.elements[j].value = F.elements[j].value.toUpperCase();

      // Not a key field
      if (DB.get(l[j],"Key",true)==0) continue;

      // Regex check
      var r = DB.get(l[j],"RegEx");

      // Check field value if a regex is given
      if (r.length) {
        eval("var v = "+r+".exec('"+F.elements[j].value+"')");
        if (v==null) {
          DB.infowin("Wrong chars in input","The <b>"+DB.get(l[j],"Name")+"</b> field has wrong input.<br>Please check your input.");
          F.elements[j].focus(); return;
        }
      }

      // Append request
      if (o.length) o+="&";
      o+=DB.get(l[j],"DBName")+"="+escape(F.elements[j].value);
    }

    // No input?
    if (!o.length) {
      DB.infowin("Missing data in input","Please tell me what you are looking for..."); return;
    }

    // Hide buttons
    DB.buttons(true);

    // Send searchrequest
    DB.buildURL(DB.dbhandle,"./search.php",false,"db="+escape(db)+"&"+o,DB.srchdone,"Sending search request...");
  },

  //
  // Callback function for db submit
  //
  srchdone: function() {

    // Search done
    if (DB.dbhandle.readyState == 4) {

      // Close popin
      DB.closepopin();

      // Sind Fehler aufgetreten?
      var d = DB.dbhandle.responseXML; 

      // MSIE Fix
      DB.dbhande = DB.msiefix(DB.dbhandle);
      if ((!d) || (d.length == 0)) {
        DB.buttons(false); return;
      }

      // Set last search result
      DB.lastsrch = d;

      // Get form
      var F = eB(gE("content"),"form",0);

      // How many results?
      var r = eB(d,"Found"); 
      if (!r.length) {

        // Nothing found
        DB.infowin("Nothing found","There was no match for your searchrequest");

        // Show keys
        DB.buttons(false);
      } else if (r.length > 1) {

        // Header
        var m = "<h1>There are "+r.length+" hits matching your search criteria</h1>Please click on the <i>edit</i> link to edit the selected entry.";

        // Show warning
        if (r.length == 1000) {
          m+= "<font color='e00000'>Search results are limited to 1000 hits!</font>";
        }
        m+="</p>";

        // Show a list of matches
        var db = DB.get(d,"DB"); 
        for (var i = 0;i<r.length;i++) {
          var l = DB.get(r[i],"Item").split("\t");
          m+= "<b>"+(i+1)+"</b> = "+l[0]+" ==&gt; "+l[1]+" [<a href='javascript:DB.dbedit(\""+db+"\","+i+")'>edit</a>]<br>\n";
        }

        // Show results
        gE("content").innerHTML = m;
      } else {

        // Get fields for this database
        var f = DB.getfields(DB.curdb,true); if (f==null) return;

        // Split result by \t
        var l = DB.get(r[0],"Item").split("\t");
        var s = eB(eB(f,"FieldList",0),"Field"); 
        for (var i = 0;i<s.length; i++) {

          // Get special settings
          var fc = DB.get(s[i],"DConvert",true);

          // Convert into human readable date format
          if (fc==1 && l[i].length) {
            if (parseInt(l[i])>0) {
              var dr = new Date(l[i]*1000);
              l[i] = ((dr.getDate()<10)?"0"+dr.getDate():dr.getDate())+"-"+((dr.getMonth()<10)?"0"+dr.getMonth():dr.getMonth())+"-"+dr.getFullYear();
            } else l[i] = "";
          }

          // Set value
          F.elements[i].value = l[i];
        }

        // Show keys
        DB.buttons(false);
      }
    }
  },

  //
  // Submit database changes
  //
  dbsubmit: function(db) {

    // Get fields for the selected DB
    var f = DB.getfields(db,true); if (f==null) return -1;

    // Get form
    var F = eB(gE("content"),"form",0);

    // Get fields from this database
    var l = eB(eB(f,"FieldList",0),"Field"); 
    var o = ""; var y = "";
    for (var j = 0;j<l.length;j++) {

      // Key field and no value?
      if ((DB.get(l[j],"Key",true)>0) && (!F.elements[j].value.length)) {
        DB.infowin("Missing input","The <b>"+DB.get(l[j],"Name")+"</b> field is a key field.<br>You have to enter a value for this field.");
        F.elements[j].focus(); return -1;
      } else if (DB.get(l[j],"Key",true)==1) {
        if (y.length) y+=",";
        y+=DB.get(l[j],"DBName");
      }

      // Regex check
      var r = DB.get(l[j],"RegEx");

      // Check field value if a regex is given
      if (r.length && F.elements[j].value.length) {
        eval("var v = "+r+".exec('"+DB.trim(F.elements[j].value)+"')");
        if (v==null) {
          DB.infowin("Wrong chars in input","The <b>"+DB.get(l[j],"Name")+"</b> field has wrong input.<br>Please check your input.");
          F.elements[j].focus(); return -1;
        }
      }

      // Convert date field?
      if (DB.get(l[j],"DConvert",true)==1 && F.elements[j].value.length) {
        var e = F.elements[j].value.split("-");
        if (e.length!=3) {
          DB.infowin("Wrong date format","Please enter all dates as <b>DD-MM-YYYY</b>");
          F.elements[j].focus(); return -1;
        }

        // Create timestamp
        F.elements[j].value = Date.parse(e[0]+" "+DB.mnames[parseInt(e[1])]+" "+e[2]+" 23:59:59");
      }

      // Get name of this field
      if (o.length) o+="&";
      o+=DB.get(l[j],"DBName")+"="+escape(DB.trim(F.elements[j].value));
    }

    // Submit changes
    DB.buildURL(DB.dbhandle,"./submit.php",false,"id="+escape(DB.u_login)+"&pwd="+escape(DB.u_pwd)+"&db="+escape(db)+"&keys="+escape(y)+"&"+o,DB.submitdone,"Submitting data to server...");
  },

  //
  // Callback function for db submit
  //
  submitdone: function() {
    if (DB.dbhandle.readyState == 4) {

      // Sind Fehler aufgetreten?
      var d = DB.dbhandle.responseXML; 

      // Close popin
      DB.closepopin();

      // MSIE Fix
      DB.dbhande = DB.msiefix(DB.dbhandle);
      if ((!d) || (d.length == 0)) return;

      // Submit ok
      if (!DB.get(d,"Code",true)) {
        DB.infowin("Error submitting changes","We are sorry but your last submitted request could not be added to the database.<br>Please check your data and try again.");
      } else {

        // Make an reload when new countries are added
        if (DB.get(d,"DB")=="countries") 
          sT("DB.countrytable(true)",100);

        // Clear this form
        var F = eB(gE("content"),"form",0);
        DB.clearfields(); F.elements[0].focus();
      }

      // Autosubmit is enabled?
      if (DB.autosubmit) {
        DB.autosubmit = false; sT("DB.onupd("+DB.lastupdateid+",0)",100);
      } else if (DB.notback) {
        DB.ronoff('updates'); sT("DB.updates(true)",30);
      }
    }
  },

  //
  // Load all available databases
  //
  availdb: function(cb) {

    // Callback 
    if (cb==null) {
      if (DB.dbhandle.readyState == 4) {

        // Close popin
        DB.closepopin();

        // Sind Fehler aufgetreten?
        var d = DB.dbhandle.responseXML; 

        // MSIE Fix
        DB.dbhande = DB.msiefix(DB.dbhandle);
        if ((!d) || (d.length == 0)) return;
        DB.databases = d; 

        // Show databases within the navigation
        var d = eB(DB.databases,"Item"); var n = gE("reiter");
        for (var i=0; i<d.length; i++) {
          var g = DB.get(d[i],"Name"); if (!g.length) continue;

          // Create new entry
          var v = cE("div"); DB.setclass(v,"reiteroff");
          v.id = "r_"+g.toLowerCase();
          var a = cE("a"); 
          a.href = "javascript:DB.ronoff('"+g.toLowerCase()+"');DB.dbedit('"+g.toLowerCase()+"');";
          aC(a,cN(g)); 
          aC(v,a); aC(n,v);
        }

        // Load country table
        sT("DB.countrytable(true)",100);
      }
      return;
    } else if (cb == true) {

      // Load available databases
      DB.buildURL(DB.dbhandle,"./XML/databases.xml",true,"",DB.availdb,"Loading database descriptions...");
    }
  },

  //
  // Load countrytable
  //
  countrytable: function(cb) {

    // Callback 
    if (cb==null) {
      if (DB.cty.readyState == 4) {

        // Close popin
        DB.closepopin();

        // Sind Fehler aufgetreten?
        var d = DB.cty.responseXML; 

        // MSIE Fix
        DB.cty = DB.msiefix(DB.cty);
        if ((!d) || (d.length == 0)) return;
        DB.country = eB(d,"Item");

        // DB System loaded
        DB.loaded = true;
      }
      return;
    } else if (cb == true) {

      // Load available databases
      DB.buildURL(DB.cty,"./country.php",true,"",DB.countrytable,"Loading list of countries...");
    }
  },

  //
  // Switch navig on/off
  //
  ronoff: function(n) {
    var d = eB(gE("reiter"),"div");
    for (var i = 0;i<d.length;i++) {
      if (d[i].getAttribute("class")=="reiteron")
        DB.setclass(d[i],"reiteroff");
    }

    // Aktivate clicked option
    DB.setclass(gE("r_"+n),"reiteron");
  },

  //
  // Load page from disc
  //
  loadpage: function(cb,pg) {

    // Callback entry
    if (cb==null) {

      // Transfer finished
      if (DB.pload.readyState == 4) {

        // Close popin
        DB.closepopin();
        gE("content").innerHTML = DB.pload.responseText;
      }

      return;
    }

    // Load page
    DB.buildURL(DB.pload,"./includes/"+pg+".inc",true,"",DB.loadpage,"Loading available pagecontent...");
  },

  //
  // Get fields from the selected database
  //
  getfields: function(db,flat) {

    // Check all available DB
    var ret = null;
    var d = eB(DB.databases,"Item");
    for (var i=0; i<d.length; i++) {
      if (DB.get(d[i],"Name").toLowerCase()!=db) continue;

      // Return Entry
      if (flat==true) return d[i];

      // Get fields from this database
      var f = eB(eB(d[i],"FieldList",0),"Field");
      ret = "";
      for (var j = 0;j<f.length;j++) ret+=DB.get(f[j],"Name")+";";
      break;
    }

    // Return field list
    return ret;
  },

  //
  // Get pending update requests
  //
  updates: function(cb) {

    // Callback entry
    if (cb==null) {

      // Transfer finished
      if (DB.dbhandle.readyState == 4) {

        // Close popin
        DB.closepopin(); var d = DB.dbhandle.responseXML;

        // MSIE Fix
        DB.dbhande = DB.msiefix(DB.dbhandle);
        if ((!d) || (d.length == 0) || (DB.notback)) {
          DB.notback = false; return;
        }

        // No updates?
        var t = eB(d,"Item");
        if (t.length==0) {
          sT("DB.loadpage(true,'help');",100); DB.ronoff('help');
          DB.infowin("No updates","Currently there are no pending updates in our database",3); DB.latestupd = null; return;
        }

        // Header
        DB.latestupd = d;
        var h = "<h1>There are "+t.length+" pending database updates</h1>";

        // Show all updates
        var lt = "";
        for (var i = 0;i<t.length;i++) {

          // Split line by ;
          var db = DB.get(t[i],"DestDB");
          var id = DB.get(t[i],"Id");
          var l  = DB.get(t[i],"String").split(";");

          // Get database fields
          var f = DB.getfields(db); if (f==null) continue;
          var fl = f.split(";");

          // Show DB Type
          if (lt != db) {
            h+= "<span class='dbhead'>["+db+"]</span><br>";
            lt = db;
          }
          h+= "<span class='small'>";
          for (var j=0;j<fl.length-1;j++) {
            h+="<b>"+fl[j]+":</b>"+l[j]+" ";
          }

          // Add links
          h+= "</span>[ <a href='javascript:DB.onupd("+i+",1,\""+db+"\","+id+")'>accept</a> | <a href='javascript:DB.onupd("+id+",0)'>reject</a> | <a href='javascript:DB.onupd("+i+",-1,\""+db+"\","+id+")'>edit</a> ]<br>\n";
        }

        // Change HTML
        gE("content").innerHTML = h;
      }
      return;
    }

    // Request all pending update requests
    DB.buildURL(DB.dbhandle,"./updates.php",true,"",DB.updates,"Loading pending update requests...");
  },

  // 
  // Register new event
  //
  eH: function(obj, evType, fn, useCapture) {

    // Objekt existiert nicht
    if (!obj) {
      alert("Assign fail for "+evType); return;
    }
    if (obj.addEventListener) {
      obj.addEventListener(evType, fn, useCapture);
      return true;
    } else if (obj.attachEvent) {
      var r = obj.attachEvent('on'+evType,fn);
      return r;
    } else {
      obj['on'+evType] = fn;
    }
  },

  //
  // Short wrapper
  //
  get: function(x,s,l) { 
    try { 
      var r = eB(x,s); 
    } catch (e) { 
      if (l==null) return ""; 
      return (l==true)?0:0.0;
    }
    if ((r.length) && (r[0].firstChild)) {
      var b = r[0].firstChild.nodeValue; 
      if (l==null) return b;
      return (l)?parseInt(b):parseFloat(b);
    } else { return (l!=null)?0:""; }
  }
};

//
// DB Interface nach dem Laden der Seite starten
//
DB.eH(window,'load',DB.load,false);
