/**
 * Configuration:
 */
var config = {
	googlemaps: {
		locations: {
			muenchen: {
				latitude: 48.146661,
				longitude: 11.562483,
				zoomlevel: 15
			},
			berlin: {
				latitude: 52.523774,
				longitude: 13.402612,
				zoomlevel: 15
			},
			hamburg: {
				latitude: 53.552330,
				longitude: 9.994383,
				zoomlevel: 15
			}
		},
		defaultlocation: 'muenchen'
	},
	swfobject: {
		full: {
			width: 990,
			height: 346
		},
		home: {
			width: 777,
			height: 607
		}
	},
	TableToggler: {
		duration: 1000
	}
};


/**
 * Formular helpers.
 */
var Formulars = new function() {

	/**
	 * Initializes formular helpers.
	 */
	this.initialize = function() {
		registerTextTogglers();
	};

	/**
	 * Search all input elements having the class js-texttoggler and register
	 * functions to toggle the default description text.
	 */
	var registerTextTogglers = function() {
		$$('input.js-texttoggler').each(function(element) {

			element.addEvent('click', function(e) {
				this.value = '';
			});

			element.addEvent('blur', function(e) {
				if(this.value == '') {
					this.value = this.defaultValue;
				} else {
					this.removeEvents('click');
					this.removeEvents('blur');
				}
			});

		});
	};

}();



/**
 * Mouseover effects in navigation lists.
 */
var Navigation = new function() {

	/**
	 * Initializes the effects.
	 */
	this.initialize = function() {
		registerImageTogglers();
	};

	/**
	 * Register effect events.
	 */
	var registerImageTogglers = function() {
		$$('.js-navigation-hover a').each(function(element) {

			element.addEvent('mouseover', function(e) {
				var img = $(this.getElementsByTagName('img')[0]);
				if(typeof img.getData('image_passive') == 'undefined') {
					img.setData('image_passive', img.src);
				}
				img.set('src', img.getData('image_active'));
				//new Pngfix({elements: [img]});
			});

			element.addEvent('mouseout', function(e) {
				var img = $(this.getElementsByTagName('img')[0]);
				img.set('src', img.getData('image_passive'));
				//new Pngfix({elements: [img]});
			});

		});
	};

}();



/**
 * Toggles table rows.
 */
