
/**
 * Object als assoziatives Array
 */
function assocArray() {

   // Array der gesetzen Keys
   this.keySet = new Array();

   /**
    * Setzt die Eigenschaft key mit dem Wert value
    * und speichert welcher Wert gesetzt wurde
    *
    * @param string  key
    * @param mixed   value
    *
    * @return void
    */
   this.set = function(key, value)
   {
      var idx;

      // Wert setzen
      this[key] = value;

      // wurde der Key schon gespeichert
      for(idx = 0; idx < this.keySet.length; idx++)
      {
         if(this.keySet[idx] == key)
         {
            // ja
            return;
         }
      }

      this.keySet.push(key);
   }
}


/**
 * Prueft ob es in den Kindelementen von objParent eine Element mit dem
 * Klassennamen className gibt
 *
 * @param object     Object in dessen Childs gesucht werden soll
 * @param className  Klassenname nach dem gesucht werden soll
 *
 * @return bool
 */
function doseClassExistInElement(objParent, className)
{
   var i, ii, arrClassName;
   var t = '';
   for(i = 0; i < objParent.childNodes.length; i++)
   {
      if(objParent.childNodes[i].nodeType != 1)
      {
         // kein Elementknoten also uninteressant
         continue;
      }

      // den Classnamen an SPACE aufsplitten
      arrClassName = objParent.childNodes[i].className.split(' ');
      for(ii = 0; ii < arrClassName.length; ii++)
      {
         // und die Teile des Classnamen mit dem gesuchten vergleichen
         if(arrClassName[ii] == className)
         {
            // Element mit der gesuchten Class gefunden
            return true;
         }
      }
   }

   // Element mit className nicht gefunden
   return false;
}

function askUser(question, urlYes, urlNo)
{
   switch(window.confirm(question))
   {
      case true:
      if(urlYes)
      {
            document.location.href = urlYes;
      }

      return true;
      break;

      case false:
         if(urlNo)
         {
           document.location.href = urlNo;
         }

        return false;
      break;

      default:
         throw 'Nicht erwarteter Wert';
      break;
   }

   return null;
}

/**
 * Sends a xmlHttpRequest
 *
 */
var xhr     = false;
var xhrData = new Object();

/**
 *
 *
 */
function sendXmlHttpRequest(url, idOutput, arrParameter, callBackMethod, setWait)
{
   var objOutput;
   
   xhr = false;
   xhrData = new Object();

   if(!idOutput)
   {
      idOutput = false;
   }

   if(!arrParameter)
   {
      arrParameter = new Array();
   }

   // try to create a xmlHttpRequest-Object
   // Mozilla, Opera, Safari or Internet Explorer 7
   if ( typeof XMLHttpRequest != 'undefined')
   {
       xhr = new XMLHttpRequest();
   }

   if ( !xhr)
   {
       // Internet Explorer 6 or older
       try
       {
           xhr  = new ActiveXObject("Msxml2.XMLHTTP");
       }
       catch(e)
       {
           try
           {
               xhr  = new ActiveXObject("Microsoft.XMLHTTP");
           }
           catch(e)
           {
               xhr  = false;
           }
       }
   }

   if(!xhr)
   {
      // creation of the xmlHttpReq-Object failed
      alert('Creation of the xmlHttpRequest-Object failed.');
      return false;
   }

   // send the request
   xhrData                 = new Object();
   xhrData['idOutput']     = idOutput;
   xhrData['arrParameter'] = arrParameter;

   xhr.open('POST', url, true);

   if(callBackMethod)
   {
      xhr.onreadystatechange = callBackMethod;
   }

   if(setWait && idOutput)
   {
      if((objOutput = document.getElementById(idOutput)))
      {
         if(setWait == 'opacity')
         {
            if(objOutput.innerHTML.indexOf('<!-- loaded -->'))
            {
               objOutput.innerHTML = '<!-- loaded --><div style="filter:Alpha(opacity=50); -moz-opacity: 0.5; opacity: 0.5; -khtml-opacity: 0.5;  cursor:wait;">'
                                    + objOutput.innerHTML
                                    + '</div>';
            }
         }
         else if(setWait == 'eggclock')
         {
            objOutput.innerHTML = '<table width="100%" height="100%">'
            + '<tr>'
            + '<td  align="center" valign="middle">'
            + '<img src="/cmsCore/img/admin/sanduhrKlein.gif" />'
            + '</td>'
            + '</tr>'
            + '</table>';
         }
         else
         {
            objOutput.innerHTML = '<table width="100%" height="100%">'
            + '<tr>'
            + '<td  align="center" valign="middle">'
            + '<img src="/cmsCore/img/admin/sanduhrKlein.gif" />'
            + '</td>'
            + '</tr>'
            + '</table>';
         }

      }
   }

   xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
   xhr.setRequestHeader('convert_charset','UTF-8/ISO-8859-15');

   if(arrParameter.length > 0)
   {
      xhr.send(urlCodeParaArray(arrParameter));
   }
   else
   {
      xhr.send('');
   }

   return true;
}

