	//encapsulated script to animate and fade tab content display
	var animatedTabs = {
		
		init: function(){

			//set animation and fade parameters
			animatedTabs.div = document.getElementById("mainArea");
			animatedTabs.fadeDiv = document.getElementById("subnav");
			animatedTabs.oType = animatedTabs.getOpacityType(animatedTabs.fadeDiv);
			animatedTabs.fps = 50;
			animatedTabs.fadeTime = 0.8;
			animatedTabs.steps = animatedTabs.fadeTime * animatedTabs.fps;
			
			animatedTabs.serviceHeight = animatedTabs.getServiceContentHeight();
			animatedTabs.lawyerHeight = animatedTabs.getLawyerContentHeight();
			
			animatedTabs.frameRate = 25;
			animatedTabs.deceleration = 4;
			animatedTabs.expandedY = 0;
			animatedTabs.collapsedY = -120;
			animatedTabs.targetY = 0;
			animatedTabs.originY = parseInt(Core.getComputedStyle(animatedTabs.div, "top"), 10);
			animatedTabs.y = animatedTabs.originY;
			animatedTabs.collapseTime = 800;
			animatedTabs.fadeTime = 800;
			
			//put tab references into array
			var aTabHeaders = Core.getElementsByClass("tabHeader");
			
			//add listeners to tabs 
			for (var i = 0; i < aTabHeaders.length; i++){
				
				//check for contents
				if(aTabHeaders.innerHTML != ""){
					Core.addEventListener(aTabHeaders[i], "click", animatedTabs.activateTab);
				}				
			}		

			//detect if page requires tab content open
			var aReqPages = ["Xlawyer", "Xservice"];
			for (var i = 0; i < aReqPages.length; i++){
				if(window.location.pathname.indexOf(aReqPages[i]) > 0){			
		
					//tab content required, add content and show
					animatedTabs.fadeDiv.innerHTML = "";
					var contentName = aReqPages[i] + "Content";
					animatedTabs.newTab = document.getElementById(aReqPages[i] + "s");
					var content = document.getElementById(contentName);
					var clone = content.cloneNode(true);
					animatedTabs.fadeDiv.appendChild(clone);	
					animatedTabs.div.style.top = "0px";
					animatedTabs.setfade(1);
					Core.addClass(animatedTabs.div, "expanded");
					
					//if appropriate add selected style to the current link
					var nLinkId = aReqPages[i] + animatedTabs.querySt("id");
					if(nLinkId > 0){
						var rLink = document.getElementById(aReqPages[i] + nLinkId);
						Core.addClass(rLink, "currentLink");
					}
					break;
				}
			}
		},
		
		getServiceContentHeight: function(){
			var serviceFirst = document.getElementById("serviceFirst");
			var serviceSecond = document.getElementById("serviceSecond");
			var serviceThird = document.getElementById("serviceThird");		
			
			var nHeight = Math.max(Math.max(serviceFirst.offsetHeight, serviceSecond.offsetHeight), serviceThird.offsetHeight);
			return nHeight;
		},
		
		getLawyerContentHeight: function(){
			var lawyerFirst = document.getElementById("lawyerFirst");
			var lawyerSecond = document.getElementById("lawyerSecond");
			var lawyerThird = document.getElementById("lawyerThird");		
			var lawyerFourth = document.getElementById("lawyerFourth");		
			
			var nHeight = Math.max(Math.max(Math.max(lawyerFirst.offsetHeight, lawyerSecond.offsetHeight), lawyerThird.offsetHeight),lawyerFourth);
			return nHeight;
		},
		
		activateTab: function(){
			
			//figure out if expanded or collapsed and move accordingly
			if(Core.hasClass(animatedTabs.div, "expanded") == true){

				//find out which height has been activated and animate for the height of the tallest content div
				var contentName = animatedTabs.newTab.parentNode.id;
				switch(contentName){
					case "service":
						animatedTabs.collapsedY = "-" + animatedTabs.serviceHeight;
						//animatedTabs.div.style.top = animatedTabs.lawyerHeight;
						break;
					case "lawyer":
						animatedTabs.collapsedY = "-" + animatedTabs.lawyerHeight;
						//animatedTabs.div.style.top = animatedTabs.serviceHeight;
						break;					
					default:
						animatedTabs.collapsedY = -120;
						break;						
				}
				
				//set animation parameters
				animatedTabs.targetY = animatedTabs.collapsedY;
				animatedTabs.originY = parseInt(Core.getComputedStyle(animatedTabs.div, "top"), 10);
				animatedTabs.y = animatedTabs.originY;
				animatedTabs.animate();
				animatedTabs.newTab = this;
				animatedTabs.fade("out");
				
				setTimeout(animatedTabs.expandTab, animatedTabs.collapseTime);
				
			}else{
				animatedTabs.newTab = this;
				animatedTabs.expandTab();
			}
		},
		
		expandTab: function(){
			
			//set as expanded
			Core.addClass(animatedTabs.div, "expanded");
			Core.removeClass(animatedTabs.div, "collapsed");			
			
			//add content from tabcontents into subnav
			animatedTabs.fadeDiv.innerHTML = "";
			var contentName = animatedTabs.newTab.parentNode.id + "Content";
			var content = document.getElementById(contentName);
			var clone = content.cloneNode(true);
			animatedTabs.fadeDiv.appendChild(clone);	
			
			switch(contentName){
					case "service":
						animatedTabs.collapsedY = "-" + animatedTabs.serviceHeight;
						break;
					case "lawyer":
						animatedTabs.collapsedY = "-" + animatedTabs.lawyerHeight;
						break;					
					default:
						animatedTabs.collapsedY = -120;
						break;						
				}
			
			animatedTabs.targetY = animatedTabs.expandedY;
			animatedTabs.originY = parseInt(Core.getComputedStyle(animatedTabs.div, "top"), 10);
			animatedTabs.y = animatedTabs.originY;
			animatedTabs.animate();
			
			animatedTabs.fade("in");				

		},
		
		animate: function(){

			//calculate new height
			animatedTabs.y += (animatedTabs.targetY - animatedTabs.y) / animatedTabs.deceleration;
		
			//if target height reached finish process
			if ((animatedTabs.targetY > animatedTabs.originY && Math.round(animatedTabs.y) >= animatedTabs.targetY) || (animatedTabs.targetY < animatedTabs.originY && Math.round(animatedTabs.y) <= animatedTabs.targetY)){
				
				//set to target height
				animatedTabs.y = animatedTabs.targetY;
				if(animatedTabs.targetY == 0){
					Core.addClass(animatedTabs.div, "expanded");
					Core.removeClass(animatedTabs.div, "collapsed");
				}else{
					Core.addClass(animatedTabs.div, "collapsed");	
					Core.removeClass(animatedTabs.div, "expanded");
				}
				
			}else{
				
				//set time for next increment
				setTimeout(animatedTabs.animate, animatedTabs.collapseTime / animatedTabs.frameRate)
			
			}
			//set new height
			animatedTabs.div.style.top = Math.round(animatedTabs.y) + "px";
		},
		
		fade: function(direction){

			//initialise the fade
			if (animatedTabs.oType != "none"){
				if (direction == "out"){ 
					animatedTabs.dofade(1, false); 
				}else{ 
					animatedTabs.dofade(0, true); 
				}
		  	}
		},
		
		dofade: function(value, targetvisibility){

			value += (targetvisibility ? 1 : -1) / animatedTabs.steps;
			if (targetvisibility ? value > 1 : value < 0){
				value = targetvisibility ? 1 : 0;
			}
			
			animatedTabs.setfade(value);
			
			if (targetvisibility ? value < 1 : value > 0){
				setTimeout(function(){animatedTabs.dofade(value, targetvisibility);}, animatedTabs.fadeTime / animatedTabs.fps);
			}
		},
		
		setfade: function(value){
			
			//set the opacity
			switch(animatedTabs.oType){
				case 'ie':
					animatedTabs.fadeDiv.filters.alpha.opacity = value * 100;
					break;
			
				case 'khtml':
					animatedTabs.fadeDiv.style.KhtmlOpacity = value;
					break;
			
				case 'moz':
					animatedTabs.fadeDiv.style.MozOpacity = (value == 1 ? 0.9999999 : value);
					break;
			
				default:
					animatedTabs.fadeDiv.style.opacity = (value == 1 ? 0.9999999 : value);
			}
		},
		
		getOpacityType: function(oDiv){
			//find the type of opacity used by the browser
			if (typeof oDiv.style.opacity != 'undefined'){
				var otype = 'w3c';
			}else if (typeof oDiv.style.MozOpacity != 'undefined'){
				otype = 'moz';
			}else if (typeof oDiv.style.KhtmlOpacity != 'undefined'){
				otype = 'khtml';
			}else if (typeof oDiv.filters == 'object'){
				otype = (oDiv.filters.length > 0
				&& typeof oDiv.filters.alpha == 'object'
				&& typeof oDiv.filters.alpha.opacity == 'number')
				? 'ie' : 'none';
			}else{ 
				otype = 'none'; 
			}
			
			return otype;
		},
		
		querySt: function(ji) {
			hu = window.location.search.substring(1);
			gy = hu.split("&");
			for (i=0;i<gy.length;i++) {
				ft = gy[i].split("=");
				if (ft[0] == ji) {
					return ft[1];
				}
			}
		}
		
	}
	
	Core.start(animatedTabs);
