// Namespace anlegen
Platform = {};

/**
 * Namespace Platform erweitern
 */
Platform.ComponentLoader = {}; 	 
Platform.Component = {};
Platform.Dialog = {};
Platform.ImageLoader = {};
Platform.Registry = {};
Platform.Search = {};

// Statischer Speicherbreich (Registry)
Platform.Registry.data = new Array();
/**
 * Statische Registry
 */
Platform.Registry.register = function(key, object) {
	Platform.Registry.data[key] = object;
}

Platform.Registry.get = function(key) {
	return Platform.Registry.data[key];
}

Platform.Registry.unregister = function(key) {
	Platform.Registry.data[key] = null;
}

/**
 * Läd dynamisch eine Platform Komponente.
 * @param element HTMLElement das zu aktualisierende Element im DOM.
 * @param className Name der Komponenten Klasse innerhalb der Platform
 * @param componentRelation Platform.Component.Relation eine Instanz der Komponenten-Beziehung.
 */
Platform.ComponentLoader.load = function(element, className, componentRelation) {
	if(componentRelation.requestParameters) 
		params = componentRelation.requestParameters;
	else 
		params = {};
	
	params.mode = "ajax";
	params.className = className; 
	
	new Ajax.Updater(element, "/component.php", {
		method: "get",
		parameters: params,
		onComplete: function(transport) {
			try {
				var local_hitCount = Platform.Registry.get("hitCount");

				if(componentRelation) {
					$$("." + className).each(function(component) {
					
						if(componentRelation.changeObserver) {
							component.observe("change", componentRelation.changeObserver);
							component.observe("component:change", componentRelation.changeObserver);
						}
						
						if(componentRelation.clickObserver) {
							component.observe("click", componentRelation.clickObserver);
							component.observe("component:click", componentRelation.changeObserver);
						}
						
						if(local_hitCount)
							component.observe("change", local_hitCount.onSearch.bind(local_hitCount));
						
						component.writeAttribute("rel", componentRelation.relatedElement);
						component.writeAttribute("component", componentRelation.className);
					});

					new PeriodicalExecuter(function(self) {
						var innerElement = element.down();
						if(!innerElement.name)
							return;
						
						var registryValue = Platform.Registry.get(innerElement.name);
						if(registryValue) {
							innerElement.setValue(registryValue);
							innerElement.fire("component:change");
							
							self.stop();
						}
					}, 0.1);
					
					if(componentRelation.onComplete)
						componentRelation.onComplete(transport, element);
				}
			}catch(exc) {
				console.error(exc);
			}
		}
	});
};

/**
 * Läd Fahrzeug Thumbs in der angegebenen Größe als ul/li Konstrukt.
 * 
 * @param HTMLElement element das zu aktualisierende Element.
 * @param Integer vehicleId Die FahrzeugId
 * @event images:loaded
 */
Platform.ImageLoader.load = function(element, vehicleId) {
	//console.log("VehicleID: %s, Element: %o", vehicleId, element);
	
	var params = {
		mode: "ajax",
		className: "ImageThumbList",
		"vehicleId": vehicleId
	};
	
	new Ajax.Updater(element, "/component.php", {
		method: "get",
		parameters: params,
		onComplete: function() {
			element.fire("images:loaded");
		}
	});
}

Platform.Component.Relation = Class.create({
	changeObserver: false,
	clickObserver: false,
	relatedElement: false,
	className: false,
	requestParameters: false,
	onComplete: false,
	
	initialize: function(parameters) {
		if(parameters && parameters.changeObserver)
			this.changeObserver = parameters.changeObserver;

		if(parameters && parameters.clickObserver)
			this.clickObserver = parameters.clickObserver;
		
		if(parameters && parameters.relatedElement)
			this.relatedElement = parameters.relatedElement;
		
		if(parameters && parameters.className)
			this.className = parameters.className;
		
		if(parameters && parameters.requestParameters)
			this.requestParameters = parameters.requestParameters;
		
		if(parameters && parameters.onComplete)
			this.onComplete = parameters.onComplete;
	}
});

/**
 * Parsed den Query String in ein JS Array.
 * @author marlettas
 * @since 12.04.2010
 */
