/**
 * Dateiname       : javascript/Overlayer.js
 * Erzeugungsdatum : 07.02.2008
 * Autor           : Carsten Kube
 * Version         : 1.0
 * Letzte Akt.     : 08.12.2010 (MA)
 * 
 * (c) Copyright SECRA GmbH
 */


var secra, Geometry, Handler;
if(!secra) {secra = {};}
else if(typeof secra !== "object") {throw new Error("secra ist kein Objekt!");}
if(secra.Overlayer) {throw new Error("secra.Overlayer existiert bereits!");}

secra.Overlayer = function(imagefolder) {
  //if(!secra.Secrautility) {throw new Error("secra.Secrautility (V1.0) nicht geladen!");}

  if(!Geometry) {throw new Error("Geometry.js (V1.0) nicht geladen!");}
  if(!Handler) {throw new Error("Handler.js (V1.0) nicht geladen!");}
  secra.Overlayer.objCounter += 1;
  this.objId = secra.Overlayer.objCounter;
  this.imagefolder = imagefolder;
  this.htmlObjects = document.getElementsByTagName("object");
  this.htmlSelects = document.getElementsByTagName("select");
  this.divlayer = document.createElement("div");
  this.divcont  = document.createElement("div");

  this.init();
};

secra.Overlayer.objCounter = 0;

secra.Overlayer.prototype.addClose = function(func){
  Handler.add(this.divlayer, "click", func);
}

secra.Overlayer.prototype.init = function() {

  var agent           = navigator.userAgent.toLowerCase();
  this.isIE           = (agent.indexOf("msie") !== -1) ? true : false;

  this.divlayer.style.zIndex = "100";
  this.divlayer.style.position = "absolute";
  this.divlayer.style.left = "0px";
  this.divlayer.style.top = "0px";

  // neue Lösung
  if(this.isIE){
   // <- Workaround für einen IE Bug (v6/7/8 bestätigt), (RP)
     // http://support.microsoft.com/kb/925014/en
     // die beiden im Artikel vorgeschlagenen Lösungen sind beide
     // nicht anwendbar, outerHTML zerstört das Element dauerhaft,
     // das laden eines externen Stylesheets ist nicht machbar, da
     // das System modular bleiben soll und der Pfad zur Hintergrunddatei
     // dynamisch gesetzt werden muss/soll - wir würden also
     // Funktionalität einbüßen.
     // Stattdessen gehen wir einen etwas anderen Weg...
     // Ziel des Workaround: Einen scheinbar externen Stylesheet
     // erzeugen ohne einen externen Stylesheet zu verwenden. Trick 17 halt.

    // neuen CSS Style Knoten erzeugen (ein vorhandener würde auch reichen,
    // aber einer mehr tut keinem weh und spart uns eine aufwendige Prüfung)
    var cssnode = document.createElement('style');
    cssnode.type = 'text/css';
    cssnode.media = 'screen';
    document.getElementsByTagName('head')[0].appendChild(cssnode);

    // je nach Version bestimmen wir jetzt, was im Style Element stehen soll
    var cssrule = null;
    if(this.isIE && this.getIEVersion()<7){
      cssrule = "background-Image: url("+this.imagefolder+"grau.gif);";
    } else {
      cssrule = "background-Image: url("+this.imagefolder+"transparent.png);";
    }

    // neue CSS Klasse erstellen (Anmerkung: Funktioniert nur im IE,
    // FF wirft Fehler aus. Da das hier aber ein reiner IE Workaround ist,
    // soll uns das nicht weiter stören.
      this.createCSSClass('.secradivlayer_bginfo', cssrule);

      // jetzt noch die neue Klasse dem Element zuweisen
    this.divlayer.className = 'secradivlayer_bginfo';

    // das wars, Ziel erreicht, die Hintergrundgrafik wird nicht mehr
    // inline im style Attribut angehängt sondern über eine Klasse die
    // im Head definiert ist.
  } else {

      // wir sind nicht im IE, Originalfunktion beibehalten... es könnte so einfach sein!
      this.divlayer.style.backgroundImage = "url("+this.imagefolder+"transparent.png)";
  }

  // alte Lösung
  /*if(this.isIE && this.getIEVersion<7){
    this.divlayer.style.backgroundImage = "url("+this.imagefolder+"grau.gif)";
  } else {
    this.divlayer.style.backgroundImage = "url("+this.imagefolder+"grau_transparent.png)";
  }*/

  this.divcont.style.zIndex = "101";
  if(!this.isIE){
    this.divcont.style.position = "fixed";
  } else {
    this.divcont.style.position = "absolute";
  }
  this.divcont.style.left = "0px";
  this.divcont.style.top = "0px";

  this.divcont.style.border = "3px dotted #FFFFFF";

  this.zerosize();

  this.divlayer.appendChild(this.divcont);

  this.resizeListener = secra.Overlayer.makescope(function() {this.resize();}, this);
};


