/* *******************************************
#kesrequire(share/webwidgets/ui/popup/Root.js)
#kesrequire(share/jsbase/util/QueryString.js)
#kesrequire(share/jsbase/util/Favicon.js)
******************************************* */

/**
 * Basisklasse fuer Applikationen die Webwidgets-Controller oder -Widgets nutzen.
 */
qx.Class.define('nx4.webwidgets.core.Application',
{
  extend : qx.application.Native,

  properties :
  {
    applicationState :
    {
      init  : "load",
      check : [ "load", "main", "finalize", "running", "close", "terminate" ],
      event : "applicationStateChange"
    },

    /**
     * Basislink fuer dynamische Seiten.
     * Sollte ohne spezielle Menuepunkt-Ids abgelegt sein.
     */
    baseLink :
    {
      init  : null,
      event : "baseLinkChange"
    },

    /**
     * Map der Parameter, die zur aktuellen Seite fuehren.
     */
    cmdArr :
    {
      init : null
    },

    /**
     * Url zum Favicon der Seite.
     */
    favicon :
    {
      init  : null,
      apply : "_applyFavicon"
    }
  },

  events :
  {
    historyRequest         : "qx.event.type.Data",
    applicationStateChange : "qx.event.type.Data",
    baseLinkChange         : "qx.event.type.Data"
  },

  members :
  {
    /*
    --------------------------------------------------------
      Basis-Methoden von qx.application.Native
    --------------------------------------------------------
    */

    main : function()
    {
      //Zustand der Application setzen
      this.setApplicationState("main");

      //Listener fuer History-Requests basteln
      qx.bom.History.getInstance().addListener("request", this._onHistoryRequest, this);

      //wenn das CMS eine Initfunktion definiert hat, diese ausfuehren
      if(typeof(initializeCMSFrontend) == "function")
        initializeCMSFrontend(this);
    },

    finalize : function()
    {
      //Zustand der Application setzen
      this.setApplicationState("finalize");

      //wenn das CMS eine Initfunktion definiert hat, diese ausfuehren
      if(typeof(finalizeCMSFrontend) == "function")
        finalizeCMSFrontend(this);

      //an dieser Stelle sollte dann alles initialisiert sein
      //also verteilen wir hier den initialen History-State
      this._initHistory();

      //ab hier laeuft die Applikation im Bereich des Users
      this.setApplicationState("running");
    },

    close : function()
    {
      //Zustand der Application setzen
      this.setApplicationState("close");

      //wenn das CMS eine Closefunktion definiert hat, diese ausfuehren
      if(typeof(closeCMSFrontend) == "function")
        closeCMSFrontend(this);
    },

    terminate : function()
    {
      //Zustand der Application setzen
      this.setApplicationState("terminate");

      //wenn das CMS eine Terminatefunktion definiert hat, diese ausfuehren
      if(typeof(terminateCMSFrontend) == "function")
        terminateCMSFrontend(this);
    },


    /*
    --------------------------------------------------------
      Hilfsmethoden.
    --------------------------------------------------------
    */

    isRunning : function()
    {
      return this.getApplicationState() == "running";
    },


    /*
    --------------------------------------------------------
      Verwaltung eines Popup-Rootwidgets.
    --------------------------------------------------------
    */

    _popupRoot : null, /**< das Popup Root-Widget. */

    /**
     * Gibt das Popup-Rootwidget zurueck - wenn definiert.
     * @return Rootwidget fuer Popups
     */
    getPopupRoot : function()
    {
      if(this._popupRoot)
        return this._popupRoot;
      else
        throw "no popup root-widget defined";
    },

    /**
     * Ein Element als Popup-Rootwidget definieren.
     * @param domElem das Dom-Element, z.B. mittels document.getElementById(...) ermittelt.
     */
    createPopupRoot : function(domElem)
    {
      var el = new nx4.webwidgets.ui.popup.Root(domElem);
      el.getContainerElement().setStyles(
      {
        "position" : "absolute",
        "top"      : "0px",
        "left"     : "0px"
      });

      if(this._popupRoot)
        throw "only one popup root can be set";

      this._popupRoot = el;
    },


    /*
    --------------------------------------------------------
      Verwaltung der Faviconfunktionen.
    --------------------------------------------------------
    */

    _applyFavicon : function(n, o)
    {
      var fi = nx4.jsbase.util.Favicon;
      if(n)
        fi.update(n);
      else
        fi.remove();
    },


    /*
    --------------------------------------------------------
      Verwaltung der Historyfunktionen.
    --------------------------------------------------------
    */

    /**
     * Methode um den initialen History-State zu verteilen.
     * D.h. es wird der Zustand der beim laden der echten Seite im Anker platziert ist,
     * als History-Event weitergereicht.
     */
    _initHistory : function()
    {
      var qs = new nx4.jsbase.util.QueryString(qx.bom.History.getInstance().getState());
      var targ = qs.getParam("target");
      qs.removeParam("target");
      this.fireDataEvent("historyRequest", 
      {
        target : targ,
        data : qs.toString()
      });
    },

    /**
     * Verteilt den Zustand der bei einem Klick auf den Vor- bzw Zurueckbutton ausgeloest wurde.
     */
    _onHistoryRequest : function(e)
    {
      var qs = new nx4.jsbase.util.QueryString(e.getData());
      var targ = qs.getParam("target");
      qs.removeParam("target");
      this.fireDataEvent("historyRequest", 
      {
        target : targ,
        data : qs.toString()
      });

      //wenn ein Favicon gesetzt ist, dieses nach einem History-Request wieder setzen,
      //da die Browser ihr Original-Favicon dabei zu vergessen scheinen.
      if(this.getFavicon())
        nx4.jsbase.util.Favicon.update(this.getFavicon());
    }
  }
});

