/* XAjax-Erweiterungen für HAL2 */
/* XAjax-Erweiterungen für HAL2 */
xajax.$$ = function(tname) {
    if(document.getElementsByTagName(tname)) {
        return document.getElementsByTagName(tname);
    }
    return false;
}
var classElements = null;
xajax.getElementsByClassName = function() {
    if(arguments.length < 1) { return null; }
    var cname = arguments[0];
    var rootObj = document.getElementsByTagName('body')[0];
    if(arguments.length == 1) {
      classElements = new Array();
    }
    if(arguments.length == 2) {
        rootObj = arguments[1];
    }
    if(typeof rootObj == 'object' && rootObj.hasChildNodes())
    {
      var childs = rootObj.childNodes;
      for(var i = 0; i < childs.length; i++)
      {  
        if(typeof childs[i] == 'object' && (typeof childs[i].getAttribute == 'function' || typeof childs[i].getAttribute == 'object')) {         
            if(childs[i].getAttribute('className') == cname || childs[i].getAttribute('class') == cname) { 
                classElements.push(childs[i]);
            }
            if(childs[i].hasChildNodes()) {
                this.getElementsByClassName(cname, childs[i]);
            }
        }
      }
    }
    return classElements;
}
/* ACHTUNG: hier wird die Xajax-Eigene Funktion \$() überschrieben */
/**
 * @param   mix -   id des Elements -> document.getElementById() 
 *                  oder 
 *                  '.classname' als css-Klasse -> hier werden alle Elemente dieser CSS-Klasse
 *                  in einem Array zurückgegeben oder null @see xajax.getElementsByClassName()
 * @param   optional: id des Eltern-Elements, dessen Childs mit css-Klasse '.classname' gesucht werden                   
 */
xajax.$ = function(mix) {
    if(!mix) { return null; }
    if(mix.indexOf('\.') != -1) {
      var cname = mix.replace(/./,'');      
      return this.getElementsByClassName(cname);
    }
    var returnObj = document.getElementById(mix);
    if(!returnObj && document.all) {
        returnObj = document.all[mix];
    }
    if(xajaxDebug && !returnObj && mix != this.workId) {
        this.DebugMessage("Element with the id \"" + mix + "\" not found.");
    }
    return returnObj;
}

/* 1. Eingabefelder(meist Selctfelder) disablen/enablen, wenn Daten abgeschickt wurden */
xajax.lockInputfield = function(tagid) {
  obj = xajax.$(tagid);
  obj.disabled = true;
  if(arguments.length == 2) {
    obj.value = arguments[1];
  }
}
xajax.unlockInputfield = function(tagid) {
  obj = xajax.$(tagid);
  obj.disabled = false;
  if(arguments.length == 2) {
    obj.value = arguments[1];
  }
}
/* 2. Visibilisieren/Unvisibilisieren */
xajax.hideTag = function(tagid) {
    if(!xajax.isObject(tagid)) { return false; }
    obj = xajax.$(tagid);
    obj.style.visibility = 'hidden';
    obj.style.display = 'none';
}
xajax.showTag = function(tagid) {
    if(!xajax.isObject(tagid)) { return false; }
    obj = xajax.$(tagid);
    obj.style.visibility = 'visible';
    obj.style.display = 'block';
}
xajax.showInlineTag = function(tagid) {
    if(!xajax.isObject(tagid)) { return false; }
  obj = xajax.$(tagid);
  obj.style.visibility = 'visible';
  obj.style.display = 'inline';
}
xajax.switchTag = function(tagid) {
    if(!xajax.isObject(tagid)) { return false; }
    obj = xajax.$(tagid);
    if(obj.style.visibility == 'visible') {
  this.hideTag(tagid);
  return false;
    } else {
  this.showTag(tagid);
  return true;
    }
}
/**
 * Dau-Schutz
 */
