/**
 * JavaScript functions for use akadmailform plugin.
 *
 * @author a.foeder@iveins.de
 * @package TYPO3
 * @subpackage akadmailforms
 */

var akadmailforms = {
	formSubmit: function(formElem) {
		var ret = true;


		var highlightColl = [];

			// Eingabefelder auf Ausgefülltheit prüfen:
		$$('.tx-akadmailforms-pi .mandatory, .tx-akadmailforms-pi .mandatory-exclamation').each(function(elem, index){
			if(''==elem.value || elem.value==elem.getProperty('title')) {
				highlightColl.extend([elem]);
			}
		});

			// Spezialfall: Email prüfen:
		$$('.tx-akadmailforms-pi input.txtEmail').each(function(elem, index){
			if(elem.value!=elem.getProperty('title') && !elem.value.test(/^([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})?$/i)) {
				highlightColl.extend([elem]);
			}
		});

			// Spezialfall: Herr/Frau prüfen:
		if(!$$('.tx-akadmailforms-pi fieldset.address-foa input.radio:checked').length) {
			highlightColl.extend($$('.tx-akadmailforms-pi fieldset.address-foa'));
		}


		// Spezialfall: Sprachtest-Auswahl prüfen:
		if($$('.tx-akadmailforms-pi fieldset.langtest-sel').length) {
			if($$('.tx-akadmailforms-pi fieldset.langtest-sel input:checked').length) {
				return true;
			} else {
				highlightColl.extend($$('.tx-akadmailforms-pi fieldset.langtest-sel'));
			}
		}



		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($$('.tx-akadmailforms-pi .choicetrees .right.choicelists_are_mandatory').length && !$$('.tx-akadmailforms-pi .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($$('.tx-akadmailforms-pi .choicetrees fieldset.left.choicelist.choicelists_are_mandatory').length && !$$('.tx-akadmailforms-pi .choicetrees fieldset.left.choicelist.choicelists_are_mandatory input:checked').length) {
				ret = false;
				$$('span.left-choicelist-mandatory').setStyle('visibility','visible').highlight('#ffff00');
			}
		//}


		$(formElem).getElement('#formData').value = JSON.encode(this.collectFormData());



			// 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');
			});
		}

		return ret;
	},

	collectFormData: function() {
		var ret = $H();

			// leeres Array für die Auswahllisten initialisieren
		ret.set('choicelists', []);

		$$('.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')]);

				inputElem.getParents('ul').getParents('li').flatten().unique().each(function(li_item) {
					tempCollectHash[index].include(li_item.getFirst('input').value+'::'+li_item.getFirst('input').get('title'));
				});
			});

			ret.choicelists.push(tempCollectHash);
		});

		/* 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;
	}
}


window.addEvent('domready', function() {
		// 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', '');
		}
	});


	/**
	 * 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.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').each(function(elem) {
		elem.addEvent('blur', function(evt) {

			if(this.value!=this.getProperty('title') && !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');
	} 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')
		}
	});

		// ab zweiter Ebene für jedes letzte LI den border entfernen:
	$$('.tx-akadmailforms-pi ul.choicelist-level-2 li:nth-child(last)').setStyle('border-bottom', '0 none');

		// 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(){
					if(!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('change', function() {
		if($$('.tx-akadmailforms-pi .choicetrees fieldset.left.choicelist input:checked').length) {
				// mindestens ein Element ist angewählt:
			$$('span.left-choicelist-mandatory').setStyle('visibility','hidden');
		} else {
			$$('span.left-choicelist-mandatory').setStyle('visibility','visible').highlight('#ffff00');
		}
	});

});





/**
 * 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);
	}

});