/**************************************************************

	Script		: mooSwitch
	Version		: 3.1
	Author		: Liam Smart
	Licence		: Open Source MIT Licence
	Usage		: window.addEvent('domready', function(){
					 //call mooSwitch
					  var initMooSwitch = new mooSwitch({
						  container: $(document.body),//inline font-size style will be applied to this
						  defaultDomain: 'liamsmart.co.uk',//default domain so cookie can be shared between different sub-domains
						  linksContainer: $('ChangeTextSize'),//container that holds the text size links (error message will be output here)
						  templateContainer: $('ChangeTemplate'),//container that holds the template switch links (error message will be output here)
						  smallSize: '90%',//small font size
						  mediumSize: '100%',//medium font size
						  largeSize: '110%',//large font size
						  smallLink: '.mooSwitch li.small a',//link to trigger small font (could be the li, or an image etc.)
						  mediumLink: '.mooSwitch li.medium a',//link to trigger medium font (could be the li, or an image etc.)
						  largeLink: '.mooSwitch li.large a',//link to trigger large font (could be the li, or an image etc.)
						  defaultSize: '100%',//if no cookies are set there must be a default size to set page to (must be percentage)
						  defaultTemplate: 'One',//if no template cookie has been set, which template to use as default (options: 'One','Two')
						  templateOneLink: '.mooSwitch li.TemplateOne a',//link to trigger template one switch (could be the li, or an image etc.)
						  templateTwoLink: '.mooSwitch li.TemplateTwo a',//link to trigger template two switch (could be the li, or an image etc.)
						  templateOne: './styles/TemplateOne.css',//path to template one stylesheet
						  templateTwo: './styles/TemplateTwo.css',//path to template two stylesheet
						  showAlerts: true,//display alerts to warn users cookies are disabled etc
						  alertsPos: 'bottom',//where to inject the alerts relative to the containers specified (allowed: 'top','bottom','after','before' see: http://mootools.net/docs/Element/Element#Element:inject)
						  speed: 400//duration the transition will take
					});
				});

**************************************************************/

