/**
 * JavaScript functions for use akadmailform plugin.
 *
 * @author a.foeder@iveins.de
 * @package TYPO3
 * @subpackage akadmailforms
 */

var akadmailforms = {
	formSubmit: function(formElem) {
		var ret = true;

		if($('jsCallStack')) $('jsCallStack').setProperty('value', $('jsCallStack').get('value') + '; 10');

		var highlightColl = [];

			// Eingabefelder auf Ausgefülltheit prüfen:
		formElem.getElements('.mandatory, .mandatory-exclamation').each(function(elem, index){
			if(''==elem.value || elem.value==elem.getProperty('title')) {
				highlightColl.append([elem]);
			}
		});




			// für #306: gewähltes Land ermitteln
		var selCountry = null;
		var isNotDe = true;
		if (selCountry = $$('.tx-akadmailforms-pi .frm2col-fullwidth .address select.selCountry').pick()) {
			var isNotDe = selCountry.value !== 'DE';
		}
			// Spezialfall: Email prüfen, auch in Hinblick auf gewähltes Land != DE (#306):
		formElem.getElements('input.txtEmail').each(function(elem, index){
			if (	(elem.value != elem.getProperty('title') || (selCountry && isNotDe)   )
					&& !elem.value.test(/^([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})?$/i)
					) {
				highlightColl.append([elem]);
			} 
		});

		var noteField = $$('.tx-akadmailforms-pi .frm2col-fullwidth .additionalInfo textarea').pick();
		if (noteField && selCountry && 'DE'!==selCountry.value && (''==noteField.value || noteField.value==noteField.getProperty('title'))) {
			highlightColl.append([noteField]);
		}





		if($('jsCallStack')) $('jsCallStack').setProperty('value', $('jsCallStack').get('value') + '; 20');
			// Spezialfall: Herr/Frau prüfen:
		if(!formElem.getElements('.fs2col fieldset.address-foa input.radio:checked').length) {
			highlightColl.append([formElem.getElements('fieldset.address-foa')].flatten());
		}


			// Spezialfall: Sprachtest-Auswahl prüfen:
		if(formElem.getElements('fieldset.langtest-sel').length) {
			if(formElem.getElements('fieldset.langtest-sel input:checked').length) {
				return true;
			} else {
				highlightColl.append([formElem.getElements('fieldset.langtest-sel')].flatten());
			}
		}

		if($('jsCallStack')) $('jsCallStack').setProperty('value', $('jsCallStack').get('value') + '; 30');

		if(highlightColl.length > 0) {
			ret = false;

				// ans obere Fenster scrollen:
			new Fx.Scroll(window, {duration:50}).toTop().chain(function() {
				$$(highlightColl).addClass('mandatory-exclamation');
				$$(highlightColl).highlight('#ffff00', '#EBEBE4');
			});
		}

			// "Aufmerksam geworden durch" prüfen, ob wenigstens eins angeklickt ist:
		//if($$('.tx-akadmailforms-pi .choicetrees .right').length) {	//<-- wichtig, um die Unterscheidung zum "kleinen" Formular zu erhalten
			if(formElem.getElements('.choicetrees .right.choicelists_are_mandatory').length && !formElem.getElements('.choicetrees .right.choicelists_are_mandatory input:checked').length) {
					//kein einziges Element angeklickt, ret auf false setzen...
				ret = false;
				$$('span.right-choicelist-mandatory').setStyle('visibility','visible').highlight('#ffff00');
			}
		//}

			// und die Produkte (links) ebenfalls derart prüfen:
		//if($$('.tx-akadmailforms-pi .choicetrees fieldset.left.choicelist').length) {	//<-- wichtig, um die Unterscheidung zum "kleinen" Formular zu erhalten
			if(formElem.getElements('.choicetrees fieldset.left.choicelist.choicelists_are_mandatory').length && !formElem.getElements('.choicetrees fieldset.left.choicelist.choicelists_are_mandatory input:checked').length) {
				ret = false;
				$$('span.left-choicelist-mandatory').set('text', 'Bitte wählen Sie einen Bereich:').setStyle('visibility','visible').highlight('#ffff00');
			}
		//}

				// prüfen, ob linke Choicelist mandatory ist UND > 2
			if(formElem.getElements('.choicetrees fieldset.left.choicelist.choicelists_are_mandatory').length && formElem.getElements('.choicetrees fieldset.left.choicelist.choicelists_are_mandatory input:checked').length > 2) {
				ret = false;
				$$('span.left-choicelist-mandatory').set('text', 'Bitte nicht mehr als zwei Produkte auswählen:').setStyle('visibility','visible').highlight('#ffff00');
			} else if(formElem.getElements('.choicetrees fieldset.left.choicelist input:checked').length
					&& formElem.getElements('.choicetrees fieldset.left.choicelist input:checked').length <= 2) {
							// mindestens ein, maximal zwei Elemente sind angewählt, alles OK:
						$$('span.left-choicelist-mandatory').setStyle('visibility','hidden');
			}

			if($('jsCallStack')) $('jsCallStack').setProperty('value', $('jsCallStack').get('value') + '; 40');



		try {
			$(formElem).getElement('.formData').setProperty('value', JSON.encode(this.collectFormData()));
		} catch(e){
			ret = false;
			if($('jsCallStack')) $('jsCallStack').setProperty('value', $('jsCallStack').get('value') + '; Err@collectFormData:'+e.description);
		};




		if($('jsCallStack')) $('jsCallStack').setProperty('value', $('jsCallStack').get('value') + '; 50');

			// folgende Zeilen muessen am Ende der func stehen, sie werden ab-
			// gearbeitet kurz vor dem Absenden des Forms.
		if(ret) {	// keine Fehler, Form kann abgesendet werden.
				// Default-Werte von interaktiven Feldern entfernen:
			formElem.getElements('input, textarea').each(function(item) {
				if(item.get('value')==item.get('title')) item.set('value', '');
			});

				// und Absende-Button(s) disabeln und umbenennen:
			formElem.getElements('input[type=submit]').each(function(item){
				item.set('value', 'bitte warten...');
				item.set('disabled', 'disabled');
			});
		}
		if($('jsCallStack')) $('jsCallStack').setProperty('value', $('jsCallStack').get('value') + '; 60');
		return ret;
	},

	collectFormData: function() {
		var ret = $H();
		if($('jsCallStack')) $('jsCallStack').setProperty('value', $('jsCallStack').get('value') + '; 100');
			// leeres Array für die Auswahllisten initialisieren
		ret.set('choicelists', []);
		if($('jsCallStack')) $('jsCallStack').setProperty('value', $('jsCallStack').get('value') + '; 110');
		$$('.tx-akadmailforms-pi ul.choicelist-level-1').each(function(choicelistUL) {
			var tempCollectHash = $H();
			choicelistUL.getElements('input:checked').each(function(inputElem, index) {
				tempCollectHash.include(index, [inputElem.value+'::'+inputElem.get('title')]);

					// Übergeordnete Elemente, falls Checkbox vorhanden, mit in die Liste aufnehmen:
				inputElem.getParents('ul').getParents('li').flatten().unique().each(function(li_item) {
					if(li_item.getFirst('input')) {
						tempCollectHash[index].include(li_item.getFirst('input').value+'::'+li_item.getFirst('input').get('title'));
					}
				});
			});

			ret.choicelists.push(tempCollectHash);
		});
		if($('jsCallStack')) $('jsCallStack').setProperty('value', $('jsCallStack').get('value') + '; 120');
		/* BACKUP.
		var selBoxesLeft = $H();
			// Gesetzte Checkboxen für den linken Bereich setzen:
		$$('.tx-akadmailforms-pi .choicetrees .left input:checked').each(function(item,index) {
				selBoxesLeft.include(index, [item.value]);

				item.getParents('ul').getParents('li').flatten().unique().each(function(li_item) {
					selBoxesLeft[index].include(li_item.getFirst('input').value);
				});
			});


			//...und dasselbe für rechts:
		var selBoxesRight = $H();
			// Gesetzte Checkboxen für den linken Bereich setzen:
		$$('.tx-akadmailforms-pi .choicetrees .right input:checked').each(function(item,index) {
				selBoxesRight.include(index, [item.value]);

				item.getParents('ul').getParents('li').flatten().unique().each(function(li_item) {
					selBoxesRight[index].include(li_item.getFirst('input').value);
				});
			});


		ret.extend({
			'choicelistTreeLeft': selBoxesLeft,
			'choicelistTreeRight': selBoxesRight
		});
		*/

		/* --> folgender Code würde alle Formularelemente sammeln; wollen wir aber nicht.
		$$('.tx-akadmailforms-pi input, .tx-akadmailforms-pi select, .tx-akadmailforms-pi textarea').each(function(elem, i) {
			if('formData'==elem.name) return;

			switch(elem.get('type')) {
				case 'checkbox':
					ret.include(elem.name, elem.checked);
					break;
				default:
					ret.include(elem.name, elem.value);
					break;
			}

		});
		*/
		//if(console) console.log(ret);

		return ret;
	},



	initSelLanguageDependantDisplay: function() {
		var selBox = $$('.tx-akadmailforms-pi .frm2col-fullwidth .address select.selCountry').pick();
		var submitFieldsets = $$('.tx-akadmailforms-pi .frm2col-fullwidth fieldset.submit');
		var firstFieldset= $$('.tx-akadmailforms-pi .frm2col-fullwidth fieldset.submit')[0];
		var secondFieldset = $$('.tx-akadmailforms-pi .frm2col-fullwidth fieldset.submit')[1];

		if (!secondFieldset.getElement('p.privacy-note')) {
			var	privacyNoteCopy	= firstFieldset.getElement('p.privacy-note').clone();
			privacyNoteCopy.inject(secondFieldset).setStyle('display','none');
		}

		if ('DE' !== selBox.value) {
			secondFieldset.getElement('p.privacy-note').setStyle('display','block');
			firstFieldset.setStyle('display','none');
			$$('.tx-akadmailforms-pi .frm2col-fullwidth h1').set('text', 'Sie schicken Ihre Anfrage aus dem Ausland?');
			$$('.tx-akadmailforms-pi .frm2col-fullwidth .additionalInfo legend').set('html', 'Gerne senden wir Ihnen per Mail erste Informationen. Lassen Sie uns bitte wissen, wofür Sie sich<br />interessieren und unter welchen Bedingungen Sie ein Fernstudium im Ausland planen – wir setzen<br />uns dann gerne mit Ihnen in Verbindung.<br />&nbsp;');
		} else {
			secondFieldset.getElement('p.privacy-note').setStyle('display','none');
			firstFieldset.setStyle('display','block');

			$$('.tx-akadmailforms-pi .frm2col-fullwidth .additionalInfo textarea').removeClass('mandatory-exclamation');
			$$('.tx-akadmailforms-pi .frm2col-fullwidth .additionalInfo .txtEmail').removeClass('mandatory-exclamation');

			$$('.tx-akadmailforms-pi .frm2col-fullwidth h1').set('text', 'Sie haben konkrete Fragen?');
			$$('.tx-akadmailforms-pi .frm2col-fullwidth .additionalInfo legend').set('html', 'Wir beraten Sie gerne auch individuell. Bitte teilen Sie uns Telefonnummer und E-Mail-Adresse mit<br />und wir kontaktieren Sie persönlich.');
		}
	}
}