xajax.requestIsRunning = function() {
  if( document.body.style.cursor == 'wait' ) {
    alert('Anfrage läuft bereits...bitte warten!');
    return true;
  }
  /* hier prüfen wir, ob alle relavanten Daten im Formular angezeigt werden */
  /*
    if(this.isObject('ziel_station')) {
        var fin = xajax.getVal('ziel_station');
        var onW =  xajax.getVal('oneway_id');
          if(onW > 0 && fin == 'notloaded') {
              alert('Bitte warten, bis alle Daten angezeigt wurden!');
              return true;
          }
    }
   */
  return false;
}
/* Options vorbelegen */
xajax.selectDefaultOption = function(tagid) {
  obj = xajax.$(tagid);
  if(obj.type == 'select-one')
  {
    for (i = 0; i < obj.length; i++)
      {
  if (obj.options[i].defaultSelected == true)
    {
      obj.options[i].selected = true;
      break;
    }
  else 
    {
      obj.options[0].selected = true;
    }
      }
  }
}
/* Checkbox auswählen */
xajax.checkObject = function(tagid) {
  xajax.$(tagid).checked = true;
  xajax.$(tagid).focus();
}

/* und hier eine Verbeugung vor den guten alten, bewährten DataGetFuncs !!! to be extendet !!! */
/* Wertzuweisung an ein HTML-Element */
xajax.setVal = function(tagid, val) {
  if(xajax.$(tagid) && xajax.$(tagid).value != 'undefined') {
    var frmObj = xajax.$(tagid);
    switch(frmObj.type) {
    case 'select':
    case 'select-one':
    case 'select-multiple':
      for(var i = 0; i < frmObj.length; i++)
  {
    if(frmObj.options[i].value == val) {
      frmObj.options[i].selected = true;
      return true;
    }
  }
      break;
    case 'checkbox':
    case 'radio':
      frmObj.checked = true;
      return true;
    default:
      xajax.$(tagid).value = val;
      break;
    }
  } else {
    if(xajaxDebug)
      alert('xajax::setVal -> Kein Objekt oder keine Objekt-Eigenschaft! ('+tagid+')');
    return false;
  }
  return true;
}

/* Wert eines HTML-Elements auslesen */
  xajax.getVal = function(tagid) {
  var error = true;
  if(arguments.length == 2) {
    var valtype = arguments[1];
  }
  if(arguments.length == 3) {
    var formTag = arguments[2];
  }
  if(xajax.$(tagid) && xajax.$(tagid).type) {
    var frmObj = xajax.$(tagid);
    switch(frmObj.type) {
    case 'select':
    case 'select-one':
      for(var i = 0; i < frmObj.length; i++)
  {
    if(frmObj.options[i].selected == true) {
      switch(valtype) {
      case "inhalt":
        return frmObj.options[i].text;
        break;
      default:
        return frmObj.options[i].value;
        break;
      }
    }
  }
      error = false;
      break;
    case 'select-multiple':
      var multiselectArr = new Array();
      var j = 0;
      for(var i = 0; i < frmObj.length; i++)
  {
    if(frmObj.options[i].selected == true)
      multiselectArr[j++] = frmObj.options[i].value;
  }
      return multiselectArr;
      break;
    case 'checkbox':
      if(frmObj.checked == true)
  return frmObj.value;
      error = false;
      break;
    case 'radio':
      var frmElements = eval('formTag.'+frmObj.name);
      if(frmElements.length > 0)
	{
	  for(var i = 0; 1 < frmElements.length; i++)
	    {	
	      // alert('checked: '+frmElements[i].checked);
	      if(frmElements[i].checked == true) {
		// alert(frmElements[i].value); 
		return frmElements[i].value;
	      }
	    }
	}
      break;
    default:
      if(frmObj.value)
  return frmObj.value;
      break;
    }
  }
  
  if(error) {
    if(xajaxDebug)
      alert('xajax::getVal -> Kein Objekt oder keine Objekt-Eigenschaft! ('+tagid+')');
    return false;
  }
  return '';
}
/* Prüfung auf Element/Object */
xajax.isObject = function(tagid) {
  if(xajax.$(tagid)) {
    return true;
  }
  return false;
}

/**
 * Patch für Mozilla/Firefox bzgl. xajax.getFormValues() 
 * im Firefox werden die neu erstellten Selectboxen nicht mit übermittelt
 */
