/*

	References [function, resource]
	
	addEvent                 http://www.ejohn.org/projects/flexible-javascript-events/
	documenttextsizer        http://www.javascriptkit.com/script/script2/doctextresizer.shtml
	externalLinks            http://www.sitepoint.com/article/standards-compliant-world/
	getElementsByClassName   http://code.google.com/p/getelementsbyclassname/

*/

// 
function addEvent(obj, type, fn) {
	if(obj.attachEvent) {
		obj['e'+type+fn] = fn;
		obj[type+fn] = function() {
			obj['e'+type+fn](window.event);
		}
		obj.attachEvent('on'+type, obj[type+fn] );
	} else
		obj.addEventListener(type, fn, false);
}


// 
var documenttextsizer = {
	prevcontrol: '',
	existingclasses: '',

	setpageclass:function(control, newclass) {
		if(this.prevcontrol != '')
			this.css(this.prevcontrol, 'selectedtoggler', 'remove') //de-select previous control, by removing 'selectedtoggler' from it
		document.documentElement.className = this.existingclasses+' '+newclass //apply new class to document
		this.css(control, 'selectedtoggler', 'add') //select current control
		this.setCookie('pagesetting', newclass, 7) //remember new class added to document for 7 days
		this.prevcontrol = control
	},

	css:function(el, targetclass, action) {
		var needle = new RegExp("(^|\\s+)"+targetclass+"($|\\s+)", "ig")
		if(action == "check")
			return needle.test(el.className)
		else if(action == "remove")
			el.className = el.className.replace(needle, "")
		else if(action == "add")
			el.className += " "+targetclass
	},

	getCookie:function(Name) {
		var re = new RegExp(Name+"=[^;]+", "i"); //construct RE to search for target name/value pair
		if(document.cookie.match(re)) //if cookie found
			return document.cookie.match(re)[0].split("=")[1] //return its value
		return null
	},

	setCookie:function(name, value, days) {
		if(typeof days != "undefined") { //if set persistent cookie
			var expireDate = new Date()
			var expstring = expireDate.setDate(expireDate.getDate()+days)
			document.cookie = name+"="+value+"; path=/; expires="+expireDate.toGMTString()
		}
		else //else if this is a session only cookie
			document.cookie = name+"="+value
	},

	setup:function(targetclass) {
		this.existingclasses = document.documentElement.className //store existing CSS classes on HTML element, if any
		var persistedsetting = this.getCookie('pagesetting')
		var alllinks = document.getElementsByTagName("a")
		for (var i = 0; i < alllinks.length; i++){
			if(this.css(alllinks[i], targetclass, "check")) {
				if(alllinks[i].getAttribute("rel") == persistedsetting) //if this control's rel attribute matches persisted doc CSS class name
					this.setpageclass(alllinks[i], alllinks[i].getAttribute("rel")) //apply persisted class to document
				alllinks[i].onclick = function() {
					documenttextsizer.setpageclass(this, this.getAttribute("rel"))
					return false
				}
			}
		}
	}
}

// 
function externalLinks() {
	if(!document.getElementsByTagName)
		return; 
	var anchors = document.getElementsByTagName('a');
	for(var i = 0; i < anchors.length; i++) {
		var anchor = anchors[i];
		if(anchor.getAttribute('href') && anchor.getAttribute('rel') == 'external')
			anchor.setAttribute('target', '_blank');
	}
}

// 
var getElementsByClassName = function(className, tag, elm) {
	if(document.getElementsByClassName) {
		getElementsByClassName = function(className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag) ? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i = 0, il = elements.length; i < il; i += 1) {
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName))
					returnElements.push(current);
			}
			return returnElements;
		};
	} else if(document.evaluate) {
		getElementsByClassName = function(className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace) ? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j = 0, jl = classes.length; j < jl; j += 1)
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			} catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while((node = elements.iterateNext()))
				returnElements.push(node);
			return returnElements;
		};
	} else {
		getElementsByClassName = function(className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all) ? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k = 0, kl = classes.length; k < kl; k += 1)
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			for(var l = 0, ll = elements.length; l < ll; l += 1) {
				current = elements[l];
				match = false;
				for(var m = 0, ml = classesToCheck.length; m < ml; m += 1) {
					match = classesToCheck[m].test(current.className);
					if(!match)
						break;
				}
				if(match)
					returnElements.push(current);
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};

// 
var ImageCaptions = {
	init: function() {
		// get all image elements with class "caption"
		var aImages = getElementsByClassName("caption", "img", document.getElementById("content"));
		
		// loop through them
		for(var i = 0, j = aImages.length; i < j; i++)
			// make sure they have title text set
			if(aImages[i].alt != '') {
				// save some stuff for later use
				var oParent = aImages[i].parentNode;
				var sAlt = aImages[i].alt;
				var sClasses = aImages[i].className;
				
				// remove interfering elements
				aImages[i].align = '';
				aImages[i].alt = '';
				aImages[i].className = '';
				aImages[i].hspace = '0';
				aImages[i].vspace = '0';
					
				// create new parent container for image
				var oContainer = document.createElement('div');
				
				// assign classes from img tag
				oContainer.className = sClasses;
				
				// constrain the width of DIV to image dimensions
				oContainer.style.width = aImages[i].style.width;
				
				// swap existing image
				oParent.replaceChild(oContainer, aImages[i]);
				oContainer.appendChild(aImages[i]);
				
				// create strap line
				var oCaptionContainer = document.createElement('div');
				var oCaption = document.createElement('p');
				oCaption.appendChild(document.createTextNode(sAlt));
				oCaptionContainer.appendChild(oCaption);
				
				// append strapline to parent container
				oContainer.appendChild(oCaptionContainer);
				
				//oCaptionContainer.style.width = aImages[i].getAttribute('width') + 'px';
				oCaptionContainer.style.width = aImages[i].style.width;
			}
	}
}

// 
addEvent(window, 'load', externalLinks);
addEvent(window, 'load', ImageCaptions.init);