var TMD = {
	tabControls:  function(tabset,initialSelectedTab){
		//Get tabset container
		if (typeof tabset == 'string') {
			if (document.getElementById(tabset)) {
				tabset = document.getElementById(tabset);
			}
			else {
				return;
			}			
		}
		//Get ul and then tabset navigation links
		var tabsetNavigation = tabset.getElementsByTagName("ul")[0];
		var tabLinks = tabsetNavigation.getElementsByTagName("a");
	
		//Get tab content divs
		var tabsetContentDivs = TMD.getElementsByClassName('tabContent',"div",tabset);
		//Function to remove all 'on' classes
		var removeAllOnClasses = function () {
			for (i=0; i<tabLinks.length; i++) {
				TMD.removeClass(tabLinks[i],"on");
				TMD.removeClass(tabsetContentDivs[i],"on");
			}
		}
		
		//Function to add 'on' class to specified element
		var addOnClass = function (tabLinkToSwitchOn) {
			removeAllOnClasses();
			for (i=0; i<tabLinks.length; i++) {
				var tabLink = tabLinks[i].toString();
				tabLink = tabLink.substring(tabLink.indexOf("#")+1);
				if (tabLink == tabLinkToSwitchOn){
					tabLink = tabLinks[i];
					TMD.addClass(tabLinks[i],"on");
					TMD.addClass(tabsetContentDivs[i],"on");
				}
			}
		}
		
		//Function to return the href hash/ID of tab link that has just been clicked
		var getSelectedTabLink = function (e) {
			if(!e) {
				e = window.event;
			}
			if (window.attachEvent) {
				e.returnValue = false;
				//This if statement is a bug fix for ie6 which seems to lose track of where we are in the DOM.  The bottom else statement is the normal behaviour.
				if (e.srcElement.toString().indexOf("#") != -1) {
					var selectedTabLink = e.srcElement.toString();
				}
				else {
					var selectedTabLink = e.srcElement.parentElement.toString();
				}
			}
			else {
				e.preventDefault();
				var selectedTabLink =(e.currentTarget).toString();
			}
			selectedTabLink = selectedTabLink.substring(selectedTabLink.indexOf("#")+1);
			return selectedTabLink;
		}
		
		//Add 'on' class to specified element that acts as initial 'on' tab
		addOnClass(initialSelectedTab);
		
		//Initialisation function to attach addOnClass function to tab navigation links.
		for (i=0; i<tabLinks.length; i++) {
			if (window.addEventListener) {
				tabLinks[i].addEventListener("click", 
				function(e) {
					addOnClass(getSelectedTabLink(e));
				},
				false
				);
			}
			else if (window.attachEvent) {
				tabLinks[i].attachEvent("onclick", 
				function(e) {
					if(!e) {
						e= window.event;
					}
					addOnClass(getSelectedTabLink(e));
				});
			}
		}
	},
	
	isMemberOfClass: function(element, classNameToSearch) {
		if (typeof element == 'string') {
			element = document.getElementById(element);
		}
		var classes = element.className;
		if (!classes) {
			return false;
		}
		if (classes == classNameToSearch) {
			return true;
		}
		return element.className.search('\\b' + classNameToSearch + '\\b') != -1;
	},
	
	addClass: function (element, classNameToSearch) {
		if (typeof element == 'string') {
			element = document.getElementById(element);
		}
		if (element instanceof Array) {
			for (i=0; i<element.length; i++) {
				if (TMD.isMemberOfClass(element[i], classNameToSearch)) {
					continue;
				}
				else {
					if (element[i].className) {
						element[i].className += " " + classNameToSearch;					
					}
					else {
						element[i].className = classNameToSearch;
					}
				}
			}
		}
		else {
			if (element.className) {
				element.className += " " + classNameToSearch;					
			}
			else {
				element.className = classNameToSearch;
			}
		}
	},
	
	removeClass: function (element, classNameToSearch) {
		if (typeof element == 'string') {
			element = document.getElementById(element);
		}
		if (element instanceof Array) {
			for (i=0; i<element.length; i++) {
				element[i].className = element[i].className.replace(new RegExp('\\b\\s*' + classNameToSearch + '\\s*\\b', 'g'), "");
			}
		}
		else {
			element.className = element.className.replace(new RegExp('\\b\\s*' + classNameToSearch + '\\s*\\b', 'g'), "");
		}
	},
	
	getElementsByClassName: function(classNameToSearch, tagname, rootID) {
		//If no root specified then use entire document
		if (!rootID) {
			rootID = document;
		}
		else if (typeof rootID == "string") {
			rootID = document.getElementById(rootID);
		}
		
		//If no tagname specified then use all tags
		if (!tagname) {
			tagname ="*";
		}
		
		//get all elements with the tagname under the root
		var all = rootID.getElementsByTagName(tagname);
		//If no class name specified then return all elements
		if (!classNameToSearch) {
			return all;
		}
		
		//filter elements by class name
		var matchingElements = [];
		for(var i=0; i < all.length; i++) {
			var element = all[i];
			if (TMD.isMemberOfClass(element, classNameToSearch)) { 
				matchingElements.push(element);
			}
		}
		return matchingElements; //returns array even if empty cos no classname match
	},
	
	pseudoHoverClassForIE6: function(parentContainerID, tagTypeToApplyHoverClassTo){
		if (document.getElementById(parentContainerID)) {
			var pseudoHoverClassEls = document.getElementById(parentContainerID).getElementsByTagName(tagTypeToApplyHoverClassTo);
		}
		else {
			return;
		}
		for (var i=0; i<pseudoHoverClassEls.length; i++) {
			pseudoHoverClassEls[i].onmouseover = function() {
				this.className += " hoverOver";
			}
			pseudoHoverClassEls[i].onmouseout = function() {
				this.className = this.className.replace(new RegExp(" hoverOver\\b"), "");
			}
		}
	},
	
	onDomReady: function(functionToBeRun) {
		function init() {
			// quit if this function has already been called
			if (arguments.callee.done) {
				return;
			}
			
			// flag this function so we don't do the same thing twice
			arguments.callee.done = true;
			
			// kill the timer for Safari
			if (_timer) {
				clearInterval(_timer);
			}
			
			// do stuff
			var events = [];
			events.push(functionToBeRun);
			for (var i = 0, j = events.length; i<j; i++) {
				events[i]();
			}
		};
		
		/* for Mozilla/Opera9 */
		if (document.addEventListener) {
			document.addEventListener("DOMContentLoaded", init, false);
		}
		
		/* for Internet Explorer */
		/*@cc_on @*/
		/*@if (@_win32)
			document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
			var script = document.getElementById("__ie_onload");
			script.onreadystatechange = function() {
				if (this.readyState == "complete") {
					init();
				}
			};
		/*@end @*/
		
		/* for Safari */
		if (/WebKit/i.test(navigator.userAgent)) {
			var _timer = setInterval(function() {
				if (/loaded|complete/.test(document.readyState)) {
					init();
				}
			}, 10);
		}
		
		/* for other browsers */
		window.onload = init;		
	}
	
};

TMD.onDomReady(function(){
	TMD.tabControls("tabsetCV","expertise");
	TMD.tabControls("tabsetPortfolio","snowGlobe");
});

