﻿/// <reference name="MicrosoftAjax.js"/>

Type.registerNamespace("Utilis.Web");

Utilis.Web.Navigation = function(element) {
	Utilis.Web.Navigation.initializeBase(this, [element]);
}

Utilis.Web.Navigation.prototype = {
	initialize: function() {
		Utilis.Web.Navigation.callBaseMethod(this, 'initialize');

		this.root = new navigationItem(null, this.get_element(), null, 0);
	},
	dispose: function() {
		//Add custom dispose actions here
		Utilis.Web.Navigation.callBaseMethod(this, 'dispose');
	}
}
Utilis.Web.Navigation.registerClass('Utilis.Web.Navigation', Sys.UI.Behavior);

/// Navigation item element
function navigationItem(element, subElement, parent, level) {
	this.isSelected = false;
	this.isExpanded = false;
	this.element = element;
	this.subElement = subElement;
	this.parent = parent;
	this.image = null;
	this.level = level;

	this.initialize();
}

// Constants
navigationItem.imgExpanded = "Img/NavLeft-.png";
navigationItem.imgExpandedOver = "Img/NavLeft-_over.png";
navigationItem.imgCollapsed = "Img/NavLeft+.png";
navigationItem.imgCollapsedOver = "Img/NavLeft+_over.png";
navigationItem.imgNoItems = "Img/NavLeft0.png";

navigationItem.imgArrow = "Img/NavLeft+_2.png";
navigationItem.imgArrowSelected = "Img/NavLeft+_2_sel.png";

navigationItem.prototype.initialize = function() {
	// Process sub items
	var childs = new Array();
	if (this.subElement) {
		if (!this.isExpanded) Sys.UI.DomElement.addCssClass(this.subElement, "hide");

		for (var i in this.subElement.childNodes) {
			var ce = this.subElement.childNodes[i];
			if (ce && ce.nodeType == 1) {
				if (ce.nodeName == "B") {
					var elem = ce.childNodes[0];
					var childElem = ce.childNodes[1];
					Array.add(childs, new navigationItem(elem, childElem, this, this.level + 1));
				}
			}
		}
		if (childs.length > 0) this.childs = childs;
	}

	if (this.element) {
		this.element.instance = this;

		// Set selected
		this.isSelected = Sys.UI.DomElement.containsCssClass(this.element, "selected");
		if (this.isSelected) {
			this.isExpanded = true;
			var rec = this;
			while (rec) {
				rec.isExpanded = true;
				// Set class on selected path
				if (rec.element) {
					Sys.UI.DomElement.addCssClass(rec.element.parentNode, "exp");
				}
				rec = rec.parent;
			}
		}

		this.image = document.createElement("img");
		this.setVisible(this.isExpanded);
		this.element.parentNode.insertBefore(this.image, this.element);
	}

	// Add collapse/expand handler
	if (this.element) {
		$addHandler(this.image, "click", Function.createDelegate(this, function(e) {
			e.stopPropagation();
			e.preventDefault();
			if (this.subElement) {
				this.toogleVisible();
			}
		}));

		$addHandler(this.image, "mouseover", Function.createDelegate(this, function(e) {
			if (this.subElement) {
				this.image.src = this.getImageSrc(this, true);
			}
		}));

		$addHandler(this.image, "mouseout", Function.createDelegate(this, function(e) {
			if (this.subElement) {
				this.image.src = this.getImageSrc(this);
			}
		}));
	}
}

navigationItem.prototype.setVisible = function(value) {
	this.isExpanded = value;
	if (this.image && this.subElement) {
		if (this.isExpanded) {
			Sys.UI.DomElement.removeCssClass(this.subElement, "hide");
		} else {
			Sys.UI.DomElement.addCssClass(this.subElement, "hide");
		}
	}
	this.image.src = this.getImageSrc(this);
}

navigationItem.prototype.getImageSrc = function(item, isMouseOver) {
	if (item) {
		if (item.level < 3) {
			if (!item.subElement) { return navigationItem.imgNoItems; }
			else if (item.isExpanded && isMouseOver) { return navigationItem.imgExpandedOver; }
			else if (item.isExpanded) { return navigationItem.imgExpanded; }
			else if (!item.isExpanded && isMouseOver) { return navigationItem.imgCollapsedOver; }
			else if (!item.isExpanded) { return navigationItem.imgCollapsed; }
		}
		else {
			if (item.isSelected) { return navigationItem.imgArrowSelected; }
			else { return navigationItem.imgArrow; }
		}
	} else {
		return null;
	}
}

navigationItem.prototype.toogleVisible = function() {
	this.setVisible(!this.isExpanded);
}

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();