Platform.QueryParser = Class.create({
	queryElements: false,
	initialize: function() {
		var arrLocationParts = document.location.href.split("?");
		this.queryElements = new Array();
		
		if(Object.isArray(arrLocationParts) && !Object.isUndefined(arrLocationParts[1])) {
			arrLocationParts[1].split("&").each(function(queryPart){
				var elementParts = queryPart.split("=");
				this.queryElements[elementParts[0]] = elementParts[1];
			}.bind(this));
		}
	},
	/**
	 * Liefert den Wert zum uebergebenen Key.
	 * @param String name der Query Variablen
	 * @return mixed Wert der Query Variablen
	 */
	get: function(strQueryVairable) {
		return this.queryElements[strQueryVairable] ? this.queryElements[strQueryVairable] : false;
	}
});

Platform.ToolTips = Class.create({
	initialize: function(className) {
		$$(className + "[tooltipPath]").each(function(tooltipElement){
			var position = tooltipElement.readAttribute("tooltipPosition");
			var path = tooltipElement.readAttribute("tooltipPath");
			
			position = position.split(".");
			if(Object.isArray(position) && position.length > 2) {
				position = position[0];
			}else if(Object.isArray(position) && position.length > 1) { 
				tooltipElement = tooltipElement.select("." + position[1]).first();
				position = position[0];
			}
			
			toolTipIcon = new Element("span");
			toolTipIcon.addClassName("toolTipIcon");
			toolTipIcon.update("&nbsp;");
			// console.log("Tooltip: %o", tooltipElement);
			try {
				if(position == "after") {
					
					if(tooltipElement.tagName == "SELECT")
						var inserter = { after: toolTipIcon };
					else
						var inserter = { bottom: toolTipIcon };
					
					tooltipElement.insert(inserter);
				} else
					tooltipElement.insert({ before: toolTipIcon });
				
				new Tip(toolTipIcon, {
					style: "caraworld",
					viewport: true,
					ajax: {
						url: "/component.php?className=TooltipContent&mode=ajax&path=" + path,
						options: {
							method: "get"
						}
					}
				});
			}catch(exc) {
				console.error(exc);
			}
		});
	}
});

Platform.Dialog.showHtml = function(strHtml) {
	$("modalDialog").update(strHtml);
	Platform.Dialog.display();
}

Platform.Dialog.show = function(strDialogName, options) {
	var params = {};
	
	if(options && options.requestParameters)
		params = options.requestParameters;
		
	new Ajax.Updater($("modalDialog"), "/dialog/" + strDialogName, { 
		method: "get",
		parameters: params,
		onComplete: Platform.Dialog.display
	});
}

Platform.Dialog.display = function() {
	var scrollOffsets = document.viewport.getScrollOffsets();
	var offset = scrollOffsets.top;
	
	$("overlay").setStyle({
		height: $("outerWrapper").getHeight() + offset + "px",
		width:  $("outerWrapper").getWidth()+ "px"
	});
	
	$("overlay").setOpacity(0.75);
	$("overlay").show();
	$("modalDialog").show();
	
	$$(".modalCloser").invoke("observe", "click", Platform.Dialog.close);
	document.fire("dialog:complete");	
}

Platform.Dialog.close = function() {
	$$(".modalCloser").invoke("stopObserving", "click", Platform.Dialog.close);
	$("overlay").hide();
	$("modalDialog").hide();
}

/**
 * Enthaelt Einstellung um einen Modalen DIalog zu seteuern bzw. AJAX Parameters mit einzuhaengen.
 */
Platform.Dialog.Options = Class.create({
	/** @lends Platform.Dialog.Option */
	/**
	 * Zusaetzliche Parameter fuer den Ajax-Load
	 */
	requestParameters: false
});

Platform.Contact = Class.create({
	element: false,
	initialize: function(parameters) {
		if(!parameters || !parameters.element)
			throw new Error("Element must be given to Platform.Contact in Platform.js Line 266.");
		
		this.element = parameters.element;
		this.element.select(".button").first().observe("click", this.submitClicked.bind(this));
	},
	submitClicked: function(clickEvent) {
		var validator = new Form.Validator({
			element: this.element
		});
		
		validator.validate();
		
		if(validator.getResult() == true) {
			new Platform.Salt({
				element: this.element,
				onSalted: this.submission.bind(this)
			});
		}
	},
	submission: function() {
		var componentsClass = new Element("input", {
			type: "hidden",
			name: "className",
			value: "ContactDealer"
		});
		
		this.element.insert({ "bottom": componentsClass });
		
		this.element.request({
			method: "post",
			onComplete: function(transport){
				try {
					this.element.hide();
					Platform.Dialog.showHtml(transport.responseText);
				}catch(exc) {
					console.error(exc);
				}
			}.bind(this)
		});
	}
});

