

//#############################################################
//#############################################################
//
// Captcha-MODUL Projektbezogene Methoden und Objekte
// OO-PROGRAMMIERUNG
// AUTOR: DF
// ERSTELLT: 08.09.2008
//
//#############################################################
//#############################################################

var undefined;

function Captcha(idx) {
  this.id = undefined;
  this.token = undefined;
  this.captchaString = undefined;
  this.numberImageRequest = 0;
  this.numberCaptchaTest = 0;
  this.form = undefined;
  this.ajax = undefined;
  this.mode = 'standard' // standard, ajax
  this.lang = 'de';
  
  this._setID(idx);
  this._init();
}

//#############################################################

Captcha.prototype._init = function () {
  this.ajax = Ajax.createInstance(this.id);
  this.ajax.setAsynchron(false);
  this.ajax.setMethod('GET');
  if (this.mode == 'Ajax') {
    return;
  }
  var idx = new String(this.id);
  var func = function () {
    Captcha._documentHasLoad = true;
    Captcha.getInstance(idx).drawCaptchaImage();
  }
  Captcha.addEvent('load',window,func);
}

//#############################################################

Captcha.prototype._setID = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Captcha->_setID: Falsche Anzahl von Argumenten!");
  }
  if (typeof str != "string") {
    focus();
    throw new Error("Captcha->_setID: Argument str ist nicht vom Typ String!");
  }
  this.id = str;
}

//#############################################################

Captcha.prototype._setToken = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Captcha->_setToken: Falsche Anzahl von Argumenten!");
  }
  if (typeof str != "string") {
    focus();
    throw new Error("Captcha->_setToken: Argument str ist nicht vom Typ String!");
  }
  this.token = str;
  this.setTokenInput();
}          

//#############################################################   

Captcha.prototype._setMode = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Captcha->_setMode: Falsche Anzahl von Argumenten!");
  }
  if (typeof str != "string") {
    focus();
    throw new Error("Captcha->_setMode: Argument str ist nicht vom Typ String!");
  }
  this.mode = str;
}     

//#############################################################

Captcha.prototype._setCaptchaString = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Captcha->_setCaptchaString: Falsche Anzahl von Argumenten!");
  }
  if (typeof str != "string") {
    focus();
    throw new Error("Captcha->_setCaptchaString: Argument str ist nicht vom Typ String!");
  }
  this.captchaString = str;
}

//#############################################################

Captcha.prototype._setFormOnSubmit = function () {
  if (! this.form) {
    focus();
    throw new Error("Captcha->_setFormOnSubmit: HTML-Form-Element wurde nicht definiert!");
    return;
  }
  var _funcOldSubmit = this.form.onsubmit;
  var funcOldSubmit = function (event) { 
    if (_funcOldSubmit) {
      return _funcOldSubmit(); 
    }
     return true;
  }
  var idx = new String(this.id);
  var func = function (event) {
    var captchaStringElem = document.getElementById('_CAPTCHA_STRING_');
    if (! captchaStringElem) {
      captchaStringElem = this.form['_CAPTCHA_STRING_'];
    }
    if (! captchaStringElem){
        focus();
        throw new Error("Captcha->_setFormOnSubmit: HTML-Input-Element _CAPTCHA_STRING_ existiert nicht!");
        return false;
    }
    if (! funcOldSubmit() ) {
      return false;
    }
    if (! Captcha.getInstance(idx).validateCaptcha(captchaStringElem.value) ) {
      captchaStringElem.focus();
      return false;
    }
    return true;
  }
   this.form.onsubmit = func;
}               

//#############################################################   

Captcha.prototype.setLang = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Captcha->_setLang: Falsche Anzahl von Argumenten!");
  }
  if (typeof str != "string") {
    focus();
    throw new Error("Captcha->_setLang: Argument str ist nicht vom Typ String!");
  }
  this.lang = str;
}            

//#############################################################

