  /**
  * SOS_Util : Hilfsfunktionen
  *
  * @copyright    Software- und Oranisation-Service GmbH, Germany
  * @author       Oliver Haufe    <oliver.haufe@sos-berlin.com>
  * @author       Robert Ehrlich  <robert.ehrlich@sos-berlin.com>
  *
  * @access       public
  * @package      UTIL
  */ 
 
  
  /**
  * Konstruktor
  *
  * @access public
  */
  var SOS_Util = function(){}
 
  SOS_Util.userAgent  = navigator.userAgent.toLowerCase();

  SOS_Util.isIE       = SOS_Util.userAgent.indexOf('msie')      != -1;
  SOS_Util.isGecko    = !SOS_Util.isIE;
  SOS_Util.isNetscape = SOS_Util.userAgent.indexOf('netscape')  != -1;


  /**
  * überprüft, ob eine Variable (param) eine Funktion ist.
  * Sie liefert true zurück, wenn es sich bei der Variablen um eine Funktion handelt, sonst false
  *
  * @param    param Object
  * @return   boolean
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public
  */
  SOS_Util.isFunction = function(param){
      return typeof param == 'function';
  }

  /**
  * überprüft, ob eine Variable (param)  vom Typ NULL ist.
  * Sie liefert true zurück, wenn es sich bei der Variablen um ein NULL handelt,sonst false
  * Eine Variable ist dann als Null anzusehen, wenn sie folgende Kriterien erfüllt:
  * Wert NULL,Variable ist nicht definiert
  *
  * @param    param Object
  * @return   boolean
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public
  */
  SOS_Util.isNull = function(param){
      return SOS_Util.isUndefined(param) || param == null;
  }
  
  /**
  * überprüft, ob eine Variable (param) vom Typ Number ist.
  * Gibt true zurück, wenn der Wert eine gültige Zahl ist, und false, 
  * wenn es keine Zahl ist bzw. die Zahl sich außerhalb des Wertebereiches von JavaScript befindet.
  *
  * @param    param Object
  * @return   boolean
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public
  */
  SOS_Util.isNumber = function(param){
      return typeof param == 'number' && isFinite(param);
  }
  
  /**
  * überprüft, ob eine Variable (param) einen gültigen Number Wert hat.
  * Sie liefert true zurück, wenn es sich bei der Variablen einen gültigen Number Wert handelt, sonst false
  * param kann sowohl als Number als auch als String übergeben werden
  *
  * @param    param Object
  * @return   boolean
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public
  */
  SOS_Util.isNumberValue = function(param){
    
    if(param) { param = String(param);  } 
    else      { return false;           }
    
    if(param.search(/(,,)|(,\.)|(\.\.)|(\.,)/) != -1){
      return false; 
    }
        
    return SOS_Util.isNumber(1*param.replace(/,|\./g,''));
  }
  
  /**
  * überprüft, ob eine Variable (param) vom Typ Object ist.
  * Sie liefert true zurück, wenn es sich bei der Variablen um ein Object handelt, sonst false
  *
  * @param    param Object
  * @return   boolean
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public
  */
  SOS_Util.isObject = function(param){
      return (param && (typeof param == 'object' || SOS_Util.isFunction(param)));
  }
  
  /**
  * überprüft, ob eine Variable (param) vom Typ String ist.
  * Sie liefert true zurück, wenn es sich bei der Variablen um ein String handelt, sonst false
  *
  * @param    param Object
  * @return   boolean
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public
  */
  SOS_Util.isString = function(param){
      return typeof param == 'string';
  }
  
  /**
  * überprüft, ob eine Variable (param) vom Typ undefined (nicht fesetzt) ist.
  * Sie liefert true zurück, wenn es sich bei einer nicht gesetzter Variable handelt, sonst false
  *
  * @param    param Object
  * @return   boolean
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public
  */
  SOS_Util.isUndefined = function(param){
      return typeof param == 'undefined';
  } 

  /**
  * überprüft, ob eine Variable (param) vom Typ Array ist.
  * Sie liefert true zurück, wenn es sich bei der Variablen um ein Array handelt, sonst false
  *
  * @param    param Object
  * @return   boolean
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public
  */
  SOS_Util.isArray = function(param){
    
    if(!param) return false;
      
  return SOS_Util.isObject(param) && param.constructor == Array;
  }
  
  /**
  * überprüft, ob eine Variable (param) vom Typ boolean ist.
  * Sie liefert true zurück, wenn es sich bei der Variablen um einen booleschen Wert handelt, sonst false
  *
  * @param    param Object
  * @return   boolean
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public
  */
  SOS_Util.isBoolean = function(param){
      return typeof param == 'boolean';
  }
  
  /**
  * !!!! in arbeit NICHT FERTIG
  * liefert true zurück, wenn eine Variable (param) nicht definiert,
  * leer oder gleich 0 ist. 
  * bei Objekten - ob Objekt und alle seine Eigenschaften nicht NULL sind
  * In allen anderen Fällen wird false als Antwort geliefert.
  *
  * @param    param Object
  * @return   boolean
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public
  */
  SOS_Util.isEmpty = function(param){
    
    if(!param) return true;
        
    if(SOS_Util.isObject(param)){
      for (var i in param) {
        if (!SOS_Util.isNull(param[i])) {
          return false;
        }
      }
    }
    else if(!SOS_Util.isNull(param)                    ||
            (SOS_Util.isNumber(param) && param != 0 )  ||
            (SOS_Util.isString(param) && param.length != 0)){
      return false;
    }
    
    return true;
  }
  
      
  /**
  * Konvertiert eine Hexadezimalzahl in eine Dezimalzahl
  *
  * @param    hex String Hexadezimalzahl
  * @return   Integer von Parameter
  * @type     Number
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-27
  */  
  SOS_Util.hex2dec = function(hex) { 
    
    hex = hex.toString();
    if( hex.search(/[^0123456789abcdefABCDEF]/) > -1 ) { 
      throw new SOS_Exception( new Error(), "Number has illegal digits" ); 
    }
    if( hex.length > 8 ) { throw new SOS_Exception( new Error(), "Number must be lower than 100000000" ); }
    var digits = "0123456789abcdef";
    var num    = 0;
    hex = hex.toLowerCase();
    for(i=0; i < hex.length; i++) {
      for (j=0; j <= 16; j++) {
        if (hex.substr(i,1) == digits.substr(j,1)) {
          num = num + j * Math.pow(16, hex.length-i-1);
        }
      }
    }
    return num;
  }  
 
  /**
  * Konvertiert ein Integer in das Hexadezimalformat
  * 
  * @param    num Integer
  * @return   Hexadezimalzahl von Parameter
  * @type     String
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-27
  */
  SOS_Util.dec2hex = function( num ) {
    
    num        = parseInt(num);
    if( num   >= Math.pow(16,8) ) { 
      throw new SOS_Exception( new Error(), "Number must be lower than "+Math.pow(16,8) );
    }
    if( num    < 0 ) { throw new SOS_Exception( new Error(), "Number must be positive" ); }
    var digits = "0123456789abcdef";
    var hex    = new Array("0","0","0","0","0","0","0","0");
    for( var i=0; i < hex.length; i++ ) {
      hex[hex.length-1-i] = digits.charAt(Math.abs(num)%16);
      num                 = Math.floor(num/16);
    }
    while( hex[0] == 0 && hex.length > 1 ) { hex.shift(); }
    return hex.join("");
  }
 
  
  /**
  * Entfernt Leerzeichen bzw. das als Parameter übergebene Zeichen vom Anfang einer 
  * Zeichenkette
  *
  * @param    param         String Objekt
  * @param    chr String das am Anfang zu entfernende Zeichen (default: alle Leerzeichen)
  * @return   links getrimmte Zeichenkette
  * @type     String
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-27
  */
  SOS_Util.ltrim = function(param,chr) { 
    
    if( SOS_Util.isUndefined(chr) ) {
      var pattern = new RegExp( "^[\\s]*([\\S]*.*)" ); 
    } else if( SOS_Util.isString(chr) ) {
      chr == escape(chr);
      if( chr.indexOf("%") == 0 ) {
        chr = chr.substr(1,2);
      } else {
        chr = SOS_Util.dec2hex(chr.charCodeAt(0));    
      }
      var pattern = new RegExp( "^[\\x"+chr+"]*([^\\x"+chr+"]*.*)" );
    } else {
      throw new SOS_Exception( new Error(), chr.toString() + " isn't a string" );
    }
    return param.replace(pattern,"$1");
  }
    
  
  /**
  * Entfernt Leerzeichen bzw. das als Parameter übergebene Zeichen vom Ende einer 
  * Zeichenkette
  *
  * @param    param         String Objekt
  * @param    chr String das am Ende zu entfernende Zeichen (default: alle Leerzeichen)
  * @return   rechts getrimmte Zeichenkette
  * @type     String
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-27
  */  
  SOS_Util.rtrim = function(param,chr) {
  
    if( SOS_Util.isUndefined(chr) ) {
      var pattern = new RegExp( "(.*[\\S]+)[\\s]*$"); 
    } else if( SOS_Util.isString(chr) ) {
      chr == escape(chr);
      if( chr.indexOf("%") == 0 ) {
        chr = chr.substr(1,2);
      } else {
        chr = SOS_Util.dec2hex(chr.charCodeAt(0));    
      }
      var pattern = new RegExp( "(.*[^\\x"+chr+"]+)[\\x"+chr+"]*$" );
    } else {
      throw new SOS_Exception( new Error(), chr.toString() + " isn't a string" );
    }
    return param.replace(pattern,"$1");
  }
    
    
  /**
  * Entfernt Leerzeichen bzw. das als Parameter übergebene Zeichen vom Anfang und vom 
  * Ende einer Zeichenkette
  *
  * @param    param         String Objekt
  * @param    chr String das am Anfang und Ende zu entfernende Zeichen (default: alle Leerzeichen)
  * @return   links und rechts getrimmte Zeichenkette
  * @type     String
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-27
  */  
  SOS_Util.trim  = function(param,chr) { 
    
    return SOS_Util.rtrim(SOS_Util.ltrim(param,chr));
  }
    
  
  /**
  * Versieht in einer Zeichenkette die Elemente Nul-Byte, Quote, Doublequote und 
  * Backslash mit einem Backslash.
  *
  * @param    param         String Objekt
  * @return   mit Backslash vor Nul-Byte, Quote, Doublequote und Backslash
  * @type     String
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-30
  */  
  SOS_Util.addSlashes = function(param) { 
    
    if(!param) return '';
    
    return param.replace(/(\0|\'|\"|\\)/g,"\\$1");
  }
      
      
  /**
  * Entfernt in einer Zeichenkette ggf. vorhandene Backslashes vor den Elementen 
  * Nul-Byte, Quote, Doublequote und Backslash
  *
  * @param    param         String Objekt
  * @return   ohne Backslash vor Nul-Byte, Quote, Doublequote und Backslash
  * @type     String
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-30
  */  
  SOS_Util.stripSlashes = function(param) { 
    if(!param) return '';
    
    return param.replace(/\\(\0|\'|\"|\\)/g,"$1");
  }
      
  
  /**
  * Wandelt Sonderzeichen in entsprechenden HTML-Code um.<br/>Folgende Sonderzeichen 
  * werden erkannt: & -> &amp;, " -> &quot;, ' -> &#039;, < -> &lt;, > -> &gt;
  *
  * @param    param         String Objekt
  * @return   mit HTML-Code für &,",',<,>
  * @type     String
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-27
  */  
  SOS_Util.htmlSpecialChars = function(param) { 
    
    if(!param) return '';
    
    return param.replace(/&/g,"&amp;").replace(/\"/g,"&quot;").replace(/\'/g,"&#039;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
  }
    
  
  /**
  * Wandelt bestimmten HTML-Code in entsprechende Sonderzeichen um.<br/>Folgender HTML-Code 
  * wird erkannt: &amp; -> &, &quot; -> ", &#039; -> ', &lt; -> <, &gt; -> >
  *
  * @param    param         String Objekt
  * @return   mit &,",',<,> statt entsprechendem HTML-Code
  * @type     String
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-27
  */  
  SOS_Util.unHtmlSpecialChars = function(param) { 
    if(!param) return '';
    
    return param.replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&#039;/g,"'").replace(/&quot;/g,"\"").replace(/&amp;/g,"&");
  }
    
    
  /**
  * Quotiert alle Sonderzeichen, die in regulären Ausdrücken eine Bedeutung haben.<br/>
  * Die betroffenen Zeichen sind: |{}[]()/.*+?^$\
  *
  * @param    param         String Objekt
  * @return   regulärer Ausdruck mit maskierten regulären Sonderzeichen
  * @type     string
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-30
  */
  SOS_Util.regQuoted = function(param) {
    if(!param) return '';
    
    var pattern = /([\|\{\}\[\]\(\)\/\.\*\+\?\^\$\\\\])/g;
    return param.replace( pattern, "\\$1" );
  }
    
    
  /**
  * Ersetzt alle Vorkommen von needle mit str.
  *
  * @param    param         String Objekt
  * @param    needle String Such-String
  * @param    str    String Ersetzungs-String
  * @return   ersetzte Zeichenkette
  * @type     String
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-30
  */  
  SOS_Util.strReplace = function( param, needle, str ) {
    
    if(!param) return '';
    
    if( typeof needle != "string" || typeof str != "string" ) { 
      throw SOS_Exception( new Error(), "both arguments must be strings" );
    }
    var pattern = new RegExp( "("+SOS_Util.regQuoted(needle)+")","g" );
    return param.replace( pattern, str );
  }
    
    
  /**
  * Wandelt Zeilenumbrüche in den HTML-Code &lt;br/&gt; um. 
  *
  * @param    param       String Objekt
  * @return   &lt;br/&gt;  statt \n
  * @type     String
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-30
  */  
  SOS_Util.nl2br = function(param) {
    
    if(!param) return '';
    
    return param.replace( /(\r\n|\n)/g, "<br/>" );
  }
    
    
  /**
  * Wandelt den HTML-Code &lt;br/&gt; in Zeilenumbrüche um. 
  *
  * @param    param       String Objekt
  * @return   \n statt &lt;br/&gt;
  * @type     String
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006-01-30
  */  
  SOS_Util.br2nl = function(param) {
    if(!param) return '';
    
    return param.replace( /<br[\/\s]*>/g, "\n" );
  }  

  
  /**
  * HTML-Tags entfernen
  *
  * @param    param       String Objekt
  * @return   Zeichekette ohne HTML Elementen
  * @type     String
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-30
  * @access public
  */
  SOS_Util.stripTags = function(param){
    
    if(!param) return '';
    
    return param.replace(/<([^>]|\s)*>/g,''); 
  }
  
  
  /**
  * Vergleichen von Zeichenketten
  * testet, ob das String-Objekt mit der Zeichenkette s beginnt
  *
  * @param    param       String Objekt
  * @param    s           Zeichekette
  * @return   boolean     true oder false
  * @type     String
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-30
  * @access public
  */
  SOS_Util.startsWith = function(param,s){
    
    if(!param) return false;
    if(!s || !SOS_Util.isString(s)) return false;
    
    return (param.substr(0,s.length) == s);
  }
  
  /**
  * Vergleichen von Zeichenketten
  * testet, ob das String-Objekt mit der Zeichenkette s endet
  *
  * @param    param       String Objekt
  * @param    s           Zeichekette
  * @return   boolean     true oder false
  * @type     String
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-30
  * @access public
  */
  SOS_Util.endsWith = function(param,s){
    
    if(!param) return false;
    if(!s || !SOS_Util.isString(s)) return false;
    
    var pl  = param.length;
    var sl  = s.length;
    if(sl > pl) return false;
    
    return (sl == 0 || param.substr(pl-sl,sl) == s);
  }
   
  
  /**
  * Variableninhalt mit alert ausgeben lassen
  *
  * @param    param Object
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public

  */
  SOS_Util.debug = function(param){
    
    try{
      var result  = '';
      result     += 'Objekt: '+param+'\n\n';
      for(temp in param){
        result += temp +' : '+param[temp]+'\n';
      }
      alert(result);
    }
    catch(x){
      alert('ERROR SOS_UTIL.debug : '+x.message);  
    }
  }


  /**
  * Kode einer Funktion ermitteln, um zB onload, onresize usw Funktionen nicht zu überschreiben,
  * sondern die neue Funktionalität an die vorhandene anzuhängen
  * zB: window.onload   = new Function('my_new_function();'+SOS_Util.getFunctionContent('window.onload'));
  *
  * @param    param     Object
  * @return   string    Funktionsinhalt
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public

  */
  SOS_Util.getFunctionContent = function(functionName){
    var content = '';
      
    try{
      content   = eval(functionName).toString();
      var pos   = content.indexOf('{') + 2;
      content   = content.substr(pos,content.length-pos-2);
    }
    catch(x){
    }
    
    return content; 
  }


  /**
  * Liefert Funktionname
  *
  * @param    param       Funktion
  * @return   string      Funktionsname
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006-01-27
  * @access public

  */
  SOS_Util.getFunctionName = function(param){
    if(!param) return '';
  
    return param.toString().match(/( \w+)/)[0]; 
  }


  /** 
  * Substituiert Platzhalter des globalen Mehsprachigkeit-Objekts 'translations' 
  * und gibt Eintrag gemäß des 1.Parameter zurück.
  * Subsituiert wird {i} durch i+1.Parameter (i muss Integer sein)
  *
  * @return   Eintrag des Übersetzungs-Objekt
  * @type     String
  * @author   Oliver Haufe <oliver.haufe@sos-berlin.com>
  * @version  1.0-2006/03/02
  */  
  SOS_Util.getTranslation = function() {
      
    try {   
      if( arguments.length == 0 ) { return ""; }
      if( !SOS_Util.isObject(translations) || SOS_Util.isNull(translations[arguments[0]]) ) { 
        return arguments[0]; 
      }
      if( !SOS_Util.isString(translations[arguments[0]]) ) {
        return translations[arguments[0]];
      } 
      var translation = translations[arguments[0]];
      for( var i = 1; i < arguments.length; i++ ) {
        var pattern = new RegExp( "\\{"+i+"\\}", "g" );
        translation = translation.replace( pattern, arguments[i] );
      }
      return translation;
    }
    catch(E){
      return translations[arguments[0]];
    }
  }
  
  /**
  * Liefert Browserabhähgig Window Event 
  *
  * @param    e           Window Event 
  * @return   event       Window Event
  * @access   public
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006/03/02
  */
  SOS_Util.getWindowEvent = function(e){
    
  return (document.all) ? window.event : e;  
  }
  
  /**
  * Strg+N (Strg+T) abschalten  
  * alle Browser
  *
  * Aufruf :  zB. beim window.onload
  * @access   public
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006/03/02
  */
  SOS_Util.forbidNewWindowInit = function() {
    document.onkeydown  = SOS_Util.forbidNewWindow;
    document.onkeypress = SOS_Util.forbidNewWindow;
  }

  /**
  * Strg+N (Strg+T) abschalten  
  * alle Browser
  * Aufruf :  siehe SOS_Util.forbidNewWindowInit
  *
  * @access   private
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006/03/02
  */
  SOS_Util.forbidNewWindow = function(e) {
    
    var winEvent        = SOS_Util.getWindowEvent(e);
    var isNewWinPressed = false;
    
    if(document.all){
      isNewWinPressed = (winEvent.ctrlKey && winEvent.keyCode == 78); 
    }
    else{
      // Bei FF|NS wird statt keyCode charCode genommen 
      // (nur für die Tastenkombinationen, die FF|NS selbst hat : Strg+N ... )
      // 110 - N
      // 116 - T
      isNewWinPressed = (winEvent.ctrlKey && (winEvent.charCode == 110 || winEvent.charCode == 116)); 
    }
    return !(isNewWinPressed);
  }
  
  /**
  * Entertaste abfangen 
  * alle Browser
  *
  * @param    e         Window Event 
  * @return   boolean   ob die Entertaste gedrückt wurde
  * @access   public
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006/03/02
  */
  SOS_Util.isEnter = function(e){
    
    var winEvent = SOS_Util.getWindowEvent(e);
    
  return (winEvent.keyCode == 13); 
  }
  
  /**
  * Entertaste beim Formularelementen unterdrücken 
  * alle Browser
  * zB.: <input type="text" onkeypress="return SOS_Util.noEnter(event)" ... /> 
  *
  * @param    e         Window Event 
  * @return   boolean   false bei Entertaste
  * @access   public
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006/03/02
  */
  SOS_Util.noEnter = function(e){
    
  return !(SOS_Util.isEnter(e)); 
  }
  
  /**
  * F5 Taste abfangen 
  * alle Browser
  *
  * @param    e         Window Event 
  * @return   boolean   ob die F5 Taste gedrückt wurde
  * @access   public
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006/03/02
  */
  SOS_Util.isF5 = function(e){
    
    var winEvent = SOS_Util.getWindowEvent(e);
    
  return (winEvent.keyCode == 116); 
  }

  
  /**
  * F5 unterdrücken 
  * alle Browser
  * zB.: <body onkeydown="return SOS_Util.noF5(event)" ... /> 
  *
  * @param    e         Window Event 
  * @return   boolean   false bei F5
  * @access   public
  * @author   Robert Ehrlich <robert.ehrlich@sos-berlin.com>
  * @version  1.0-2006/03/02
  */
  SOS_Util.noF5 = function(e){
    
    if(SOS_Util.isF5(e)){ // F5
      if(document.all){		//für IE,Opera zusätzlich keyCode ändern
       	var winEvent 			= SOS_Util.getWindowEvent(e);
        winEvent.keyCode 	= 0;
      }
      return false
    }
    
    return true;
  }

  
  /**
  * Erwartet Zeichenkette wie URL-Query ( arg1=val1&arg2=val2&arg3=val3 )
  * Sonstige '&'s müssen mit %26 angegeben sein.
  *
  * @param    query  string URL-Query 
  * @return   Objekt mit arg[n] als Schlüssel und val[n] als Werte
  * @type     object
  * @access   public
  * @author   Oliver Haufe <Oliver.haufe@sos-berlin.com>
  * @version  1.0-2006/03/02
  */
  SOS_Util.parseStr = function( query ) {
    
    var params = new Object();
    var args   = query.split("&");
    var key    = "";
    var val    = "";
    var pos    = -1;
    for( var i = 0; i < args.length; i++ ) {
      pos = args[i].indexOf("=")
      if( pos == -1 ) {
        key = args[i];
        val = "";
      } else {
        key = args[i].substr( 0, pos );
        val = args[i].slice( pos+1 );
      }
      if( key != "" ) { params[key] = unescape(val); }
    }
    return params;
  }
 
