/*
 * Copyright (c) 2008 FIZON GmbH
 * All rights reserved.
 *
 * $Id: termin.js 2277 2008-10-23 10:17:22Z as $
 */

Termin = function()
{
	var thisObj		= this;

	this.popup;
	this.form		= {};
	this.selectTs	= 0;
	//this.selectRaum;
	this.wiederhollungen = [];
	this.editTermin = false;


	/**
	 * construct()
	 */
	this.construct = function()
	{
		if (typeof Termin.SingletonObj == 'undefined')
			Termin.SingletonObj = this;

		this.popup = new PPopup('Neuer Eintrag', 'termin', 560, 500, 200);
	}


	/**
	 * edit()
	 */
	this.edit = function(id, ts)
	{
		this.editTermin = this.getTerminValues(id);
		this.selectTs = (ts) ? ts : this.editTermin.start;

		this.popup.title('Eintrag bearbeiten: '+this.editTermin.betreff+
				' ('+this.editTermin.haus_name+'; '+this.editTermin.raum_name+')');
		this.popup.contentUrl = 'ppopup.php?popup=termin&id='+id;
		this.popup.display(true);
		this.popup.load(Termin.InitForm);
	}


	/**
	 * create()
	 */
	this.create = function(ts, raum)
	{
		this.editTermin = false;
		this.selectTs = ts;
		//this.selectRaum = raum;

		this.popup.title('Neuen Eintrag');
		this.popup.display(true);
		this.popup.contentUrl = 'ppopup.php?popup=termin&ts='+ts+'&r='+raum;
		this.popup.load(Termin.InitForm);
	}


	/**
	 * getTerminValues()
	 */
	this.getTerminValues = function(id)
	{
		var termin = new PGet({value:'termin', id:id});
		return termin.values;
	}


	/**
	 * initForm()
	 */
	this.initForm = function()
	{
		var form = this.popup.contentDiv.getElement('form');
		var rv, name, element, attribute, start;

		form.setAttribute('onsubmit', 'return false;');
		form.setAttribute('action', 'ppost.php');
	
		/*
		 * Form-Ellemente sammeln und mit Attributen versehen
		 */	
		for (var i = 0; i < form.elements.length; i++) {
			if (form.elements[i].name == null)
				continue;

			if (! (rv = /^tn\[([a-z_]*)\]$/.exec(form.elements[i].name)))
				continue;
			name = rv[1];

			element = this.form[name] = form.elements[i];
			attribute = element.type == 'submit' ? 'onclick' : 'onchange';
			element.setAttribute(attribute, 'Termin.Change("'+name+'")');

		}

		this.iniTimes();
	}

	/**
	 * iniTimes()
	 */
	this.iniTimes = function()
	{
		var selectTs = this.form.start.options.length > 0 
			? this.form.start.getSelected()[0].value
			: this.selectTs;

		/*
		 * startliste aufbauen und setzen
		 */
		var freieZeiten = new PGet({value:'freie_intervalle',
				key:this.form.raum.getSelected()[0].value+','+selectTs+','+this.form.id.value});
		freieZeiten = freieZeiten.lines;

		this.form.start.options.length = 0;
		this.form.start.value = null;

		for (var i = 0; i < freieZeiten.length; i++)
			this.form.start.options[i]
				= new Option(date('H:i \\U\\h\\r', freieZeiten[i]), freieZeiten[i]);

		/* den letzen muessen wir ausbldenden,
	 	 * da diese Zeit nur als "bis"-feld gesetzt werden kann. */
		this.form.start.options[this.form.start.options.length-1].style.display = 'none';

		this.setStart(this.editTermin ? this.editTermin.start : selectTs);

		/*
		 * zu bearbeitender Termin
		 */
		if (this.form.id.value > 0) {
			/* felder-werte setzen */
			this.setBis(this.editTermin.bis);
			this.setKat(this.editTermin.kat);
			this.setBetreff(this.editTermin.betreff);
			this.setText(this.editTermin.text);

			/* wiederhollungen */
			var wiederhollungen = new PGet( {value:'wiederhollungen', id:this.editTermin.id} );

			this.wiederhollungen.length = 0;

			for (var i = 0; i < wiederhollungen.lines.length; i++) {
				var tmp = wiederhollungen.lines[i].split(',');

				this.wiederhollungen[i] = {start: tmp[0], bis: tmp[1], raum: tmp[2]}
			}

			var anzahl = wiederhollungen.lines.length;
			for (var i = 0; i < this.form.anzahl.options.length; i++) {
				if (this.form.anzahl.options[i].value == anzahl)
					this.form.anzahl.options[i].selected = true;
			}
			
			for (var i = 0; i < this.form.wiederhollung.options.length; i++) {
				if (this.form.wiederhollung.options[i].value == this.editTermin.wiederhollung)
					this.form.wiederhollung.options[i].selected = true;
			}

			this.sucheWiederhollungen();
			this.wiederhollungenAnzeigen();

			if (this.editTermin.rechte < 1) {
				this.form.speichern.style.display = 'none';
				this.form.loeschen.style.display = 'none';
			}
		}
		// Neuer termin
		else {
			this.form.loeschen.style.display = 'none';
		}
	}


	/**
	 * change()
	 */
	this.change = function(name)
	{
		method = 'change' + name[0].toUpperCase() + name.substring(1, name.length);
		if (typeof this[method] != 'function')
			return false;

		return this[method]();
	}


	/**
	 * set()
	 */
	this.set = function(name, value)
	{
		method = 'change' + name[0].toUpperCase() + name.substring(1, name.length);
		if (typeof this[method] != 'function')
			return false;

		return this[method](value);
	}


	/**
	 * changeStart()
	 */
	this.changeStart = function()
	{
		/* alter "termin bis"-Wert sichern */
		var oldBis = this.form.bis.value;

		/* bis und laenge select-listen resetten */
		for (var i = 0; i < this.form.bis.options.length; i++) {
			this.form.bis.options[i] = null;
			this.form.laenge.options[i] = null;
		}
		this.form.bis.value = null;
		this.form.laenge.value = null;

		/* Select-Listen bis und laenge neu aufbauen,
		 * ein Wert nach dem Start wert des Termins */
		var i = 0;
		for (var j = this.form.start.selectedIndex + 1; j < this.form.start.options.length; j++) {
			var text = this.form.start.options[j].text;
			var value = this.form.start.options[j].value;

			this.form.bis.options[i] = new Option(text, value);
			this.form.laenge.options[i] =
				new Option((value - this.form.start.value) / 60 + ' Minuten', value);

			i++;
		}
			
		this.setBis(oldBis);
	}


	/**
	 * setStart()
	 */
	this.setStart = function(value)
	{
		this.setSelectList(this.form.start, value);
		return this.changeStart();
	}


	/**
	 * changeBis()
	 */
	this.changeBis = function()
	{
		this.syncSelectLists(this.form.bis, this.form.laenge);
		this.sucheWiederhollungen();
		this.wiederhollungenAnzeigen();
	}


	/**
	 * setBis()
	 */
	this.setBis = function(value)
	{
		this.setSelectList(this.form.bis, value);
		return this.changeBis();
	}


	/**
	 * changeLaenge()
	 */
	this.changeLaenge = function()
	{
		this.syncSelectLists(this.form.laenge, this.form.bis);
		this.sucheWiederhollungen();
		this.wiederhollungenAnzeigen();
	}


	/**
	 * changeRaum()
	 */
	this.changeRaum = function()
	{
		this.iniTimes();
	}

	/**
	 * setLaenge()
	 */
	this.setLaenge = function(value)
	{
		this.setSelectList(this.form.laenge, value);
		return this.changeLaenge();
	}


	/**
	 * changeKat()
	 */
	this.changeKat = function()
	{
		var farbe = PaJaH.GetResponseText('pget.php?value=katfarbe&key='+this.form.kat.value);
		this.form.kat.style.backgroundColor = '#'+farbe;
		this.form.kat.style.fontStyle = this.form.kat.value == 1 ? 'italic' : 'normal';
	}


	/**
	 * setKat()
	 */
	this.setKat = function(value)
	{
		this.setSelectList(this.form.kat, value);
		return this.changeKat();
	}

	
	/**
	 * changeWiederhollung()
	 */
	this.changeWiederhollung = function()
	{
		/* Die alten Wiederhollungen sind hinfaellig */
		this.wiederhollungen.length = 0;

		/* neue suchen mit neuen angaben */
		this.sucheWiederhollungen();
		this.wiederhollungenAnzeigen();
	}


	/**
	 * changeAnzahl()
	 */
	this.changeAnzahl = function()
	{
		/* zuviele Wiederhollungen entfernen */
		while (this.wiederhollungen.length > this.form.anzahl.value) 
			this.wiederhollungen.pop();

		this.sucheWiederhollungen();
		this.wiederhollungenAnzeigen();
	}


	/**
	 * setBetreff()
	 */
	this.setBetreff = function(value) 
	{
		this.form.betreff.value = value;
	}


	/**
	 * setText()
	 */
	this.setText = function(value) 
	{
		this.form.text.value = value;
	}


	/**
	 * setSelectList()
	 */
	this.setSelectList = function(select, value)
	{
		for (var i = 0; i < select.length; i++) {
			if (select[i].value == value) {
				select[i].selected = true;
				return true;
			}
		}
	}


	/**
	 * sucheWiederhollungen()
	 */
	this.sucheWiederhollungen = function()
	{
		/* wenn wiederhollungen nicht aktiv sind,
		 * deaktivieren wir diese und verlassen diese function */
		if (this.form.wiederhollung.value == 0)
			return true;

		for (var i = 1; i <= this.form.anzahl.value; i++) {
			var start	= new Date(this.form.start.value * 1000);
			var bis		= new Date(this.form.bis.value * 1000);
			var wh		= {raum: this.form.raum.value, start: null, bis: null};
		
			switch (this.form.wiederhollung.value) {
			case 'd':
				start.setDate( start.getDate()+i );
				wh.start = start.getTime() / 1000;
				bis.setDate( bis.getDate()+i );
				wh.bis = bis.getTime() / 1000;
				break;

			case 'w':
				start.setDate( start.getDate()+(i*7) );
				wh.start = start.getTime() / 1000;
				bis.setDate( bis.getDate()+(i*7) );
				wh.bis = bis.getTime() / 1000;
				break;

			case 'm':
				start.setMonth( start.getMonth()+i );
				wh.start = start.getTime() / 1000;
				bis.setMonth( bis.getMonth()+i );
				wh.bis = bis.getTime() / 1000;
				break;

			case 'y':
				start.setFullYear( start.getFullYear()+i );
				wh.start = start.getTime() / 1000;
				bis.setFullYear( bis.getFullYear()+i );
				wh.bis = bis.getTime() / 1000;
				break;
			}

			this.wiederhollungen[i-1] = wh;
		}
	}


	/**
	 * wiederhollungenAnzeigen()
	 */
	this.wiederhollungenAnzeigen = function()
	{

		var container = document.getElementById('tn_wiederhollungen');

		if (this.form.wiederhollung.value == 0) {
			container.style.display = 'none';
			return true;
		}

		container.style.display = '';
		container = document.getElementById('tn_wiederhollung');

		var html = '<table class="wiederhollungen">';
		html += '<tr><th>Tag</th><th>Monat</th><th>Jahr</th></tr>';

		for (var i = 0; i < this.wiederhollungen.length; i++) {
			var wh = this.wiederhollungen[i];
			var frei = this.frei(wh.raum, wh.start, wh.bis, this.form.id.value)
			
			html += '<tr class="'+ (frei ? 'frei' : 'belegt') +'">';
			html += '<td>'+date('l', wh.start)+' den '+date('j', wh.start)+'.</td>';
			html += '<td>'+date('F', wh.start)+'</td>';
			html += '<td>'+date('Y', wh.start)+'</td>';
			html += '</tr>';

			html += '<input type="hidden" name="tn[wiederhollungen]['+i+'][raum]" value="'+wh.raum+'" />';
			html += '<input type="hidden" name="tn[wiederhollungen]['+i+'][start]" value="'+wh.start+'" />';
			html += '<input type="hidden" name="tn[wiederhollungen]['+i+'][bis]" value="'+wh.bis+'" />';

		}
		html += '</table>';
		container.innerHTML = html;

		this.popup.position();
	}


	/**
	 * changeSpeichern()
	 */
	this.changeSpeichern = function()
	{
		var form = this.popup.contentDiv.getElement('form');

		/* prueffen ob der Termin schon belegt ist */
		if (! this.frei(this.form.raum.value, this.form.start.value, this.form.bis.value, this.form.id.value)) {
			PPage.ShowError('Termin', 'der Termin ist in dem Kalender leider nicht mehr frei.');
			//this.initForm();
			return false;
		}

		PaJaH.SendForm(form, thisObj.speichernFertig);
	}


	/**
	 * speichernFertig()
	 */
	this.speichernFertig = function(hr)
	{
		var result = hr.responseText.split(';', 2);
		if (result[0] > 0) {
			PPage.ShowError('Termin', result[1]);
			return false;
		}

		Termin.Hidden();
		FCAL.Get().windows.tag.load();
	}


	/**
	 * changeLoeschen()
	 */
	this.changeLoeschen = function()
	{
		PaJaH.PostRequest(
			'ppost.php', 
			{
				action:	'delete',
				id:		this.form.id.value
			}, 
			thisObj.loeschenFertig
		);
	}


	/**
	 * loeschenFertig()
	 */
	this.loeschenFertig = function(hr)
	{
		var result = hr.responseText.split(';', 2);
		if (result[0] > 0) {
			alert('Fehler: ' + result[1]);
			return false;
		}


		Termin.Hidden();
		FCAL.Get().windows.tag.load();
	}


	/**
	 * changeAbbrechen()
	 */
	this.changeAbbrechen = function()
	{
		return this.hidden();
	}


	/**
 	 * frei()
 	 */
	this.frei = function(raum, start, bis, id)
	{
		if (! id)
			id = 0;

		var result = PaJaH.GetResponseText(
			'pget.php?value=isfree&key='+raum+','+start+','+bis+','+id);
		return result > 0;
	}


	/**
	 * syncSelectLists()
	 */
	this.syncSelectLists = function(from, to)
	{
		for (var i = 0; i < to.length; i++)
			to[i].selected = (from.value == to[i].value);
		to.value = from.value;
	}


	/**
	 * hidden()
	 */
	this.hidden = function()
	{
		//if (! this.action)
		//	return true;

		return this.popup.display(false);
	}


	this.construct();
}


/**
 * Termin.Singleton
 */
Termin.Singleton = function()
{
	if (typeof Termin.SingletonObj == 'undefined')
		new Termin;
	return Termin.SingletonObj;
}


/**
 * STATIC METHODS
 */
//Termin.E = function(a1, a2) { return ( Termin.Singleton() ).e(a1, a2); }
//Termin.S = function(id) { return ( Termin.Singleton() ).s(id); }
//Termin.Create = function(a1, a2) { return ( Termin.Singleton() ).Create(a1, a2); }
Termin.InitForm = function() { return ( Termin.Singleton() ).initForm(); }
Termin.Change = function(a1) { return ( Termin.Singleton() ).change(a1); }
Termin.Hidden = function() { return ( Termin.Singleton() ).hidden(); }