Captcha.prototype.validateCaptcha = function (str) {
  if (arguments.length != 1) {
    throw new Error("Captcha->validateCaptcha: Falsche Anzahl von Argumenten!");
    return false;
  }
  if (this.numberCaptchaTest >= Captcha._numberRequest) {
    var alertStr = 'Bitte versuchen Sie es erneut mit dem nächsten Code.';
    if (this.lang == 'uk') {
        alertStr = 'Please try with another code.';
    } else if (this.lang == 'fr') {
        alertStr = 'Veuillez l\'essayer avec un autre code.';
    } 
    alert(alertStr);
    this.refreshCaptcha();
    return false;
  }
  if (this.mode=='ajax') {
    return this.validateCaptchaAjax(str);
  }
   return this.validateCaptchaStandard(str);
}  

//#############################################################

Captcha.prototype.validateCaptchaStandard = function (str) {
  if (arguments.length != 1) {
    throw new Error("Captcha->validateCaptcha: Falsche Anzahl von Argumenten!");
    return false;
  }
  var url = Captcha._baseGenMailURL + '&ACTION=TEST_CAPTCHA';
   url += '&_TOKEN_=' + this.token;
   url += '&_CAPTCHA_STRING_=' + str;
   url += '&_NOCACHE_=' +new Date().getTime();
   //window.open(url);
   var script = document.getElementById('__CAPTCHA_TOKEN_SCRIPT__');
   if (script) {
     document.getElementsByTagName('body')[0].removeChild(script);
   }
   script = document.createElement('script');
   script.id = '__CAPTCHA_TOKEN_SCRIPT__';
   document['body'].appendChild(script);
   var idx = new String(this.id);
   var func = function () {
      if (Captcha.test_result == 'false'){
        var alertStr = 'Der Code ist fehlerhaft.';
        if (Captcha.getInstance(idx).lang == 'uk') {
            alertStr = 'The code is invalid.';
        } else if (Captcha.getInstance(idx).lang == 'fr') {
            alertStr = 'Le code est défectueux.';
        } 
        alert(alertStr);
        //Captcha.getInstance(idx).refreshCaptcha();
        return false;
      }
      if (Captcha._error){
        focus();
        //throw new Error("Captcha->validateCaptcha: " + Captcha._error + "!");
        var force = 1;
        Captcha.getInstance(idx).refreshCaptcha(force);
        var alertStr = 'Es ist ein Fehler aufgetreten.\nVersuchen Sie es bitte mit diesem Code.';
        if (Captcha.getInstance(idx).lang == 'uk') {
            alertStr = 'An error is occurred.\nPlease try with another code';
        } else if (Captcha.getInstance(idx).lang == 'fr') {
            alertStr = 'Une erreur est apparue .\nVeuillez l\'essayer avec un autre code.';
        } 
        alert(alertStr);
        return false;
      }
      Captcha.getInstance(idx).form.submit();
   }
   this.numberCaptchaTest++;
   Captcha.callback = func;
   script.src = url;
   return false;
}  

//#############################################################

Captcha.prototype.validateCaptchaAjax = function (str) {
  if (arguments.length != 1) {
    throw new Error("Captcha->validateCaptcha: Falsche Anzahl von Argumenten!");
    return false;
  }
  var url = Captcha._baseGenMailURL + '&ACTION=TEST_CAPTCHA';
   url += '&_TOKEN_=' + this.token;
   url += '&_CAPTCHA_STRING_=' + str;
   url += '&_NOCACHE_=' +new Date().getTime();
   this.ajax.setURL(url);
   this.ajax.open();                                      
   this.ajax.sendNull();
   Ajax.cursorWait();
  this.numberCaptchaTest++;
   if (this.ajax.getReadyState() != 4){
      Ajax.cursorWait();
  }
  var xml = this.ajax.getReadableXMLNode();   
  var result = this.ajax.getSingleNodeValue('test-result');
  var error = this.ajax.getSingleNodeValue('error');
  var msg = this.ajax.getSingleNodeValue('msg');
  Ajax.cursorFinished();
  if (result == 'false'){
    var alertStr = 'Der Code ist fehlerhaft.';
    if (this.lang == 'uk') {
        alertStr = 'The code is invalid.';
    } else if (this.lang == 'fr') {
        alertStr = 'Le code est défectueux.';
    } 
    alert(alertStr);
    this.refreshCaptcha();
    return false;
  }
  if (error){
    focus();
    throw new Error("Captcha->validateCaptcha: " + msg + "!");
    var alertStr = 'Es ist ein Fehler aufgetreten.\nVersuchen Sie es bitte mit diesem Code.';
    if (this.lang == 'uk') {
        alertStr = 'An error is occurred.\nPlease try with another code';
    } else if (this.lang == 'fr') {
        alertStr = 'Une erreur est apparue .\nVeuillez l\'essayer avec un autre code.';
    } 
    alert(alertStr);
    this.refreshCaptcha();
    return false;
  }
  return true;
}  

