var VehicleTypeChooser = {};
VehicleTypeChooser.changed = function(changeEvent) {
	if($F(changeEvent.element()) == "*") {
		$("vendorChooser").select("select").invoke("setValue", "*");
		$("rangeChooser").select("select").invoke("setValue", "*");
		
		$("privateSellingForm").select(".input").each(function(field) {
			if(field.id != "vehicleTypeChooser") {
				field.disable();
			}
		});
	} else {
		$("vehicle").select(".input").each(function(field) {
			field.enable();
		});
		
		var component = false;
		var componentSetup = false;
		
		this.select("[value=" + $F(this) + "]").each(function(selectedOption) {
			component = selectedOption.readAttribute("component");
			componentSetup = selectedOption.readAttribute("componentSetup");
			Search.disableCategories(selectedOption.readAttribute("disableCategories"));
			Search.enableCategories(selectedOption.readAttribute("enableCategories"));
		});
	
		var relation = new Platform.Component.Relation({
			requestParameters: {
				componentSetup: componentSetup
			},
			changeObserver: Search.vendorChooserChanged,
			relatedElement: "rangeChooser",
			className: "RangeChooser"
		}); 
		
		Platform.ComponentLoader.load(
			$(this.readAttribute("rel")), 
			component,
			relation
		);
	}
};

function activateTab(tab) {
	if(tab == "image") {
		var vehicleId = $$("[tab=image]").invoke("readAttribute", "vehicleId");
		if(vehicleId && vehicleId > 0) {
			$$(".uploaderFrames").each(function(uploaderFrames) {
				var number = uploaderFrames.readAttribute("nr");
				var url = "http://backoffice.caraworld.de/backoffice/fahrzeuge/bild_hochladen.php?" + 
					"id_fzg=" + vehicleId + "&id_haendler=0000000000&nr=" + number + "&referer=frontend";
				
				uploaderFrames.writeAttribute("src", url);
			});
		}else {
			$("image").update(
				"<p>Sie können Fahrzeugbilder erst nach dem Registrieren und anlegen Ihres Inserates hochladen. Wir bitten um Verständnis</p>"
			);
		}
	} else if(tab == "personal" || tab == "vehicle") {
		var tabElement = $(tab);
		var entityNames = false;
		
		var arrInputs = $$("input[rel=" + tab + "]");
		if(arrInputs) {
			arrInputs.each(function(input) {
				if(!entityNames)
					entityNames = new Array();
				
				entityNames.push($F(input));
			});
		}
		
		if(!entityNames) {
			// console.error("Keine Entität gefunden.");
			return;
		}
		
		entityNames.each(function(entityName) {
			var pseudoVariable = entityName;
			var params = {
				mode: "ajax",
				__method: "get",
				entity: entityName,
				loginHash: $$(".active").invoke("readAttribute", "loginHash"),
				backofficHash: $$(".active").invoke("readAttribute", "backofficHash")
			};
			
			if(entityName.indexOf("#") > -1) {
				try {
					var arrEntity = entityName.split("#");
					entityName = arrEntity[1];
					pseudoVariable = arrEntity[0];
					
					params.entity = entityName;
					Platform.Registry.register("Vehicle[setId]", params.vehicleId);
					Platform.Registry.register(entityName + "[waitFor]", "Vehicle[setId]");
				}catch(exc) {
					console.error("Error: %o", exc);
				}
			}
			
			new PeriodicalExecuter(function(self) {
				var waitFor = Platform.Registry.get(entityName + "[waitFor]");
				var waitValue = Platform.Registry.get(waitFor);
				
				if(!waitFor || (waitFor && waitValue)) {
					self.stop();
					
					if(waitFor == "Vehicle[setId]" && waitValue)
						params.vehicleId = $F(waitFor);
					
					if(pseudoVariable != entityName)
						params.category = pseudoVariable;
					
					//console.log("%o [waitFor]: %o || waitValue: %o", entityName, waitFor, waitValue);
					new Ajax.Request("/services/entityService.php", {
						method: "get",
						parameters: params,
						onSuccess: function(transport) {
							document.fire("data:ready", {
								elementName: entityName,
								elementValue: transport.responseJSON
							});
							Object.keys(transport.responseJSON).each(function(key) {
								var entitySelector = pseudoVariable == entityName ? entityName : pseudoVariable + "#" + entityName;
								
								$$("[name='" + entitySelector + "[" + key.replace("get", "set") + "]']").each(function(element) {
									element.enable();
									
									var value = transport.responseJSON[key];
									
									if(element.readAttribute("type") == "checkbox") {
										var value = transport.responseJSON[key] == "n" ? null : "j";
									}
									
									if(
										element.name == "Vehicle[setIdVendor]" ||
										element.name == "Vehicle[setIdRange]" ||
										element.name == "Vehicle[setId]"
									){
										Platform.Registry.register(element.name, value);
										document.fire("data:ready", {
											elementName: element.name,
											elementValue: value
										});
									}
									
									element.setValue(value);
									element.fire("component:change");
									
									if(entityName == "Vehicle") {
										if(element.name == "Vehicle[setId]") {
											$$(".deleteVehicleConfirm").invoke("writeAttribute", {vehicleId: value });
											$$(".deleteUserConfirm").invoke("writeAttribute", { vehicleId: value });
											$$("[tab=image]").invoke("writeAttribute", { vehicleId: value });
										}else if(element.name == "Vehicle[setType]" && value == "Caravan") {
											$$("[category=motorCaravanSpecific]").invoke(
												"removeClassName", 
												"mandatory"
											);
										}
										
										$$(".deleteVehicleConfirm").invoke("removeClassName", "displayNone");
									}
									
									if(entityName == "User") {
										if(element.name == "User[setEmail]")
											$$(".deleteUserConfirm").invoke("writeAttribute", "email", value);
										
										$$(".deleteUserConfirm").invoke("removeClassName", "displayNone");
									}
								});
							});
						}
					});	
				}
			}, 0.1);
		});
	}
}