var TableToggler = new function() {

	var opened_tr_detail = null;

	/**
	 * Initialize toggler.
	 */
	this.initialize = function() {
		registerEvents(window.document);
	};

	var registerEvents = function(area) {
		area.getElements('.js-togglemessage-open').each(function(element) {
			element.addEvent('click', openEvent);
		});
		area.getElements('.js-togglemessage-close').each(function(element) {
			element.addEvent('click', closeEvent);
		});
		area.getElements('.js-open').each(function(element) {
			element.addEvent('click', function(e) {
				if($$('.js-togglemessage-open')) {
					open(this.getElement('.js-togglemessage-open'));
				}
			});
		});
	};

	/**
	 * Shows the news detailtext.
	 * Preloads the text first, if it is currently not available.
	 *
	 * Note: "this" is the element where the event is attached.
	 */
	var openEvent = function(e) {
		e.stop();
		open(this);
	};
	var open = function(link) {
		if(opened_tr_detail !== null) {
			showTeaser({'for': opened_tr_detail});
		}

		var tr_detail = $(link.getData('for'));
		opened_tr_detail = tr_detail;

		if(tr_detail.getData('loaded')) {
			showDetails(link.getData());
		} else {
			var request = new Request({
				url: link.href,
				method: 'get'
			});
			request.send();
			request.addEvent('success', function(html) {
				tr_detail.set('html', html);
				tr_detail.setData('loaded', true);

				tr_detail.getElements('.js-togglemessage-close').each(function(new_link) {
					new_link.setData('for', tr_detail.get('id'));					
					new_link.addEvent('click', closeEvent);
				});

				showDetails(link.getData());
			});
		}
	};

	/**
	 * Hides the news detailtext.
	 *
	 * Note: "this" is the element where the event is attached.
	 */
	var closeEvent = function(e) {
		e.stop();
		showTeaser(this.getData());
	};

	/**
	 * Activates teasertext and hiddens detailtext.
	 */
	var showTeaser = function(data) {
		var tr_detail = $(data['for']);
		setInvisible(tr_detail);
		setVisible($(tr_detail.getData('teaser')));
		opened_tr_detail = null;
	};

	/**
	 * Activates detailtext and hiddens teasertext.
	 */
	var showDetails = function(data) {
		var tr_detail = $(data['for']);
		setVisible(tr_detail);
		setInvisible($(tr_detail.getData('teaser')));
		Mediabox.scanPage();
	};

	/**
	 * Sets an tr element visible.
	 */
	var setVisible = function(element_tr) {
		addDivsForAnimation(element_tr, true);

		/*if(Browser.Engine.trident && Browser.Engine.version <= 5) {
			// <= IE7:
			element_tr.setStyle('display', 'block');
		} else {
			element_tr.setStyle('display', 'table-row');
		}*/
		element_tr.setStyle('position', 'static');
		element_tr.setStyle('overflow', 'visible');

		element_tr.getElements('.js-table-toggler').each(function(element) {
			var div_inner = element.getElement('.js-table-toggler-inner');
			var height = parseInt(div_inner.getStyle('height'));
			height += parseInt(div_inner.getStyle('padding-top'));
			height += parseInt(div_inner.getStyle('padding-bottom'));

			var tween = new Fx.Tween(element, {duration: config.TableToggler.duration});
			tween.start('height', height);
		});
	};

	/**
	 * Sets an tr element invisible.
	 */
	var setInvisible = function(element_tr) {
		addDivsForAnimation(element_tr, false);

		element_tr.getElements('.js-table-toggler').each(function(element) {
			var tween = new Fx.Tween(element, {duration: config.TableToggler.duration});
			tween.start('height', 0);
			tween.addEvent('complete', function() {
				element_tr.setStyle('position', 'absolute');
				element_tr.setStyle('overflow', 'hidden');
				element_tr.setStyle('clip', 'rect(0 0 0 0)');
			});
		});
	};

	var addDivsForAnimation = function(element_tr, closed) {
		var reregister_events = false;

		element_tr.getElements('td').each(function(td, index) {
			if(!td.getFirst('.js-table-toggler')) {
				var html = '<!-- js-table-toggler and js-table-toggler-inner added by javascript -->';
				html += '<div class="js-table-toggler"><div class="js-table-toggler-inner">';
				html += td.innerHTML;
				html += '</div></div>';
				td.innerHTML = html;

				var div_outer = td.getElement('.js-table-toggler');
				div_outer.setStyle('overflow', 'hidden');
				if(closed) {
					div_outer.setStyle('height', '0');
				}

				var div_inner = td.getElement('.js-table-toggler-inner');
				div_inner.setStyle('padding-top', td.getStyle('padding-top'));
				td.setStyle('padding-top', 0);
				div_inner.setStyle('padding-bottom', td.getStyle('padding-bottom'));
				td.setStyle('padding-bottom', 0);

				reregister_events = true;
			}
		});

		if(reregister_events) {
			// Reregister events:
			registerEvents(element_tr);
		}
	};
}();



/**
 * SwfVideoPlayer helper functions.
 */
