/**
 * Dateiname       : javascript/Positionierer.js
 * Erzeugungsdatum : 06.03.2009
 * Autor           : Carsten Kube
 * Version         : 1.0 alpha
 * Letzte Akt.     : 19.10.2010
 * 
 * (c) Copyright SECRA GmbH
 */

/*jslint browser: true, undef: true, plusplus: true */
/*globals Geometry, Handler, secra, document, window */

var secra, Geometry, Handler;
if(!secra) {secra = {};}
else if(typeof secra !== "object") {throw new Error("secra ist kein Objekt!");}
if(secra.Positionierer) {throw new Error("secra.Positionierer existiert bereits!");}

secra.Positionierer = function(paramObj)
{
  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.Positionierer.objCnt += 1;
  this.objNr = secra.Positionierer.objCnt;

  if(typeof paramObj !== "object") {
    secra.error("secra.Positionierer: Parameter-Objekt erwartet");
    throw new Error("secra.Positionierer: Parameter-Objekt erwartet");
  }
  if(!paramObj.container) {
    secra.error("secra.Positionierer: Fehlender Parameter \"container\"");
    throw new Error("secra.Positionierer: Fehlender Parameter \"container\"");
  }
  if(!paramObj.position) {
    secra.error("secra.Positionierer: Fehlender Parameter \"position\"");
    throw new Error("secra.Positionierer: Fehlender Parameter \"position\"");
  }
  this.container  = paramObj.container || document.getElementById(paramObj.container);
  this.position   = paramObj.position;
  this.funcscope = {};
  this.funcscope.center = secra.Positionierer.funcscope(this.center, this);
  this.funcscope.removeHandler = secra.Positionierer.funcscope(this.removeHandler, this);
};
secra.Positionierer.objCnt = 0;

/**
 * Zentrieren des Eingabefensters.
 */
secra.Positionierer.prototype.center = function() {
  // Probleme mit getComputedStyle bzw currentStyle:
  // es wird fuer die Hoehe 0 oder auto geliefert, was totaler Muell ist!
  var posx, posy;
  if(this.container.style.position!='fixed'){
    posx = Geometry.getHorizontalScroll()+(Geometry.getViewportWidth()-this.container.offsetWidth)/2;
    posy = Geometry.getVerticalScroll()+(Geometry.getViewportHeight()-this.container.offsetHeight)/2;
  } else {
    posx = (Geometry.getViewportWidth()-this.container.offsetWidth)/2;
    posy = (Geometry.getViewportHeight()-this.container.offsetHeight)/2;
  }
  // Position nur modifizieren, wenn das Fenster größer als der Container ist
  if(Geometry.getViewportHeight() > this.container.offsetHeight + 30){
    this.container.style.top=posy+"px";
    this.container.style.left=posx+"px";
  } else {
    if(this.container.style.position=='fixed'){
      posy = - Geometry.getVerticalScroll();
      this.container.style.top=posy+"px";
      this.container.style.left=posx+"px";
    }
  }
};

secra.Positionierer.prototype.startPositioning = function() {
  var visibility = this.container.style.visibility;
  this.container.style.visibility = "hidden";
  if(this.position === "center") {
    this.center();
    this.addHandler();
  }
  Handler.add(window, "unload", this.funcscope.removeHandler); 
  this.container.style.visibility = visibility;
};

secra.Positionierer.prototype.stopPositioning = function() {
  Handler.remove(window, "unload", this.funcscope.removeHandler); 
  this.removeHandler();
};

secra.Positionierer.prototype.addHandler = function() {
  Handler.add(window, "resize", this.funcscope.center);
  //if(this.container.style.position!='fixed'){
  	Handler.add(window, "scroll", this.funcscope.center);     
  //}
};

secra.Positionierer.prototype.removeHandler = function() {
  Handler.remove(window, "resize", this.funcscope.center); 
  if(this.container.style.position!='fixed'){
  	Handler.remove(window, "scroll", this.funcscope.center);     
  }
};

secra.Positionierer.prototype.toString = function() {
  return "[PositioniererObject " + this.objNr + "]";
};

// Statics
secra.Positionierer.funcscope = function(method, obj) {
  return function() {
    return method.apply(obj, arguments);
  };
};

