/**
* Die bestehenden Funktionen und Klassen der ersten Version werden in dem
* Objekt AT gekapselt. Dieses Vorgehen dient der Optimierung der
* grundlegenden Funktionen und Klassen sowie deren Strukturen.
*
* @author Sitepark GmbH - Oliver Buchholz
* @author Cynapsis Kommunikationsagentur - Lars Hilsebein
*
* Erweiterung des windows-Objektes um AT als Funktions- und Eigenschafts-
* sammlung
* Objekte:
* document                              Browserimmanentes Objekt
* AT                                    Hauptobjekt (in Abgrenzung zu
*                                       Browserobjekten)
* Funkionen/Variablen/Methoden auf dem document-Objekt:
* getElementsByClassName(sClassName)
*     sClassName = Klassenname, dessen Elemente gesucht werden sollen - string
*
* Funkionen/Variablen/Methoden auf dem AT-Objekt:
* version                               liefert Version (Integer)
* browser                               liefert undefined, ie, gecko, opera,
* toString                              liefert Namen und Version (String)
*                                       safari
* log(str,level)
*     str       = auszugebender String
*     level     = log (=default), debug, info, warn, error
*                                       es wird automatisch der Firebug benutzt
*                                       wenn er existiert, sonst window.status
* ie                                    liefert true, wenn broser ie ist
* ie6
* ie7
* gecko
* ff1
* ff15
* opera
* safari
* os                                    liefert windows, mac, linux
* windows
* mac
* linux
*/

if(!window.AT) {
  var AT = function(){};
  AT.toString = function() {
    return "www.atoolo.com"
  }
  AT.COUNT = 1;
  AT.COUNTF = 1;
}

/* ab 08.10.2007 in LINA
(function() {
  AT.getFirstParentByClassName = function(sClassName, oElement) {
    if (oElement.nodeType == 1) {
      if (oElement.className = sClassName) {
        return oElement;
      }
    }
    while (oElement.parentNode != null) {
      if (oElement.nodeType == 1) {
        if (oElement.className = sClassName) {
          return oElement;
        }
      }
      oElement = oElement.parentNode;
    }
    return null;
  }

  AT.getElementsByClassName = function(sClassName, sTag, oElement) {
    if (sTag == "*") {
      AT.log("Aufruf von getElementsByClassName mit sTag = \"*\" fuehrt zu Performaceproblemen.","warn");
    } else if (oElement == null || sTag == null) {
      AT.log("Aufruf von getElementsByClassName ohne sTag ["+sTag+"] oder ohne oElement ["+oElement+"] ist nicht erlaubt.","error");
      return [];
    }
    var ss = new RegExp("^"+sClassName+"$|^"+sClassName+" | "+sClassName+"$| "+sClassName+" ", "i");
    var a = oElement.getElementsByTagName(sTag);
    var myA = [];
    if(a != null) {
      for(var i = 0; i < a.length; i++) {
        if(a[i].nodeType == 1) {
          if (ss.exec(a[i].className)) {
            myA.push(a[i]);
          }
        }
      }
    }
    return myA;
  }
})();
*/

