﻿/**
 * Eve.RegisterCards
 *
 * WAS STELLT DIESE DATEI ZUR VERFUEGUNG?
 *
 * 		- Abstract-Funktionen zum Auf- und Zuklappen
 *
 * WAS BENOETIGT DIESE DATEI?
 *
 * 		- jquery.js (jQuery-Framework)
 *		- Eve.js
 *
 * LETZTE AENDERUNGEN:
 * 		2008-09-29		Erstellt (hans-peter.beck@eventim.de)
 *
 * Copyright 2008 by CTS Eventim AG.
 */
 
 
/**
 * Klasse zum Erstellen von dynamischen Abstract-Texten.
 *
 * @class	Eve.AbstractTexts
 * @base	Eve
 * @constructor
 * @param	{object}	options							Optionshash:
 * @param	{number}	options.cutMaxLength			Optional: Max. Anzahl der Zeichen vor dem Abschneiden des Textes (Default 150 Zeichen).
 * @param	{string}	options.cutType					Optional: 'letter', es kann nach jedem Buchstaben; 'word' nach jedem Wort; 'sentence' nach jedem Satz getrennt werden (Default 'letter').
 * @param	{string}	options.cutPostfix				Optional: Anzuzeigender Postfix ab der Trennung, zum Beispiel '...' (Default '').
 * @param	{string}	options.btnShowText				Optional: Wird eine Betitelung (kann auch HTML-Code enthalten) fuer einen "Aufklapp"-Button angegeben, dann wird ein "Aufklapp"-Button angezeigt (Default false).
 * @param	{string}	options.btnShowCls				Optional: Angabe eine oder mehrerer CSS-Klassen fuer den "Aufklappen"-Button (Default false).
 * @param	{string}	options.btnHideText				Optional: Wird eine Betitelung (kann auch HTML-Code enthalten) fuer einen "Zuklapp"-Button angegeben, dann wird ein "Zuklapp"-Button angezeigt (Default false).
 * @param	{string}	options.btnHideCls				Optional: Angabe eine oder mehrerer CSS-Klassen fuer den "Zuklapp"-Button (Default false).
 * @param	{boolean}	options.stripAllTags			Optional: Wenn true, werden alle HTML-Tags entfernt aus dem gesamten Text entfernt (Default false).
 *
 * Zusatzfunktionen:
 * @param	{element}	options.mainContainer			Optional: Wenn ID eines DOM-Elements angegeben werden alle Schwester-Elemente vor dem aufklappen entfernt, und dieser Container entsprechend dem freien Platz angepasst.
 */
Eve.AbstractTexts = function(options) {
	
	var options = options || {};
	
	/** Superclass-Constructor aufrufen, um alle veruegbaren Werte nutzen zu koennen ... */
	this.superclass(options);
	
	this.containerEl       = options.containerEl || false;
	this.cutMaxLength      = options.cutMaxLength || 150;
	this.cutType           = options.cutType || 'letter';
	this.cutPostfix        = options.cutPostfix || '';
	this.btnShowText       = options.btnShowText || false;
	this.btnShowCls        = options.btnShowCls || false;
	this.btnHideText       = options.btnHideText || false;
	this.btnHideCls        = options.btnHideCls || false;
	this.stripAllTags      = options.stripAllTags || false;
	this.mainContainer     = options.mainContainer || false;
	this.isOpenable        = false;
	
	if(!this.containerEl) return;
	
	this.serializeText();
	
	this.setUpMoreLink();
};

