// DHTML Basisfunktionen
// (c) 2007 schukai GmbH
// www.alvine.de

// Funktions- und Environmet-Variablen
var _ALVINE_DHTML = false;
var _ALVINE_DOM = false;
var _ALVINE_IE = false;
var _ALVINE_IE6 = false;
var _ALVINE_IE7 = false;
var _ALVINE_NS = false;
var _ALVINE_OP = false;
var _ALVINE_MAC = false;
var _ALVINE_NETSCAPE = false;

// Initialisieren der Environmet-Variablen
function initLib() {


  if(navigator.appName=="Netscape") {
    _ALVINE_NETSCAPE = true;
  }

  if(document.getElementById) {
    _ALVINE_DHTML = true;
    _ALVINE_DOM = true;
  }
  
  if(window.opera) {
    _ALVINE_OP = true;
  }

  if(document.all && !_ALVINE_OP) {
     
     var $versionpattern = /MSIE\s(.*?)\;/i;
     var version = navigator.appVersion.match($versionpattern);
     version = version[1];
          
     if(version.substring(0, 1)=='6') _ALVINE_IE6 = true;
     if(version.substring(0, 1)=='7') _ALVINE_IE7 = true;
     
    _ALVINE_DHTML = true;
    _ALVINE_IE = true;
    
  };
 
  if(document.layers && !_ALVINE_OP) {
    _ALVINE_DHTML = true;
    _ALVINE_NS = true; 
  };
  
  if(navigator.userAgent.indexOf("Mac") != -1) {
    _ALVINE_MAC = true;
  };

};

function getElementID(id) {
  return getElement('id', id);
};

// System- und browserunabhägige Funktion um ein
// Element (Objekt) zu holen
// @param type Auswahl aus: id, name, tagname
// @param ptr ID oder Name des Elements
// @param index Nur bei Verwendung des Typ tagname
function getElement(type, ptr, index) {

  if(_ALVINE_DOM) { 
    if(type.toLowerCase()=="id") { 
      if(typeof document.getElementById(ptr) == "object") {
        return document.getElementById(ptr);
      };
      return void(0);

    } else if(type.toLowerCase()=="name") {
      if(typeof document.getElementsByName(ptr) == "object") {
        return document.getElementsByName(ptr)[index];
      };
      return void(0);

    } else if(type.toLowerCase()=="tagname") {
      if(typeof document.getElementsByTagName(ptr) == "object" || (_ALVINE_OP && typeof document.getElementsByTagName(ptr) == "function")) {
        return document.getElementsByTagName(ptr)[index];
      };
      return void(0);
    } else {
      return void(0);
    };

  } else if(_ALVINE_IE) {

    if(type.toLowerCase()=="id") {
      if (typeof document.all[ptr] == "object") {
        return document.all[ptr];
      };
      return void(0);

    } else if(type.toLowerCase()=="tagname") {
      if(typeof document.all.tags(ptr) == "object") {
        return document.all.tags(ptr)[index];
      };
      return void(0);

    } else if(type.toLowerCase()=="name") {
      if(typeof document[ptr] == "object") {
        return document[ptr];
      };
      return void(0);
    } else {
      return void(0);
    };

  } else if(_ALVINE_NS) {   

    if(type.toLowerCase()=="id" || type.toLowerCase()=="name") {
      if (typeof document[ptr] == "object") {
        return document[ptr];
      };
      return void(0);

    } else if(type.toLowerCase()=="index") {
      if (typeof document.layers[ptr] == "object") {
        return document.layers[ptr];
      };
      return void(0);
    } else {
      return void(0);
    };
  };
  return void(0);
}

// Browserunabhängig Inhalte in die Seite einfügen
// @param obj Zeiger auf Objekt
// @param content Zu schreibender inhalt 
function writeHTML(obj, content) {

   if(!obj) return void(0);  
   if(_ALVINE_OP) {
     // nicht implementiert
   } else if(_ALVINE_DOM) {   // IE7
     if(typeof(obj.innerHTML)!="undefined") { 
       obj.innerHTML = content;
     } else {
     // nicht implementiert
     };
   } else if(_ALVINE_IE) {
     //obj.innerHTML = content;
   } else if(_ALVINE_NS) { 
     obj.document.open();
     obj.document.write(content);
     obj.document.close();
   };
   
   return void(0);
};

// Browserunabhängig Inhalte in die Seite einfügen
// @param obj Zeiger auf Objekt
// @param content Zu schreibender inhalt (nur Text)
function writeContent(obj, content) {

   if(!obj) return void(0);  
   if(_ALVINE_OP) {

     // nicht implementiert
   
   } else if(_ALVINE_DOM) {  
     if(obj.firstChild) { 
       obj.firstChild.nodeValue = content;
     };

   } else if(_ALVINE_IE) {
     obj.innerText = content;

   } else if(_ALVINE_NS) { 
     obj.document.open();
     obj.document.write(content);
     obj.document.close();
   };
   return void(0);
};