secra.Overlayer.prototype.getIEVersion = function(){
  var version = -1, agent, regex;
  if (navigator.appName === 'Microsoft Internet Explorer'){
    agent = navigator.userAgent;
    regex  = /MSIE ([0-9]{1,}[\.0-9]{0,})/;
    if(regex.exec(agent) !== null){
      version = parseFloat( RegExp.$1 );
    }
  }
  return version;
};


secra.Overlayer.prototype.show = function() {
  this.divlayer.removeChild(this.divcont);
  this.hideHTMLElements('htmlObjects');
  this.hideHTMLElements('htmlSelects');
  this.divlayer.appendChild(this.divcont);
  document.body.appendChild(this.divlayer);
  Handler.add(window, "resize", this.resizeListener);
  if(Geometry.getViewportHeight() > parseInt(this.getCascadedStyle(this.divcont,'height','height'),10)){
    Handler.add(window, "scroll", this.resizeListener);
  }
  this.resize();
};


secra.Overlayer.prototype.testScrolling = function(){
  if(Geometry.getViewportHeight() > parseInt(this.getCascadedStyle(this.divcont,'height','height'),10)){
    Handler.add(window, "scroll", this.resizeListener);
    if(!this.isIE){
      this.divcont.style.position = "fixed";
    } else {
      this.divcont.style.position = "absolute";
    }
  } else {
    Handler.remove(window, "scroll", this.resizeListener);
    this.divcont.style.position = "absolute";
  }
};


secra.Overlayer.prototype.hide = function() {
  this.unhideHTMLElements('htmlObjects');
  this.unhideHTMLElements('htmlSelects');
  this.zerosize();
  Handler.remove(window, "resize", this.resizeListener);
  Handler.remove(window, "scroll", this.resizeListener);
  this.divlayer.parentNode.removeChild(this.divlayer);
};



secra.Overlayer.prototype.getCascadedStyle = function(obj, cssie, cssns){
    // ermittelt die CSS Werte der externen CSS Klassen
    if (obj.currentStyle){
	    return obj.currentStyle[cssie];
    } else if (window.getComputedStyle){
      var objStyle=window.getComputedStyle(obj, "");
      return objStyle.getPropertyValue(cssns);
    }
    return null;
};


secra.Overlayer.prototype.resize = function() {
  var w = Geometry.getViewportWidth();

  if(w<Geometry.getDocumentWidth()) {
    w = Geometry.getDocumentWidth();
  }
  var h = Geometry.getViewportHeight();
  if(h<Geometry.getDocumentHeight()) {
    h = Geometry.getDocumentHeight();
  }
  this.divlayer.style.width = w + "px";
  this.divlayer.style.height = h + "px";

  //this.divcont.style.left = -this.getX(this.divcont)+"px";
  //this.divcont.style.top = -this.getY(this.divcont)+"px";
  //alert(this.divcont.style.top+"2"+this.divcont.style.left);
  this.centerContent();
};


secra.Overlayer.prototype.centerContent = function(){

        var hscroll, vscroll;
      // zentriert das Fenster neu

      var mboxh = this.getCascadedStyle(this.divcont, "height", "height");
      var mboxw = this.getCascadedStyle(this.divcont, "width", "width");
      var wmode = this.getCascadedStyle(this.divcont, "position", "position");

      if(wmode!="fixed"){
      	hscroll = Geometry.getHorizontalScroll();
      	vscroll = Geometry.getVerticalScroll();
      } else {
      	hscroll = 0;
      	vscroll = 0;
      }

      if(mboxw=='auto'){
        mboxw = parseInt(Geometry.getViewportWidth(),10)/3;
      }

      if(mboxh=='auto'){
        mboxh = parseInt(Geometry.getViewportHeight(),10)/3;
      }

      if (parseInt(Geometry.getViewportHeight(),10)-100-parseInt(mboxh,10) < 100) {
        var mboxtop  = (vscroll + parseInt(Geometry.getViewportHeight(),10)/2 - parseInt(mboxh,10) / 2);
      } else {
        mboxtop = 100;
      }
      
      var mboxleft = (hscroll + parseInt(Geometry.getViewportWidth(),10)/2 - parseInt(mboxw,10) / 2);

      if(mboxleft < 12){
        mboxleft = 12;
      }

      if(mboxtop < 12){
        mboxtop = 12;
      }

      this.divcont.style.left = mboxleft + "px";
      this.divcont.style.top = mboxtop + "px";

      this.testScrolling();
};


secra.Overlayer.prototype.repositionContainer = function() {

  var w = Geometry.getViewportWidth();
  if(w<Geometry.getDocumentWidth()) {
    w = Geometry.getDocumentWidth();
  }
  var h = Geometry.getViewportHeight();
  if(h<Geometry.getDocumentHeight()) {
    h = Geometry.getDocumentHeight();
  }
  this.divlayer.style.width = w + "px";
  this.divlayer.style.height = h + "px";
};


secra.Overlayer.prototype.zerosize = function() {
  this.divlayer.style.width = "0px";
  this.divlayer.style.height = "0px";
  //this.divcont.style.height = "0px";
};


