﻿/** Namespace sichern */
var eve = eve || {};

/**
 *
 * @class	eve.newsletterAvailableArtists
 * @constructor
 * @param	{object}	options						Optionshash:
 * @param	{string}	options.fromId				Required: ID des Selects in dem Kuenstler auswaehlbar sind.
 * @param	{string}	options.toId				Required: ID des Selects fuer die vom Nutzer ausgewaehlten Kuenstler.
 * @param	{string}	options.formId				Required: ID des Formulars in dem die Select-Felder sind.
 * @param	{boolean}	options.removeFromFrom		Optional: Wenn "true", dann wird dass doppel geklickte Element von options.fromId entfernt. Default: false.
 * @param	{boolean}	options.removeFromTo		Optional: Wenn "true", dann wird dass doppel geklickte Element von options.toId entfernt. Default: false.,
 * @param	{string}	options.btnFromTo			Optional: Button zum bewegen einer Option von options.fromId zu options.toId
 * @param	{string}	options.btnToFrom			Optional: Button zum bewegen einer Option von options.toId zu options.fromId
 * @param	{string}	options.iniByListFrom		Optional: Hidden-Input El with ","-seperated List zu initialise
 * @param	{string}	options.checkIfAddFrom		Optional: Wird der Von-Liste ein Eintrag hinzugefuegt, dann wird versucht die Checkbox mit der angegebenen ID zu aktiveren.
 * @param	{string}	options.checkIfAddTo		Optional: Wird der Zu-Liste ein Eintrag hinzugefuegt, dann wird versucht die Checkbox mit der angegebenen ID zu aktiveren.
 */
eve.newsletterAvailableArtists = function(options) {
	
	/**
	 * SELECT-BOX mit verfuegbaren Kuenstlern
	 * @type	{element}
	 */
	this.fromEl = jQuery('#' + options.fromId).get(0);
	
	/**
	 * SELECT-BOX fuer die vom Nutzer ausgewaehlten Kuenstler
	 * @type	{element}
	 */
	this.toEl = jQuery('#' + options.toId).get(0);
	
	/**
	 * Button zum bewegen einer Option von options.fromId zu options.toId
	 * @type	{element}
	 */
	this.btnFromTo = ((options.btnFromTo || null) != null) ? jQuery('#' + options.btnFromTo).get(0) : null ;
	
	/**
	 * Button zum bewegen einer Option von options.toId zu options.fromId
	 * @type	{element}
	 */
	this.btnToFrom = ((options.btnToFrom || null) != null) ? jQuery('#' + options.btnToFrom).get(0) : null ;
	
	/**
	 * ID des Formulars in dem die Select-Felder sind.
	 * @type	{element}
	 */
	this.formEl = jQuery('#' + options.formId).get(0);
	
	/**
	 * Wenn "true", dann wird dass doppel geklickte Element von options.fromId entfernt.
	 * @type	{boolean}
	 */
	this.removeFromFrom = options.removeFromFrom || false;
	
	/**
	 * Wenn "true", dann wird dass doppel geklickte Element von options.toId entfernt.
	 * @type	{boolean}
	 */
	this.removeFromTo = options.removeFromTo || false;
	
	/**
	 * Hidden-Input Value with ","-seperated List zu initialise.
	 * @type	{string}
	 */
	this.iniByListFrom = (jQuery('#'+options.iniByListFrom).get(0) || {}).value || '';
	
	/**
	 * Checkbox to check if an options where added ...
	 * @type	{object}
	 */
	this.checkIfAddFrom = ((options.checkIfAddFrom || false) ? jQuery('#' + options.checkIfAddFrom).get(0) || false : false );
	
	/**
	 * Checkbox to check if an options where added ...
	 * @type	{object}
	 */
	this.checkIfAddTo = ((options.checkIfAddTo || false) ? jQuery('#' + options.checkIfAddTo).get(0) || false : false );
	
	/** Initialize ... */
	this.ini();
};

