/*  Parse cite attribute from blockquote and display source link
 ********************************************************************/
function displayCitations(label) {
	var quotes = document.getElementsByTagName("blockquote");
	for (var i = 0; i < quotes.length; i++) {
		if (!quotes[i].cite) continue;	// if no cite attribute, continue to next loop iteration
		var citation = quotes[i].getElementsByTagName("cite")[0];	// find cite tag and store citation
		if (citation.length < 1) continue;	// if no citation, continue to next loop iteration
		new Element("a").appendText(label).setProperty("href", quotes[i].cite).injectInside(citation);
	}
}


/* New Window Links - add rel="external"
 * Popup Links - add rel="popup width=400,height=400..."
 * http://www.sitepoint.com/article/structural-markup-javascript
 ********************************************************************/
function externalLinks() {
	var anchors = document.getElementsByTagName("a");
	for (var i = 0; i < anchors.length; i++) {
		if (!anchors[i].rel) continue;
		if (anchors[i].rel.split(" ")[0] == "external") {
			anchors[i].target = "_blank";
			anchors[i].title = "Opens in new window";
		}
		if (anchors[i].rel.split(" ")[0] == "popup") {
			anchors[i].title = "Opens in a pop-up window";
			anchors[i].onclick = function() {
				window.open(this.href, "_blank", this.rel.split(" ")[1]).focus();
				return false;
			}
		}
	}
}


/* CheckedListBoxes (add class="selection scroll multiple" to <ol>)
 ********************************************************************/
function enableMultipleSelection(selector, className) {
	var lists = $$(selector);
	for (var i = 0; i < lists.length; i++) {
		var toggle = lists[i].parentNode.appendChild(document.createElement("div"));
		toggle.className = "help";
		toggle = toggle.appendChild(document.createElement("a"));
		toggle.href = "#";
		toggle.appendChild(document.createTextNode("Check All"));
		toggle.onfocus = function() {$(this).getParent("div", "field").addClass(className)};
		toggle.onblur = function() {$(this).getParent("div", "field").removeClass(className)};
		toggle.onclick = function() {
			var checkboxes = $(this).getParent().getPrevious().getElements("input[type=checkbox]");
			var checkAll = (this.firstChild.nodeValue == "Check All") ? true : false;
			this.firstChild.nodeValue = (this.firstChild.nodeValue == "Check All") ? "Uncheck All" : "Check All";
			for (var j = 0; j < checkboxes.length; j++) checkboxes[j].checked = checkAll;
			return false;
		}
	}
}


/* When form field has focus, its highlighted and feedback is shown
 ********************************************************************/
/*
function getParentByTagName(el, tagName) {
	if (el == null) return null;
	while (el = el.parentNode) if (el.nodeName && tagName.toUpperCase() == el.nodeName) return el;
	return null;
}
*/
Element.extend({
	getParent: function(tagName, classRegex) {
		if (tagName == null && classRegex == null) return $(this.parentNode);
		var el = this;
		while (el = $(el.parentNode))
			if (tagName.toLowerCase() == el.getTag() && el.className.test(classRegex)) return el;
		return null;
	}
});
function formHighlighter(selector, className) {
	var fields = $$(selector);
	for (var i = 0; i < fields.length; i++) {
		if (fields[i].type && fields[i].type.test("button|image|submit|reset")) continue;
		fields[i].onfocus = function() {$(this).getParent("div", "field").addClass(className)};
		fields[i].onblur = function() {$(this).getParent("div", "field").removeClass(className)};
	}
}


/* Highlights Table Rows as you hover over them
 ****************************************************************/
function tableHighlighter(selector, className) {
	if (!document.all) return;
	var rows = $$(selector);
	for (var i = 0; i < rows.length; i++) {
		rows[i].onmouseover = function() {this.addClass(className);};
		rows[i].onmouseout = function() {this.removeClass(className);};
	}
}


/* Son of Suckerfish Dropdowns - www.htmldog.com
 * IE/Mac Fix: www.carroll.org.uk/sandbox/suckerfish/bones2.html
 ****************************************************************/
function sfHover(selector, className) {
	if (!document.all) return false;
	var menus = $$(selector);
	for (var i = 0; i < menus.length; i++) {
		menus[i].onmouseover = function() {this.addClass(className);};
		menus[i].onmouseout = function() {this.removeClass(className);};
	}
}


/* Toggle optional form fields <span id="toggle-optional"></span>
 ********************************************************************/
function toggleOptional(id, selector, hideText, displayText) {
	if (!$(id)) return false;
	toggle = new Element("a").injectInside($(id)).setProperty("href", "#").appendText(hideText);
	toggle.onclick = function() {
		this.firstChild.nodeValue = (this.firstChild.nodeValue == hideText) ? displayText : hideText;
		var fields = $$(selector);
		for (var j = 0; j < fields.length; j++) fields[j].toggleClass("hide");
		return false;
	}
}


/* Single toggled element uses hide class, unless visible by default
 * <a href="#content" class="toggle">Toggle Content</a>
 * <div id="content" class="hide">Some dummy content here</div>
 ********************************************************************/
function toggler(selector) {
	var elms = $$(selector);
	for (var i = 0; i < elms.length; i++) {
		elms[i].onclick = function () {$(this.href.split("#")[1]).toggleClass("hide"); return false;}
	}
}


/* Tab Panel Toggler - can have multiple groups in one page
 ****************************************************************/
function tabToggler(selector, selectedClass) {
	var links = $$(selector);
	for (var i = 0; i < links.length; i++) {
		$(links[i].href.split("#")[1]).addClass("hide");
		if (links[i].hasClass(selectedClass)) $(links[i].href.split("#")[1]).removeClass("hide");
		links[i].onclick = function() {
			$(this.href.split("#")[1]).removeClass("hide");
			var links = $(this).addClass(selectedClass).getParent("ul", "toggle").getElements("a");
			for (var j = 0; j < links.length; j++) {
				if (links[j].href != this.href) {
					$(links[j].href.split("#")[1]).addClass("hide");
					links[j].removeClass(selectedClass);
				}
			}
			return false;
		}
	}
}


/* MeeboMe Widget - get your meebome widget! www.meebome.com
 ****************************************************************/
function meeboMe(id) {
	if ($(id)) $(id).innerHTML = '<embed src="http://widget.meebo.com/mm.swf?AXSIcfqVvZ" type="application/x-shockwave-flash" width="200" height="300"></embed>';
}


/****************************************
 * onDomReady - call all methods
 ***************************************/
window.addEvent("domready", function() {
	//meeboMe("meebome");
	sfHover("li.expand", "sfhover");
	formHighlighter("form.highlight input, form.highlight select, form.highlight textarea", "focused");
	tableHighlighter("table.highlight tbody tr", "hover");
	enableMultipleSelection("ol.multiple", "focused");
	externalLinks();
	toggleOptional("toggle-optional", "div.optional", "Hide optional fields?", "Display optional fields?");
	toggler("a.toggle");
	tabToggler("ul.toggle a", "current");
	displayCitations("(source)");
});