secra.Overlayer.prototype.hideHTMLElements = function(prop) { // private
  // alten Status sichern, dann unsichtbar
  for(var i = 0, k = this[prop].length; i < k; i += 1){
    this[prop][i].oldvisibility = this[prop][i].style.visibility  || "";
    this[prop][i].style.visibility = "hidden";
  }
};

secra.Overlayer.prototype.unhideHTMLElements = function(prop) { // private
	for(var i = 0, k = this[prop].length; i < k; i += 1){
	  this[prop][i].style.visibility = this[prop][i].oldvisibility;
	}
};

secra.Overlayer.prototype.getContainer = function() {
	return this.divcont;
};

secra.Overlayer.prototype.toString = function() {
  return "Object [Overlayer Id: "+this.objId+"]";
};

secra.Overlayer.prototype.getX = function(element) {
  var x = 0;
  for(var e = element; e; e = e.offsetParent) {
    x += e.offsetLeft;
  }
  for(e = element.parentNode; e && e !== document.body; e = e.parentNode) {
    if(e.scrollLeft) {
      x -= e.scrollLeft;
    }
  }
  return x;
};

secra.Overlayer.prototype.getY = function(element) {
  var y = 0;
  for(var e = element; e; e = e.offsetParent) {
    y += e.offsetTop;
  }
  for(e = element.parentNode; e && e !== document.body; e = e.parentNode) {
    if(e.scrollTop) {
      y -= e.scrollTop;
    }
  }
  return y;
};



secra.Overlayer.prototype.getStyle = function(elem, stylename) {
  if(elem.currentStyle) {
      return elem.currentStyle[stylename];
  } else if(window.getComputedStyle) {
      return window.getComputedStyle(elem, null)[stylename];
  }
  return null;
};


secra.Overlayer.makescope = function(method, obj) {
  return function() {
    method.apply(obj, arguments);
  };
};


// dies ist ein Fundstück aus dem Netz, dessen Urheber so freundlich war es
// für die Verwendung freizugeben (Creative Commons License 2.5). Keine
// Angaben zum Autoren im Artikel vorhanden, keine Wünsche.
// Demnach sind wir in diesem Punkt frei.
// http://webdevel.blogspot.com/2006/06/create-css-class-javascript.html

// diese Methode wird für den IE HTTPS Warnung - Workaround verwendet. Sie
// ist nicht in allen Browsern funktionsfähig, getestet nur in IE (und
// das reicht für einen IE Fix ja auch, FF wirft Fehler aus).
secra.Overlayer.prototype.createCSSClass = function(selector, style)
{
 // using information found at: http://www.quirksmode.org/dom/w3c_css.html
 // doesn't work in older versions of Opera (< 9) due to lack of styleSheets support
 if(!document.styleSheets) {
   return;
 }
 if(document.getElementsByTagName("head").length === 0) {
   return;
 }
 var styleSheet, mediaType, i, media, styleSheetElement;
 if(document.styleSheets.length > 0)
 {
  for(i = 0; i<document.styleSheets.length; i+=1)
  {
   if(document.styleSheets[i].disabled) {
     continue;
   }
   media = document.styleSheets[i].media;
   mediaType = typeof media;
   // IE
   if(mediaType === "string")
   {
    if(media === "" || media.indexOf("screen") !== -1)
    {
     styleSheet = document.styleSheets[i];
    }
   }
   else if(mediaType === "object")
   {
    if(media.mediaText === "" || media.mediaText.indexOf("screen") !== -1)
    {
     styleSheet = document.styleSheets[i];
    }
   }
   // stylesheet found, so break out of loop
   if(typeof styleSheet !== "undefined") {
     break;
   }
  }
 }
 // if no style sheet is found
 if(typeof styleSheet === "undefined")
 {
  // create a new style sheet
  styleSheetElement = document.createElement("style");
  styleSheetElement.type = "text/css";
  // add to <head>
  document.getElementsByTagName("head")[0].appendChild(styleSheetElement);
  // select it
  for(i = 0; i<document.styleSheets.length; i+=1)
  {
   if (document.styleSheets[i].disabled) {
     continue;
   }
   styleSheet = document.styleSheets[i];
  }
  // get media type
  media = styleSheet.media;
  mediaType = typeof media;
 }
 // IE
 if(mediaType === "string")
 {
  for(i = 0;i<styleSheet.rules.length;i+=1)
  {
   // if there is an existing rule set up, replace it
   if(styleSheet.rules[i].selectorText.toLowerCase() === selector.toLowerCase())
   {
    styleSheet.rules[i].style.cssText = style;
    return;
   }
  }
  // or add a new rule
  styleSheet.addRule(selector,style);
 }
 else if(mediaType === "object")
 {
  for(i = 0;i<styleSheet.cssRules.length;i+=1)
  {
   // if there is an existing rule set up, replace it
   if(styleSheet.cssRules[i].selectorText.toLowerCase() === selector.toLowerCase())
   {
    styleSheet.cssRules[i].style.cssText = style;
    return;
   }
  }
  // or insert new rule
  styleSheet.insertRule(selector + "{" + style + "}", styleSheet.cssRules.length);
 }
};
