﻿var cntntTree = (function () {
	// Private properties
	var opts, regexCollapsibleClass, fragmentID;
	// Private methods
	function extend(o, e) {
		var r = {};
		for (var k in (o || {})) r[k] = o[k];
		for (var k in (e || {})) r[k] = e[k];
		return r;
	}

	function replaceClassElement(objElement, strClassA, strClassB) {
		regexClassA = RegExp("\\b" + strClassA + "\\b");
		if (objElement.className.match(regexClassA)) {
			objElement.className = objElement.className.replace(regexClassA, strClassB);
		}
	}

	function processClick(oEvent) {
		toggleClassElement(this, opts.labelClosedClass, opts.labelOpenClass);
		if (this.datacontents) {
			toggleClassElement(this.datacontents, opts.contentClosedClass, opts.contentOpenClass);
		}
	}

	function openContent(o, opts) {
		replaceClassElement(o, opts.labelClosedClass, opts.labelOpenClass);
		if (o.datacontents) {
			replaceClassElement(o.datacontents, opts.contentClosedClass, opts.contentOpenClass);
		}
		if (o.dataparent) {
			openContent(o.dataparent, opts);
		}
	}

	function preventEventDefault(oEvent) {
		oEvent = (typeof oEvent == "undefined") ? window.event : oEvent;
		if (oEvent.preventDefault) oEvent.preventDefault();
		return false;
	}

	function processSecondaryLinkClick(oEvent) {
		var strHeadingID = this.href.split("#", 2)[1];
		var objHeading = document.getElementById(strHeadingID);
		if (objHeading) {
			openContent(objHeading, opts)
		}
	}

	function initSecondaryLinks(arrayContextIDs) {
		var i, x, oElement, arrayLinks, strFrament;
		if (arrayContextIDs != null) {
			for (i = 0; i < arrayContextIDs.length; i++) {
				oElement = GetElement(arrayContextIDs[i]);
				if (oElement) {
					arrayLinks = oElement.getElementsByTagName('a');
					var strFrament;
					for (x = 0; x < arrayLinks.length; x++) {
						if (strFrament = arrayLinks[x].href.split("#", 2)[1]) {
							AddEventHandlerElement(arrayLinks[x], "click", processSecondaryLinkClick);
						}
					}
				}
			}
		}
	}

	function initContainer(oContainer, triggerLink, oParent) {
		var arrayLists = oContainer.getElementsByTagName(opts.containerElements);
		var containsFragment = false;
		var anyContainFragment = false;
		var oLink, elemA, elemB, arrayChildren, x1, x2;
		for (x1 = 0; x1 < arrayLists.length; x1++) {
			var objList = arrayLists[x1];
			if (objList.className.match(regexCollapsibleClass)) {
				arrayChildren = objList.childNodes;
				for (x2 = 0; x2 < arrayChildren.length; x2++) {
					elemA = arrayChildren.item(x2)
					if (elemA.nodeName.toUpperCase() == opts.labelElements.toUpperCase() && !elemA.datacontents) {
						elemB = elemA.nextSibling;
						while (elemB != null && elemB.nodeType != 1) { elemB = elemB.nextSibling; }
						if (elemB != null && elemB.nodeName.toUpperCase() == opts.contentElements.toUpperCase()) {
							oLink = triggerLink.cloneNode(true)
							elemA.insertBefore(oLink, elemA.firstChild);
							AddEventHandlerElement(oLink, "click", preventEventDefault);
							elemA.datacontents = elemB;
							if (typeof oParent != "undefined" || oParent) {
								elemA.dataparent = oParent;
							}
							AddEventHandlerElement(elemA, "click", processClick);
							containsFragment = initContainer(elemB, triggerLink, elemA);
							if ((elemA.id && elemA.id == fragmentID) || containsFragment) {
								appendClassElement(elemA, opts.labelOpenClass);
								appendClassElement(elemB, opts.contentOpenClass);
								anyContainFragment = true;
							}
							else {
								appendClassElement(elemA, opts.labelClosedClass);
								appendClassElement(elemB, opts.contentClosedClass);
							}
						}
					}
				}
			}
		}
		return anyContainFragment;
	}

	return {
		// Public properties
		defaults: {
			triggerClass: "collapsible",
			containerElements: "dl",
			labelElements: "dt",
			contentElements: "dd",
			openImgSrc: "/web/format/img/plusBlue.gif",
			openImgAlt: "Show section",
			openImgClass: "open",
			closeImgSrc: "/web/format/img/minusBlue.gif",
			closeImgAlt: "Hide section",
			closeImgClass: "close",
			labelOpenClass: "dtLink",
			labelClosedClass: "dtLinkOff",
			contentOpenClass: "ddshow",
			contentClosedClass: "ddhide",
			triggerLinkClass: "trigger",
			secondaryLinksEnabled: false,
			secondaryLinkContainerIDs: ["mainContent"]
		},
		// Public methods
		initialize: function (options) {
			if (!document.getElementById || !document.getElementsByTagName) { return; }
			opts = extend(cntntTree.defaults, options);
			var openImage = document.createElement("img");
			var closeImage = document.createElement("img");
			openImage.className = opts.openImgClass;
			closeImage.className = opts.closeImgClass;
			openImage.src = opts.openImgSrc;
			closeImage.src = opts.closeImgSrc;
			openImage.alt = opts.openImgAlt;
			closeImage.alt = opts.closeImgAlt;
			var triggerLink = document.createElement("a");
			triggerLink.setAttribute("href", "#");
			triggerLink.className = opts.triggerLinkClass;
			triggerLink.appendChild(openImage);
			triggerLink.appendChild(closeImage);
			regexCollapsibleClass = RegExp("\\b" + opts.triggerClass + "\\b");
			fragmentID = (window.location.hash !== '' && window.location.hash !== '#') ? window.location.hash.slice(1) : '';
			if (opts.secondaryLinksEnabled) {
				initSecondaryLinks(opts.secondaryLinkContainerIDs)
			}
			initContainer(document, triggerLink);
			triggerLink = null;
		}
	};
})();
