/**
 * FontSizer.js - Set font sizes for specific elements
 * 
 * @author  Webstores <info at webstores dot nl>
 *          Copyright (c) Webstores internet totaalbureau <http://www.webstores.nl/>
 * 
 * @param {Mixed} el The CSS selector or object reference of the font size element
 * @param {Object} options Optional parameters object
 */
function FontSizer(el, options) {
	this.el = $(el);
	this.options = options;
	this.construct();
};

FontSizer.prototype = {
	
	/**
	 * @constructor
	 */
	construct: function() {
		if(this.el.length) {
			var self = this;
			
			this.options = $.extend({
				applyTo: ['body'],
				selectedClass: 'selected',
				useCookie: true,
				cookieName: 'fontsize',
				cookieExpiration: 7
			}, this.options || {});
			
			$('a', this.el).click(function(e) {
				e.preventDefault();
				self.sizeClickHandler(this);
			});
			
			var cookieSize = this.getCookie(this.options.cookieName);
			
			if(cookieSize) {
				this.setFontSize(this.options.applyTo, cookieSize);
				this.setActiveSizer($('a[href$="' + cookieSize + '"]', this.el).get(0));
			}
		}
	},
	
	/**
	 * When a size button element is clicked
	 * 
	 * @param {Object} el The size button element
	 */
	sizeClickHandler: function(el) {
		if(!$(el).parent().hasClass(this.options.selectedClass)) {
			this.setFontSize(this.options.applyTo, el.href.split('#')[1]);
			this.setActiveSizer(el);
		}
	},
	
	/**
	 * Sets a font size class to one or more elements
	 * 
	 * @param {Array} arr An array with CSS selectors of elements 
	 * @param {String} cls The font size class to apply
	 */
	setFontSize: function(arr, cls) {
		var currentClass = $('.selected a', this.el).attr('href').split('#')[1];
		
		for(var i = 0; i < arr.length; i++) {
			$(arr[i]).removeClass(currentClass).addClass(cls);
		}
		
		if(this.options.useCookie) {
			this.setCookie(this.options.cookieName, cls, this.options.cookieExpiration);
		}
	},
	
	/**
	 * Sets a selected class to a given element
	 * 
	 * @param {Object} el The element to set the selected class to
	 */
	setActiveSizer: function(el) {
		$('.' + this.options.selectedClass, this.el).removeClass(this.options.selectedClass);
		$(el).parent().addClass(this.options.selectedClass);
	},
	
	/**
	 * Sets a cookie
	 * 
	 * @param {String} name The cookie's name
	 * @param {String} value The cookie's data
	 * @param {Number} days The cookie's expiration in days
	 */
	setCookie: 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=/';
	},
	
	/**
	 * Gets a cookie by its name
	 * 
	 * @param {String} name The cookie's name
	 * @return {Mixed} The cookie's data or false
	 */
	getCookie: function(name) {
		var cName = name + '=';
		var cData = document.cookie.split(';');
		
		for(var i = 0; i < cData.length; i++) {
			var cookie = cData[i];
			
			while(cookie.charAt(0) == ' ') {
				cookie = cookie.substring(1, cookie.length);
			}
			
			if(cookie.indexOf(cName) == 0) {
				return cookie.substring(cName.length, cookie.length);
			}
		}
		
		return false;
	}
};

