﻿//shortcutting YAHOO libs
var $D = $D || YAHOO.util.Dom;
var $E = $E || YAHOO.util.Event;
var $A = $A || YAHOO.util.Anim;
var $M = $M || YAHOO.util.Motion;
var $DD = $DD || YAHOO.util.DD;
var $ = $D.get;
var $$ = YAHOO.util.Selector ? YAHOO.util.Selector.query : null;

var DanBolig = DanBolig || {};

DanBolig.Navigation = DanBolig.Navigation || {};
(function() {

	var controllers = {};

	DanBolig.Navigation.PageParts = {
		init: function(_selectByClass) {
			var elms = $$(this.selectors.root);
			for (var i = 0; i < elms.length; i++) {
				var c = new DanBolig.Navigation.PageParts.Controller(elms[i]);
				controllers[c.id] = c;
			}
		},
		selectors: {
			"root": "div.pagepart-control-container",
			"parts": "div.pagepart-control-part",
			"links": ".pagepart-control-links a[href^=#]",
			"active_link": ".pagepart-control-links a.active"
		},
		controllerFor: function(elm) {
			if (elm instanceof String) elm = $$("#" + elm)[0];
			if (!elm) return null;
			while (elm && !YAHOO.util.Selector.test(elm, this.selectors.root)) elm = elm.parentNode;
			return controllers[elm.controllerId];
		}
	};

	DanBolig.Navigation.PageParts.Controller = function(root) {
		var self = this;
		var s = DanBolig.Navigation.PageParts.selectors;
		var selectByClass = $D.hasClass(root, "pagepart-select-by-class");
		this.selectLinkContainer = $D.hasClass(root, "pagepart-selectlinkcontainer");

		this.id = "Controller" + parseInt(10000000 * Math.random());
		this.container = root;
		this.container.controllerId = this.id;

		// Custom events setup
		this.onActivate = new YAHOO.util.CustomEvent("activate", this);
		this.onDeactivate = new YAHOO.util.CustomEvent("deactivate", this);

		// Handle pre-activated part
		var current_link = $$(s.active_link, root)[0];
		this.current = current_link ? current_link.getAttribute("href", 2).substr(1) : null;

		var partsRoot = root;

		// Check for a custom root node
		var rootClasses = root.className.split(/\s/);
		var reg = new RegExp("^pagepart\\-root\\-(.*)");
		for (var i = 0, j = rootClasses.length; i < j; i++) {
			var m = reg.exec(rootClasses[i]);
			if (m) {
				partsRoot = $$("#" + m[1], null, true);
			}
		}

		// Setup parts collection/hash
		var parts = $$(s.parts, partsRoot);
		if (parts.length == 0) return null;
		this.parts = {};
		this.classPartsMap = {};
		for (var i = 0; i < parts.length; i++) {
			if (selectByClass) {
				var classes = parts[i].className.split(/\s/);
				var reg = new RegExp("^activatedby\\-(.*)");
				for (var j = 0; j < classes.length; j++) {
					var match = reg.exec(classes[j]);
					if (match != null) {
						this.parts[match[1]] = this.parts[match[1]] || [];
						this.parts[match[1]].push(parts[i]);
					}
				}
			}

			if (parts[i].id) {
				this.parts[parts[i].id] = this.parts[parts[i].id] || [];
				this.parts[parts[i].id].push(parts[i]);
			}
			//if (parts[i].id != this.current)
			if (!((parts[i].id && parts[i].id == this.current) || (selectByClass && $D.hasClass(parts[i], "activatedby-" + this.current))))
				$D.hide(parts[i]);
		}

		// Setup links collection/hash
		var links = $$(s.links, root);
		if (links.length == 0) return null;
		this.links = {};
		for (var i = 0; i < links.length; i++) {
			var href = links[i].getAttribute("href", 2);
			if (/^#/.test(href)) {
				href = href.substr(1);
				if (this.parts[href] || (selectByClass && this.classPartsMap[href] && this.classPartsMap[href].length)) {
					this.links[href] = this.links[href] || [];
					links[i].part_id = href;
					this.links[href].push(links[i]);
					$E.on(links[i], "click", (function(self, href, link, e) {
						// Deactivate current part
						$D.hide(self.parts[self.current]);
						$D.removeClass(self.links[self.current], "active");
						if (self.selectLinkContainer) {
							for (var i = 0, j = self.links[self.current].length; i < j; i++) {
								$D.removeClass(self.links[self.current][i].parentNode, "selected");
							}
						}

						// Trigger custom event
						self.onDeactivate.fire(self.current);

						// Set current part
						self.current = href;

						// Activate current part
						$D.show(self.parts[self.current]);
						$D.addClass(self.links[self.current], "active");
						if (self.selectLinkContainer) {
							for (var i = 0, j = self.links[self.current].length; i < j; i++) {
								$D.addClass(self.links[self.current][i].parentNode, "selected");
							}
						}

						// Trigger custom event
						self.onActivate.fire(self.current);

						// Cancel event
						link.blur();
						$E.preventDefault(e);
					}).curry(self, href, links[i]));
				}
			}
		}
	}
})();

$E.onDOMReady(function() {
	DanBolig.Navigation.PageParts.init();
});