//#############################################################

Captcha.prototype.refreshCaptcha = function (force) {
  if ( this.numberCaptchaTest < Captcha._numberRequest && (! force)){
     return;
  }
  this.numberCaptchaTest = 0;
  this.numberImageRequest = 0;
  this.setFreshToken();
  if (this.mode == 'ajax'){
    //this.setTokenInput();
    this.drawCaptchaImage();
  }
}

//#############################################################

Captcha.prototype.setFormIdx = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Captcha->setFormIdx: Falsche Anzahl von Argumenten!");
  }
  if (typeof str != "string") {
    focus();
    throw new Error("Captcha->setFormIdx: Argument str ist nicht vom Typ String!");
  }
  var elem = document.getElementById(str);
  if (! elem) {
    focus();
    throw new Error("Captcha->setFormIdx: HTML-Element mit ID = " + str + " ist nicht vorhanden!");
  }
  this.form = elem;
  this._setFormOnSubmit();
  //this.setTokenInput();
}

//#############################################################

Captcha.prototype.setFreshToken = function () {
  var url = Captcha._baseGenMailURL + '&ACTION=NEW_CAPTCHA';
 url += '&_NOCACHE_=' +new Date().getTime();
  var token = undefined;
  if (this.mode == 'ajax') {
      this.getFreshTokenAjax(url);
  } else {
      this.getFreshTokenStandard(url);
  }
}

//#############################################################

Captcha.prototype.getFreshTokenStandard = function (url) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Captcha->getFreshTokenStandard: Falsche Anzahl von Argumenten!");
  }
  if (typeof url != "string") {
    focus();
    throw new Error("Captcha->getFreshTokenStandard: Argument "+ url +" ist nicht vom Typ String!");
  }
   var script = document.getElementById('__CAPTCHA_TOKEN_SCRIPT__');
   if (script) {
     document.getElementsByTagName('body')[0].removeChild(script);
   }
   script = document.createElement('script');
   script.id = '__CAPTCHA_TOKEN_SCRIPT__';
   document['body'].appendChild(script);
   var idx = new String(this.id);
   var func = function () {
      Captcha.getInstance(idx)._setToken(Captcha.token);
      Captcha.getInstance(idx).drawCaptchaImage();
   }
   Captcha.callback = func;
   script.src = url;
}

//#############################################################

Captcha.prototype.getFreshTokenAjax = function (url) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Captcha->getFreshTokenAjax: Falsche Anzahl von Argumenten!");
  }
  if (typeof url != "string") {
    focus();
    throw new Error("Captcha->getFreshTokenAjax: Argument "+ url +" ist nicht vom Typ String!");
  }
  if (! this.ajax) {
    focus();
    throw new Error("Captcha->getFreshTokenAjax: Instance.ajax ist undefiniert!");
  }
  if (this.mode == 'ajax') {
  }
   this.ajax.setURL(url);
   this.ajax.open();                                      
   this.ajax.sendNull();
   Ajax.cursorWait();
   if (this.ajax.getReadyState() != 4){
      Ajax.cursorWait();
  }
  var xml = this.ajax.getReadableXMLNode();   
  var token = this.ajax.getSingleNodeValue('token');
  var error = this.ajax.getSingleNodeValue('error');
  var msg = this.ajax.getSingleNodeValue('msg');
  Ajax.cursorFinished();
  if (error){
    focus();
    throw new Error("Captcha->getFreshTokenAjax: Error!\n" + msg );
    return;
  }
   this._setToken(token);
   return this.token;
}