function urlCodeParaArray(arrIn)
{
   var i, parts, fieldName, fieldValue;
   var strCoded = '';
   var arrOut   = new Array();

   for(i = 0; i < arrIn.length; i++)
   {
      parts = arrIn[i].split('=');

      fieldName = parts[0];
      parts.shift();
      fieldValue = urlencode(parts.join('='));

      arrOut.push(fieldName + '=' + fieldValue);
   }

   return arrOut.join('&');
}

function urlencode( str )
{
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // %          note: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');
    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'

    var histogram = {}, histogram_r = {}, code = 0, tmp_arr = [];
    var ret = str.toString();

    // The histogram is identical to the one in urldecode.
    histogram['!']   = '%21';
    histogram['%20'] = '+';

    // Begin with encodeURIComponent, which most resembles PHP's encoding functions
    ret = encodeURIComponent(ret);

    for(search in histogram)
    {
        replace = histogram[search];
        tmp_arr = ret.split(search); // Custom replace
        ret = tmp_arr.join(replace);
    }

    // Uppercase for full PHP compatibility
    return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2)
    {
        return "%"+m2.toUpperCase();
    });

    return ret;
}

function XmlHttpRequestCallBack()
{
   var objOutput;

   if((xhr.readyState != 4) || (xhr.status != 200))
   {
      // der Request ist noch nicht komplett fertig
      return;
   }
   
   if(xhrData['idOutput'] == false)
   {
      // keine Output ID, also auch keine Ausgabe
      return;
   }

   if(!(objOutput = document.getElementById(xhrData['idOutput'])))
   {
      alert(xhr.responseText);
      return;
   }

   objOutput.innerHTML = xhr.responseText;

   // Uebertragen der Meldungen
   XmlHttpRequestCallBack_printMessages();
}

/**
 * Ausgabe der Fehler- und Erfolgsmeldungen eines XmlHttpRequest
 */
function XmlHttpRequestCallBack_printMessages()
{
   var objIn, objOut

   // DIV der Fehlermeldung im XmlHttpReq
   objIn = document.getElementById('xmlHttpRegErrorHidden');

   // DIV der Fehlermelung in der Seite
   objOut = document.getElementById('sysError');

   // wenn es beide gibt kopieren des Inhaltes
   if(objIn && objOut)
   {
      objOut.innerHTML = objIn.innerHTML;
   }

   // DIV der Meldung im XmlHttpReq
   objIn = document.getElementById('xmlHttpRegMessageHidden');

   // DIV der Melung in der Seite
   objOut = document.getElementById('sysMessage');

   // wenn es beide gibt kopieren des Inhaltes
   if(objIn && objOut)
   {
      objOut.innerHTML = objIn.innerHTML;
   }

   return;
}

/**
 * Weiterleitung auf den Login
 * Prueft ob die Seite sich in einem Frameset befindet. Wenn ja wird als Redirect
 * fuer das Login die URL der umgebenden YSeite verwendet
 */
function redirectToLogin()
{
   var para = parent.frames.location.search.replace(/^\?/, '&');
   var url = 'http://'
            + parent.frames.location.hostname
            + '/login/login?redirectTo='
            + parent.frames.location.pathname
            + '&reason=timeOut'
            + para;

   try
   {
      parent.frames.location.href = url;
   }
   catch(e)
   {
      document.location.href = url;
   }

}