function validatePassword(changeEvent) {
	var password = false;
	$$(".password").each(function(passwordElement) {
		password = $F(passwordElement);
	});
	
	if(password != $F(this)) {
		this.addClassName("invalid");
	}else {
		this.removeClassName("invalid");
	}
}

function validateEmail(changeEvent) {
	var params = {
		mode: "ajax",
		__method: "exists",
		entity: "User",
		"User[setEmail]": $F(this)
	}
	new Ajax.Request("/services/entityService.php", {
		method: "get",
		parameters: params,
		onComplete: function(transport) {
			if(
				transport && 
				transport.responseJSON && 
				transport.responseJSON.User
			) {
				if(transport.responseJSON.User.exists) {
					this.addClassName("invalid");
				}else {
					this.removeClassName("invalid");
				}
			}	
		}.bind(this)
	});
}

function submitClicked() {
	var validator = new Form.Validator({
		element: $('privateSellingForm'),
		beforeValidate: function(validator) {
			var user = false;
			$$("[name='User[setUserHash]']").each(function(userHash) {
				user = $F(userHash);
			});
			
			var pass = $F("password");
			var repeat = $F("passwordRepeat");
			
			if(user && pass == "" && repeat == "") {
				$("password").removeClassName("mandatory");
				$("passwordRepeat").removeClassName("mandatory");
			}else {
				$("password").addClassName("mandatory");
				$("passwordRepeat").addClassName("mandatory");
			}
		}
	});
	
	validator.validate();
	
	if(validator.getResult() == true) {
		new Platform.Salt({
			element: $('privateSellingForm'),
			onSalted: formSubmission
		});
	}
}

function formSubmission() {
	$('privateSellingForm').select(".input").each(function(input) {
		if($F(input) == "*" || input.name == "do_not_send")
			input.disable();
		
	});
	
	$('privateSellingForm').request({
		onCreate: function() {
			Platform.Dialog.showHtml(
				"<div id=\"contentBox\"><img src='/pictures/layout/ajax-loader_big.gif' /></div>"
			);		
		},
		onSuccess: function(transport) {
			try {
				var historyService = new Platform.Services.History({
					onLoad: $$(".button[rel=save]").invoke("toggle"),
					onSuccess: function(transport) {
						Platform.Dialog.showHtml(
							"<div id=\"contentBox\">Ihr Fahrzeug wurde erfolgreich gespeichert.</div>"
						);
						
						if(
							transport && 
							transport.responseJSON && 
							transport.responseJSON.history && 
							transport.responseJSON.history.url
						)
							document.location.href = transport.responseJSON.history.url + "?register=true";
					}
				});
				
				historyService.get();
				
				location.reload();
			}catch(exc) {
				//console.log("Exception in line 219: %o", exc);
			}
			
		}
	});
}

function validateLength(keyUpEvent) {
	var maxLength = this.readAttribute("maxLength");
	var lengthElement = $(this.readAttribute("lengthField"));
	
	if($F(this).length > maxLength) {
		this.value = this.value.substring(0, maxLength);
		lengthElement.update(0);
		this.addClassName("invalid");
		
		$$(".errorList[rel=" + lengthElement.name + "]").invoke("remove");
		  
		var errorBox = new Element("li");
		errorBox.addClassName("errorBox");
		errorBox.update("Maximal " + maxLength + " Zeichen möglich.");
		
		var ul = new Element("ul");
		ul.addClassName("errorList");
		ul.writeAttribute({ rel: lengthElement.name });
		this.insert({
			"after": ul
		});
		
		this.next().insert({
			"bottom": errorBox
		});
    } else {
	    lengthElement.update(maxLength - $F(this).length);
		this.removeClassName("invalid");
		
		$$(".errorList[rel=" + lengthElement.name + "]").invoke("remove");
    }
}

function deleteVehicleClicked() {
	var params = {
		mode: "ajax",
		__method: "delete",
		entity: "Vehicle",
		vehicleId: this.readAttribute("vehicleId")
	};

	new Ajax.Request("/services/entityService.php", {
		method: "post",
		parameters: params,
		onSuccess: function(transport) {
			document.location.reload();
		},
		onFailure: function(transport) {
			Platform.Dialog.showHtml("Fahrzeug konnte nicht gelöscht werden.");
		}
	});
}

