// Add event handler to body when window loads
function addLoadEvent(func) {
	var oldonload = window.onload;
	
	if (typeof window.onload != "function") {
		window.onload = func;
	} else {
		window.onload = function () {
			oldonload();
			func();
		}
	}
}

addLoadEvent(function () {
	AnyFields.init();
	Callouts.fix();
	Checklists.init(); 
	DocLinks.init();
	Cursors.init();
	Hover.init(Hover.collections);
	GoogleLinkTracker.init();
});

/*---------------------------------------------------------------------------+
| Cookie - Create/read/erase cookies                                         |
+---------------------------------------------------------------------------*/
var Cookie = {
    create: function (name, value, days) {
        if (days) {
            var date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            var expires = "; expires=" + date.toGMTString();
        }
        else var expires = "";
        document.cookie = name + "=" + value + expires + "; path=/";
    },

    read: function (name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }
        return null;
    },

    remove: function (name) {
        Cookie.create(name, "", -1);
    }
}


/*---------------------------------------------------------------------------+
 | AnyFields - Add/remove "Any" value to fields that can accept blank values |
 +---------------------------------------------------------------------------*/
var AnyFields = {
	init : function () {
		// Check for functionality
		if (!document.getElementById || !document.getElementsByTagName) return false;
		
		// Get all inputs
		var fields = document.getElementsByTagName("input");
		
		for (var i = 0; i < fields.length; i++) {
			var theField = fields[i];
			
			// Check for class
			if (theField.className.indexOf("any") > -1) {
				// Add behaviors
				AnyFields.addBehaviors(theField);
			}
		}
	},
	
	addBehaviors : function(field) {
		var defaultValue = (field.value && field.value != "") ? field.value : "";

		// When focus is set to fields, remove default value and class so it looks normal
		field.onfocus = function() {
			this.className = this.className.replace(" any", "");
			if (this.value == defaultValue)
				this.value = "";
		};
		
		// When focus is removed, reset class and default value only if blank
		field.onblur = function() {
			if (this.value == "") {
				this.className += " any";
				this.value = defaultValue;
			}
		};
	}
};


/*------------------------------------------------------------------------+
 | Callouts - Adjust widths of callouts depending on size of image within |
 +------------------------------------------------------------------------*/
var Callouts = {
	fix : function() {
		// Check for functionality
		if (!document.getElementById || !document.getElementsByTagName) return false;
		
		var bin = document.getElementById("content-primary");
		var arrBins = bin.getElementsByTagName("*");
		var classRE = /call-[lr]/gi;
		
		// Set div width = largest image width
		for (var i = 0; i < arrBins.length; i++) {
			if (classRE.test(arrBins[i].className)) {
				var images = arrBins[i].getElementsByTagName("img");
				
				if (images.length >= 1) {
					var maxWidth = images[0].offsetWidth;
					
					for (var j = 0; j < images.length; j++) {
						var curWidth = images[j].offsetWidth;
						if (curWidth > maxWidth) maxWidth = curWidth;
					}
					
					//if (maxWidth > 100) {
						arrBins[i].style.width = maxWidth + "px";
					//}
				}
			}
		}
		
		return false;
	}
};


/*---------------------------------------------------------------------------------------+
 | Checklists - Add class to parent element when selected to make selection more visible |
 +---------------------------------------------------------------------------------------*/
var Checklists = {
	init : function() {
		// Find all links
		var lists = document.getElementsByTagName("ul");
		
		for (var i = 0; i < lists.length; i++) {
			if (lists[i].className.indexOf("checklist") > -1) {
				var curList = lists[i];
				var inputs = curList.getElementsByTagName("input");
				
				for (var j = 0; j < inputs.length; j++) {
					var curInput = inputs[j];
					
					if (curInput.type == "checkbox") {
						// Set classes in case of soft refreshes
						if (curInput.checked) curInput.parentNode.className = "sel";
						
						// Toggle class on label element
						curInput.onclick = function () {
							if (this.parentNode.className.indexOf("sel") > -1) {
								this.parentNode.className = "";
							} else {
								this.parentNode.className = "sel";
							}
						};
					}
				}
			}
		}
	}
};


/*--------------------------------------------+
 | Cursors - Change cursor for sortable lists |
 +--------------------------------------------*/
var Cursors = {
	init : function() {
		// Check for functionality
		if (!document.getElementById || !document.getElementsByTagName) return false;
		
		var lists = document.getElementsByTagName("ul");
		
		for (var i = 0; i < lists.length; i++) {
			var curList = lists[i];
			
			if (curList.className.indexOf("sequence") > -1) {
				var listItems = curList.getElementsByTagName("li");
				for (var j = 0; j < listItems.length; j++) {
					listItems[j].onmousedown = function() { this.style.cursor = "url(/images/shared/grabbing.cur), move"; };
					listItems[j].onmouseup = function() { this.style.cursor = "url(/images/shared/grab.cur), move"; };
				}
			}
		}
	}
};


/*----------------------------------------------------------------+
 | DidMouseMove - Only use, prevent lightbox from showing on drag |
 +----------------------------------------------------------------*/
var DidMouseMove = {
	hash : {},

	recordDown : function(event)
	{
		var element = Event.element(event);
		DidMouseMove.hash[element.id] = new Array();
		DidMouseMove.hash[element.id][0] = event.screenX;
		DidMouseMove.hash[element.id][1] = event.screenY;
	},
	
	stopEventIfItDid : function(event)
	{
		var element = Event.element(event);
		if (!(DidMouseMove.hash[element.id][0] == event.screenX
			&& DidMouseMove.hash[element.id][1] == event.screenY))
			event.stop();
	}
};


