var adresscontainer = function() {

	this.objectID               = 0;
	this.idPrefix               = '';
	this.idPostfix              = '';

	this.idContainer            = 'address';
	this.idContainerNoAddress   = 'address_no_address';
	this.idContainerAddress     = 'address_address';
	this.idContainerForm        = 'address_form';

	this.parentContainer        = '';

	this.idButtonSave           = 'address_switch_save';
	this.idButtonCancel         = 'address_switch_cancel';
	this.idButtonEnter          = 'address_switch_no_address';
	this.idButtonChange         = 'address_switch_change';

	this.idDisplayHotelname     = 'address_hotel';
	this.idDisplayStreet        = 'address_street';
	this.idDisplayZip           = 'address_zip';
	this.idDisplayCity          = 'address_city';

	this.idFormHotelname        = 'address_form_hotel';
	this.idFormStreet           = 'address_form_street';
	this.idFormZip              = 'address_form_zip';
	this.idFormCity             = 'address_form_city';
	this.idFormDate             = 'datePicker';

	this.heightNoAddress        = 0;
	this.heightAddress          = 0;
	this.heightForm             = 0;

	this.validationHotelname    = {};
	this.validationStreet       = {};
	this.validationZip          = {};
	this.validationCity         = {};
	this.validationDate         = '';

	//this.ShowViewOnNoAddress	= 'address_form';
	this.ShowViewOnNoAddress	= 'address_no_address';

	this.init = function() {

		//Höhen der container festlegen
		this.heightNoAddress = $(this.getID(this.idContainerNoAddress)).getHeight();
		this.heightAddress   = $(this.getID(this.idContainerAddress)).getHeight();
		this.heightForm      = $(this.getID(this.idContainerForm)).getHeight();

		var binded_cancelAddress = this.cancelAddress.bind('',this);
		$(this.getID(this.idButtonCancel)).observe('click', binded_cancelAddress);


		var binded_enterAddress = this.enterAddress.bind('',this);
		$(this.getID(this.idButtonEnter)).observe('click', binded_enterAddress);

		var binded_saveAddress = this.saveAddress.bind('',this);
		$(this.getID(this.idButtonSave)).observe('click', binded_saveAddress);

		var binded_changeAddress = this.changeAddress.bind('',this);
		$(this.getID(this.idButtonChange)).observe('click', binded_changeAddress);

		// alle 3 container ausblenden
		$(this.getID(this.idContainerNoAddress)).setStyle({display: 'none'});
		$(this.getID(this.idContainerAddress)).setStyle({display: 'none'});
		$(this.getID(this.idContainerForm)).setStyle({display: 'none'});

		//Ist bereits eine Adresse in der Form?
		if(this.isCompleteAddress()) {
			this.form2display();
			this.switchView(this.idContainerAddress);
		} else {
			this.switchView(this.ShowViewOnNoAddress);
		}

		//Validation Hotelname
		var binded_onValid = this.onValid.bind('',this, this.getID(this.idFormHotelname));
		var binded_onInvalid = this.onInvalid.bind('',this, this.getID(this.idFormHotelname));

		this.validationHotelname = new LiveValidation(this.getID(this.idFormHotelname), {
			onValid : binded_onValid,
			onInvalid : binded_onInvalid
		});
		this.validationHotelname.add( Validate.Presence, {});

		//Validation Strasse
		var binded_onValid = this.onValid.bind('',this, this.getID(this.idFormStreet));
		var binded_onInvalid = this.onInvalid.bind('',this, this.getID(this.idFormStreet));

		this.validationStreet = new LiveValidation(this.getID(this.idFormStreet), {
			onValid : binded_onValid,
			onInvalid : binded_onInvalid
		});
		this.validationStreet.add( Validate.Presence, {});

		//Validation Ort
		var binded_onValid = this.onValid.bind('',this, this.getID(this.idFormCity));
		var binded_onInvalid = this.onInvalid.bind('',this, this.getID(this.idFormCity));

		this.validationCity = new LiveValidation(this.getID(this.idFormCity), {
			onValid : binded_onValid,
			onInvalid : binded_onInvalid
		});
		this.validationCity.add( Validate.Presence, {});

		//Validation PLZ
		var binded_onValid = this.onValid.bind('',this, this.getID(this.idFormZip));
		var binded_onInvalid = this.onInvalid.bind('',this, this.getID(this.idFormZip));

		this.validationZip = new LiveValidation(this.getID(this.idFormZip), {
			onValid : binded_onValid,
			onInvalid : binded_onInvalid
		});
		this.validationZip.add( Validate.Presence, {});

		//Validation Date
		if ($(this.getID(this.idFormDate))) {
			var binded_onValid = this.onValid.bind('',this, this.getID(this.idFormDate));
			var binded_onInvalid = this.onInvalid.bind('',this, this.getID(this.idFormDate));

			this.validationDate = new LiveValidation(this.getID(this.idFormDate), {
				onValid : binded_onValid,
				onInvalid : binded_onInvalid
			});
			this.validationDate.add( Validate.Presence , {});
			this.validationDate.add( Validate.Format   , { pattern: /[0-9]{2}.[0-9]{2}.[0-9]{4}/i } );
		}


	};

	this.onValid = function(parentThis, fieldID) {
		$(fieldID).addClassName('LV_valid_field');
	};

	this.onInvalid = function(parentThis, fieldID) {
		if (parentThis.akView() != parentThis.idContainerForm) {
			parentThis.showView(parentThis.idContainerForm);
		}

		//Fehlermeldung anzeigen
		if (!$('errorMessage').visible()) {
			$('errorMessage').appear();
		}

		$(fieldID).addClassName('LV_invalid_field');
	};

	this.destruct = function() {
		// validierungen zerstören
		this.validationHotelname.destroy();
		this.validationStreet.destroy();
		this.validationCity.destroy();
		this.validationZip.destroy();
		if (typeof(this.validationDate) == 'object') {
			this.validationDate.destroy();
		}
	};

	this.getID = function(idName) {
		return this.idPrefix+idName+this.idPostfix;
	};

	this.isCompleteAddress = function() {
		if (
			$(this.getID(this.idFormHotelname)).value &&
			$(this.getID(this.idFormStreet)).value &&
			$(this.getID(this.idFormZip)).value &&
			$(this.getID(this.idFormCity)).value
		) {
			return true;
		} else {
			return false;
		}
	};

	this.form2display = function() {
		$(this.getID(this.idDisplayHotelname)).innerHTML  = $(this.getID(this.idFormHotelname)).value;
		$(this.getID(this.idDisplayStreet)).innerHTML = $(this.getID(this.idFormStreet)).value;
		$(this.getID(this.idDisplayZip)).innerHTML    = $(this.getID(this.idFormZip)).value;
		$(this.getID(this.idDisplayCity)).innerHTML   = $(this.getID(this.idFormCity)).value;
	};

	this.display2form = function() {
		$(this.getID(this.idFormHotelname)).value  = $(this.getID(this.idDisplayHotelname)).innerHTML;
		$(this.getID(this.idFormStreet)).value = $(this.getID(this.idDisplayStreet)).innerHTML;
		$(this.getID(this.idFormZip)).value    = $(this.getID(this.idDisplayZip)).innerHTML;
		$(this.getID(this.idFormCity)).value   = $(this.getID(this.idDisplayCity)).innerHTML;
	};

	this.showView = function(view) {
		// hole Höhe
		height = this.containerHeight(view);

		// aktuelle Höhe
		akHeight = $(this.getID(this.idContainer)).getHeight();

		// Diferenz ermitteln
		var diffHeight = height-akHeight;

		//Komplette Container Höhe ermitteln
		var containerHeight = $(this.parentContainer).getHeight();

		//neue Containerhöhe berechnen
		var newContainerHeight = containerHeight+diffHeight;
		$(this.parentContainer).setStyle({height: newContainerHeight+'px'});

		// Aktuellen view ausblenden
		if (this.akView()) {
			$(this.getID(this.akView())).setStyle({display: 'none'});
		}

		// Container auf neue Höhe Stellen
		$(this.getID(this.idContainer)).setStyle({height: height+'px'});

		//neuen view einblenden
		$(this.getID(view)).setStyle({display: ''});
	};

	this.cancelAddress = function(parentThis, event) {
		parentThis.display2form();
		if (parentThis.isCompleteAddress()) {
			parentThis.switchView(parentThis.idContainerAddress);
		} else {
			parentThis.switchView(parentThis.idContainerNoAddress);
		}

		return false;
	};

	this.enterAddress = function(parentThis, event) {
		parentThis.switchView(parentThis.idContainerForm);

		return false;
	};

	this.saveAddress = function(parentThis, event) {

		// Validierung der Formularfelder erst prüfen
		var isValid = LiveValidation.massValidate( [
			parentThis.validationHotelname,
			parentThis.validationStreet,
			parentThis.validationCity,
			parentThis.validationZip
		]);
		if (isValid) {
			parentThis.form2display();
			parentThis.switchView(parentThis.idContainerAddress);
		}

		return false;
	};

	this.changeAddress = function(parentThis, event) {
		parentThis.enterAddress(parentThis);

		return false;
	};

	// genau wie switch view nur annimiert
	this.switchView = function(view) {

		// hole Höhe
		height = this.containerHeight(view);

		// aktuelle Höhe
		akHeight = $(this.getID(this.idContainer)).getHeight();

		// Diferenz ermitteln
		var diffHeight = height-akHeight;

		//Komplette Container Höhe ermitteln
		var containerHeight = $(this.parentContainer).getHeight();

		//neue Containerhöhe berechnen
		var newContainerHeight = containerHeight+diffHeight;
		$(this.parentContainer).setStyle({height: newContainerHeight+'px'});


		// Aktuellen view ausblenden
		if (this.akView()) {
			$(this.getID(this.akView())).setStyle({display: 'none'});
		}

		// Container auf neue Höhe Stellen
		var morpher = new Effect.Morph(this.getID(this.idContainer), {style: 'height: '+height+'px',  duration: 0.5});
		//neuen view einblenden
		$(this.getID(view)).setOpacity(0);
		$(this.getID(view)).setStyle({display: ''});
		new Effect.Opacity(this.getID(view), { from: 0, to: 1, duration: 0.5 });

	};

	this.akView = function() {
		if ($(this.getID(this.idContainerNoAddress)).visible()) {
			return this.idContainerNoAddress;
		} else if ($(this.getID(this.idContainerAddress)).visible()) {
			return this.idContainerAddress;
		} else if ($(this.getID(this.idContainerForm)).visible()) {
			return this.idContainerForm;
		} else {
			return false;
		}
	};

	this.containerHeight = function(view) {
		// Hole Höhe
		var height = 0;
		if (view == this.idContainerNoAddress) {
			height = this.heightNoAddress;
		} else if (view == this.idContainerAddress) {
			height = this.heightAddress;
		} else if (view == this.idContainerForm) {
			height = this.heightForm;
		}
		return height;
	};
}