//start mooSwitch class
var mooSwitch = new Class({
	
	//implements
	Implements:[Options],

	//options
	options:{
		linksContainer: $('ChangeTextSize'),//container that holds the text size links (error message will be output here)
		templateContainer: $('ChangeTemplate'),//container that holds the template switch links (error message will be output here)
		smallSize: '62%',//small font size
		mediumSize: '72%',//medium font size
		largeSize: '82%',//large font size
		smallLink: '.mooSwitch li.small a',//link to trigger small font (could be the li, or an image etc.)
		mediumLink: '.mooSwitch li.medium a',//link to trigger medium font (could be the li, or an image etc.)
		largeLink: '.mooSwitch li.large a',//link to trigger large font (could be the li, or an image etc.)
		defaultSize: '72%',//if no cookies are set there must be a default size to set page to (options: 'small','medium','large')
		templateOne: './styles/TemplateOne.css',//path to template one stylesheet
		templateTwo: './styles/TemplateTwo.css',//path to template two stylesheet
		showAlerts: true,//display alerts to warn users cookies are disabled etc
		alertsPos: 'bottom',//where to inject the alerts relative to the containers specified (allowed: 'top','bottom','after','before' see: http://mootools.net/docs/Element/Element#Element:inject)
		speed: 400//duration the transition will take
	},
	
	//initialization
	initialize:function(options){
		//set options
		this.setOptions(options);
		//start mooSwitch
		if($$(this.options.linksContainer).length > 0 || $$(this.options.templateContainer).length > 0){this.start();};
	},
	
	//start mooSwitch
	start:function(){
		//test cookie settings
		var myCookieSizeSet = Cookie.write('mooSwitchTest',1,{duration:365,domain:this.options.defaultDomain,path:'/'});
		var myCookieSizeRead = Cookie.read('mooSwitchTest');
		var myCookieSaved = Cookie.read('mooSwitchSaved');
		//if cookie above was not successfully set then display error div but only if first visit
		if(this.options.showAlerts == true){
			if(myCookieSizeRead == 1 && myCookieSaved == null){
				//build div as first time user with cookies enabled
				var cookieAlert = new Element('div', {
					'class': 'mooSwitchAlertGreen',
					'html': '<p>Your settings will be saved from now on!</p>'
				});
				//prevent an error if linksContainer isnt specified
				if(this.options.linksContainer != null){
					cookieAlert.inject(this.options.linksContainer,this.options.alertsPos);
				}else if(this.options.templateContainer != null){//try template links container
					cookieAlert.inject(this.options.templateContainer,this.options.alertsPos);
				}else{//just inject it at top of container
					cookieAlert.inject(this.options.container,this.options.alertsPos);
				};
				//set cookie so this loop isnt triggered for another year
				Cookie.write('mooSwitchSaved',1,{duration:365,domain:this.options.defaultDomain,path:'/'});
			}else if(myCookieSizeRead == null){
				//build enable cookie alert div as cookies disabled
				//build div as first time user with cookies enabled
				var cookieAlert = new Element('div', {
					'class': 'mooSwitchAlertRed',
					'html': '<p>You need to enable cookies for settings to be saved!</p>'
				});
				//prevent an error if linksContainer isnt specified
				if(this.options.linksContainer != null){
					cookieAlert.inject(this.options.linksContainer,this.options.alertsPos);
				}else if(this.options.templateContainer != null){//try template links container
					cookieAlert.inject(this.options.linksContainer,this.options.alertsPos);
				}else{//just inject it at top of container
					cookieAlert.inject(this.options.container,this.options.alertsPos);
				};
			};
		};
		//call next function
		this.setCookies();
	},
	
	//start building switchers
	setCookies:function(){
		//set up size variables
		var myCookieSize = Cookie.read("mooSwitchSize");
		var myCookieTemplate = Cookie.read("mooSwitchTemplate");
		var smallA = $$(this.options.smallLink);
		var mediumA = $$(this.options.mediumLink);
		var largeA = $$(this.options.largeLink);
		var templateOne = $$(this.options.templateOneLink);
		var templateTwo = $$(this.options.templateTwoLink);
		var morphTextSize = new Fx.Morph(this.options.container,{duration:this.options.speed,transition:Fx.Transitions.linear,'unit':'%'});
		
		//check to see if a template was ever set
		if(myCookieTemplate == null){
			//set cookie to default template one so rest of class will work and set variable
			Cookie.write('mooSwitchTemplate',this.options.defaultTemplate,{duration:365,domain:this.options.defaultDomain,path:'/'});
			myCookieTemplate = this.options.defaultTemplate;
		};
		
		//clear all selected states
		smallA.removeClass('selected');
		mediumA.removeClass('selected');
		largeA.removeClass('selected');
		
		//set link selected class to selected depending on cookie value
		if(myCookieSize == this.options.largeSize){
			//change selected states
			largeA.addClass('selected');
			//change text size
			this.options.container.setStyle('font-size',this.options.largeSize);
		}else if(myCookieSize == this.options.mediumSize){
			//change selected states
			mediumA.addClass('selected');
			//change text size
			this.options.container.setStyle('font-size',this.options.mediumSize);
		}else if(myCookieSize == this.options.smallSize){
			//change selected states
			smallA.addClass('selected');
			//change text size
			this.options.container.setStyle('font-size',this.options.smallSize);
		}else if(myCookieSize != null){
			//change text size since it must be a percentage value for second template
			this.options.container.setStyle('font-size',myCookieSize);
		}else{
			//set cookie since there isnt one already and set container to default size
			Cookie.write('mooSwitchSize',this.options.defaultSize,{duration:365,domain:this.options.defaultDomain,path:'/'});
			this.options.container.setStyle('font-size',this.options.defaultSize);
			//if its default template & no cookie-size revert to default option
			if(myCookieTemplate == 'One'){
				//add selected class to link and set font-size to container
				if(this.options.defaultSize == this.options.largeSize){
					largeA.addClass('selected');
					this.options.container.setStyle('font-size',this.options.largeSize);
				}else if(this.options.defaultSize == this.options.mediumSize){
					mediumA.addClass('selected');
					this.options.container.setStyle('font-size',this.options.mediumSize);
				}else{
					smallA.addClass('selected');
					this.options.container.setStyle('font-size',this.options.smallSize);
				};
			};
		};
		
		//template
		if(myCookieTemplate == "Two"){
			//change selected states
			templateOne.removeClass('selected');
			templateTwo.addClass('selected');
			//change template
			var myCSS = new Asset.css('./styles/TemplateTwo.css',{id:'TemplateTwo',title:'TemplateTwo'});
		}else{
			//change selected states
			templateOne.addClass('selected');
			templateTwo.removeClass('selected');
		};
		
		//set up events for each link to set cookie value
		//small
		smallA.addEvent('click', function(event){
			//prevent default
			event.preventDefault();
			//morph text size and set cookie
			if(myCookieTemplate == 'One'){
				//set cookie
				Cookie.write('mooSwitchSize',this.options.smallSize,{duration:365,domain:this.options.defaultDomain,path:'/'});
				//set font size
				morphTextSize.start({
					'font-size': this.options.smallSize
				});
				//change selected states
				smallA.addClass('selected');
				mediumA.removeClass('selected');
				largeA.removeClass('selected');
			}else{
				if(this.options.container.getStyle('font-size').toInt() >= this.options.smallSize.toInt()){
					//set cookie
					Cookie.write('mooSwitchSize',this.options.container.getStyle('font-size').toInt()-5+'%',{duration:365,domain:this.options.defaultDomain,path:'/'});
					//set font size
					morphTextSize.start({
						'font-size': this.options.container.getStyle('font-size').toInt()-5+'%'
					});
				}else{
					//change selected states
					smallA.addClass('selected');
					largeA.removeClass('selected');
				};
			};
		}.bind(this));
		
		//medium
		mediumA.addEvent('click', function(event){
			//prevent default
			event.preventDefault();
			//morph text size and set cookie
			if(myCookieTemplate == 'One'){
				//set cookie
				Cookie.write('mooSwitchSize',this.options.mediumSize,{duration:365,domain:this.options.defaultDomain,path:'/'});
				//set font size
				morphTextSize.start({
					'font-size': this.options.mediumSize
				});
				//change selected states
				smallA.removeClass('selected');
				mediumA.addClass('selected');
				largeA.removeClass('selected');
			};
		}.bind(this));
		
		//large
		largeA.addEvent('click', function(event){
			//prevent default
			event.preventDefault();
			//morph text size and set cookie
			if(myCookieTemplate == 'One'){
				//set cookie
				Cookie.write('mooSwitchSize',this.options.largeSize,{duration:365,domain:this.options.defaultDomain,path:'/'});
				//set font size
				morphTextSize.start({
					'font-size': this.options.largeSize
				});
				//change selected states
				smallA.removeClass('selected');
				mediumA.removeClass('selected');
				largeA.addClass('selected');
			}else{
				if(this.options.container.getStyle('font-size').toInt() <= this.options.largeSize.toInt()){
					//set font size
					morphTextSize.start({
						'font-size': this.options.container.getStyle('font-size').toInt()+5+'%'
					});
					//set cookie
					Cookie.write('mooSwitchSize',this.options.container.getStyle('font-size').toInt()+5+'%',{duration:365,domain:this.options.defaultDomain,path:'/'});
				}else{
					//change selected states
					smallA.removeClass('selected');
					largeA.addClass('selected');
				};
			};
		}.bind(this));

		//template one
		templateOne.addEvent('click', function(event){
			//prevent default
			event.preventDefault();
			//check to make sure mot already on this template
			if(myCookieTemplate != 'One'){
				//set cookie
				Cookie.write('mooSwitchTemplate','One',{duration:365,domain:this.options.defaultDomain,path:'/'});
				//set template
				var myCSS = new Asset.css(this.options.templateOne,{id:'TemplateOne'});
				//change selected states
				templateOne.addClass('selected');
				templateTwo.removeClass('selected');
				//refresh page
				window.location.reload();
			};
		}.bind(this));
		
		//template two
		templateTwo.addEvent('click', function(event){
			//prevent default
			event.preventDefault();
			//check to make sure mot already on this template
			if(myCookieTemplate != 'Two'){
				//set cookie
				Cookie.write('mooSwitchTemplate','Two',{duration:365,domain:this.options.defaultDomain,path:'/'});
				//set template
				var myCSS = new Asset.css(this.options.templateOne,{id:'TemplateTwo'});
				//change selected states
				templateOne.removeClass('selected');
				templateTwo.addClass('selected');
				//refresh page
				window.location.reload();
			};
		}.bind(this));
	}
});