var tx_akadmailforms_pi_piscripts_domreadyAdded = false;

window.addEvent('domready', function() {
	if(tx_akadmailforms_pi_piscripts_domreadyAdded) return;

	tx_akadmailforms_pi_piscripts_domreadyAdded = true;

		// erste Überschrift ausblenden; gewünscht von Herrn Orth, 04.01.2010
	try {
		$$('.tx-akadmailforms-pi fieldset.choicelist.left label.choicelist-header')[0].setStyle('display','none');
	} catch(e){};


		// das Formular einblenden und den title als action setzen
	$$('.tx-akadmailforms-pi > form').each(function(elem) {
		elem.removeClass('dspn');

		if(elem.get('title') && elem.get('title').match('^http://')) {
			elem.set('action', elem.get('title'));
			elem.set('title', '');
		}
	});


		// #306: wenn Land != DE, dann Email als Pflichtfeld etc.:
	if (selbox = $$('.tx-akadmailforms-pi .frm2col-fullwidth .address select.selCountry').pick()) {
 	   if ('DE'!==selbox.value) akadmailforms.initSelLanguageDependantDisplay();
	}


	/**
	 * Jedem Input-Text-Element, das ein Sternchen enthält, die Pflichtfeldfunktionen hinzufügen
	 */
	$$('.tx-akadmailforms-pi fieldset input[title$=*]').each(function(elem) {
		elem.addClass('mandatory');
		elem.setProperty('title', elem.getProperty('title').slice(0,-1));


		elem.addEvent('focus', function(evt) {
				// in jedem Fall die Klasse für Mandatory entfernen, zur Eingabe:
			this.removeClass('mandatory');
				// ebenso die Klasse für Pflichfeldverletzung, ggf.:
			this.removeClass('mandatory-exclamation');
		});

		elem.addEvent('blur', function(evt) {
			if(''==this.value || this.value==this.getProperty('title')) {
					// kein Wert gesetzt bzw. title-Wert; jedoch Pflichtfeld, daher Pflichtfeldklasse setzen:
				this.addClass('mandatory-exclamation');
			} else {
					//ein Wert wurde gesetzt, alles OK:
			}
		});
	});


	/**
	 * Jedem Input-Text-Element im Plugin den Title als Value hinzufügen:
	 */
	$$('.tx-akadmailforms-pi fieldset input[type=text], .tx-akadmailforms-pi fieldset textarea').each(function(elem) {
			// wenn der Wert nicht bereits vorausgefüllt ist (durch piVars):
		if((!elem.value) || (elem.value == elem.getProperty('title'))) {
			elem.addClass('notfilled');
			elem.value = elem.getProperty('title');
		}

		elem.addEvent('focus', function(evt) {
			this.removeClass('notfilled');
				// wenn der Wert identisch mit dem title ist, dann Feld für Eingabe leeren:
			if(this.value==this.getProperty('title')) {
				this.value = '';
			}
		});


		elem.addEvent('blur', function(evt) {
				// wenn der Wert leer ist, dann Wert aus title zurückholen:
			if(''==this.value) {
				this.value = this.getProperty('title');
				this.addClass('notfilled');
			} else {
				this.removeClass('notfilled');
			}
		});
	});


	/**
	 * Dem Email-Textfeld die Validierung hinzufügen, sofern ein Wert angegeben wurd
	 */
	$$('.tx-akadmailforms-pi input.txtEmail').addEvent('blur', function(evt) {

		var selCountry = null;
		var isNotDe = true;
		if (selCountry = $$('.tx-akadmailforms-pi .frm2col-fullwidth .address select.selCountry').pick()) {
			var isNotDe = selCountry.value !== 'DE';
		}


		if (	(this.value != this.getProperty('title') || (selCountry && isNotDe)   )
				&& !this.value.test(/^([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})?$/i)
				) {
			this.addClass('mandatory-exclamation');
		} else {
			this.removeClass('mandatory-exclamation');
		}
	});


	/**
	 * den beiden Anrede-Radiobuttons das Event hinzufügen, beim Click die mandatory-exclamation zu entfernen
	 */
	$$('.tx-akadmailforms-pi fieldset.address-foa input.radio').addEvent('click', function(evt) {
		this.getParent('fieldset.address-foa').removeClass('mandatory-exclamation');
	});



		// Falls der User die Adresse bereits ausgefüllt hat und/oder von einer
		// Produktdetailseite kommt...
	if($('addressGiven') && $('addressGiven').value && $('productName') && $('productName').value) {
		$$('.tx-akadmailforms-pi fieldset.fs2col.address').slide('hide');
		$$('.tx-akadmailforms-pi fieldset.fs2col fieldset.choicelist').set('slide',{duration:'250'}).slide('hide').getParent().setStyle('margin', 0);
	} else {
		$$('.tx-akadmailforms-pi fieldset.static-data').slide('hide');
		$$('.tx-akadmailforms-pi fieldset.change-static-data').slide('hide');
		$$('.tx-akadmailforms-pi fieldset.interested-in').slide('hide');
		$$('.tx-akadmailforms-pi .interested-in-w-checkbox').slide('hide');
		$$('.tx-akadmailforms-pi .interested-in-w-checkbox input:checked').set('checked','');
	}

		// Event für den "Daten ändern"-Button hinzufügen:
	$$('.tx-akadmailforms-pi fieldset.change-static-data input.submit').addEvent('click', function(evt){
		$$('.tx-akadmailforms-pi fieldset.static-data').slide('out');
		$$('.tx-akadmailforms-pi fieldset.change-static-data').slide('out');
		$$('.tx-akadmailforms-pi fieldset.interested-in').slide('out');

		$$('.tx-akadmailforms-pi fieldset.fs2col.address').slide('in');
		$$('.tx-akadmailforms-pi fieldset.fs2col fieldset.choicelist').slide('show').getParent().setStyle('height', 'auto');
	});


		// Klasse für jedes LI hinzufügen, das Childs hat:
	$$('.tx-akadmailforms-pi ul.choicelist > li > ul.choicelist').getParent('li').addClass('hassub');

		// Klasse für jedes letzte UL hinzufügen, das keine weiteren ULs hat:
	$$('.tx-akadmailforms-pi ul.choicelist').each(function(elem,index){
		if(!elem.getElement('ul')) {
			elem.addClass('choicelist-innermost')
		}
	});

		// Untermenüs ausfaden:
	$$('.tx-akadmailforms-pi ul.choicelist-level-1 ul').set('slide',{duration:'100'}).slide('hide');

		// Event fürs ein/ausfaden hinzufügen:
	$$('.tx-akadmailforms-pi ul.choicelist li').addEvent('click', function(evt) {
		if(this.hasClass('hassub')) { //hat unterelemente; Ausklappen durchführen:
			if(this.hasClass('is-expanded')) {
				this.getElement('ul').slide('out');
				this.removeClass('is-expanded');
			} else {
				this.getElement('ul').slide('in').get('slide').chain(function(){

						// a.foeder@andersundsehr.com: Mail Herr Orth Do 17.02.2011 09:37;
						// >>Der Kunde wünscht nun keine Scrollbalken mehr, sondern möchte alle Produkte nach dem Aufklappen sichtbar haben.<<
						// daher wird folgendes if mittels false&& "inaktiviert":
					if (false && !this.element.getElements('ul').length && parseInt(this.wrapper.getStyle('height')) > 100) {
							// letztes UL in diesem Tree; hat > 100 Pixel höhe:
						this.wrapper.setStyles({
							'height': '100px',
							'overflow-y':'scroll'
						});
					} else {
						this.wrapper.setStyle('height', 'auto');
					}
				});
				this.addClass('is-expanded');
			}
		}

		evt.stopPropagation();
	});


		// Fehlermeldung für "Aufmerksam geworden durch" bei Auswahl ausblenden:
	$$('.tx-akadmailforms-pi .choicetrees .right input[type=radio]').addEvent('change', function() {
		if($$('.tx-akadmailforms-pi .choicetrees .right input:checked').length) {
				// mindestens ein Element ist angewählt:
			$$('span.right-choicelist-mandatory').setStyle('visibility','hidden');
		} else {
			$$('span.right-choicelist-mandatory').setStyle('visibility','visible').highlight('#ffff00');
		}
	});

		// zusätzlich dasselbe für links:
	$$('.tx-akadmailforms-pi .choicetrees fieldset.left.choicelist input[type=checkbox]').addEvent('click', function(evt) {
		if($$('.tx-akadmailforms-pi .choicetrees fieldset.left.choicelist input:checked').length
				&& $$('.tx-akadmailforms-pi .choicetrees fieldset.left.choicelist input:checked').length <= 2) {
				// mindestens ein, maximal zwei Elemente sind angewählt, alles OK:
			$$('span.left-choicelist-mandatory').setStyle('visibility','hidden');
		} else if($$('.tx-akadmailforms-pi .choicetrees fieldset.left.choicelist input:checked').length > 2) {
			$$('span.left-choicelist-mandatory').set('text','Bitte nicht mehr als zwei Produkte auswählen:').setStyle('visibility','visible').highlight('#ffff00');
			$(evt.target).set('checked', false);
			evt.stop();
		} else if(!$$('.tx-akadmailforms-pi .choicetrees fieldset.left.choicelist.choicelists_are_mandatory input:checked').length) {
			$$('span.left-choicelist-mandatory').set('text','Bitte wählen Sie einen Bereich:').setStyle('visibility','visible').highlight('#ffff00');
		}
	});




		// #306: Beim Ändern der Länderauswahl, wenn Land <> "DE", Formulardarstellung ändern:
		// es gibt zwei Absenden-Buttons, bei Auswahl <> DE soll der erste ausgeblendet werden;
		// außerdem soll ein Text eingeblendet werden und E-Mail sowie das Notizfeld Pflichtfelder werden.
	$$('.tx-akadmailforms-pi .frm2col-fullwidth .address select.selCountry').addEvent('change', function(){
		akadmailforms.initSelLanguageDependantDisplay();
	});

	$$('.tx-akadmailforms-pi .frm2col-fullwidth .additionalInfo textarea').addEvents({
		'focus': function() {
				// in jedem Fall die Klasse für Mandatory entfernen, zur Eingabe:
				// ebenso die Klasse für Pflichfeldverletzung, ggf.:
			this.removeClass('mandatory').removeClass('mandatory-exclamation');
		},

		'blur': function() {
			var selCountry = $$('.tx-akadmailforms-pi .frm2col-fullwidth .address select.selCountry').pick();

			if (selCountry && 'DE'!==selCountry.value && (''==this.value || this.value==this.getProperty('title'))) {
					// Selbox ist vorhanden und Land != DE, also FEHLER!
				this.addClass('mandatory-exclamation');
			} else {
					//ein Wert wurde gesetzt, alles OK:
			}
		}
	});

});





/**
 * Array.Extras from the Mootools More Builder
 */
Array.implement({

	min: function(){
		return Math.min.apply(null, this);
	},

	max: function(){
		return Math.max.apply(null, this);
	},

	average: function(){
		return this.length ? this.sum() / this.length : 0;
	},

	sum: function(){
		var result = 0, l = this.length;
		if (l){
			do {
				result += this[--l];
			} while (l);
		}
		return result;
	},

	unique: function(){
		return [].combine(this);
	}

});