xajax.getFormValuesByParams = function(args) {
  
  var sXml = "<xjxquery><q>";
  
  for(var i = 0; i < this.getFormValuesByParams.arguments.length; i++)
    {
      if(!xajax.isObject(this.getFormValuesByParams.arguments[i]))
  continue;
      
      var inputObj = this.$(this.getFormValuesByParams.arguments[i]);
      
      var name = inputObj.name;
      
      if (sXml != '<xjxquery><q>')
  sXml += '&';
      
      if(inputObj.type=='select-multiple')
  {
    for (var j = 0; j < inputObj.length; j++)
      {
        if (inputObj.options[j].selected == true) {
    if(name.indexOf('[]') == -1) {
      sXml += name+"[]="+encodeURIComponent(inputObj.options[j].value)+"&";
    } else {
      sXml += name+"="+encodeURIComponent(inputObj.options[j].value)+"&";
    }
        }
      }
  }
      else
  {
    switch(inputObj.type) { // to be extended!!!
    case "checkbox":
    case "radio":
      if(inputObj.checked == true ) {
        sXml += name+"="+encodeURIComponent(inputObj.value);
      }
      break;
    default:
      sXml += name+"="+encodeURIComponent(inputObj.value);
      break;
    }
  }
    }
  sXml +="</q></xjxquery>";
  
  return sXml;
}
/** beliebige Eingabefelder leeren 
 * @param args - beliebige Anzahl, der zu leerenden Felder: clearInputfields('feld1','feld2','feld3',...)
 */
xajax.clearInputfields = function(args) {
  
  for(var i = 0; i < this.clearInputfields.arguments.length; i++)
    {
      var inputObj = this.$(this.clearInputfields.arguments[i]);
      
      switch(inputObj.type) {
      case "text":
      case "select":
      case "select-one":
      case "select-multiple":
      case "hidden":
      case "textarea":
  this.setVal(inputObj.id, '');
  break;
      default:
  break;
      }
    }
}
/**
 * Übergebene Parameter als XML-String zusammenstellen
 * ACHTUNG!!!
 * alle argumente werden in der Form: 'varname=wert' erwartet, als String
 */
xajax.createXMLParams = function(args) {
  var sXml = "<xjxquery><q>";
  // alert('Paramanzahl: '+this.createXMLParams.arguments.length);
  
  for(var i = 0; i < this.createXMLParams.arguments.length; i++)
    {
      argPair = this.createXMLParams.arguments[i].split('=');
      if(sXml != '<xjxquery><q>') {
  sXml += '&';
      }
      sXml += argPair[0]+"="+encodeURIComponent(argPair[1]);
    }
  sXml +="</q></xjxquery>";
  return sXml;
}

/**
 * Seite in einem Popup öffnen
 * @param string pageuri    -   URL der Seite
 * 
 */
xajax.openPage = function(pageuri) {
  var params = '';
  var _w = 820;
  var _h = 600;
  var resizable = 'yes';
  var scrollbars = 'yes';
  var pagetitle = 'Hal2AjaxFenster';
  if(arguments.length > 1) {
    pagetitle = arguments[1];
  }
  if(arguments.length > 2) { 
    var paramArr = arguments[2];
    if(typeof paramArr == 'object') {
        for(paramName in paramArr) {
            params += '&'+paramName+'='+paramArr[paramName];
        }
    }
  }
  if(arguments.length > 3) {
    _w = arguments[2];
  }
  if(arguments.length > 4) {
    _h = arguments[3];
  }
  if(arguments.length > 5) {
    resizable = arguments[4];
  }
  if(arguments.length > 6) {
    scrollbars = arguments[5];
  }
    ajxfenster = window.open(pageuri+params,pagetitle,'width='+_w+',height='+_h+',resizable='+resizable+',scrollbars='+scrollbars);
    if(ajxfenster.focus) ajxfenster.focus();
}
/**
 * ------ Debug-Funktionen ------
 */