Platform.Salt = Class.create({
	element: false,
	onSalted: false,
	initialize: function(parameters) {
		if(!parameters || !parameters.element)
			throw("Element must be given to Platform.Salt.");
		
		if(!parameters || !parameters.onSalted)
			throw("onSalted must be given to Platform.Salt.");
		
		this.element = parameters.element;
		this.onSalted = parameters.onSalted;
		
		this.makeSalted();
	},
	makeSalted: function() {
		var params = {
			mode: "ajax",
			className: "SaltedForm"
		};
		new Ajax.Request("/component.php", {
			method: "get",
			parameters: params,
			on200: function(transport) {
				var saltedElement = new Element("input", {
					type: "hidden",
					name: "salt",
					value: transport.responseJSON.salt
				});
				this.element.insert({
					"bottom": saltedElement
				});
				this.onSalted();
			}.bind(this),
			on403: function(transport) {
				Platform.Dialog.show("FormForbidden");
			},
			on500: function(transport) {
				Platform.Dialog.show("SecurityError");
			}
		});
	}
});

Platform.Tabsystem = Class.create({
	element: false,
	onActivate: Prototype.K,
	controls: false,
	initialize: function(parameters) {
		if(!parameters)
			throw new Error("No parameters given Platform.Tabsystem in Line: 365.");
			
		if(!parameters.element)
			throw new Error("No element given Platform.Tabsystem in Line: 368.");
		
		this.element = parameters.element;
		
		if(parameters.onActivate)
			this.onActivate = parameters.onActivate;
		
		if(parameters.controls)
			this.controls = parameters.controls;
		
		this.element.observe("click", this.tabClicked.bind(this));
		this.controls.invoke("observe", "click", this.controlClicked.bind(this));
		this.activate();
	},
	controlClicked: function(clickEvent) {
		// validation 
		if(this.validateActive()) {
			var clicked = clickEvent.element();
			if(!clicked.hasClassName("tabControl"))
				clicked = clicked.up();
			
			var direction = clicked.readAttribute("rel");
			var activeTab = false;
			this.element.select(".active").each(function(active) {
				activeTab = active; 
				active.removeClassName("active");
			});
			
			var siblings = false;
			switch(direction) {
				case "next":
					siblings = activeTab.up().nextSiblings();
				break;
				
				case "previous":
					siblings = activeTab.up().previousSiblings();
				break;
				
				default:
					throw new Error("Tab could not be toggled next/previous.");
				break;
			}
			
			siblings.first().select(".tab").each(function(tabItem) {
				//if(!tabItem.hasClassName("inactive"))
					tabItem.removeClassName("inactive");
					tabItem.addClassName("active");
			});
			this.activate();
		}
	},
	tabClicked: function(clickEvent) {
		// validation
		if(this.validateActive()) {
			var element = clickEvent.element();
			if(!element.hasClassName("tab"))
				element = element.up();
			
			//console.log("el: %o", element);
			if(element.hasClassName("inactive"))
				return;
			
			this.element.select(".tab").invoke("removeClassName", "active");
			
			element.addClassName("active");
			
			this.activate();
		}
	},
	activate: function() {
		this.element.select(".tab").each(function(tab) {
			if(tab.hasClassName("active")) {
				if(tab.hasClassName("first"))
					$$(".previousTab").invoke("hide");
				else
					$$(".previousTab").invoke("show");
				
				if(tab.hasClassName("last"))
					$$(".nextTab").invoke("hide");
				else
					$$(".nextTab").invoke("show");

				$(tab.readAttribute("tab")).show();
				
				this.onActivate(tab.readAttribute("tab"));
			} else {
				$(tab.readAttribute("tab")).hide();
			}
		}.bind(this));
	},
	validateActive: function() {
		var formPart = false;
		
		this.element.select(".tab").each(function(tab) {
			if(tab.hasClassName("active")) {
				formPart = $(tab.readAttribute("tab"));
			}
		});
		
		var validator = new Form.Validator({
			element: formPart,
			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();
		
		return validator.getResult();
	}
});