jQuery.fn.ignoreEnter = function() {
    this.keypress(
        function(e) {
      // get key pressed (charCode from Mozilla/Firefox and Opera / keyCode in IE)
            var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
            // allow enter/return key (only when in an input box or select)
            if (key == 13) { return false; }
        }
    )
    
    return this;
}

function Binder(eventType, selection, fn) {
	this.eventType = eventType;
	this.selection = selection;
	this.fn = fn;
	
	this.rebind = function(root) {
		var sel = $(root).find(this.selection);
		//$(sel).unbind(this.eventType, this.fn);
		$(sel).bind(this.eventType, this.fn);
	};
}

function prepareAbsendenButton(insgesamtPlausibel, eingabenVeraendert) {
	var absendenButton = $("#absenden");
	
	switch (true) {
		case insgesamtPlausibel && eingabenVeraendert:
			$(absendenButton)
			.attr('class', 'taste');
			
			doPrepareAbsenden();
			break;
		
		case !eingabenVeraendert:
			$(absendenButton)
			.attr('class', 'tasteinaktiv')
			.unbind('click')
			.bind('click', function(event) {
				event.preventDefault();
				return false;
			});
			
			break;

		case !insgesamtPlausibel:
			$(absendenButton)
			.attr('class', 'tasteinaktiv');

			doPrepareAbsenden();
			break;
	}
}

function Controller(rahmenController) {
	this.rahmenController = rahmenController;
	this.binders = new Array();
	this.zuletztFokussiert = null;
	this.counter = 0;
	
	var ctrl = this;

	this.absendenButtonAktiv = function(insgesamtPlausibel, eingabenVeraendert) {
		prepareAbsendenButton(insgesamtPlausibel, eingabenVeraendert);
	};
	
	this.verarbeiteJSONAntwort = function(json) {
		var bereichId = json.bereichId;
		var bereich = $("#" + bereichId);
		var keineFehlermeldung = false;
		
		ctrl.absendenButtonAktiv(json.insgesamtPlausibel, json.eingabenVeraendert);
		ctrl.rahmenController.setValue(bereichId, json.ok);
		
		if (json.daten != null) {
			for (var id in json.daten) {
				switch (id) {
					case "x_grundstueck_vorhanden":
					case "x_grundstueck_geplant":
					case "x_grundstueck_reserviert":
						if (
							id + "_plz" == ctrl.zuletztFokussiert ||
							id + "_ort" == ctrl.zuletztFokussiert
						) { 
							keineFehlermeldung = true;
							continue;
						}
						
						break;
						
					case "x_kontakt_ortplz":
						if (
							"postleitzahl" == ctrl.zuletztFokussiert ||
							"wohnort" == ctrl.zuletztFokussiert
						) {
							keineFehlermeldung = true;
							continue;
						}
						
						break;
					
					default:
						break;
				}
				
				var austauschBereich = $("#" + id);
				$(austauschBereich).html(json.daten[id]);
				ctrl.rebind(austauschBereich);
			}
		}
		
		if (json.fehlermeldung != null) {
			for (var id in json.fehlermeldung) {
				var bereich = $("#" + id);
				$(bereich).find("td.spalte2 div.fehler").remove();
				
				if (json.fehlermeldung[id] != null) {
					var meldungen = new Array();
					for (var meldung in json.fehlermeldung[id]) {
						var cont = false;
						
						if (keineFehlermeldung) {
							switch (meldung) {
								case "60":
								case "62":
								case "64":
								case "66":
									cont = true;
									break;
									
								default:
									break;
							}
						}
						
						if (cont) continue;
						meldungen[meldungen.length] = json.fehlermeldung[id][meldung];
					}
					
					if (meldungen.length < 1) continue;
					var fehlerHTML =
						'<p class="first">' + meldungen.join("</p><p>") + "</p>";
					$(bereich).find("td.spalte2 div.platzhalter").
						before('<div class="fehler">' + fehlerHTML + '</div>');
				}
			}
		}
	};
	
	this.fokussiert = function(feld) {
		var feldId = $(feld).attr("name");
		
		var zuletztFokussiertBereichId = this.rahmenController.getBereichId(this.zuletztFokussiert);
		var aktivFokussiertBereichId = this.rahmenController.getBereichId(feldId);
		
		if (null != this.zuletztFokussiert && zuletztFokussiertBereichId != aktivFokussiertBereichId) {
			this.eingabe($('[@name=' + this.zuletztFokussiert + ']').get(0), feldId);
		}
		this.zuletztFokussiert = $(feld).attr("name");
	};

	this.eingabe = function(feld, onFocus) {
		var feldId = $(feld).attr("name");
		var daten = "";

		var bereich = $("#" + this.rahmenController.getBereichId(feldId));
		$(bereich).find("td.spalte0 img").get(0).src = "/include/indicator.gif";
		
		switch ($(feld).attr("type")) {
			case "text":
				daten = $(feld).val();
				break;

			case "checkbox":
				daten = feld.checked;
				break;
				
			case "radio":
				var felder = $("input[@type=radio][@name=" + feldId + "]");
				$(felder).each(function(i) {
					if (this.checked) daten = $(this).val();
				});
				break;
							
			default:
				if ($(feld).is("textarea")) {
					daten = $(feld).val();
					break;
				}
				
				if ($(feld).is("select")) {
					var selectedIndex = feld.selectedIndex;
					if (selectedIndex < 1) daten = "";
					else daten = feld.options[selectedIndex].value;
					break;
				}
			
				break;	
		}
		
		// Halbwegs zufälligen Wert ermitteln, der sich in diesem Browser
		// nicht mehr wiederholen kann. Damit gehen wir sicher, dass die Anfrage
		// auch wirklich beim Server landet und nicht durch den Browsercache
		// beantwort wird
		var rnd = new Date().getTime() + "." + this.counter++;
		
		if (typeof onFocus != 'undefined') {
			$.getJSON(
				"/eingabe-center/ajax",
				{ feldId: feldId, daten: daten, rnd: rnd, onFocus: onFocus },
				this.verarbeiteJSONAntwort
			);
		} else {
			$.getJSON(
				"/eingabe-center/ajax",
				{ feldId: feldId, daten: daten, rnd: rnd },
				this.verarbeiteJSONAntwort
			);
		}
		
		return true;
	}

	this.bindToFields = function(selection, eventType, binder) {
		var ctrl = this;
		
		if (!binder)
			var binder = function() {
				ctrl.eingabe(this, false);
			};
		
		var bound = $(selection).bind(eventType, binder);
		
		var binderObj = new Binder(eventType, selection, binder);
		this.binders[this.binders.length] = binderObj;
		
		return bound;
	}
	
	this.rebind = function(root) {
		$.each(this.binders, function(idx, obj) {
			obj.rebind(root);
		});
	}
	
	this.bindToDefaultFields = function() {
		var ctrl = this;
		var defaultBinder = function(event) {
			ctrl.eingabe(this);
		};
		
		var onFocusBinder = function() {
			ctrl.fokussiert(this);
		};
	
		var cbsClick = this.bindToFields("input.eingabe[@type=checkbox]", "click", defaultBinder);
		var radios = this.bindToFields("input.eingabe[@type=radio]", "click", defaultBinder);
		var texts = this.bindToFields("input.eingabe[@type=text]", "blur", defaultBinder);
		
		$("input.eingabe[@type=text]").add("select.eingabe").ignoreEnter();
		var textareas = this.bindToFields("textarea.eingabe", "blur", defaultBinder);
		var selects = this.bindToFields("select.eingabe", "change", defaultBinder);

		var focusedInputs = this.bindToFields("input.eingabe[@type=text]", "focus", onFocusBinder);
		var focusedInputsRadio = this.bindToFields("input.eingabe[@type=radio]", "click", onFocusBinder);
		var focusedInputsCheckbox = this.bindToFields("input.eingabe[@type=checkbox]", "click", onFocusBinder);
		var focusedSelects = this.bindToFields("select.eingabe", "focus", onFocusBinder);
		var focusedTextareas = this.bindToFields("textarea.eingabe", "focus", onFocusBinder);
	}
	
	this.bindToDefaultFields();
}