(function() {
/* niergendwo verwendet werden
  AT.funcname = function(f) {
    if (f != null) {
      var s = (f.toString().match(/^function (\w*)/))[0];
      // var s = f.toString();
      if ((s == null) || (s.length == 0)) {
        return "anonymous";
      } else {
        return s + "()";
      }
    }
  }

*/

  AT.switchBody = function (functionId) {
    var body = Lina.get(functionId);
    if (body != null) {
      if (body.style.display == "none") {
        body.style.display = "block";
      } else if (body.style.display == "block") {
        body.style.display = "none";
      }
    }
  }

  AT.log = function(str, level, t) {
    if (debug > 0) {
      var jetzt = new Date();
      var Jahr = jetzt.getFullYear();
      var Jahresmonat = jetzt.getMonth();
      Jahresmonat++;
      var Tag = jetzt.getDate();
      var Std = jetzt.getHours();
      var Min = jetzt.getMinutes();
      var Sekunden = jetzt.getSeconds();
      var Millis = jetzt.getMilliseconds();
      var MillisAusgabe = ((Millis < 10) ? "00" + Millis : ((Millis < 100) ? "0" + Millis : Millis));
      var JahresmonatAusgabe = ((Jahresmonat < 10) ? "0" + Jahresmonat : Jahresmonat);
      var TagAusgabe = ((Tag < 10) ? "0" + Tag : Tag);
      var StdAusgabe = ((Std < 10) ? "0" + Std : Std);
      var MinAusgabe = ((Min < 10) ? "0" + Min : Min);
      var SekundenAusgabe = ((Sekunden < 10) ? "0" + Sekunden : Sekunden);
      var Gesamtausgabestring = Jahr + "-" + JahresmonatAusgabe + "-" + TagAusgabe + " " + StdAusgabe + ":" + MinAusgabe + ":" + SekundenAusgabe + "." + MillisAusgabe;

      if (level == undefined ||
            ( level != 'log' &&
              level != 'debug' &&
              level != 'info' &&
              level != 'warn' &&
              level != 'error'
            )
          ) {
        level = "log";
      }
      if (typeof(console) != "object") {
        if (level == "log") {
          level = "debug";
        }

        var debugDivConsole = Lina.get("debug");
		if (debugDivConsole == null) {
			return;
		}

        // window.status = "[" + level +"] " + str;
        var spanBefore = "";
        var spanAfter = "";

        if (level == "info") {
          spanBefore = "<span style=\"font-style: italic;\">";
          spanAfter = "</span>";
        }
        if (level == "warn") {
          spanBefore = "<span style=\"font-weight: bold;\">";
          spanAfter = "</span>";
        }
        if (level == "error") {
          spanBefore = "<span style=\"font-weight: bold; color: red;\">";
          spanAfter = "</span>";
        }
        var newATlogtext = document.createElement("div");
        var stackTrace = "";
        if (level == "error") {
          // getStackTrace
          var countStack = 0;
          for (var a = arguments.caller; a != null; a = a.caller) {
            // stackTrace += AT.funcname(a.callee);
            // stackTrace += '<a href="#" onclick="Lina.get("error' + countStack + '").display = \'inline\';">' + AT.funcname(a.callee) + "</a><br>";
			var line = "" + a.callee;
			line = line.replace(/</g,"&lt;");
			line = line.replace(/>/g,"&gt;");
			line = line.replace(/\n/g,"<br>");
			line = line.replace(/ /g,"&nbsp;");
			line = line.replace(/\t/g,"&nbsp;&nbsp;&nbsp;");

			var bodyIndex = line.indexOf("{");
			var head = line.substring(0, bodyIndex);
			var body = line.substring(bodyIndex, line.length);

			var functionId = "f" + debugDivConsole.childNodes.length + "_" + countStack;

            stackTrace += '<span id="error' + countStack + '"><div style="margin-left: 10px; cursor: pointer;" onclick="AT.switchBody(\'' + functionId + '\');">' + head  + '<div id="' + functionId + '" style="display: none;">' + body + '</div></div>';
            //stackTrace += '<span id="error' + countStack + '">' + a.callee + '</span><hr>';
            if (a.caller == a) {
              break;
            }
            countStack++;
          }
          stackTrace += "<br>";
        }
        if (typeof(str) == "string") {
          str = str.replace(/</g,"&lt;").replace(/>/g,"&gt;");
          str = str.replace(/\n/g,"<br>");
          str = str.replace(/ /g,"&nbsp;");
		  str = str.replace(/\t/g,"&nbsp;&nbsp;&nbsp;");
        }
		var errorMessage = "";
		if (t != null && t.description) {
			errorMessage = '<span style="font-weight: bold; color: red;">' + t.description + '</span><br>';
		}
        newATlogtext.innerHTML = Gesamtausgabestring + " - " + "[" + level + "] " + spanBefore + str + spanAfter + "<br>" + errorMessage + stackTrace;
        debugDivConsole.insertBefore(newATlogtext, debugDivConsole.firstChild);
        // Alternativ waere ein scrolling abwaerts, knallt aber mit dem startmenue
        // Lina.get("debug").appendChild(newATlogtext);
        // newATlogtext.scrollIntoView();
      } else {
        console[level](Gesamtausgabestring + " - " + str);
        if (typeof(str) != "string") {
			console.dir(str);
		}
        // pruefen, ob es ein Error-Objekt ist
        if ((t != null) && (console[level] != null)) {
          console[level](t);
        }
      }
    }
  }
})();