//#############################################################

Captcha.prototype.drawCaptchaImage = function () {
  var imgID = '_CAPTCHA_IMAGE_' + this.id;
  if (! Captcha._documentHasLoad) {
    document.write('<img id="' + imgID + '" src="http://www.rdts-ag.de/grafik/trans.gif" title="Sicherheitscode" alt="Sicherheitscode" style="height: 80px; width: 180px; visibility: hidden; border: none; "/><br />');
    return;
  }
  if (! this.token || this.numberImageRequest > Captcha._numberRequest) {
    this.setFreshToken();
  }
   this.numberImageRequest++;
   if (! this.token){
      return;
   }
   var imgSrc = Captcha._baseImageURL + this.token;
   var img = document.getElementById(imgID);
   if (! img){ 
     return;
   } 
   var func = function() {
      document.getElementById(imgID).style.visibility = 'visible';
      document.getElementById(imgID).style.height = 'auto';
      document.getElementById(imgID).style.width = 'auto';
   }
   Captcha.addEvent('load',img,func);
   img.src = imgSrc;   
   return;
}

//#############################################################

Captcha.prototype.setTokenInput = function () {
   var inputID = '_CAPTCHA_TOKEN_' + this.id;
   var elem = document.getElementById(inputID);
   if (elem){
     elem.value = this.token;
     return;
   }
   if (! this.form){
      focus();
      throw new Error("Captcha->setTokenInput: HTML-Form-Element wurde nicht definiert!");
      return;
   }
   var inp = document.createElement('input');
   inp.type = 'hidden';
   inp.id = inputID;
   inp.name = '_TOKEN_';   
   inp.value = this.token;
   this.form.appendChild(inp);
}

//#############################################################

Captcha._baseGenMailURL = 'https://genmail.rdts.de/cgi-bin/captcha?';
Captcha._baseImageURL = Captcha._baseGenMailURL + '&ACTION=GET_CAPTCHA_PICTURE&amp;_TOKEN_=';
Captcha._numberRequest = 5;
Captcha._increment = [];
Captcha._registerInstance = {};
Captcha._registerInstanceLength = [];
Captcha._documentHasLoad = false;
Captcha._callbackInstanceRegister = {};

//#############################################################

Captcha.callback = function () {
}

//#############################################################

Captcha.getInstance = function(id) {
  if (arguments.length!=1) {
    throw new Error("Falsche Anzahl von Argumenten!");
  }
  if (! (Captcha._registerInstance[id])){
    focus();
    throw new Error("Es ist keine Captcha.Instance mit id=" + id + " registriert!");
  }
  return Captcha._registerInstance[id];
}

//#############################################################

