/*
* 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());
};