(function() {
  AT.ie7=false;
  AT.ie6=false;
  AT.ff=false;
  AT.ff15=false;
  AT.ff1=false;
  AT.browser="";
  if(document.recalc) {
    AT.browser="ie";
  } else if(window.__defineGetter__) {
    AT.browser="gecko";
  } else if(window.opera) {
    AT.browser="opera";
  } else if(navigator.userAgent.match("Safari")) {
    AT.browser="safari";
  }
  if(AT.browser) {
    AT[AT.browser]=true;
  }
  if(AT.ie) {
    if(typeof(window.XMLHttpRequest)=="object") {
      AT.ie7=true;
    } else {
      AT.ie6=true;
    }
  }
  if(AT.gecko) {
    if(typeof(document.inputEncoding)=="string") {
      AT.ff = true;
      AT.ff15=true;
    } else {
      AT.ff = true;
      AT.ff1=true;
    }
  }

  AT.os="";
  if ((navigator.platform == "Win64") ||
      (navigator.platform == "Win32") ||
      (navigator.platform == "Windows")) {
    AT.os="windows";
  }
  if ((navigator.platform == "Mac68K") ||
      (navigator.platform == "MacPPC") ||
      (navigator.platform == "MacIntel") ||
      (navigator.platform == "Macintosh")) {
    AT.os="mac";
  }
  if ((navigator.platform == "X11") &&
      (!isMac) &&
      (!isWin)) {
    AT.os="linux";
  }
  if(AT.os) {
    AT[AT.os]=true;
  }
})();