Captcha.createInstance = function(id) {
  if (!arguments.length) {
    id = 'Captcha' + Captcha._increment.length;
    Captcha._increment.push(1);
  }
  if (! (Captcha._registerInstance[id])){
    Captcha._registerInstance[id] = new Captcha(id);
    Captcha._registerInstanceLength.push(id);
  } else {
    focus();
    throw new Error("Captcha.createInstance: id schon vorhanden!");
  }
  return Captcha.getInstance(id);
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Captcha.addEvent = function(oneEvent, obj, handler, bol, ieWindow){
  if (arguments.length < 3) {
    focus();
    throw new Error('Captcha.addEvent: Falsche Anzahl von Argumenten!');
  }
  if(window.addEventListener){
    // Other
    obj.addEventListener(oneEvent, handler, bol);
  } else if(obj.attachEvent){
    // IE
    var win = window;
    if (ieWindow) {
      win = ieWindow;
    }
    obj['e' + oneEvent + handler] = handler;
    obj[oneEvent + handler] = function() { obj['e' + oneEvent + handler] ( win.event ); win.event.cancelBubble = true;};
    obj.attachEvent('on' + oneEvent, obj[oneEvent + handler]);
  }
  return true;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Captcha.removeEvent = function(oneEvent, obj, handler, bol){
  if (arguments.length < 3) {
    focus();
    throw new Error('Captcha.removeEvent: Falsche Anzahl von Argumenten!');
  }
  if(window.removeEventListener){
    // Other
    obj.removeEventListener(oneEvent, handler, bol);
  } else if(obj.detachEvent){
    // IE
    obj.detachEvent( "on"+ oneEvent, obj[oneEvent + handler] );
    obj[oneEvent + handler] = undefined;
    obj["e" + oneEvent + handler] = undefined;
  }
  return true;
}


//#############################################################
//#############################################################
//
// Ajax-MODUL Projektbezogene Methoden und Objekte
// OO-PROGRAMMIERUNG
// AUTOR: DF
// ERSTELLT: 31.01.2007
//
//#############################################################
//#############################################################

function Ajax(id) {
  this.id;
  this.req = undefined;
  this.url = '';
  this.asynchron = true;
  this.parameter = {};
  this.parameterLength = [];
  this.mimeType = 'text/xml';
  this.requestHeader = 'application/x-www-form-urlencoded';
  this.callBackFunction = undefined;
  this.method = 'GET';

  this._setID(id);
}

//#############################################################

Ajax.prototype._setID = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Ajax->_setID: Falsche Anzahl von Argumenten!");
  }
  if (typeof str != "string") {
    focus();
    throw new Error("Ajax->_setID: Argument str ist nicht vom Typ String!");
  }
  this.id = str;
}

//#############################################################

Ajax.prototype.createRequest = function () {
  var req;
  if (window.ActiveXObject) {
    try {
      req = new ActiveXObject("Microsoft.XMLHTTP");
    } catch(e) {
      req = new ActiveXObject("Msxml2.XMLHTTP");
    }
  } else if (typeof XMLHttpRequest != undefined) {
    req = new XMLHttpRequest();
    /*
    if (this.mimeType){
      req.overrideMimeType(this.mimeType);
    }*/
  } else {
    focus();
    throw new Error("Ajax->createRequest: Der Browser unterstützt die Methode nicht!");
  }
  return req;
}

//#############################################################

Ajax.prototype.addParameter = function (strKey, strValue) {
  if (arguments.length != 2) {
    focus();
    throw new Error("Ajax->addParameter: Falsche Anzahl von Argumenten!");
  }
  if (typeof strKey != "string") {
    focus();
    throw new Error("Ajax->addParameter: Argument strKey ist nicht vom Typ String!");
  }
  if (typeof strValue != "string") {
    focus();
    throw new Error("Ajax->addParameter: Argument strValue ist nicht vom Typ String!");
  }
  this.parameter[strKey] = strValue;
  this.parameterLength.push(strKey);
}

//#############################################################

Ajax.prototype.setRequestHeader = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Ajax->setRequestHeader: Falsche Anzahl von Argumenten!");
  }
  if (typeof str != "string") {
    focus();
    throw new Error("Ajax->setRequestHeader: Argument str ist nicht vom Typ String!");
  }
  this.requestHeader = str;
}

//#############################################################

Ajax.prototype.setAsynchron = function (b) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Ajax->setAsynchron: Falsche Anzahl von Argumenten!");
  }
  if (typeof b != "boolean") {
    focus();
    throw new Error("Ajax->setAsynchron: Argument str ist nicht vom Typ Boolean!");
  }
  this.asynchron = b;
}

//#############################################################

Ajax.prototype.setMethod = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Ajax->setMethod: Falsche Anzahl von Argumenten!");
  }
  if (typeof str != "string") {
    focus();
    throw new Error("Ajax->setMethod: Argument str ist nicht vom Typ String!");
  }
  if (str!='GET' && str!='POST' && str!='HEAD'){
    focus();
    throw new Error("Ajax->setMethod: Argument str muss Wert GET oder POST oder HEAD haben!");
  }
  this.method = str;
}

//#############################################################