// Diese Funktion verschiebt ein Objekt 
// an die angegebenen koordinaten
function moveElementTo(obj, x, y) {

  if(_ALVINE_DOM || _ALVINE_OP) { 
    obj.style.left = x+'px';
    obj.style.top = y+'px'; 
  } else if(_ALVINE_NS) { 
    obj.moveTo(x, y);
  };

 };
 
function setVisibilityMode(obj, flag) {

   if(!obj) return void(0);

   if(_ALVINE_DOM || _ALVINE_OP) { 
     if(flag) { 
       obj.style.visibility = "visible";
       obj.style.display = "block";
     } else {
       obj.style.visibility = "hidden";
       obj.style.display = "none";
     };

   } else if(_ALVINE_IE) {
     if(flag) { 
       obj.style.visibility = "visible";
       obj.style.display = "block";
     } else {
       obj.style.visibility = "hidden";
       obj.style.display = "none";
     };
   
   } else if(_ALVINE_NS) { 
     if(flag) { 
       obj.visibility="show";
       obj.display="block";
     } else {
       obj.visibility="hide";
       obj.display="none";
     };
   };
   return void(0);
};

// Sichtbarkeit von Elementen ändern.
// @param obj Zeiger auf Element
// @param flag true: sichtbar, false: unsichtbar
function setVisibility(obj, flag) {

   if(!obj) return void(0);

   if(_ALVINE_DOM || _ALVINE_OP) { 
     if(flag) { 
       obj.style.visibility = "visible";
       obj.style.display = "block";
     } else {
       obj.style.visibility = "hidden";
       obj.style.display = "none";
     };

   } else if(_ALVINE_IE) {
     if(flag) { 
       obj.style.visibility = "visible";
       obj.style.display = "block";
     } else {
       obj.style.visibility = "hidden";
       obj.style.display = "none";
     };
   
   } else if(_ALVINE_NS) { 
     if(flag) { 
       obj.visibility="show";
       obj.style.display = "block";
     } else {
       obj.visibility="hide";
       obj.style.display = "none";
     };
   };
   return void(0);
};

// Position eines Elements ermitteln
// Diese Funktion arbeitet mit dem Offset eines Elements
// und arbeitet sich rekursiv durch das DOM
// Ist eine AbbruchsID angegeben und trift
// die Funktion auf dieses Element so wird der
// Wert zurückgegeben
// @param obj Zeiger auf Element
// @param id AbbruchsID
function getLeftOfElement(obj, id) {

  if(_ALVINE_NS) return obj.pageX;

  if(!id) id = "noid"; 
  var left = obj.offsetLeft;
  if(obj.id==id) return left;

  if(obj.offsetParent!=null && obj.offsetParent.tagName!="HTML") {
    left += getLeftOfElement(obj.offsetParent);
  };
  return left;
}

// Identische Funktion für die Y-Koordinate
// @param obj Zeiger auf Element
// @param id AbbruchsID
function getTopOfElement(obj, id) {

  if(_ALVINE_NS) return obj.pageY;
  if(!id) id = "noid"; // dummywert!
  var top = obj.offsetTop; 

  if(obj.id==id) return top;
  if(obj.offsetParent!=null && obj.offsetParent.tagName!="HTML") {
    top += getTopOfElement(obj.offsetParent);
  };
  
  // to: add padding
  
  return top;
}

// Höhe eines Objektes zurückgeben
function getHeightOfElement(obj) {
  if(_ALVINE_NS) return obj.height;
  return obj.offsetHeight;
};

// Breite eines Objektes zurückgeben
function getWidthOfElement(obj) {
  if(_ALVINE_NS) return obj.width;
  return obj.offsetWidth;
};



// Simple AJAX - Object 