Eve.AbstractTexts.prototype = {
	
	/** 
	 * Sucht im Dokument nach einem Link mit der Klasse "eveJsToInfo", um diesen
	 * sichtbar zu machen, da es ja anscheinend eine EventInfo-Box gibt. Darauf
	 * wird dann ein Event gelegt, was erst nach unten scrollt und dann
	 * den Abstract aufklappt.
	 *
	 * @member	Eve.AbstractTexts
	 */
	setUpMoreLink : function() {
		
		this.toMoreLinks = jQuery('.eveJsToInfo').get() || false;
		
		this.defaultTextEl = jQuery('.artistInfoUnAvailable').get(0) || false;
		
		if (!(this.toMoreLinks || false)) return;
		
		jQuery(this.toMoreLinks).click(function() {
			
			this.scrollToElement(this.mainContainer, 1000, this.showRest.scope(this));
			
			return false;
			
		}.scope(this));
		
		jQuery(this.toMoreLinks).show();
		
		if (this.defaultTextEl) jQuery(this.defaultTextEl).hide();
	},
	
	/**
	 * Sucht in dem HTML-Container der aktuellen Instanz nach HTML-Code und teilt diesen
	 * in zwei Teile, entsprechend der vorkonfigurierten max. Laenge des Abstracts.
	 *
	 * @member	Eve.AbstractTexts
	 */
	serializeText : function() {
		
		/** Schauen ob es einen Main-Container gibt ... */
		if(this.mainContainer) {
			
			this.mainContainer   = jQuery('#' + this.mainContainer).get(0) || false;
			this.mainContainerId = this.getElementId(this.mainContainer);
			this.toHideElements  = jQuery('#'+this.getElementId(this.mainContainer.parentNode)+' > *').get() || [];
		}
		
		/** Den Original-HTML-Code merken ... */
		this.originalHtml = this.containerEl.innerHTML;
		
		/** Jetzt den Code teilen ... */
		var cuttedText = this.cutHtmlText({ 
			
			htmlText     : this.originalHtml,
			maxLength    : this.cutMaxLength,
			cutType      : 'word',
			elType       : 'span',
			stripAllTags : this.stripAllTags
		});
		
		/** Im aktuellen Objekt merken ... */
		this.abstractEl = cuttedText.abstract;
		
		if (cuttedText.totalLength > this.cutMaxLength) {
			
			this.abstractEl.btn = document.createElement('a');
			this.abstractEl.btn.href = 'javascript:void(0);';
			this.abstractEl.btn.innerHTML = (eveMessages.AbstractText.readMore || '');
			jQuery(this.abstractEl.btn).addClass('moreOrLess');
			jQuery(this.abstractEl).append('... ');
			jQuery(this.abstractEl).append(this.abstractEl.btn);
			
			jQuery(this.abstractEl.btn).click(this.showRest.scope(this));
			
			// Merker setzen, dass da ueberhaupt etwas aufklappbar ist, weil wenn nicht
			// dann dann brauch bei einem Einsprung das Feature nicht ausgefuehrt werden.
			this.isOpenable = true;
		}
		
		this.containerEl.btn = document.createElement('a');
		this.containerEl.btn.href = 'javascript:void(0);';
		this.containerEl.btn.innerHTML = (eveMessages.AbstractText.closeInfo || ''); //(this.toHideElements.length > 1) ? 'Fotos zeigen' : abstractText.message.close_info;
		this.containerEl.style.position = "relative";
		this.containerEl.btn.style.position = 'absolute';
		this.containerEl.btn.style.left = '850px';
		this.containerEl.btn.style.top = '-24px';
		this.containerEl.btn.style.whiteSpace = 'nowrap';
		jQuery(this.containerEl.btn).addClass('moreOrLess');
		jQuery(this.containerEl.btn).hide();
		jQuery(this.containerEl).prepend(this.containerEl.btn);
		
		jQuery(this.containerEl.btn).click(this.hideRest.scope(this));
			
		this.abstractEl.parent = this;
		this.containerEl.parent = this;
		
		/** Klasse auf den Container setzen, dass es ein Abstract-Complete-Text ist */
		jQuery(this.containerEl).addClass('eveJsAbstractTextsRest');
		jQuery(this.abstractEl).addClass('eveJsAbstractTextsAbstract');
		
		jQuery(this.containerEl).hide();
		
		/** Neu befuellen ... */
		jQuery(this.containerEl.parentNode).prepend(this.abstractEl);
		
		/** Damit der echte Text auf absolute gesetzt werden kann ... */
		this.fireEvent('change');
	},
	
	
	checkSisterAbstracts : function(tmpId) {
		
		if (!(this.sisterAbstracts || false)) {
				
			this.sisterAbstracts = jQuery('#' + tmpId + ' .eveJsAbstractTextsAbstract').get() || false;
			this.sisterRests = jQuery('#' + tmpId + ' .eveJsAbstractTextsRest').get() || false;
		}
	},
	
	showRest : function() {
		
		// Nur aufklappen, wenn nicht bereits aufgeklappt oder es ueberhaupt etwas
		// aufzuklappen gibt ...
		if ((this.isShown || false) || !(this.isOpenable || false)) return;
		
		this.isShown = true;
		
		if(this.mainContainer) {
			
			var tmpId          = this.mainContainerId;
			var toHideElements = this.toHideElements.concat([]);
			
			this.checkSisterAbstracts(tmpId);
			
			var step4 = function() {
				
				/** Jetzt noch evtl. andere Abstracts oeffnen, die in Registerkarten sind ... */
				if ((this.sisterAbstracts || false)) {
					
					for (var i = 0; i < this.sisterAbstracts.length; i++) {
						
						var tmpAbstract = this.sisterAbstracts[i];
						var tmpRest     = this.sisterRests[i];
						
						if (tmpAbstract != this.abstractEl) {
							
							jQuery(tmpAbstract).hide();
							jQuery(tmpRest).show();
							jQuery(tmpRest.btn).show();
							tmpRest.parent.isShown = true;
						}
					}
				}
				
				jQuery(this.containerEl.btn).fadeIn('slow');
				
				this.fireEvent('change');
				
			}.scope(this);
			
			var step3 = function() {
				
				if ((this.mainContainer.toStretch || false)) this.mainContainer.toStretch.style.height = 'auto';
				
				this.mainContainer.style.height = 'auto';
				
				jQuery(this.containerEl).slideDown('slow', step4);
				
			}.scope(this);
			
			var step2 = function() {
				
				this.mainContainer.toStretch.oldHeight = jQuery(this.mainContainer.toStretch).height();
				
				var animCfg = { height:'70px' };
				
				if (this.toHideElements.length > 1) animCfg.width = '988px';
				
				jQuery(this.mainContainer.toStretch).animate(animCfg, 500, 'linear', step3);
				
			}.scope(this);
			
			var step1 = function() {
				
				if (toHideElements.length > 0) {
				
					var toHide = toHideElements.pop();
					
					if (tmpId != this.getElementId(toHide)) {
						
						jQuery(toHide).fadeOut('slow', step1);
						
					} else {
						
						this.mainContainer.toStretch = toHide;
						
						step1();
					}
					
					return;
					
				}
					
				step2();
				
			}.scope(this);
			
			jQuery(this.abstractEl).fadeOut('fast', step1);
			
		} else {
			
			showElements();
		}
	},
	
	hideRest : function() {
		
		if (!(this.isShown || false)) return;
		
		this.isShown = false;
		
		if(this.mainContainer) {
			
			var tmpId          = this.mainContainerId;
			var toHideElements = this.toHideElements.concat([]);
			
			this.checkSisterAbstracts(tmpId);
			
			var step3 = function() {
				
				jQuery(this.abstractEl).fadeIn('slow');
				
				if (toHideElements.length > 1) {
				
					var toHide = toHideElements.pop();
					
					if (tmpId != this.getElementId(toHide)) {
						
						jQuery(toHide).height(this.mainContainer.toStretch.oldHeight);
						jQuery(toHide).fadeIn('slow', step3);
						
					} else {
						
						step3();
					}
					
					return;
					
				}
				
				this.fireEvent('change');
				
				
			}.scope(this);
			
			var step2 = function() {
			
				var animCfg = { height: this.mainContainer.toStretch.oldHeight+'px' };
				
				if (this.toHideElements.length > 1) animCfg.width = '487px';
				
				jQuery(this.mainContainer.toStretch).animate(animCfg, 500, 'linear', step3);
					
			}.scope(this);
			
			var step1 = function() {
					
				this.mainContainer.toStretch.style.height = 'auto';
				this.mainContainer.style.height = 'auto';
				jQuery(this.containerEl).slideUp('slow', step2);
				
			}.scope(this);
			
			var step0 = function() {
				
				/** Jetzt noch evtl. andere Abstracts oeffnen, die in Registerkarten sind ... */
				if ((this.sisterAbstracts || false)) {
					
					for (var i = 0; i < this.sisterAbstracts.length; i++) {
						
						var tmpAbstract = this.sisterAbstracts[i];
						var tmpRest     = this.sisterRests[i];
						
						if (this.getElementId(tmpAbstract) != this.getElementId(this.abstractEl)) {
							
							jQuery(tmpAbstract).show();
							jQuery(tmpRest).hide();
							jQuery(tmpRest.btn).hide();
							tmpRest.parent.isShown = false;
						}
					}
				}
				
				step1();
				
			}.scope(this);
			
			jQuery(this.containerEl.btn).fadeOut('fast', step0);
			
		} else {
		
			jQuery(this.containerEl).hide();
			jQuery(this.abstractEl).show();
			this.fireEvent('change');
		}
	}
};

/** Ableiten */
Eve.AbstractTexts.extendClassBy(Eve);