/* Ein Popup mit Text-Content(HTML) */
xajax.openWin = function(data, _w, _h) {
  fenster = window.open('', 'hal2ajax_fenster','width='+_w+',height='+_h+',resizable=yes,scrollbars=yes');
  if(fenster)
    {
      if(fenster.focus) fenster.focus();
      fenster.document.open();
      fenster.document.write('<html><head><title>HAL2Ajax</title></head><body><div id="debugBox" style="font-family: Arial, Helvetica, Geneva, Swiss, SunSans-Regular; position: absolut; top:10px; left:750px; z-index: 100;">');
      fenster.document.write('<form name="dataholder"></center>');
      fenster.document.write('<center><table BORDER >');
      fenster.document.write('<tr><td><div id="debugcontent">');
      fenster.document.write(data);
      fenster.document.write('</div></td></tr>');
      fenster.document.write('</table></center></form></div></body></html>');
      fenster.document.close();
    }
}
/* Formular-Daten in einem Popup darstellen, zum Debuggen recht hilfreich */
xajax.showFormVars = function(formtag) {
  var data = this.getFormValues(formtag);
  
  var ddata = data.replace(/&quot;/,'');
  
  ddata = data.split('&');
  
  var formattedData = 'array(<br>';
  for(var i=0; i < ddata.length; i++)
    {
      content = ddata[i].split('=');
      formattedData += '<div style="padding-left: 33px;">'+content[0]+' => '+content[1]+'</div>';
    }
  formattedData += ')<br>';
  formattedData = formattedData.fontsize(2);
  formattedData = formattedData.fontcolor('limegreen');
  this.openWin(formattedData, 450, 600);
}
/**
 * zum setzen von globalen Variablen
 * -> ein Iframe erstellen
 */
xajax.createRegister = function(variablen_str, key) {
  var frameparent = this.$('registrator');
  frameparent.src = '/cc-common/registrator.php?key='+key+'&'+variablen_str;
}
xajax.addHidden = function(formtag, param,wert) {
    /* noch besser wäre wohl jedes Formular abzufragen */    
    var parentObj = xajax.$(formtag);
    var hiddenObj = xajax.$(param);    
    if(hiddenObj == null)
    {
        hiddenObj = document.createElement('input');
        hiddenObj.type = 'hidden';
        hiddenObj.name = param;
        hiddenObj.id = param;
        parentObj.appendChild(hiddenObj);
    }    
    hiddenObj.value = wert;    
}
xajax.setOpacity = function(obj, value){
    obj1 = obj;
    if(typeof obj == 'string' && this.isObject(obj)) {
        obj1 = xajax.$(obj);
    }
    
    if (obj1 && typeof obj1.style.MozOpacity!='undefined') { //Old Mozilla syntax
      obj1.style.MozOpacity=value;
    }
    else if (obj1 && typeof obj1.style.opacity!="undefined") { //Standard opacity syntax
        obj1.style.filter='Alpha(opacity='+Number(value*100)+')';
    } else {
      obj1.style.opacity=value;
    }
}
/* Position eines Objektes */
xajax.getPos = function(obj) {
    var curleft = curtop = 0;
    if (obj.offsetParent) {
        do {
           curleft += obj.offsetLeft;
           curtop += obj.offsetTop;
        } while (obj = obj.offsetParent);
    }
    return [curleft,curtop];
}
/* Waitscreen 
 * Achtung!!! nicht getestet
 */