function alvineSimpleAjaxRequest(url, id, errorID) {
  var url = url;
  var containerID = id;
  var errorContainerID = errorID;
  var requestObj = false;
  
  var urlData = new Array();
  var callBacks = new Array();

  var urlControlData = new Array();
  var urlControlID = new Array();
  
  
  function checkState() {
    // 0 (nicht initialisiert)
    // 1 (lade)
    // 2 (geladen)
    // 3 (interaktiv)
    // 4 (vollständig) 
    if(requestObj.readyState!=4) return false; 

    if(requestObj.status==200) {
      return requestObj.responseText;
    } else {
    
      errorMsg = 'Error: '+requestObj.status; // @TODO: sprachversionen

      if(errorContainerID!=null) {
        obj = getElement('id', errorContainerID);
        writeHTML(obj,errorMsg);
        return false;
      };

      return errorMsg;
    }
  }  
  
  this.sendRequest = function() {
    requestObj = null;
    if(window.XMLHttpRequest) { // Mozilla, Firefox, Safari, ...
      requestObj = new XMLHttpRequest();
      if (requestObj.overrideMimeType) {
        requestObj.overrideMimeType('text/html'); // BugFix für fehlerhaften Response
      };
    } else if(window.ActiveXObject) { // IE
      try {
        requestObj = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
        try {
          requestObj = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
        };
      }
    };

    if(!requestObj) {
    
      errorMsg = 'no ajax'; // @TODO: sprachversionen

      if(errorContainerID!=null) {
        obj = getElement('id', errorContainerID);
        writeHTML(obj,errorMsg);
        return false;
      };

      return false;
    }
    
    var parameters = "";
    for(i=0; i<urlData.length;i++) {
      if(parameters.length>0) parameters += '&';
      value = eval(urlData[i]);
      parameters += 'sxx_ajax['+urlData[i]+']='+value;
    };

    for(i=0; i<urlControlID.length;i++) {
      if(parameters.length>0) parameters += '&';
      value = eval(urlControlData[i]);
      parameters += 'sxx_ajax['+urlControlID[i]+']='+value;
    };

    if(parameters.length>0) parameters += '&';
    parameters += 'r='+(1 + 10000*(Math.random()));;
    
    try {
      requestObj.onreadystatechange = eventHandler; 
      requestObj.open('POST', url, true);
      requestObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');   // wenn data
      requestObj.send(parameters); // WENN DATA hier übergeben  
    } catch (e) {
      alert(e);
    };
  }

  this.bindControl = function(key, id) {
    handler = 'getElementID(\''+id+'\').value;';
    urlControlData[urlControlData.length] = handler;   
    urlControlID[urlControlID.length] = key;
  }
  
  this.bindVariable = function(key) {
    urlData[urlData.length] = key;
  }
  
  function eventHandler() {
    var result = checkState();
    if(result==false) return;
    obj = getElement('id', containerID);
    resultContent = result;
    
    outScript = "";
    
    scriptStartIndex = resultContent.indexOf('<script'+'>');
    if(scriptStartIndex>=0) {
      scriptEndIndex = resultContent.indexOf('</script'+'>');
      outScript += resultContent.substr(scriptStartIndex+8, scriptEndIndex-scriptStartIndex-8);
      resultContent = resultContent.substr(0,scriptStartIndex)+resultContent.substr(scriptEndIndex+8+1,resultContent.length);
    };

    scriptStartIndex = resultContent.indexOf('<array>');
    if(scriptStartIndex>=0) {
      scriptEndIndex = resultContent.indexOf('</array>');
      skript = resultContent.substr(scriptStartIndex+7, scriptEndIndex-scriptStartIndex-7);
      data=eval(skript);
      for(j=0;j<callBacks.length;j++) {
        callBacks[j]('array',data);
      };
      resultContent = resultContent.substr(0,scriptStartIndex)+resultContent.substr(scriptEndIndex+7+1,resultContent.length);
    };    

    scriptStartIndex = resultContent.indexOf('<object>');
    if(scriptStartIndex>=0) {
      scriptEndIndex = resultContent.indexOf('</object>');
      skript = resultContent.substr(scriptStartIndex+8, scriptEndIndex-scriptStartIndex-8);
      data=eval(skript);
      for(j=0;j<callBacks.length;j++) {
        callBacks[j]('object',data);
      };
      resultContent = resultContent.substr(0,scriptStartIndex)+resultContent.substr(scriptEndIndex+8+1,resultContent.length);
    }; 

    writeHTML(obj,resultContent);
    if(outScript) eval(outScript);
  };
  
  this.bindCallback = function(callBack) {
    callBacks[callBacks.length] = callBack
  };
};


// Umgebungsvariablen initialisieren
initLib();

// Testwerte
//alert('FLAGS \nIE ' + _ALVINE_IE + " \nDOM " + _ALVINE_DOM + " \nNS "+ _ALVINE_NS + " \nOP " +_ALVINE_OP + " \nMAC " + _ALVINE_MAC);



function str_replace(Search, Replace, Subject){

    if ((Subject == null) || (Search == null))           return null;
    if ((Subject.length == 0) || (Search.length == 0))   return Subject;
    if ((Replace == null) || (Replace.length == 0))    Replace = "";

    var LengthSearch = Search.length;
    var LengthReplace = Replace.length;
    var Pos = Subject.indexOf(Search, 0);

    while (Pos >= 0)
    {
        Subject = Subject.substring(0, Pos) + Replace + Subject.substring(Pos + LengthSearch);
        Pos = Subject.indexOf(Search, Pos + LengthReplace);
    }
    return Subject;
}