Source: BKGWebMap/Control/CookieCheck.js

/*
 * Copyright (c) 2013 Bundesamt für Kartographie und Geodäsie.
 * See license.txt in the BKG WebMap distribution or repository for the
 * full text of the license.
 *
 * Author: Dirk Thalheim
 */

/**
 * @requires OpenLayers/BaseTypes/Class.js
 * @requires BKGWebMap/Control.js
 * @requires BKGWebMap/Util.js
 */

/**
 * @classdesc Zeigt einen Warnhinweis, falls im Browser Cookies für sg.geodatenzentrum.de deaktiviert sind.
 *
 * Benötigt serverseitiges Script zum Cookietest.
 *
 * @constructor BKGWebMap.Control.CookieCheck
 * @param {object} options - Optionen für das Controlelement
 */
BKGWebMap.Control.CookieCheck = OpenLayers.Class(OpenLayers.Control, {

	/**
   * Label für Statusanzeigen
   * @memberOf BKGWebMap.Control.CookieCheck
   * @type object
   */
	label: 'Für eine korrekte Darstellung <b>aktivieren Sie Cookies für sg.geodatenzentrum.de</b> und laden Sie die ' +
           'Webseite noch einmal vollständig neu (Strg + F5). Weitere Informationen dazu finden sie ' +
           '<a href="http://sg.geodatenzentrum.de/web_bkg_webmap/cookietest/enable.html" target="_blank">hier</a>',

  /**
   * Name des Callbacks für Evaluierung des Cookietest Ergebnis
   * @memberOf BKGWebMap.Control.CookieCheck
   * @type string
   */
  callback: 'BKGWebMap.Control.CookieCheck.callback',

  /**
   * Zeit in Millisekunden, bis der Warnhinweis erscheint.
   * @memberOf BKGWebMap.Control.CookieCheck
   * @type int
   */
	delay: 10000,

  initialize:function(options) {
    OpenLayers.Control.prototype.initialize.apply(this, arguments);
    // generiere einen zufälligen Token, um Caching zu vermeiden
    this.token = Math.random().toString(36).substring(2,10);
  },

  destroy:function() {
    if(this._showTimer) {
      clearTimeout(this._showTimer);
    }
    OpenLayers.Control.prototype.destroy.apply(this, arguments);
  },

  draw:function(px) {
    // Div erzeugen
    var div = OpenLayers.Control.prototype.draw.apply(this, arguments);
    OpenLayers.Element.addClass(div, 'error');
		OpenLayers.Element.addClass(div, 'hidden');

    this.info = document.createElement('span');
    this.info.innerHTML = this.label;
    div.appendChild(this.info);

    this.closeButton = document.createElement('div');
    this.closeButton.className = 'close';
    div.appendChild(this.closeButton);
    OpenLayers.Event.observe(this.closeButton, "touchstart", OpenLayers.Function.bindAsEventListener(this.hide, this));
    OpenLayers.Event.observe(this.closeButton, "click", OpenLayers.Function.bindAsEventListener(this.hide, this));

    // Cookietest aufrufen
    BKGWebMap.Control.CookieCheck.instance = this;
    var script = document.createElement('script');
    script.src = BKGWebMap.Control.CookieCheck.URL + '?callback=' + this.callback + '&token=' + this.token;
    var head = document.getElementsByTagName('head')[0];
    head.appendChild(script);
		
		this._showTimer = setTimeout( OpenLayers.Function.bind( this.show, this ), this.delay );

    return div;
  },

  check: function(token) {
		clearTimeout(this._showTimer);
    if (token == this.token) {
      this.hide();
    } else {
			this.show();
		}
  },
	
	show: function() {
		OpenLayers.Element.removeClass(this.div, 'hidden');
		this._showTimer = null;
	},
	
	hide: function() {
		OpenLayers.Element.removeClass(this.div, 'error');
		OpenLayers.Element.addClass(this.div, 'hidden');
		this._showTimer = null;	
	},

    CLASS_NAME: "BKGWebMap.Control.CookieCheck"
});

/**
 * URL zum serverseitigen Cookietest.
 * @type {string}
 */
BKGWebMap.Control.CookieCheck.URL = BKGWebMap.Util.getServiceUrl('web_bkg_webmap', '/cookietest/setcookie.php', true);

/**
 * Referenz zur aktuellen Instanz.
 * @type {BKGWebMap.Control.CookieCheck}
 */
BKGWebMap.Control.CookieCheck.instance = null;

/**
 * Statische Methode zum Aufruf nach serverseitigem Test.
 * @param {string} token
 */
BKGWebMap.Control.CookieCheck.callback = function(token) {
  if(!BKGWebMap.Control.CookieCheck.instance) return;
  BKGWebMap.Control.CookieCheck.instance.check(token);
};

/**
 * Factory-Funktion zur Generierung eines CookieCheck Steuerelement.
 * @param {Array<OpenLayers.Control>} controls - Liste der Steuerelemente, in die die neue erzeugten Steuerelemente
 *                                               eingefügt werden sollen.
 * @param {boolean} enabled - true wenn CookieCheck verwendet werden soll.
 */
BKGWebMap.Control.FACTORIES['checkCookies'] = function(controls, enabled) {
  // TODO: nur wenn mit app_id aufgerufen wird!
  if (enabled) controls.push(new BKGWebMap.Control.CookieCheck());
};