/* 
-----------------------------------------------------------------
	MOE Corporate
	styleswitcher.js
	
	Change applied stylesheet to resize text
	Created 12.02.2008 by DS
	Last Updated: See SVN		
	
	- test_for_css()
	- add_text_resizer()
	- reduce_text_size()
	- enlarge_text_size()
	- resize_text()
	- set_active_stylesheet()
	- create_cookie()
	- read_cookie()
	- erase_cookie()
	
-----------------------------------------------------------------
*/

	var current_size;

	var stylesheet_titles = new Array();
	stylesheet_titles[1] = 'Text Size: Smallest';	
	stylesheet_titles[2] = 'Text Size: Small';
	stylesheet_titles[3] = 'Text Size: Regular';	
	stylesheet_titles[4] = 'Text Size: Large';	
	stylesheet_titles[5] = 'Text Size: Largest';	
	
	var reducer;
	var enlarger;
	var default_alternate = 3;
	
	function test_for_css()
	{
		/* 
			Based on http://www.quirksmode.org/dom/getstyles.html
		*/			
		
		if (document.getElementsByTagName)
		{
			var pixel = document.getElementsByTagName('img')[0];
			
			if (pixel.currentStyle) /* explorer - note explorer fork must come first! */
			{
				var pixel_css_width = eval('pixel.currentStyle.width');
			}
			else if (document.defaultView.getComputedStyle) /* mozilla */
			{
				var pixel_css_width = document.defaultView.getComputedStyle(pixel, '').getPropertyValue("width");
			}	
			if ((pixel_css_width) && (pixel_css_width == '2px'))
			{
				// css will be enabled if pixel has been stretched to 2px wide by linked CSS file				
				return true;
			}
		}
	}	
	
	function disable_test_selection(e)
	{
		return false;
	}

	function enable_test_selection()
	{
		return true
	}
	
	function add_text_resizer()
	{
		var css_enabled = test_for_css();
		
		if (document.getElementById('search-nav') && css_enabled)
		{
			// DECREASE SIZE							
			
			var reducer_wrapper = document.createElement('li');
					reducer_wrapper.className = 'first disabled';	
					reducer_wrapper.id = 'reduce';					
				
					reducer = document.createElement('span'); // changed from button to span 16.05.2008									
					
					reducer.className = 'a blur button generated';					
					reducer.setAttribute('title', 'Reduce text size. '); // hidden text may be more accessible than relying on the title attribute		
					
			var reducer_liner_wrapper = document.createElement('span');			
					reducer_liner_wrapper.className = 'wrapper';					
					
			var reducer_liner = document.createElement('span');			
					reducer_liner.className = 'liner';

			var reducer_text = document.createTextNode('a');
			
			var reducer_hidden_text_wrapper = document.createElement('span');
					reducer_hidden_text_wrapper.className = 'access';		
			var reducer_hidden_text = document.createTextNode(' (reduce text size)');
					reducer_hidden_text_wrapper.appendChild(reducer_hidden_text);
				
					reducer_liner_wrapper.appendChild(reducer_liner);
					reducer_liner.appendChild(reducer_text);			
					reducer.appendChild(reducer_liner_wrapper);					
					reducer.appendChild(reducer_hidden_text_wrapper);							
						reducer_wrapper.appendChild(reducer);			
				
				/*	Device independent handlers
					Generating a button instead of our standard faux-link is a bit sifty,
					but I think we can get away with it because:
						the whole page is wrapped in a .net form,
						the button action is relevant to the data/content contained within the whole page,
						the button only exists if JS is enabled,
						and it means that we can cater to kayboard users :)
				*/			
				add_event(reducer, 'click', reduce_text_size, false);
				
				if (whichbrowser.isIE)
				{
					reducer.onselectstart = new Function ("return false");
				}
				else
				{
					reducer.onmousedown = disable_test_selection;
					reducer.onclick = enable_test_selection;	
				}					
				
			// INCREASE SIZE
				
			var enlarger_wrapper = document.createElement('li');
					enlarger_wrapper.className = 'disabled';				
					enlarger_wrapper.id = 'enlarge';			
				
					enlarger = document.createElement('span'); // changed from button to span 16.05.2008
					
					// Prevent selection (grey background) of span.button text on click
					// this block only works in this shorthand
					if (whichbrowser.isIE)
					{
						enlarger.onselectstart = new Function ("return false");
					}
					else
					{
						enlarger.onmousedown = disable_test_selection;
						enlarger.onclick = enable_test_selection;	
					}						
					
					enlarger.className = 'a blur button generated';
					enlarger.setAttribute('title', 'Increase text size. '); // hidden text may be more accessible than relying on the title attribute													
					
			var enlarger_liner_wrapper = document.createElement('span');			
					enlarger_liner_wrapper.className = 'wrapper';								
					
			var enlarger_liner = document.createElement('span');	
					enlarger_liner.className = 'liner';			

			var enlarger_text = document.createTextNode('A');
			
			var enlarger_hidden_text_wrapper = document.createElement('span');
					enlarger_hidden_text_wrapper.className = 'access';		
			var enlarger_hidden_text = document.createTextNode(' (increase text size)');
					enlarger_hidden_text_wrapper.appendChild(enlarger_hidden_text);
				
					enlarger_liner_wrapper.appendChild(enlarger_liner);	
					enlarger_liner.appendChild(enlarger_text);	
					enlarger.appendChild(enlarger_liner_wrapper);						
					enlarger.appendChild(enlarger_hidden_text_wrapper);							
					enlarger_wrapper.appendChild(enlarger);										
				
					add_event(enlarger, 'click', enlarge_text_size, false);		

					// Prevent selection (grey background) of span.button text on click
					// this block only works in this shorthand
					if (whichbrowser.isIE)
					{
						enlarger.onselectstart = new Function ("return false");
					}
					else
					{
						enlarger.onmousedown = disable_test_selection;
						enlarger.onclick = enable_test_selection;	
					}		

			// INSERT INTO DOM
				
			var next_sibling = document.getElementById('search-nav').getElementsByTagName('li')[0];	
					next_sibling.className = ''; // no longer 'first'
					next_sibling.parentNode.insertBefore(enlarger_wrapper, next_sibling);	
				
			var next_sibling = document.getElementById('search-nav').getElementsByTagName('li')[0];	
					next_sibling.parentNode.insertBefore(reducer_wrapper, next_sibling);				
		}
	}	
	
	function reduce_text_size(e)
	{
		if (current_size > 1)
		{
			set_active_stylesheet(current_size - 1);		
		}
	}

	function enlarge_text_size()
	{
		if (current_size < 5)
		{		
			set_active_stylesheet(current_size + 1);
		}
	}		
	
	function resize_text() 
	{
		var alternate_index = read_cookie("moe_corporate_textsize");
		
		if (alternate_index != null) // if a style has been set, what is it?
		{
			set_active_stylesheet(alternate_index); // enable this particular alternate stylesheet
		}
		else // apply the default alternate stylesheet
		{
			set_active_stylesheet(default_alternate);
		}
	}	

	function set_active_stylesheet(stylesheet_index) 
	{	
		/* 
			StyleSwitcher (resize text)
			Enable/Disable and Cookies sections written by Paul Sowden
			http://www.idontsmoke.co.uk/ss/
			http://www.alistapart.com/stories/alternate/	
		*/			
		
		// apply the alternate style via a cookie so that	it is persistent
		var i, a, main, title;
		
		// erase existing cookie (for ie7)
		erase_cookie("moe_corporate_textsize");
		
		// create new cookie to save selected stylesheet index
		create_cookie("moe_corporate_textsize", stylesheet_index, 365); 
		
		// read cookie - only apply new style if cookies enabled (styles persistent)
		cookieSize = read_cookie('moe_corporate_textsize');
		
		if (cookieSize)
		{
			current_size = parseInt(read_cookie('moe_corporate_textsize'));
		}
		else 
		{
			current_size = 0;
		}
		
		// use cookie value to apply styling
		if (current_size != 0)
		{		
			// match stylesheet_index to title stored in array
			title = stylesheet_titles[current_size];
			
			// loop through all alternative stylesheets (identified by <link rel="stylesheet"...title="...">)
			// disable all alternative stylesheets
			// enable selected alternative stylesheet
			for (i=0; (a = document.getElementsByTagName("link")[i]); i++)
			{
				if (
					(a.getAttribute("rel").indexOf("style") != -1) // Is this a link to a style sheet?
					&& 
					(a.getAttribute("title")) // Is there a title attribute? (only preferred/alternate stylesheets have a title)
				) 
				{
					a.disabled = true; // disable all alternatives by default
					
					if (a.getAttribute("title") == title) // if this is the preferred alternative
					{					
						a.disabled = false; // enable this alternative
					}
				}
			}
		}
		else
		{
			// no cookie support
			document.getElementById('search-nav').getElementsByTagName('ul')[0].removeChild(reducer.parentNode);
			document.getElementById('search-nav').getElementsByTagName('ul')[0].removeChild(enlarger.parentNode);			
			document.getElementById('search-nav').getElementsByTagName('li')[0].className = 'first';			
		}
		
		// update display of and actions triggered by resize buttons
		update_resize_buttons(current_size);		
	}
	
	function update_resize_buttons(current_size)
	{	
		/* 
			Control which resize buttons are active, 
			based on whether the current_size may be enlarged or reduced
		*/
		
		if ((document.getElementById('reduce')) && (document.getElementById('enlarge')))
		{			
			switch(current_size)
			{
				case 1:
					reducer.parentNode.className = reducer.parentNode.className.replace('enabled', 'disabled');		
					reducer.setAttribute('title', 'You are at the minimum text size. ')
				
					enlarger.parentNode.className = enlarger.parentNode.className.replace('disabled', 'enabled');		
					enlarger.setAttribute('title', 'Increase text size. ')
					break;
				case 2:
					reducer.parentNode.className = reducer.parentNode.className.replace('disabled', 'enabled');	
					reducer.setAttribute('title', 'Reduce text size. ')					
					enlarger.parentNode.className = enlarger.parentNode.className.replace('disabled', 'enabled');			
					enlarger.setAttribute('title', 'Increase text size. ')					
					break;
				case 3:
					reducer.parentNode.className = reducer.parentNode.className.replace('disabled', 'enabled');			
					reducer.setAttribute('title', 'Reduce text size. ')					
					enlarger.parentNode.className = enlarger.parentNode.className.replace('disabled', 'enabled');			
					enlarger.setAttribute('title', 'Increase text size. ')					
					break;
				case 4:
					reducer.parentNode.className = reducer.parentNode.className.replace('disabled', 'enabled');		
					reducer.setAttribute('title', 'Reduce text size. ')					
					enlarger.parentNode.className = enlarger.parentNode.className.replace('disabled', 'enabled');			
					enlarger.setAttribute('title', 'Increase text size. ')					
					break;					
				case 5:
					reducer.parentNode.className = reducer.parentNode.className.replace('disabled', 'enabled');		
					reducer.setAttribute('title', 'Reduce text size. ')					
					enlarger.parentNode.className = enlarger.parentNode.className.replace('enabled', 'disabled');	
					enlarger.setAttribute('title', 'You are at the maximum text size. ')					
						
					break;		
				default:
					// aka case:0 - if no sizeStyle retrievable, remove resize set
					reducer.parentNode.className = reducer.parentNode.className.replace('enabled', 'disabled');		
					reducer.setAttribute('title', 'You are at the minimum text size. ')	
					enlarger.parentNode.className = enlarger.parentNode.className.replace('enabled', 'disabled');			
					enlarger.setAttribute('title', 'You are at the maximum text size. ')	
					break;
				break;
			}
		}
	}	

	function create_cookie(name, value, days) 
	{
		/* 
			Read and Write Cookies
			http://www.quirksmode.org/js/cookies.html
		*/		
		
		if (days) 
		{
			var date = new Date();
			date.setTime(date.getTime() + (days*24*60*60*1000));
			var expires = '; expires=' + date.toGMTString(); // safari-killing whitespace removed 26.07.2007
			var path = '; path=/';
		}
		else var expires = '';
		// path added 210705 as cookie may have been saved per page or folder
		document.cookie = name + ' = ' + value + expires + path;
	}
	function read_cookie(name) 
	{
		/* 
			Read and Write Cookies
			http://www.quirksmode.org/js/cookies.html
			
			For some reason this function is failing in IE5x, 
			while the create_cookie() function is working well.
			This issue is duplicated on other sites offering a test script.
			Could this be a problem with the test browser?			
		*/		
		
		var name_value = name + '='; // white space between quotes removed!
		var cookie_array = document.cookie.split(';');
		
		for (var i=0; i<cookie_array.length; i++) 
		{
			var c = cookie_array[i];
			
			while (c.charAt(0) == ' ')
			{
				c = c.substring(1, c.length);				
			}
			if (c.indexOf(name_value) == 0) 
			{
				return c.substring(name_value.length, c.length);
			}
			
	  }
	  return null;
	}	
	
	function erase_cookie(name) 
	{
		create_cookie(name,"",-1);
	}		