/* ab 09.10.2007 Funktionalität in Lina
  AT.FlashObject = function(src, id, width, height, bgColor, reqMajorVer, reqMinorVer, reqRevision, quality) {
    if(typeof reqMajorVer == "undefined") { reqMajorVer = 7; }
    if(typeof reqMinorVer == "undefined") { reqMinorVer = 0; }
    if(typeof reqRevision == "undefined") { reqRevision = 0; }
    var reqVersion = AT.DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision);
    if(reqVersion == false) { return false; }
  	var qual = quality ? quality : "high";
    this.params     = {};
    this.variables  = {};
    this.attributes = [];
    this.setAttribute("src", src);
    this.setAttribute("id", id);
    this.setAttribute("width", width);
    this.setAttribute("height", height);
    this.setParam("bgColor", bgColor);
    this.setParam("quality", qual);
  }

  AT.FlashObject.prototype.setAttribute = function(key, value) { this.attributes[key] = value; }
  AT.FlashObject.prototype.getAttribute = function(key) { return this.attributes[key]; }
  AT.FlashObject.prototype.setParam     = function(key, value) { this.params[key] = value; }
  AT.FlashObject.prototype.getParams    = function() { return this.params; }
	AT.FlashObject.prototype.addVariable  = function(key, value) { this.variables[key] = value; }
	AT.FlashObject.prototype.getVariable  = function(key) { return this.variables[key];	}
	AT.FlashObject.prototype.getVariables = function(){	return this.variables; }

	AT.FlashObject.prototype.getVariablePairs = function(){
		var toReturn = [];
		var key;
  	var vars = this.getVariables();
    for(key in vars){
      toReturn.push(key+"="+vars[key]);
    }
    return toReturn;
  }

	AT.FlashObject.prototype.getFlashHTML = function() {
    var toReturn = "";
    if(navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) {
      toReturn  = "<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("src")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\"";
      toReturn += " id=\""+this.getAttribute('id')+"\" name=\""+this.getAttribute('id')+"\" ";
      var par = this.getParams();
      for(var key in par) {
        toReturn += [key] + "=\""+par[key]+"\" ";
      }
      var vp =this.getVariablePairs().join("&");
      if(vp.length > 0) {
        toReturn += "flashvars=\""+vp+"\"";
      }
      toReturn += "/>";
    } else {
      toReturn  = "<object id=\""+this.getAttribute('id')+"\" name=\""+this.getAttribute('id')+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\">";
      toReturn += "<param name=\"movie\" value=\""+this.getAttribute("src")+"\" />";
      var par = this.getParams();
      for(var key in par) {
        toReturn += "<param name=\""+key+"\" value=\""+par[key]+"\" />";
      }
      var vp = this.getVariablePairs().join("&");
      if(vp.length>0) {
        toReturn += "<param name=\"flashvars\" value=\""+vp+"\" />";
      }
      toReturn += "</object>";
    }
    return toReturn;
	}

  AT.FlashObject.prototype.write = function(obj){
    var n = (typeof obj == "string") ? Lina.get(obj) : obj;
    n.innerHTML = this.getFlashHTML();
    return true;
  }

  // JavaScript-Hilfsprogramm ist zur Ermittlung der Versionsinformationen des Flash Player Plug-Ins erforderlich
  AT.JSGetSwfVer = function(i) {
    var flashVer = -1;
    // NS/Opera-Version >= 3 auf Flash-Plug-In im Plug-In-Array pruefen
    if (navigator.plugins != null && navigator.plugins.length > 0) {
      if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
        var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
        var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
        var descArray = flashDescription.split(" ");
        var tempArrayMajor = descArray[2].split(".");
        var versionMajor = tempArrayMajor[0];
        var versionMinor = tempArrayMajor[1];
        if ( descArray[3] != "" ) {
          tempArrayMinor = descArray[3].split("r");
        } else {
          tempArrayMinor = descArray[4].split("r");
        }
        var versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0;
        flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
      }
    }
    // MSN/WebTV 2.6 unterstuetzt Flash 4
    else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
    // WebTV 2.5 unterstuetzt Flash 3
    else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
    // aelteres WebTV unterstuetzt Flash 2
    else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
    // Ermittlung in allen anderen Faellen nicht moeglich
    else {
      flashVer = -1;
    }
    return flashVer;
  }

  // Wenn der Funktionsaufruf ohne Parameter erfolgt, gibt diese Funktion einen Gleitkommawert zurueck,
  // bei dem es sich entweder um die Flash Player-Version oder um 0.0 handelt.
  // Beispiel: Flash Player 7r14 gibt 7.14 zurueck.
  // Wenn reqMinorVer, reqMajorVer, reqRevision aufgerufen wird, wird 'true' zurueckgegeben, sofern diese bzw. eine hoehere Version verfuegbar ist
  AT.DetectFlashVer = function(reqMajorVer, reqMinorVer, reqRevision) {
    versionStr = "";
    reqVer = parseFloat(reqMajorVer + "." + reqRevision);
      // Versionen rueckwaerts durchlaufen, bis die neueste Version gefunden wird
    for(i = 25; i > 0; i--) {
      if (isIE && isWin && !isOpera) {
        versionStr = VBGetSwfVer(i); // Funktionsdefinition in flashSniffer_helper.vb
      } else {
        versionStr = AT.JSGetSwfVer(i);
      }
      if (versionStr == -1 ) {
        return false;
      } else if (versionStr != 0) {
        if(isIE && isWin && !isOpera) {
          var tempArray         = versionStr.split(" ");
          var tempString        = tempArray[1];
          var versionArray      = tempString .split(",");
        } else {
          var versionArray      = versionStr.split(".");
        }
        var versionMajor      = versionArray[0];
        var versionMinor      = versionArray[1];
        var versionRevision   = versionArray[2];

        var versionString     = versionMajor + "." + versionRevision;   // 7.0r24 == 7.24
        var versionNum        = parseFloat(versionString);
            // ist die Hauptrevision >= angeforderte Hauptrevision UND die Nebenversion >= angeforderte Nebenversion
        if ( (versionMajor > reqMajorVer) && (versionNum >= reqVer) ) {
          return true;
        } else {
          return ((versionNum >= reqVer && versionMinor >= reqMinorVer) ? true : false );
        }
      }
    }
    return (reqVer ? false : 0.0);
  }
*/

if (AT.ie) {
	/*
	window.onerror = errorHandling;
	function errorHandling(sMessage, sFile, iLine) {
	  AT.log(sMessage + " in " + sFile + " on line " + iLine,"error");
	  return true;
	}
	*/
}
