'use strict';

/*global window, document, console, jQuery, Locale */

jQuery.noConflict();

/**
 * @desc Create the main application which sets up the fire events
 */
var App = (function (Locale, $) {

	App	= {
		util:	{
			page:		{},
			validate:	{},
			rpc:		{},
			debug:		{
				log: function () {
					window.log.history = window.log.history || [];
					window.log.history.push(arguments);
					if (this.console) {
						console.log(Array.prototype.slice.call(arguments));
					}
				}
			}
		},
		lang:		Locale,
		tracking:	{},
		options:	{},
		page:		{}
	};

	App.util.array = {};

	App.util.string = {
		trim: function (string) {
			return string.replace(/^\s+|\s+$/g, "");
		},
		toCamelCase: function (string) {
			var s = App.util.string.trim(string);
			return (/\S[A-Z]/.test(s)) ?
				s.replace(/(.)([A-Z])/g, function (t, a, b) {
					return a + ' ' + b.toLowerCase();
				}) :
				s.replace(/([\ \-])([a-z])/g, function (t, a, b) {
					return b.toUpperCase();
				});
		}
	};

	App.util.validate = {
		regex: function (string, regex) {
			return regex.test(string);
		},
		email: function (string) {
			return App.util.validate.regex(string, "/^(?!\.)[-+_a-z0-9.]++(?<!\.)@(?![-.])[-a-z0-9.]+(?<!\.)\.[a-z]{2,6}$/");
		},
		postcode: function (string) {
			return this.regex(string, "/^([A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\ [0-9][ABD-HJLNP-UW-Z]{2}|(GIR\ 0AA)|(SAN\ TA1)|(BFPO\ (C\/O\ )?[0-9]{1,4})|((ASCN|BBND|[BFS]IQQ|PCRN|STHL|TDCU|TKCA)\ 1ZZ))$/");
		},
		notEmpty: function (string) {
			return App.util.string.trim(string).length > 0;
		},
		isNumber: function (number) {
			return !isNan(number);
		},
		isInt: function (number) {
			return false; // @ todo
		},
		isAlphaNumeric: function (string, whitespace) {
			whitespace = Boolean(whitespace);
			return false; // @ todo
		},
		range: function (value, max, min) {
			min = (typeof min === 'integer') ? min : 0;
			return value >= min && value <= max;
		}
	};

	App.util.page.fire = function (Pages, func, funcname, args) {
		func		= (func === undefined) ? 'base' : App.util.string.toCamelCase(func);
		funcname	= (funcname === undefined) ? 'init' : App.util.string.toCamelCase(funcname);

		if (func !== '' && Pages[func] && typeof Pages[func][funcname] === 'function') {
			Pages[func][funcname](args);
		}
	};

	App.util.page.start = function (Pages) {
		App.util.page.fire(Pages, 'common');

		$.each(document.body.className.split(/\s+/), function (i, className) {
			var classParts;

			App.util.page.fire(Pages, className);

			classParts = className.match(/([a-z0-9]+)-(.*)/i);
			if (classParts !== null && classParts.length === 3) {
				App.util.page.fire(Pages, classParts[1], classParts[2]);
			}
		});

		App.util.page.fire(Pages, 'common', 'finalize');
	};

	return App;

}(typeof Locale === 'object' ? Locale : {}, jQuery));


// set log to shorthand
window.log = window.debug = App.util.debug.log;