function deleteVehicleConfirmClicked(clickEvent) {
	document.observe("dialog:complete", function() {
		$$(".dialogClose").invoke("observe", "click", Platform.Dialog.close);
		$$(".deleteVehicle").each(function(deleteVehicleLink) {
			deleteVehicleLink.writeAttribute("vehicleId", this.readAttribute("vehicleId"));
			
			deleteVehicleLink.observe("click", deleteVehicleClicked);
		}.bind(this));
	}.bind(this));
	
	Platform.Dialog.show("DeleteVehicleConfirm");
}

function deleteUserClicked() {
	var params = {
		mode: "ajax",
		__method: "delete",
		entity: "User",
		vehicleId: this.readAttribute("vehicleId"),
		email: this.readAttribute("email")
	};

	new Ajax.Request("/services/entityService.php", {
		method: "post",
		parameters: params,
		onSuccess: function(transport) {
			//document.location.reload();
		},
		onFailure: function(transport) {
			Platform.Dialog.showHtml("User konnte nicht gelöscht werden.");
		}
	});
}

function deleteUserConfirmClicked(clickEvent) {
	document.observe("dialog:complete", function() {
		$$(".dialogClose").invoke("observe", "click", Platform.Dialog.close);
		$$(".deleteUser").each(function(deleteUserLink) {
			deleteUserLink.writeAttribute("vehicleId", this.readAttribute("vehicleId"));
			deleteUserLink.writeAttribute("email", this.readAttribute("email"));
			
			deleteUserLink.observe("click", deleteUserClicked);
		}.bind(this));
	}.bind(this));
	
	Platform.Dialog.show("DeleteUserConfirm");
}

document.observe("dom:loaded", function(){
	/* ausblenden aller Freitextfelder, da diese in der DB nicht abgebildet werden können,
	 * da kein eigenes Feld
	 */

	if($('vendorChooser'))
		$('vendorChooser').down().addClassName("mandatory");
	
	if($('rangeChooser'))
		$('rangeChooser').down().addClassName("mandatory");
	
	
	if($$('.BasicTextareaField')) {
		$$('.BasicTextareaField').each(function(element) {
			element.removeClassName("mandatory");
		});
	}
	
	// Passwort leeren wenn Bearbeitung aus BO mit loginHash
	if($$(".active").invoke("readAttribute", "loginHash") != "") {
		if($("password")) {
			$("password").setValue("");
			$("password").removeClassName("mandatory");
			$("password").removeAttribute("name");
			$("password").writeAttribute("name", "do_not_send");
		}

		if($("passwordRepeat")) {
			$("passwordRepeat").setValue("");
			$("passwordRepeat").removeClassName("mandatory");
			$("password").removeAttribute("name");
			$("password").writeAttribute("name", "do_not_send");
		}
		
		if($("agbs")) {
			$("agbs").checked = true;
		}
		
		if($("datenschutz")) {
			$("datenschutz").checked = true;
		}
	}
	
	// beim ändern des Fahrzeugtyps relevante Feler die mandatory sind, zurücksetzten
	$$(".vehicleTypeChooser").invoke("observe", "change", function(clickEvent) {
		if($F(this) == "Reisemobil") {
			$$('.notMandatory').each(function(element) {
				if(element.readAttribute("category") == "motorCaravanSpecific") {
					element.addClassName("mandatory");
					element.removeClassName("notMandatory");
				}
			});
		} else if($F(this) == "Caravan") {
			$$('.mandatory').each(function(element) {
				if(element.readAttribute("category") == "motorCaravanSpecific") {
					element.addClassName("notMandatory");
					element.removeClassName("mandatory");
					
					var elementType = element.readAttribute("type");
					if(elementType == "text") {
						element.setValue("");
					} else {
						element.setValue("*");
					}
				}
			});
		}
	});
	
	try {
		new Platform.Tabsystem({
			element: $$(".contentTabs").first(),
			controls: $$(".tabControl"),
			onActivate: activateTab
		});
		
		if($("vehicle")) {
			$("vehicle").select(".input").each(function(field) {
				if(field.id != "vehicleTypeChooser")
					field.disable();
			});
		}
		
		$$(".vehicleTypeChooser").invoke("observe", "change", VehicleTypeChooser.changed);
		$$(".vehicleTypeChooser").invoke("observe", "component:change", VehicleTypeChooser.changed);
		$$(".passwordRepeat").invoke("observe", "change", validatePassword);
		$$(".suggest").invoke("observe", "change", validateEmail);
		$$(".button[rel=save]").invoke("observe", "click", submitClicked);
		$$('.shortText').invoke("observe", "keyup", validateLength);
		$$('.descriptionText').invoke("observe", "keyup", validateLength);
		$$('.deleteVehicleConfirm').invoke("observe", "click", deleteVehicleConfirmClicked);
		$$('.deleteUserConfirm').invoke("observe", "click", deleteUserConfirmClicked);
		
		new Platform.ToolTips("span");
		new Platform.ToolTips(".input");
	}catch(exc) {
		console.error("Exc in Line 241: %o", exc);
	}
});