var ZS = new Class({

  initialize : function()
  {
		$$('.no_js').dispose();

		this.add_form_element_classes();
    this.add_pseudo_classes();
    this.add_pseudo_selectors();
    this.css_colorize_tables();

		this.init_overlay_label();
		this.parseLinks();
	},

	init_overlay_label : function( class_name )
	{
		/* Overlaying label-elements*/

		$$('label.overlay-label').each( function( el_label )
		{
			var el_input = $(el_label.getProperty("for"));

			if ( $defined( el_input ) ) {
				if ( "" === el_input.value ) el_label.addClass("apply");
				if ( "" !== el_input.value ) el_label.addClass("hidden");
				el_label.el_input = el_input;
				el_input.el_label = el_label;

				el_label.addEvents({
					'mouseenter': function(event) { this.el_input.addClass("hover"); },
					'mouseleave': function(event) { this.el_input.removeClass("hover"); }
				}); //addEvents

				el_input.addEvents({
					'focus': function(event) { this.el_label.addClass("hidden"); },
					'keydown': function(event) { this.el_label.addClass("hidden"); },
					'blur': function(event) { if ( "" === this.value ) this.el_label.removeClass("hidden"); }
				}); //addEvents

			}; //endif
		}); //each
	},

	parseLinks : function()
	{
		var links = [];
		var parsedURI = this._parseURI();
		var host = parsedURI.scheme+"://"+parsedURI.domain;

		var outlinks = $$('a[href^=http://]').filter(function(link){ return ! link.get('href').match(host.escapeRegExp()); }).addClass('outlink');
		var downloads = $$('a.pdf');

		links.combine(outlinks);
		links.combine(downloads);

		links.each(function(link){
			link.removeEvents('click').addEvent('click', function(event) {
				event.stop();
				window.open(this.get('href'));
				return false;
			});
		});
	},

	css_fix_auto_clear : function( class_name )
	{
		/* JS-basiertes Clearing für floating divs */

		if ( true === Browser.Engine.trident ) {
			$$('div.autoclear').each( function( el_floating )
			{
				new Element('br', {'class': "clear"}).inject(el_floating, 'bottom');
				// el_floating.removeClass("autoclear");
			}); //each
		}; //endif
	},

	css_colorize_tables : function( class_name )
	{
		/* CSS-Klassen für "gerade" Reihen hinzufügen */

		if ( false === $defined(class_name) ) class_name = "js_color";

		$$('table.' + class_name).each( function(table) {
			var tbody = table.getChildren('tbody')[0];
			if ( false === $defined(tbody) ) tbody = table;

			tbody.getElements('tr').removeClass('equal');
			tbody.getElements('tr:nth-child(2n+1)').addClass('equal');
		});
	},

	add_pseudo_classes : function()
	{
		/* Pseudo Attribute-Selector für inkompatible Browser */

		if ( Browser.Engine.trident ) {
			$$('input.text','textarea', 'li').addEvents({
				'mouseenter': function(event) { this.addClass("hover"); },
				'mouseleave': function(event) { this.removeClass("hover"); }
			}); //addEvents
		}; // endif
	},

	add_pseudo_selectors : function()
	{
		if ( firstChild = $$('div:first-child', 'fieldset:first-child', 'li:first-child', 'h1:first-child', 'h2:first-child') ) {
			firstChild.addClass("first-child");
		}; // endif
		if ( lastChild = $$('div:last-child', 'fieldset:last-child', 'li:last-child') ) {
			lastChild.addClass("last-child");
		}; // endif
	},

	add_form_element_classes : function()
	{
		/* Pseudo Attribute-Selector für inkompatible Browser */

		$$('input').each( function(el_input)
		{
			switch ( el_input.getAttribute("type") ) {
				case "reset":
				case "button":
				case "checkbox":
				case "radio":
				case "file":
				case "password":
				case "hidden":
					el_input.addClass(el_input.getAttribute("type"));
					break;
				case "submit":
					el_input.addClass("button");
					break;
				case "text" :
				default :
					el_input.addClass("text");
					break;
			}; //switch
		}); //each
	},

	/* http://forum.mootools.net/viewtopic.php?pid=21481#post-21513 */
	_parseURI : function( uri )
	{
		var bits = (window.location.href||uri).match(/^(?:([^:\/?#.]+):)?(?:\/\/)?(([^:\/?#]*)(?::(\d*))?)((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[\?#]|$)))*\/?)?([^?#\/]*))?(?:\?([^#]*))?(?:#(.*))?/);
		return (bits)
			? bits.associate(['uri', 'scheme', 'authority', 'domain', 'port', 'path', 'directory', 'file', 'query', 'fragment'])
			: null;
	}

});

window.addEvent('domready', function() { ZS = new ZS() } );