Ajax.prototype.setURL = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Ajax->setURL: Falsche Anzahl von Argumenten!");
  }
  if (typeof str != "string") {
    focus();
    throw new Error("Ajax->setURL: Argument str ist nicht vom Typ String!");
  }
  this.url = str;
}

//#############################################################

Ajax.prototype.setCallBackFunction = function (func) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Ajax->setCallBackFunction: Falsche Anzahl von Argumenten!");
  }
  if (typeof func != "function") {
    focus();
    throw new Error("Ajax->setCallBackFunction: Argument func ist nicht vom Typ Function!");
  }
  this.callBackFunction = func;
}

//#############################################################

Ajax.prototype.open = function () {
  this.req = this.createRequest();
  if (this.method == 'POST'){
    if (! this.requestHeader){
      focus();
      throw new Error("Ajax->open: Mehtod=POST requires requestHeader !");
    }
  }
  try {
    this.req.open(this.method, this.url, this.asynchron);
    if (this.callBackFunction){
      this.req.onreadystatechange = this.callBackFunction;
    }
  } catch(e){
    alert(e);
    Ajax._getNavigatorPrivilege(this);
  }
}

//#############################################################

Ajax.prototype.sendAll = function () {
  var _req = '';
  for (var i in this.parameter){
    if (Ajax.getCharset() == 'utf-8' || Ajax.getCharset() == 'utf-16'){
      _req += '&' + i + '=' + encodeURIComponent(this.parameter[i]);
    } else {
      _req += '&' + i + '=' + escape(this.parameter[i]);
    }
  }
  _req = _req.replace(/^\&/,'');
  this.req.send(_req);
}

//#############################################################

Ajax.prototype.sendNull = function () {
  this.req.send(null);
}

//#############################################################

Ajax.prototype.send = function (strKey, strValue) {
  if (arguments.length != 2) {
    focus();
    throw new Error("Ajax->send: Falsche Anzahl von Argumenten!");
  }
  if (typeof strKey != "string") {
    focus();
    throw new Error("Ajax->send: Argument strKey ist nicht vom Typ String!");
  }
  if (typeof strValue != "string") {
    focus();
    throw new Error("Ajax->send: Argument strValue ist nicht vom Typ String!");
  }
  if (Ajax.getCharset() == 'utf-8' || Ajax.getCharset() == 'utf-16'){
    this.req.send(strKey + '=' + encodeURIComponent(strValue));
  } else {
    this.req.send(strKey + '=' + escape(strValue));
  }
}

//#############################################################

Ajax.prototype.getReadyState = function () {
  if (this.req.readyState == undefined){
    return undefined;
  }
  return this.req.readyState;
}

//#############################################################

Ajax.prototype.getStatus = function () {
  if (this.req.status == undefined){
    return undefined;
  }
  return this.req.status;
}

//#############################################################

Ajax.prototype.getResponseXML = function () {
  return this.req.responseXML;
}

//#############################################################

Ajax.prototype.getResponseText = function () {
  return this.req.responseText;
}

//#############################################################

Ajax.prototype.getXML = function (str) {
  str = Ajax.stripSpace(str);
  if (arguments.length != 1) {
    focus();
    throw new Error("Ajax->getXML: Falsche Anzahl von Argumenten!");
  }
  if (typeof str != "string") {
    focus();
    throw new Error("Ajax->send: Argument str ist nicht vom Typ String!");
  }
  var xml = '';
  if (window.DOMParser){
    var parser = new DOMParser();
    xml = parser.parseFromString(str, "text/xml");
  } else {
    xml = new ActiveXObject("Microsoft.XMLDOM");
    xml.async="false";
    xml.loadXML(str);
  }
  return xml;
}

//#############################################################

Ajax.prototype.getReadableXMLNode = function () {
  if (! this.req.responseXML){
    return undefined;
  }
  return this.req.responseXML.documentElement;
}

//#############################################################

