/** -------------------------
/**  Erweiterte Element-Klasse
/** -------------------------*/
Element.extend({
	/** -------------------------
	/**  Element hervorheben
	/** -------------------------*/
	highlight: function(delay){
		var effect = new Fx.Style(this.id, 'background-color', {duration:1500});
		effect.start.pass(['#FFF661', '#FFFFFF'], effect).delay(delay);
	}
});



/** -------------------------
/**  Kleinanzeigen Klasse
/** -------------------------*/
var Advertisement = new Class({

	/** -------------------------
	/**  Kleinanzeigen initialisieren
	/** -------------------------*/
	initialize: function(options){
		this.options = options;
		
		// Vorschau anzeigen
		$('preview').setStyle('display', 'block');
		
		// Kontodaten verstecken und Effekte vorbereiten
		$('bezahlung').FX = {};
		$('bezahlung').FX.slide = new Fx.Slide('bezahlung');
		$('bezahlung').FX.opac  = new Fx.Style('bezahlung', 'opacity');
		$('bezahlung').FX.slide.hide();
		$('bezahlung').FX.opac.hide();

		// Event zur Kategorieauswahl hinzufuegen
		$('cat').addEvent('change', function(e){ this.updatePayment(); }.bind(this));
		$('title').addEvent('keyup', function(e){ this.updateHeadline(); }.bind(this));
		
		// Vorschau vorbereiten und updaten
		this.createPreview();
		this.updateHeadline();
		this.updatePreview();
	},
	
	/** -------------------------
	/**  Bezahlung updaten
	/** -------------------------*/
	updatePayment: function() {
		// Wert der Anzeigenkategorie holen
		var value = $('cat').getValue();
		
		if(value == '' || value == 'Stellensuche' || value == 'Stellenangebote') 
		{ // Kostenlose Option ausgewählt
			if($('bezahlung').getStyle('visibility') != 'hidden') {
				this.options.freeAd = true;
				$('bezahlung').FX.slide.slideOut();
				$('bezahlung').FX.opac.start(1, 0);
			}
		} 
		else 
		{ // Kostenpflichtige Option ausgewählt
			if($('bezahlung').getStyle('visibility') != 'visible') {
				this.options.freeAd = false;
				$('bezahlung').FX.slide.slideIn();
				$('bezahlung').FX.opac.start(0, 1);
				$('bezahlung').highlight(500);
			}
		}
		
		// Vorschau updaten
		this.updatePreview();
	},
	
	/** -------------------------
	/**  Überschrift updaten
	/** -------------------------*/
	updateHeadline: function() {
		if(!$('preview-headline') || !$('title')) return;
		var headline = $('title').getValue().trim().length > 0 ? $('title').getValue().trim() : 'Überschrift';
		$('preview-headline').empty().setHTML(headline);
	},
	
	/** -------------------------
	/**  Vorschau erstellen
	/** -------------------------*/
	createPreview: function(){
		//if(!$('preview')) return false;
		this.listItems = [];
		
		// Listitems entsprechend der maximalen Zeilen erstellen
		for(var i=1; i <= this.options.maxRows; i++) {
			this.listItems[i] = new Element('li', {
				'id': 'preview-row-'+i,
				'styles': {'display': (i > this.options.minRows ? 'none' : '')}
			});
			this.listItems[i].setHTML('<span> </span>');
			$('preview-rows').adopt(this.listItems[i]);
		}
		
		// Dem Textfeld ein keyup-Event hinzufügen
		$('text').addEvent('keyup', function(e){ this.updatePreview(); }.bind(this));
	},
	
	/** -------------------------
	/**  Vorschau updaten
	/** -------------------------*/
	updatePreview: function(){
		this.letters  = 0;
		this.currRow  = 0;
		this.words    = $('text').getValue().split(' ');
		this.rows     = [];
		this.list     = '';
		this.rowsObj  = {0: []};
		
		// Zeilen und Wörter trennen
		this.words.each(function(word, index){
			if(word.trim().length > 0) {
				var rowLength = this.rowsObj[this.currRow].join(' ').length;
				if(rowLength+word.length < this.options.lettersPerRow) 
				{ // Wort passt in die aktuelle Zeile
					this.rowsObj[this.currRow].push(word.trim());
				} 
				else 
				{ // Wort passt nicht in die aktuelle Zeile
					this.currRow += 1;
					this.rowsObj[this.currRow] = [];
					this.rowsObj[this.currRow].push(word);
				}
			}
		}, this);
		
		// Zeilen zusammenbauen
		$each(this.rowsObj, function(val, key) {
			if(key < this.options.maxRows) {
				var thisRow = val.join(' ').trim();
				this.letters += thisRow.length;
				this.rows.push(thisRow);
			}
		}, this);
		
		// Anzuzeigende Zeilen berechnen
		if(this.rows.length < this.options.minRows) {
			this.dispRows = this.options.minRows;
		}
		else if(this.rows.length < this.options.maxRows) {
			this.dispRows = this.rows.length+1;
		} else {
			this.dispRows = this.options.maxRows;
		}
		
		// Momentan angezeigt Zeilen ermitteln 
		if(!$defined(this.visibleRows)) {
			this.visibleRows = this.dispRows;
		}
		
		// Sichtbare Zeilen durchgehen
		for(var i=1; i <= this.visibleRows; i++) {
			if(i <= this.dispRows) 
			{ // Zeile sichtbar machen und Inhalt updaten
				this.listItems[i].setStyle('display', '');
				this.listItems[i].empty().setHTML('<span>'+(this.rows[i-1] ? this.rows[i-1] : '')+'</span>');
			} 
			else 
			{ // Zeile verstecken und Inhalt löschen
				this.listItems[i].setStyle('display', 'none');
				this.listItems[i].empty();
			}
		}

		// Angezeigte Zeilen erneut ermitteln
		this.visibleRows = this.dispRows;

		// Preis kalkulieren
		this.cost = (this.options.costPerRow * (this.rows.length > this.options.minRows ? this.rows.length : this.options.minRows)).toFloat();

		// Informationen für den Benutzer updaten
		$('preview-info-letters').empty().setHTML(this.letters);
		$('preview-info-maxrows').empty().setHTML(this.options.maxRows);
		$('preview-info-rows').empty().setHTML(this.rows.length < this.options.minRows ? this.options.minRows : this.rows.length);
		$('preview-info-cost').empty().setHTML(this.options.freeAd ? 'kostenlos' : this.cost+',- Euro');
	}
});