HAL2Waiter = function() {
  // default
  this.parentTag = null;
  this.waiter = null;
  this.img = null;
  this.text = null;
  this.ready = false;
      /* daten initialisiseren */
    this.init = function() {
      // wohin soll der Waitscreen
      this.ready = false; // reset
      this.parentTag = document.getElementsByTagName('body')[0];
      // parent-Tag-Id || parent-Tag-Name      
      if(arguments.length > 0  && arguments[0] != false) { // nicht im Body
        if(typeof xajax.$(arguments[0]) != 'undefined') {          
            this.parentTag = xajax.$(arguments[0]);
        }
      }
      /* Image-Source */
      if(arguments.length > 1 && arguments[1] != false)
      {
        this.img = arguments[1];
      }
      /* Text */
      if(arguments.length > 2 && arguments[2] != false)
      {
        this.text = arguments[2];
      }
      // waiter erstellen
      this.waiter = document.createElement('div');
      this.waiter.style.visibility='hidden';
      this.waiter.style.background='#ededed';
      // this.waiter.style.border='1px solid #ff0000';
      this.waiter.style.padding='2px 2px 2px 2px';
      /* Positionierung und Größen sollten sich am parent-Tag orientieren */   
      
      var parentHeight = this.parentTag.offsetHeight;
      var parentWidth = this.parentTag.offsetWidth;
      
      this.waiter.style.width = (parentWidth)+'px';
      this.waiter.style.height = parentHeight+'px';
      // alert(this.waiter.style.width+' - '+this.waiter.style.height+' - '+document.getElementById('footer').style.top);
      this.waiter.style.zIndex = '1000';

      this.waiter.style.top = '0px';//Number(parentHeight/2)+'px';
      this.waiter.style.left = '0px';//Number(parentWidth/2)+'px';    
      var contentPosTop = Number(parentHeight/2);
      var contentPosLeft = Number(parentWidth/2)-10;
      
      this.waiter.style.position = 'absolute';
      
      this.waiter.style.opacity = 8;
      var opacityVal = 0.8;
      xajax.setOpacity(this.waiter,opacityVal);
      
      if(this.img == null) { var content = '<div style=\'position:absolute;top:'+contentPosTop+'px;left:'+contentPosLeft+'px;\'>'+(this.text==null ? 'Bitte warten...' : this.text)+'</div>'; }
      else{ var content = '<div style=\'position:absolute;top:'+contentPosTop+'px;left:'+contentPosLeft+'px;\'><img src=\''+this.img+'\' border=\'0\'></div>'; }
      this.waiter.innerHTML = '<center>'+content+'</center>';
      this.parentTag.appendChild(this.waiter);
      this.ready = true;
    },
    this.show = function() {
      if(this.waiter.style.visibility == 'hidden') {
        this.init(this.parentTag.id,this.img);
      }      
      if(typeof this.waiter == 'object') {
        if(this.parentTag.nodeName == 'BODY') {
          /* hier müssen wir auf die gesamte Höhe inkl. Scrollhöhe aufziehen, wozu ein 'footer' erwartet wird
           ist leider für den IE nötig  */
          this.waiter.style.height = (document.getElementById('footer').offsetTop+document.getElementById('footer').offsetHeight)+'px';//document.getElementById('footer').style.top;
        }
        // this.waiter.setAttribute('zIndex','1000');        
        this.waiter.style.visibility='visible';
      }      
    },
    this.hide = function() {
      if(typeof this.waiter == 'object') {
        // alert('hide-w: '+xajax.getInnerWidth()+' h: '+xajax.getInnerHeight());        
        this.waiter.style.visibility='hidden';
        document.body.style.cursor='default'; // cursor reset
      }
    },
    this.setWaiter = function(sh) {
        if(sh) {this.show();return true;}
        if(!sh) {this.hide();return true;}
    }
    this.isReady = function() { return this.ready; }
}
xajax.waiter = new HAL2Waiter();

/* Loading-Function überschreiben */
var oldLoaders = xajax.loadingFunction;
var oldDoneLoaders = xajax.doneLoadingFunction;
xajax.loadingFunction = function() {	
        if(typeof xajax.waiter == 'object' 
        && typeof xajax.waiter.isReady == 'function' 
        && xajax.waiter.isReady() == true) {
            xajax.waiter.show();    
        }
        eval(oldLoaders);
}
xajax.doneLoadingFunction = function() {
  if(typeof xajax.waiter == 'object' 
  && typeof xajax.waiter.isReady == 'function' 
  && xajax.waiter.isReady() == true) {
        xajax.waiter.hide();
  }
  eval(oldDoneLoaders);
}
var helpalert = function() {
    alert('sehr hilfreich...'+arguments[0].id+' - '+arguments.length);
    
}
var change = function(cln,totext) {  
    tchange = xajax.$('.'+cln);
    if(tchange == null) { alert('Keine Übereinstimmmung gefunden...'); return false; }
    for(var i = 0; i < tchange.length; i++) {
        _t = tchange[i]; // _t muss GLOBAL sein, damit es auch in der Event-Function gilt
        _t.setAttribute('className',totext);
        _t.setAttribute('class',totext);
        _t.setAttribute('id','h'+i);
        _t.onclick = function(){ alert('t: '+this+'\n'+this.innerHTML); }
    }
}