/*----------------------------------------------+
 | DocLinks - Add icon after links to documents |
 +----------------------------------------------*/
var DocLinks = {
	init : function() {
		// Find all links
		var links = document.getElementsByTagName("a");
		
		for (var i = 0; i < links.length; i++) {
			var theLink = links[i];
			var address = theLink.href.toLowerCase();
			
			// Don't add icon to links styled to look different
			if (theLink.className.indexOf("btn-fancy") == -1) {
				// Check if link points to files with common extensions
				var matches = address.match(/\.(doc|pdf|xls|ppt)/);
				
				if (matches) {
					// Using "match" always returns two results (not sure why)
					var ext = matches[0].substr(1, 3);
					
					// Create new image and insert it
					var newImg = document.createElement("img");
					newImg.alt = "(" + ext.toUpperCase() + ")";
					newImg.className = "icon";
					newImg.src = "/images/shared/icon-" + ext + ".gif";
					newImg.title = newImg.alt;
					
					if (theLink.getElementsByTagName("img").length <= 0)
						theLink.parentNode.insertBefore(newImg, theLink);
					
					// Make link open in new window/tab
					theLink.onclick = function () {
						window.open(this.href);
						return false;
					};
				}
			}
		}
	}
};


/*-----------------------------------------------------------------------------------------+
 | GoogleLinkTracker - Add click tracking for Google Analytics to files and outgoing links |
 +-----------------------------------------------------------------------------------------*/
var GoogleLinkTracker = {
	init : function() {
		var links = document.getElementsByTagName("a");
		
		for (var i = 0; i < links.length; i++) {
			var theLink = links[i];
			var theURL = theLink.href.toLowerCase();
			
			if (typeof(pageTracker) != "undefined")
			{
				if (/\.(bmp|doc|docx|gif|jpg|pdf|png|xls|xlsx|ppt|pptx|zip)/.test(theURL)) {
					var func = function () { if (pageTracker) pageTracker._trackPageview("/files/" + this.href); };
					
					if (typeof(jQuery) != "undefined")
						jQuery(theLink).click(func);
					else
						theLink.onclick = func;
				}
					
				if (theURL.indexOf("modelsforchange.net") == -1) {
					var func = function () { if (pageTracker) pageTracker._trackPageview("/outbound/" + this.href); };
					
					if (typeof(jQuery) != "undefined")
						jQuery(theLink).click(func);
					else
						theLink.onlick = func;
				}
			}
		}
	}
};


/*-----------------------------------------+
 | Hover - Add :hover functionality for IE |
 +-----------------------------------------*/
var Hover = {
	// Create two-dimensional array of identifiers for hover effect
	// [id/class] [child nodes] [unique]
	collections : new Array(
		new Array("nav", "li", true)
	),
	
	// Find all elemnts specified in array (IE only)
	init : function(collections) {
		if (document.all && document.getElementById && document.getElementsByTagName) {
			for (var i = 0; i < collections.length; i++) {
				var list = collections[i];
				var name = list[0];
				var delimiter = list[1];
				var unique = list[2];
				var children = new Array();
				
				if (unique) {
					// Unique element, find by ID
					var parent = document.getElementById(name);
					
					if (parent) {
						children = parent.getElementsByTagName(delimiter);
						Hover.addBehaviors(children);
					}
				} else {
					// Not unique, find by class
					var parents = document.getElementsByTagName("*");
					
					for (var j = 0; j < parents.length; j++) {
						if (parents[j].className.indexOf(name) > -1) {
							children = parents[j].getElementsByTagName(delimiter);
							Hover.addBehaviors(children);
						}
					}
				}
			}
		}
	},
	
	// Add class of "over" to elements when mouse hovers over them, remove when mouse stops hovering
	addBehaviors : function(collection) {
		for (var j = 0; j < collection.length; j++) {
			var node = collection[j];
			
			if (node.className.indexOf("current") == -1) {
			    node.onmouseover = function() { this.className += " over"; };
				node.onmouseout = function() { this.className = this.className.replace(" over", ""); };
			}
		}
	}
};


/*--------------------------------------------------+
 | Tog - Toggle visibility of two opposing elements |
 +--------------------------------------------------*/
var Tog = {
    swap: function(a, b) {
        Tog.toggle(a);
        Tog.toggle(b);
    },
    toggle: function(a) {
        if (typeof a == "string")
            a = document.getElementById(a);
        if (!a) return false;

        if (a.className.indexOf("closed") != -1) {
            Tog.toggleOn(a);
        } else {
            Tog.toggleOff(a);
        }
    },
    firstParamToggleOn: function(a, b, c) {
        Tog.toggleOn(a);
        Tog.toggleOff(b);
        Tog.toggleOff(c);
    },    
    toggleOn: function(a) {
        if (typeof a == "string")
            a = document.getElementById(a);
        if (!a) return false;

        oldClass = a.className;
        newClass = oldClass.replace(/closed/g, "");
        a.className = newClass;
    },
    toggleOff: function(a) {
        if (typeof a == "string")
            a = document.getElementById(a);
        if (!a) return false;

        a.className += " closed";
    },
    togglePropertyValue: function(a, prop, value1, value2) {
        if (typeof a == "string")
            a = document.getElementById(a);

        if (!a) return false;

        if (a[prop].indexOf(value1) != -1) {
            a[prop] = value2;
        } else {
            a[prop] = value1;
        }
    }
};