/** -------------------------
/**  Glossar
/** -------------------------*/
var Glossary = new Class({
	/** -------------------------
	/**  Initialisieren
	/** -------------------------*/
	initialize: function(parent, options) {
		if(!$(parent)) return false;
		this.parent   = $(parent);
		this.letters  = [];
		this.glossary = {};
		this.options = options;

		$('glossary').addClass('dynamic');

		// Tabellen durchgehen
		$$('div#glossary div').each(function(el, i) {
			var table = el.getElementsByTagName('table')[0];
			var letter = el.id.replace(/glossary-(.*)/i, '$1');
			this.letters.include(letter);
			
			// Effekte definieren
			el.FX1 = new Fx.Slide(el, {duration: 500});
			el.FX2 = new Fx.Style(el, 'opacity', {duration: 500});
			if(i > 0) {
				el.FX1.hide();
				el.FX2.set(0);
			}

			// Zeilen durchgehen
			$each(table.getElementsByTagName('tr'), function(tr){
				var tds = $A(tr.getElementsByTagName('td'));
				
				if(tds.length == 4) 
				{ // Neuer Bereich
					currentArea = tds[0].innerHTML;
					if(!this.glossary[letter]) this.glossary[letter] = {};
					this.glossary[letter][currentArea] = [];
					this.glossary[letter][currentArea].include({
						'name': tds[1].innerHTML,
						'tel':  tds[2].innerHTML,
						'mail': tds[3].innerHTML
					});
				}
				else if(tds.length == 3) 
				{ // Gehoert zum vorherigen Bereich
					this.glossary[letter][currentArea].include({
						'name': tds[0].innerHTML,
						'tel':  tds[1].innerHTML,
						'mail': tds[2].innerHTML
					});
				}
			}, this);
		}, this);

		// Navigation durchgehen
		$$('#glossary-navi a').each(function(el, i)
		{ // Event zu jedem Navigationspunkt hinzufügen
			el.addEvent('click', function(event){
				var letter = el.href.replace(/(.*)#glossary-(.*)/i, '$2');
				this.toLetter(letter);
				event.preventDefault();
			}.bind(this));
		}, this);

		// Event zum Suchgeld hinzufuegen
		$('glossary-search-keyword').addEvent('keyup', function(){
			this.lookUp($('glossary-search-keyword').getValue());
		}.bind(this));

		// Zum ersten Buchstaben springen
		this.toLetter(this.letters[0]);
	},
	
	/** -------------------------
	/**  Zu einem Buchstaben springen
	/** -------------------------*/
	toLetter: function(letter) {
		if(letter == this.currentLetter) return false;
		
		if(letter != 'RESULTS') $('glossary-search-keyword').value = '';
		
		// Neues und altes Element holen
		var newEl = $('glossary-'+letter);
		var oldEl = $('glossary-'+this.currentLetter);

		if(oldEl) 
		{ // Altes Element ausblenden
			oldEl.FX2.start(1, 0);
			oldEl.FX1.hide.pass([], oldEl.FX1).delay(500);
			
			// Aktiv-Klasse vom alten Navigationspunkt entfernen
			if($('glossary-navi-'+this.currentLetter)) {
				$('glossary-navi-'+this.currentLetter).removeClass('active');
			}
		}
		
		// Neues Element einblenden
		newEl.FX1.slideIn();
		newEl.FX2.start(0, 1);
	
		// Aktiv-Klasse zum neien Navigationspunkt hinzufügen
		if($('glossary-navi-'+letter)) {
			$('glossary-navi-'+letter).addClass('active');
		}
		
		// Aktuelles Element setzen
		this.currentLetter = letter;
	},
	
	/** -------------------------
	/**  Glossar durchsuchen
	/** -------------------------*/
	lookUp: function(keyword) {
		this.results = [];
		var keyword = keyword.trim();
		
		if(keyword.length > 2) 
		{ // Keyword ist laenger als zwei Zeichen
			$each(this.glossary, function(areas, letter){
				$each(areas, function(persons, area){
					$each(persons, function(person){
						if(area.test(keyword, 'i') || person.name.test(keyword, 'i') || person.tel.test(keyword, 'i')) {
							this.results.push({'area': area, 'name': person.name, 'tel': person.tel, 'mail': person.mail});
						}
					}.bind(this));
				}.bind(this));
			}.bind(this));
			
			// Ergebnisse anzeigen
			this.showResults();
		}
	},
	
	/** -------------------------
	/**  Suchergebnisse anzeigen
	/** -------------------------*/
	showResults: function() {
		var tbody = new Element('tbody');
		$$('#glossary-RESULTS tbody')[0].replaceWith(tbody);
	

		if(this.results.length > 0) 
		{ // Mindestens ein Suchergebnise
			this.results.each(function(obj, i)
			{ // Tabellenzeilen erstellen
				var tr = new Element('tr', {'class': (i%2 ? 'even' : 'odd')});
				tr.adopt(new Element('td').setHTML(obj.area));
				tr.adopt(new Element('td').setHTML(obj.name));
				tr.adopt(new Element('td').setHTML(obj.tel));
				tr.adopt(new Element('td').setHTML(obj.mail));
				tbody.adopt(tr);
			});
			
			var desiredHeight = $$('#glossary-RESULTS table')[0].getSize().size.y;
			$('glossary-RESULTS').setStyle('height', desiredHeight);
			$('glossary-RESULTS').parentNode.setStyle('height', desiredHeight);
		} 
		else 
		{ // Keine Ergebnisse, Fehlermeldung anzeigen
			var tr = new Element('tr', {'class': 'odd'});
			tr.adopt(new Element('td', {'colspan': 4}).setHTML('Keine Suchergebnisse'));
			tbody.adopt(tr);
		}
		
		// Suchergebnisse anzeigen
		this.toLetter('RESULTS');
	}
});



/** -------------------------
/**  Google Maps Klasse
/** -------------------------*/
var GoogleMap = new Class({
	initialize: function(container, address) {
		if (GBrowserIsCompatible()) 
		{ // Browser ist kompatibel mit Google Maps
			// Karteninstanz erstellen
			var map = new GMap2($(container));
			map.addControl(new GSmallMapControl());
			map.addControl(new GMapTypeControl());
			
			// Adresse finden
			var geocoder = new GClientGeocoder();
			geocoder.getLatLng(address, function(point) {
					if(point)
					{ // Adresse wurde gefunden
						map.setCenter(point, 13);
						var marker = new GMarker(point);
						map.addOverlay(marker);
					}
					else
					{ // Adresse wurde nicht gefunden
						$(container).empty().setStyle('display', 'none');
					}
				}
			 );
		}
	}
});



/** -------------------------
/**  Window event
/** -------------------------*/
window.addEvent('domready', function(){
	$$('body').addClass('javascript');
	// JavaScript-Hinweis ausblenden, falls vorhanden
	if($('no-javascript')) $('no-javascript').setStyle('display', 'none');
});