// Einblendbare Menü-Erläuterungen
$(function() {
	$("div.erlaeuterung").children("p.option").each(function(i) {
		var statischeErlaeuterungen =
			$(this).parent().children("p").not(".option");
		var erlaeuterung = this;
		$(erlaeuterung).hide();
		
		var zugehoerigesLabel = $("label[@for=inp_" + $(this).attr("id") + "]");
		var sliderToVisible = function() {
			$(statischeErlaeuterungen).slideUp("fast");
			$(erlaeuterung).slideDown("fast");
		};
		
		var sliderToHidden = function() {
			$(erlaeuterung).slideUp("fast");
			$(statischeErlaeuterungen).slideDown("fast");
		};
		
		var info = $('<span style="cursor:help;color:white;font-weight:bolder;margin-left:1ex;background-color:#990000;font-size:smaller;padding:0.2ex 0.4ex;">INFO</span>')
		.hoverIntent({
			sensitivity: 1,
			interval: 600,
			over: sliderToVisible,
			timeout: 600,
			out: sliderToHidden
		});
		
		$(zugehoerigesLabel).
			append(info);
	});
});

function prepareAbsenden(url) {
	$("#absenden").unbind("click");
	$("#absenden").bind("click", function(event) {
		try {
			event.preventDefault();
	
			if (typeof document.body.style.maxHeight === "undefined") {//if IE 6
				$("body","html").css({height: "100%", width: "100%"});
				$("html").css("overflow","hidden");
			}
	
			var overlay = $('<div id="overlay"></div>')
			$("body").append(overlay);
	
			var closeOverlayFnct = function(event) {
				event.preventDefault();
				
				$("#absenden_fenster").fadeOut("normal", function() {
					$(this).remove();
					$("#overlay").remove();
	
					if (typeof document.body.style.maxHeight == "undefined") {//if IE 6
						$("body","html").css({height: "auto", width: "auto"});
						$("html").css("overflow","");
					}					
				});
			};
			
			$(overlay).bind("click", closeOverlayFnct);
			
			var rnd = new Date().getTime();
			$.get(
				url,
				{ bodyOnly: "true", rnd: rnd },
				function(data) {
					var wnd =
						$('<div id="absenden_fenster" class="cnt"></div>')
						.html(data)
						.css({marginLeft: '-' + parseInt((550 / 2),10) + 'px', width: 550 + 'px'})
						.hide();
						
						if ( !(jQuery.browser.msie && jQuery.browser.version < 7 )) { // take away IE6
							wnd.css({marginTop: '-' + parseInt((350 * (1/3)),10) + 'px'});
						}

					wnd.appendTo("body").fadeIn("normal");
					wnd.find(".close").bind("click", closeOverlayFnct);
				}
			);
		} catch(e) {
		}
	});
};