eve.newsletterAvailableArtists.prototype = {
	
	iniIsDone : false,
	
	/**
	 * Initialisiert die Selects mit Events, sowie das Formular ...
	 */
	ini : function() {
		
		if (!(this.formEl || false) || !(this.toEl || false)) return;
		
		/** Selects */
		this.fromEl.checkIfAdd    = this.checkIfAddFrom;
		this.fromEl.other         = this.toEl;
		this.fromEl.classThis     = this;
		this.fromEl.removeByClick = this.removeFromFrom;
		this.setSelectEvents(this.fromEl);
		
		this.toEl.checkIfAdd    = this.checkIfAddTo;
		this.toEl.other         = this.fromEl;
		this.toEl.classThis     = this;
		this.toEl.removeByClick = this.removeFromTo;
		this.setSelectEvents(this.toEl);
		
		/** Buttons? */
		if ((this.btnFromTo || null) != null) {
			
			this.btnFromTo.selectFrom = this.fromEl;
			this.setBtnEvents(this.btnFromTo);
		}
		
		if ((this.btnToFrom || null) != null) {
			
			this.btnToFrom.selectFrom = this.toEl;
			this.setBtnEvents(this.btnToFrom);
		}
		
		/** Initialising Artists from saved state */
		if (this.iniByListFrom != '') this.setSelected(this.fromEl, true, this.iniByListFrom.split(','), true, 'ini');
		
		/** Formular */
		this.formEl.classThis   = this;
		
		jQuery(this.formEl).submit(function() {
			
			this.classThis.reselectAllToOptions();
			
			return true;									
		});
		
		this.iniIsDone = true;
	},
	
	reselectAllToOptions : function() {
		
		/** Suche nach allen Options die ein Value haben und selektiere diese ... */
		for (var i = 0; i < this.toEl.options.length; i++) {
			
			this.toEl.options[i].selected = ((this.toEl.options[i].value || '') != '') ? true : false ;
		}
	},
	
	/**
	 * Setzt auf die Buttons zum Hinzufuegen / Loeschen onClick-Events,
	 * die bei den jeweils zugeordneten Selects ein dblclick-Event
	 * feuern ...
	 */
	setBtnEvents : function(buttenEl) {
		
		buttenEl.style.cursor = 'pointer';
		
		jQuery(buttenEl).click(function() {
			
			/** Loese den dblclick-Event auf dem Select des Buttons aus */
			jQuery(this.selectFrom).dblclick();
		});
	},
	
	/**
	 * Setzt auf ein SELECT-Element einen Doppelclick-Event.
	 */
	setSelectEvents : function(selectEl) {
		
		/** onDoubleClick */
		jQuery(selectEl).dblclick(this.onDblClick);
	},
	
	/**
	 * Eventhandler der aufgerufen wird, wenn auf einem SELECT ein
	 * Doppelklick ausgefuehrt wird.
	 */
	onDblClick : function(e) {
		
		if (this.selectedIndex < 0) return;
		
		var selOptions = this.classThis.getSelected(this);
		
		this.classThis.move(this, this.other, selOptions);
	},
	
	
	/**
	 * Selektiert alle in byValueList gesetzten und im selectEl wiedergefundenen
	 * Optionen. Wenn copy = true ist, dann werden diese in das jeweils andere
	 * Select-Element (selectEl.other) kopiert.
	 * @param	{element}	selectEl		SELECT-Element, in dem selektiert werden soll.
	 * @param	{boolean}	setSelectTo		Wenn true, wird selektiert, wenn false, wird deselektiert.
	 * @param	{array}		byValueList		Liste der Values die in den Optionen mit dem Value selektiert werden sollen.
	 * @param	{boolean}	copy			Wenn true, werden die selektierten Eintraege verschoben, wenn false, dann nicht.
	 */
	setSelected : function(selectEl, setSelectTo, byValueList, copy, mode) {
		
		var tmpOptions = [];
		var valueList  = {};
		
		for (var i = 0; i < (byValueList || []).length; i++) valueList[byValueList[i]] = true;
		
		for (var i = 0; i < selectEl.options.length; i++) {
			
			/** Shortcut */
			var tmpOption = selectEl.options[i];
			
			/** Wenn Wildcard oder passendes Value gefunden wurde, dann selecten */
			if (valueList[tmpOption.value || ''] !== true && (byValueList || '') != '*') continue;
				
			tmpOption.setAttribute('selected', setSelectTo || false);
			
			/** Merken */
			tmpOptions.push(tmpOption);
		}
		
		/** Die vorselektierten Optionen nun von der Quelle zu Ziel verschieben */
		if ((copy || false) == true) this.move(selectEl, selectEl.other, tmpOptions);
	},
	
	
	getSelected : function(selectEl, setSelectTo) {
		
		var selectedElements = [];
		
		for (var i = 0; i < selectEl.options.length; i++) {
			
			if (selectEl.options[i].selected != true) continue;
			
			selectedElements.push(selectEl.options[i]);
			
			if ((typeof setSelectTo) == 'boolean') selectEl.options[i].selected = setSelectTo;
		}
		
		return selectedElements;
	},
	
	/**
	 * Bewegt eine Option vom Quell-SELECT zum Ziel-SELECT, wobei es je nach
	 * Konfiguration entweder aus dem Quell-SELECT entfernt wird oder einfach
	 * nur disabled wird.
	 */
	move : function(from, to, selOptions) {
		
		for (var i = 0; i < selOptions.length; i++) {
			
			var option = selOptions[i];
			
			/** Leer / Disabled? Ende! */
			if (option.value == '' || option.inUse == true) continue;
			
			/** Auf dem Ziel nachschauen, ob es da schon gibt ... */
			var tmpExistingEl = option.other || null;
			
			/** Wenn es das noch nicht gibt, dann dahin schieben ... */
			if ((tmpExistingEl || null) == null) {
				
				var clone = new Option(option.text, option.value, false, false);
				
				/** Quelle im Clone merken, da performanter ... ... */
				clone.other = option;
				
				to.options[to.options.length] = clone;
				
			} else {
				
				//tmpExistingEl.disabled = false;
				tmpExistingEl.style.color = '';
				tmpExistingEl.inUse = false;
			}
				
			
			/** Wenn es per Config erlaubt ist, dass Element vom from entfernen ... */
			if (from.removeByClick === true) {
				
				jQuery(option).remove();
				
				/**
				 * Wenn es eine Anweisung gibt die "Ja, ich will Newsletter..."-Checkbox zu deaktivieren, wenn dem Ziel ein
				 * Eintrag entfernt wurde und es keine mehr gibt, dann mach dies jetzt.
				 */
				if((this.iniIsDone || false) && from.checkIfAdd && from.options.length == 0) from.checkIfAdd.checked = false;
				
			} else {
			
				option.inUse = true;
				option.style.color = '#ccc';
			}
		}
			
		this.selectLastToOption();
		
		if (from = this.fromEl) var oldSelected = this.getSelected(this.fromEl, false);
		
		/**
		 * Wenn es eine Anweisung gibt die "Ja, ich will Newsletter..."-Checkbox zu aktivieren, wenn dem Ziel ein
		 * Eintrag hinzugefuegt wurde, dann mach dies jetzt.
		 */
		if((this.iniIsDone || false) && to.checkIfAdd) to.checkIfAdd.checked = true;
	},
	
	selectLastToOption : function() {
		
		var lastOption = this.toEl.options[((this.toEl.options.length > 0) ? this.toEl.options.length - 1 : this.toEl.options.length )] || false;
		
		if(!lastOption) return;
		
		if(lastOption.value != '') this.toEl.selectedIndex = this.toEl.options.length - 1;
	}
};