Ajax.prototype.getSingleNodeValue = function (name) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Ajax->getSingleNodeValue: Falsche Anzahl von Argumenten!");
  }
  if (typeof name != "string") {
    focus();
    throw new Error("Ajax->getSingleNodeValue: Argument name ist nicht vom Typ String!");
  }
  var xml = this.getReadableXMLNode();
  if (! xml){
    return undefined;
  }
  for (var i=0; i<xml.childNodes.length; i++) {
    var node = xml.childNodes[i];
    if (node.nodeType != 1){
      continue;
    }
    if (node.nodeName.toLowerCase() != name){
      continue;
    }
    return this.getValueFromXMLNode(node);
  }
  return undefined;
}

//#############################################################

Ajax.prototype.getValueFromXMLNode = function (node) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Ajax->getValueFromXMLNode: Falsche Anzahl von Argumenten!");
  }
  return node.firstChild.nodeValue;
}

//#############################################################

Ajax.prototype.getIdenticalNodeArray = function (name) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Ajax->getIdenticalNodeArray: Falsche Anzahl von Argumenten!");
  }
  if (typeof name != "string") {
    focus();
    throw new Error("Ajax->getIdenticalNodeArray: Argument name ist nicht vom Typ String!");
  }
  var xml = this.getReadableXMLNode();
  if (! xml){
    return undefined;
  }
  return xml.getElementsByTagName(name);
}

//#############################################################

Ajax._increment = [];
Ajax._registerInstance = {};
Ajax._registerInstanceLength = [];

//#############################################################

Ajax._getNavigatorPrivilege = function (obj) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Ajax._getNavigatorPrivilege: Falsche Anzahl von Argumenten!");
  }
  if (! (obj instanceof Ajax)) {
    focus();
    throw new Error("Ajax._getNavigatorPrivilege: Argument obj ist keine Instance von Ajax!");
  }
  if (obj.req) {
    if (typeof netscape != 'undefined' && typeof netscape.security != 'undefined' && typeof netscape.security.PrivilegeManager != 'undefined') {
      netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
      obj.open();
    } else {
      focus();
      throw new Error("Ajax._getNavigatorPrivilege: Das Ajax-Progamm läuft in diesem Kontext nicht. bitte wenden Sie sich an Ihren Administrator!");
    }
  }
}

//#############################################################

Ajax.stripSpace = function(attr){
  var result = '';
  if (attr){
    attr = new String(attr);
    result = attr.replace(/^\s+/,'');
    result = result.replace(/\s+$/,'');
  }
  if (result.match(/^\s+/) || result.match(/\s+$/)){
    return Ajax.stripSpace(result);
  }
  return result;
}

//#############################################################

Ajax.getInstance = function(id) {
  if (arguments.length!=1) {
    throw new Error("Falsche Anzahl von Argumenten!");
  }
  if (! (Ajax._registerInstance[id])){
    focus();
    throw new Error("Es ist keine Ajax.Instance mit id=" + id + " registriert!");
  }
  return Ajax._registerInstance[id];
}

//#############################################################

Ajax.createInstance = function(id) {
  if (!arguments.length) {
    id = 'Ajax' + Ajax._increment.length;
    Ajax._increment.push(1);
  }
  if (! (Ajax._registerInstance[id])){
    Ajax._registerInstance[id] = new Ajax(id);
    Ajax._registerInstanceLength.push(id);
  } else {
    focus();
    throw new Error("Ajax.createInstance: id schon vorhanden!");
  }
  return Ajax.getInstance(id);
}

//#############################################################

Ajax.cursorWait = function () {
  if (! document.getElementsByTagName('body').length){
    return;
  }
  document.getElementsByTagName('body')[0].style.cursor = 'wait';
}

//#############################################################

Ajax.cursorFinished = function () {
  if (! document.getElementsByTagName('body').length){
    return;
  }
  document.getElementsByTagName('body')[0].style.cursor = 'auto';
}

//#############################################################

Ajax.getCharset = function () {
  if (document.charset){
    // IE
    return document.charset.toLowerCase();
  } else if (document.characterSet) {
    return document.characterSet.toLowerCase();
  } else {
    return undefined;
  }
}




