/**
 * FontTools 0.1.5
 */
FontTools = {
	callbackRegistrations : {},
	callbackEvents : [],

	registerCallback : function(event, thisObj, callback) {
		for(var key in this.callbackEvents) {
			var eventName = this.callbackEvents[key];

			if(eventName == event) {


				if(
					!this.callbackRegistrations[eventName] ||
					typeof this.callbackRegistrations[eventName] != "object"
				) {
					this.callbackRegistrations[eventName] = [];
				}

				this.callbackRegistrations[eventName][this.callbackRegistrations[eventName].length] = {
					thisObj  : thisObj,
					callback : callback
				};
			}
		}
	},

	registerEvents : function(events) {
		if(events) {
			if(typeof events == "object") {
				for(var key in events) {
					this.callbackEvents[this.callbackEvents.length] = events[key];
				}
			} else {
				this.callbackEvents[this.callbackEvents.length] = events;
			}
		}
	},

	fireEvent : function(event, params) {
		if(
			this.callbackRegistrations &&
			this.callbackRegistrations[event] &&
			typeof this.callbackRegistrations[event] == "object"
		) {
			for(var key in this.callbackRegistrations[event]) {
				var reg = this.callbackRegistrations[event][key];

				if(reg && typeof reg == "object" && reg.callback && typeof reg.callback == "function") {
					reg.callback.call(reg.thisObj, reg.callback, event, params);
				}
			}
		}
	}
}

FontTools.registerEvents([
	"fontsize_increase", "fontsize_decrease", "fontsize_init", "fontsize_reset",
	"fontsize_change"
]);

FontTools.FontSize = {
	defaultStep  : 0,
	sizeSteps    : [],
	currentStep  : 0,
	currentSize  : "",
	initStep     : 0,
	sizeUnit     : "%",
	parseType    : "int",

	init : function(initSize, defaultSize, sizeSteps) {
		if(initSize.indexOf("%") > 0) {
			this.sizeUnit = "%";
			this.parseType = "int";
		} else if(initSize.indexOf("px") > 0) {
			this.sizeUnit = "px";
			this.parseType = "int";
		} else if(initSize.indexOf("em") > 0) {
			this.sizeUnit = "em";
			this.parseType = "float";
		} else {
			this.sizeUnit = "";
			this.parseType = "int";
		}

		this.defaultSize = defaultSize;

		if(this.parseType == "int") {
			this.initSize = parseInt(initSize.replace(this.sizeUnit, ""), 10);
		} else if(this.parseType == "float") {
			this.initSize = parseFloat(initSize.replace(this.sizeUnit, ""), 10);
		}

		this.currentStep = 0;

		for(var key in sizeSteps) {
			if(this.parseType == "int") {
				this.sizeSteps[this.sizeSteps.length] = parseInt(sizeSteps[key].replace(this.sizeUnit, ""), 10);
			} else if(this.parseType == "float") {
				this.sizeSteps[this.sizeSteps.length] = parseFloat(sizeSteps[key].replace(this.sizeUnit, ""), 10);
			}

			if(initSize == sizeSteps[key]) {
				this.currentStep = key;
				this.initStep = key;
			}

			if(defaultSize == sizeSteps[key]) {
				this.defaultStep = key;
			}
		}

		$('body').css('font-size', this.sizeSteps[this.initStep] + this.sizeUnit);
		this.currentSize = this.sizeSteps[this.currentStep] + this.sizeUnit;
		FontTools.fireEvent("fontsize_init", {});
		FontTools.fireEvent("fontsize_change", {});
	},

	reset : function() {
		 $('body').css('font-size', this.sizeSteps[this.defaultStep] + this.sizeUnit);
		 this.currentStep = this.defaultStep;
		 this.currentSize = this.sizeSteps[this.currentStep] + this.sizeUnit;
		 FontTools.fireEvent("fontsize_reset", {});
		 FontTools.fireEvent("fontsize_change", {});
	},

	increase : function() {
		if(this.currentStep < this.sizeSteps.length - 1) {
			this.currentStep++;
			$('body').css('font-size', this.sizeSteps[this.currentStep] + this.sizeUnit);
			this.currentSize = this.sizeSteps[this.currentStep] + this.sizeUnit;
			FontTools.fireEvent("fontsize_increase", {});
			FontTools.fireEvent("fontsize_change", {});
		}
	},

	decrease : function() {
		if(this.currentStep > 0) {
			this.currentStep--;
			$('body').css('font-size', this.sizeSteps[this.currentStep] + this.sizeUnit);
			this.currentSize = this.sizeSteps[this.currentStep] + this.sizeUnit;
			FontTools.fireEvent("fontsize_decrease", {});
			FontTools.fireEvent("fontsize_change", {});
		}
	}
};