function ret(val)
{
   if(!val)
   {
      return null;
   }

   return val;
}

/**
 * Funktion zum Parsen von GET-Variablen der URL
 *
 * @param   string   name  Name der Variable
 * @return  string         Value der Variable
 */
function gup( name )
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}


/**
 * Klasse zum Parsen von URIs
 * 
 * Beispiele:
 *    var u = new parseUri('http://www.test.it/aa/bb?p1=einz&p2=zwei&p3=drei');
 *    alert(u.protocol);  // Gibt http aus
 *    alert(u.domain);    // Gibt www.test.it aus
 *
 * Verfuegbare Eigenschaften sind:
 *    source
 *    protocol
 *    authority
 *    domain
 *    port
 *    path
 *    directoryPath
 *    fileName
 *    query
 *    anchor
 * 
 * Die Eigenschaft query enthaelt ein Objekt in dem die Parameter der URI
 * Eigenschaften mit den Werten der Parameter sind.
 * Beispiel:
 *    var u = new parseUri('http://www.test.it/aa/bb?p1=einz&p2=zwei&p3=drei');
 *    if(u.query.p3 == undefined)
 *    {
 *       alert('Kein Wert');
 *    }
 *    else
 *    {
 *       alert('p3 => ' + u.query.p3);   // Gibt drei aus
 *    }
 */
function parseUri(uri){

   // Objekt in dem die Parameter (das hinter dem ?) der URI als Eigenschaften gespeichert sind 
   this.query = {};
   
   // Array mit den Namen der Parameter, die in query gespeichert sind
   this.parameter = new Array();
   
   // Namen der Bestandteile, in die die URI zerlegt wird
   this.uriPartNames = [
                           'source',
                           'protocol',
                           'authority',
                           'domain',
                           'port',
                           'path',
                           'directoryPath',
                           'fileName',
                           'query',
                           'anchor'
                         ];
   
   /**
    * Zerlegt die URI in ihre Bestandteile
    *
    * @param string     sourceUri
    *
    * @returns object
    */
   this.parseUri = function(sourceUri)
   {
      var uri = {};
      var uriParts = new RegExp("^(?:([^:/?#.]+):)?(?://)?(([^:/?#]*)(?::(\\d*))?)?((/(?:[^?#](?![^?#/]*\\.[^?#/.]+(?:[\\?#]|$)))*/?)?([^?#/]*))?(?:\\?([^#]*))?(?:#(.*))?").exec(sourceUri);
       
      for(var i = 0; i < this.uriPartNames.length; i++)
      { 
          this[this.uriPartNames[i]] = (uriParts[i] ? uriParts[i] : '');
      }
       
      // Always end directoryPath with a trailing backslash if a path was present in the source URI
      // Note that a trailing backslash is NOT automatically inserted within or appended to the "path" key
      if(this.directoryPath.length > 0)
      {
          this.directoryPath = this.directoryPath.replace(/\/?$/, "/");
      }
      
      this.query = decodeURI(this.query);
      
      return uri;
   }
   
   
   /**
    * Zerlegt die Parameter der URI in Key/Value-Paare
    *
    * @param string query
    *
    * @return object
    */
   this.parseQuery = function(query)
   {
      var q = {};
      var pairs, i, tmp, k, v;
      
      this.parameter = new Array();
      
      if(!query)
      {
         return q;
      }
      
      // &amp; in & wandeln
      query = query.replace(/&amp;/g, '&');      
      
      // Query an & aufteilen und ueber die Key/Value-Paare iterieren
      pairs = query.split('&');
      for(i = 0; i < pairs.length; i++)
      {
         // Das Key/Value-Paar an = aufteilen
         tmp = pairs[i].split('=', 2);
         
         if(tmp.length != 2)
         {
            // der Split hat nicht die erwarteten zwei Teile geliefert
            continue;
         }
         
         k = tmp[0];
         v = tmp[1];
         
         q[k] = v;
         
         // Name des Parameters speichern
         this.parameter.push(k);
      }
      
      return q;
   }
   
   // URI in ihre Bestandteile zerlegen lassen
   this.parseUri(uri);
   
   // Die Parameter der URI zerlegen
   this.query = this.parseQuery(this.query);   
}