jQuery(function() {
	
	eve.nlaaInstance = new eve.newsletterAvailableArtists({
			
			toId           : 'newsletterSelectedArtists',
			fromId         : 'newsletterAvailableArtists',
			formId         : 'newsletterForm',
			removeFromFrom : false,
			removeFromTo   : true,
			btnFromTo      : 'newsletterBtnFromTo',
			btnToFrom      : 'newsletterBtnToFrom',
			iniByListFrom  : 'newsletterSavedArtists',
			checkIfAddTo   : 'newsletterArtistsCheckbox'
	});
});


//################################ Box : Lieblingskünstler Check ######################-->

//für das Ein/Ausklappen der drei Newsletter-Typen
//Type1 = Ticketalarm
//Type2 = Reginaler Newsletter
//Type3 = normaler Newsletter
function switchType1(element) {	
	(element.checked)?document.getElementById("Type1Content").style.display = "block":document.getElementById("Type1Content").style.display = "none" 
}//end funktion 
function switchType2(element) {
	(element.checked)?document.getElementById("Type2Content").style.display = "block":document.getElementById("Type2Content").style.display = "none" 
}//end funktion 
function switchType3(element) {
	(element.checked)?document.getElementById("Type3Content").style.display = "block":document.getElementById("Type3Content").style.display = "none" 
}//end funktion 

//für das Ein/Ausklappen der drei Newsletter-Typen bei Bestandskunden
function showTypen(type2, type3) {
	if (type2 == "checked") { document.getElementById("Type2Content").style.display = "block" }
	if (type3 == "checked") { document.getElementById("Type3Content").style.display = "block" }
}//end function