var Videoplayers = new function() {

	/**
	 * Initializes videoplayers.
	 */
	this.initialize = function() {
		if($$('.js-flashplayer').length > 0) {
			reloadSwfObject(bindSwfObject);
		}
	};

	/**
	 * Reloads the swfobject javascript code if needed.
	 */
	var reloadSwfObject = function(callback) {
		var request = new Request({
			url: rootpath + '/js/swfobject.js',
			method: 'get',
			evalResponse: true
		});
		request.send();
		request.addEvent('success', callback);
	};

	/**
	 * Replace the placeholders with videoplayers.
	 */
	var bindSwfObject = function() {
		$$('.js-flashplayer').each(function(element) {

			var location = "";
			var locationData = config.swfobject[element.getData('location')];
			var xmlData = element.getData('xml');
			var language = element.getData('language');
			var height = element.getData('height');

			// zur übergabe ans embedSWF
			var flashvars = {};
			var params = { allowFullscreen: true,
							wmode: "transparent"};
			var attributes = {};

			// wenn undefined, dann keyvisual, sonst home mit 607 pixel hoehe
			if (typeof locationData == 'undefined') {
				locationData = config.swfobject.full;
			} else {
				location = element.getData('location');
				if (location == "home") height = 607;
			}

			if (typeof xmlData != 'undefined') {
				flashvars.xmlURL = xmlData;
			}
			if (typeof language != 'undefined') {
				flashvars.lang = language;
			}

			swfobject.embedSWF(element.getData('swf'), element.id, locationData.width, height, "9.0.0", false, flashvars, params, attributes);
		});
	};
}();



/**
 * Shows Google Maps on contact page.
 *
 * Its impossible to reload the Google Maps API if needed,
 * because they uses "document.write".
 */
var GoogleMaps = new function() {

	/**
	 * Initializes Google Maps.
	 */
	this.initialize = function() {
		if($$('.js-google-maps').length > 0) {
			bindGoogleMaps();
		}
	};

	/**
	 * Replace the placeholders with Google Maps.
	 */
	var bindGoogleMaps = function() {
		if(GBrowserIsCompatible()) {
			$$('.js-google-maps').each(function(element) {
				var map = new GMap2(element);
				var locationname = element.getData('location');
				if(!locationname) {
					locationname = config.googlemaps.defaultlocation;
				}
				var location = config.googlemaps.locations[locationname];
				map.setCenter(
					new GLatLng(location.latitude, location.longitude),
					location.zoomlevel
				);
				map.addOverlay(new GMarker(
					new GLatLng(location.latitude, location.longitude)
				));
			});
		}
	};

}();



/**
 * Toggles locations in contact page.
 */
var LocationToggler = new function() {

	/**
	 * Initializes the location toggler.
	 */
	this.initialize = function() {
		$$('.js-locationtoggler').addEvent('change', function() {
			showLocation(this.getChildren('option[selected]').get('id'));
		});
	};

	/**
	 * Does the dirty work.
	 */
	var showLocation = function(locationname) {
		$$('.js-location').setStyle('display', 'none');
		$$('.js-location-' + locationname).setStyle('display', 'block');
	};

}();


var ImageToggler = new function() {

	this.initialize = function() {
		var toggle = function() {
			if(this.getData('logo2') != '') {
				var logo2 = this.get('src');
				this.set('src', this.getData('logo2'));
				this.setData('logo2', logo2);
			}
		};
		$$('img.js-image-toggler').addEvent('mouseover', toggle);
		$$('img.js-image-toggler').addEvent('mouseout', toggle);
	};

}();


window.addEvent('domready', function() {
	Formulars.initialize();
	Navigation.initialize();
	TableToggler.initialize();
	Videoplayers.initialize();
	GoogleMaps.initialize();
	LocationToggler.initialize();
	ImageToggler.initialize();
});



/**
 * Extend Elements by functions to retrieve element specific data.
 */
var _elementdata = {};

Element.implement({
	setData: function(key, value) {
		if(typeof _elementdata[this.id] == 'undefined') {
			_elementdata[this.id] = {};
		}
		_elementdata[this.id][key] = value;
	},

	getData: function(key) {
		if(key && typeof _elementdata[this.id] != 'undefined') {
			return _elementdata[this.id][key];
		} else {
			return _elementdata[this.id];
		}
	}
});
