﻿/**
 * WAS STELLT DIESE DATEI ZUR VERFUEGUNG?
 *
 *		- Funktionen um die Meta-Navigation (Warenkorb, Merkzettel, Login/Logout) ueber JavaScript auf per Akamai
 *		  gecachten Seiten dem Ist-Zustand des Servers anzugleichen.
 *
 * WAS BENOETIGT DIESE DATEI?
 *
 * 		- jquery.js (jQuery-Framework)
 *		- Eve.js
 *
 * LETZTE AENDERUNGEN:
 * 		2010-02-22			Die einfachen Funktionen durch eine gekapselte Klasse ersetzt.
 * 		2010-02-03			Erstellt (hans-peter.beck@eventim.de)
 *
 * Copyright 2010 by CTS Eventim AG.
 */

/**
 * Ermittelt aus dem aktuellen Cookie die Werte, die in der Meta-Navigation stehen sollten
 * und tauscht diese dann ggf. aus.
 * 
 * @class	MetaNavigation
 * @author	hpbeck
 * @param	{object}	options										Options-Hashmap:
 * @param	{string}	options.loginCode							Quellcode fuer den eingelogten Zustand.
 * @param	{string}	options.leafletSelector						Optional: jQuery-Selektor fuer das zu entfernende "Merkzettel"-Snippet, wenn man eingeloggt ist, wird dann spaeter durch loginCode ersetzt.
 * @param	{string}	options.loginSelector						Optional: jQuery-Selektor fuer das "Login"-Snippet mit "Logged in > Logout" Snippet zu ersetzende Quellcode, wenn Nutzer eingelogt ist.
 * @param	{string}	options.shoppincCartSpanSelector			Optional: jQuery-Selektor fuer das span-Tag in dem die Zahl fuer den Warenkorb zu aktualisieren ist.
 * @param	{string}	options.bookmarkedEventsSpanSelector		Optional: jQuery-Selektor fuer das span-Tag in dem die Zahl fuer den Merkzettel zu aktualisieren ist.
 * @constructor
 */
var MetaNavigation = function(options) {
	
	this.options = options || {};
	
	this.loginCode                    = this.options.loginCode || false;
	this.leafletSelector              = this.options.leafletSelector || false;
	this.loginSelector                = this.options.loginSelector || false;
	this.shoppincCartSpanSelector     = this.options.shoppincCartSpanSelector || false;
	this.bookmarkedEventsSpanSelector = this.options.bookmarkedEventsSpanSelector || false;
	
	this.initialize();
};

MetaNavigation.prototype = {
	
	/**
	 * Initialisierung der MetaNavigation.
	 * 
	 * @member	MetaNavigation
	 * @private
	 */
	initialize : function() {
		
		// Wenn der User eingeloggt ist, dann den "Login"-Layer und den Merkzettel-Login-Link durch die
		// eingeloggte Version austauschen (erst danach die Werte fuer Warenkorb und Merkzettel neu setzen).
		if(typeof this.getParamFromWebShopCookie('login') == "string" && this.getParamFromWebShopCookie('login') == '1') this.setLoginToLoggedIn();
	
		// Warenkorb und Merkzettelwerte setzen, wenn es sie jeweils nicht gibt, dann einfach 0
		// Hinweis: Erst jetzt neu setzen, da in  this.setLoginToLoggedIn() ggf. Quellcode ersetzt wird.
		this.setBookmarkAmount((this.getParamFromWebShopCookie('merkitems') || 0));
		this.setSoppingCartAmount((this.getParamFromWebShopCookie('amount') || 0));
	},
	
	/**
	 * @member	MetaNavigation
	 * @private
	 * @return	{object}	Liefert den Inhalt des Eventim-Webshop-Cookies mit den entsprechenden Wertepaaren.
	 */
	getWebShopCookie : function() {
		
		// Aus dem Cookie die Variable webshop auslesen, Base64 decoden und in Wertepaare umwandeln.
		var tmpWebShopCookie = eveJs.base64_decode(getCookie('webshop') || '');
		var tmpPairs = tmpWebShopCookie.split('&');
		var tmpObj = {};
		
		for(var i = 0; i < tmpPairs.length; i++) {
			var tmpPair = (tmpPairs[i] || '').split('=');
			if(!(tmpPair[0] || false)) continue;
			tmpObj[tmpPair[0]] = tmpPair[1];
		};
		
		return tmpObj;
	},
	
	/**
	 * @member	MetaNavigation
	 * @public
	 * @return	{mixed}		Liefert den Wert passend zum uebergebenen Parameter-Namen aus dem Eventim-Webshop-Cookie zurueck.
	 */
	getParamFromWebShopCookie : function(paramName) {

		var tmpCookie = this.getWebShopCookie() || {};
		
		return ((typeof tmpCookie[(paramName || 'undefined')] != 'undefined') ? tmpCookie[paramName] : null );
	},
	
	/**
	 * Setzt den Wert der Anzeige fuer den Merkzettel.
	 * 
	 * @member	MetaNavigation
	 * @public
	 * @param	{string}	newValue		Der zu setzende Wert fuer die Merkzettel-Menge.
	 * @param	{string}	elSelector		Optional: jQuery-Selektor zu dem Element, in dem der Wert fuer den Merkzettel ausgetauscht werden soll (Default ist der in der Instanz hinterlegte Selektor oder false).
	 */
	setBookmarkAmount : function(newValue, elSelector) {
	
		var newValue = (typeof newValue != 'undefined') ? newValue : false;
		if(!newValue) return;
		
		var elSelector = (elSelector || this.bookmarkedEventsSpanSelector) || false;
		if(!elSelector) return;
		
		var tmpEl = jQuery(elSelector).get(0) || false;
		if(!tmpEl) return;
		
		jQuery(tmpEl).html(parseInt(newValue));
	},
	
	/**
	 * Setzt den Wert der Anzeige fuer den Warenkorb.
	 * 
	 * @member	MetaNavigation
	 * @public
	 * @param	{string}	newValue						Der zu setzende Wert fuer die Warenkorb-Menge.
	 * @param	{string}	bookmarkedEventsSpanSelector	Optional: jQuery-Selektor zu dem Element, in dem der Wert fuer den Warenkorb ausgetauscht werden soll (Default ist der in der Instanz hinterlegte Selektor oder false).
	 */
	setSoppingCartAmount : function(newValue, elSelector) {
	
		var newValue = (typeof newValue != 'undefined') ? newValue : false;
		if(!newValue) return;
		
		var elSelector = (elSelector || this.shoppincCartSpanSelector) || false;
		if(!elSelector) return;
		
		var tmpEl = jQuery(elSelector).get(0) || false;
		if(!tmpEl) return;
		
		jQuery(tmpEl).html(parseInt(newValue));
	},
	
	/**
	 * Insofern nicht schon das Menue fuer den eingeloggten Zustand angezeigt wird, ersetzt die
	 * aktuelle Methode den vorhandenen Code durch den in this.loginCode hinterlegten Quellcode.
	 * 
	 * @member	MetaNavigation
	 * @private
	 */
	setLoginToLoggedIn : function() {
		
		// Wenn das HTML-Element fuer "ausgeloggt" nicht da ist, dann wird bereits "eingeloggt" angezeigt.
		var tmpLoggedOutEl = jQuery(this.loginSelector).get(0) || false;
		if(!tmpLoggedOutEl) return;
		
		if(this.leafletSelector) jQuery(this.leafletSelector).remove();
		if(this.loginSelector && this.loginCode) jQuery(this.loginSelector).replaceWith(this.loginCode);
	}
};
