function Utilities() {
	this.loading_img = '/images/loader.gif';
	this.loading_block = $('<div class="loader">Loading .... Please Wait<div align=center><br /><img src="'+this.loading_img+'" /></div>');
	
	//Import get vars
	this._GET = [];
	var urlHalves = String(document.location).split('?');
	if(urlHalves[1]){
		var urlVars = urlHalves[1].split('&');
		for(var i=0; i<=(urlVars.length); i++){
			if(urlVars[i]){
				var urlVarPair = urlVars[i].split('=');
				this._GET[urlVarPair[0]] = urlVarPair[1];
			}
		}
	}
	if ( Page.result ) {
		this.showMsgs(Page.result.errors, $('body'), false);
	}
}
Utilities.prototype = {
	loadOn: function () {
		$(this.loading_block).dialog({
			resizable: false,
			open: function(event, ui) { $(this).prevAll(".ui-dialog-titlebar").hide();},
			dialogClass: 'loader-dialog',
			position: 'top'
		});
	},
	loadOff: function () {
		$(this.loading_block).dialog('close');
	},
	growl: function (msg, options) {
		var defaults = {
			speed: 250
		};
		options = $.extend(defaults, options);
		$.jGrowl(msg, options);
	},
	alert: function(message, options) {
		var defaults = {
			title: 'Notifiation',
			modal: true,
			show: 'slide',
			maxHeight: window.screen.height * .75,
			maxWidth: window.screen.width * .75,
			buttons: {
				"Ok": function () { $(this).dialog('close'); }
			}
		}
		options = $.extend(defaults, options);
		var jMsg = $('<div>' + message + '</div>');
		jMsg.dialog(options);
	},
	popup: function(message, options) {
		var defaults = {
			title: 'Notifiation',
			modal: true,
			show: 'slide',
			maxHeight: window.screen.height * .75,
			maxWidth: window.screen.width * .75
		}
		options = $.extend(defaults, options);
		var jMsg = $('<div>' + message + '</div>');
		jMsg.dialog(options);
	},
	confirm: function(message, options, onConfirm) {
		if ( 'function' != typeof(onConfirm) ) {
			alert('Must provide onConfirm option to the confirm method');
		}

		var defaults = {
			title: 'Notifiation',
			modal: true,
			maxHeight: window.screen.height * .75,
			maxWidth: window.screen.width * .75,
			show: 'slide',
			buttons: {
				"Ok": onConfirm,
				"Cancel": function () { $(this).dialog('close'); }
			}
		}
		options = $.extend(defaults, options);
		var jMsg = $('<div>' + message + '</div>');
		jMsg.dialog(options);
	},
	getParamArray: function (f_selector) {
		var form_obj;
		if ( f_selector instanceof jQuery ) {
			form_obj = f_selector;
		} else {
			form_obj = $(f_selector);
		}
		var tag_name = form_obj.get(0).nodeName.toLowerCase();
		if ( tag_name != 'form' ) {
			form_obj = form_obj.find('form:first');
		}
		
		var arr = form_obj.serializeArray();
		var params = new Object();
		for ( var i in arr ) {
			if ( arr[i].name != '' ) {
				params[arr[i].name] = arr[i].value;
			}
		}
		return params;
	},
	refresh: function (controller, callback) {
		var _this = this;
		$('#inner-content *').remove();
		var params = {
			controller: controller,
			action: 'index'
		};
		$.post(_this.url, params, function(response) {
			$('#inner-content').append(response);
			if ( 'function' == typeof(callback) ) {
				callback();
			}
		});
	},
	redirect: function (page, action) {
		var host = window.location.host
		var protocol = window.location.protocol;
		var url = protocol + '//' + host + '/page.php?controller=' + page;
		if ( undefined != action ) {
			url += '&action=' + action;
		}
		window.location.href = url;
	},
	showMsgs: function (msgObject, selector, showAlert) {
		selector = selector || 'body';
		showAlert = undefined == showAlert ? true : showAlert;
		var $holder = ( selector instanceof jQuery ? selector : $(selector) );
		var general_errors = '';
		var arrRegEx = new RegExp(/[a-zA-z]+[0-9]*\[[0-9a-zA-Z]*\]/);
		var indexRegEx = new RegExp(/\[[0-9a-zA-Z]*\]/);

		for ( var field_name in msgObject ) {
			if ( field_name == '_general_' ) {
				general_errors = msgObject[field_name];
			} else {
				//Check if the msgObject is an Array or Object meaning the field is an array 
				if ( msgObject[field_name] instanceof Object || msgObject[field_name] instanceof Array ) {
					for ( var index in msgObject[field_name] ) {
						var newMsgObject = {};
						var base_name = field_name.replace(/\[[0-9a-zA-Z]*\]/, '');
						var curr_field_name = base_name + '[' + index + ']';
						newMsgObject[curr_field_name] = msgObject[field_name][index];
						this.showMsgs(newMsgObject, selector, false);
					}
				} else {
					if ( arrRegEx.test(field_name) ) {
						var $field = $holder.find('[name="'+field_name+'"]');
						if ( $field.length == 0 ) {
							var base_name = field_name.replace(/\[[0-9a-zA-Z]*\]/, '');
							var index = indexRegEx.exec(field_name)[0];
							index = index.replace(/\[|\]/g, '');
							$field = $holder.find('[name="'+base_name+'[]"]:eq('+index+')');
							if ( $field.hasClass('hidden-date') ) {
								$field = $holder.find('[name="_'+base_name+'[]"]:eq('+index+')');
							} else if ( $field.is(':hidden') ) {
								$field = $field.siblings('label[for="'+base_name+'[]"]');
							}
						} else {
							if ( $field.hasClass('hidden-date') ) {
								$field = $holder.find('[name="_'+field_name+'"]');
							} else if ( $field.is(':hidden') ) {
								$field = $field.siblings('[for="'+field_name+'"]');
							}
						}

						
					} else {
						var $field = $holder.find('[name="'+field_name+'"]');
						if ( $field.attr('type') == 'radio' || $field.attr('type') == 'checkbox' ) {
							$ul = $field.parents('ul:first');
							if ( $ul.length > 0 ) {
								$field = $ul;
							}
						}
					}
					var msg = ( null == msgObject[field_name] ? 'No Error Specified' : msgObject[field_name] );
					this.addMsg($field, msg);
				}
			}
		}
		if ( showAlert ) {
			this.alert('<div class="warning">Please correct errors in the form <hr />'+general_errors+'</div>');
		}
	},
	addMsg: function ($field, msg) {
		$field.addClass('errorField');
		$field.qtip({
			content: msg,
			show: { event: 'mouseover' },
			hide: { event: 'mouseout' },
			position: {
				at: "top right",
				my: 'bottom left'
				
			},
			style: {
				classes: "ui-tooltip-red",
				tip: 'bottomLeft'
			}
		});
	},
	clearMsgs: function (selector) {
		selector = selector || 'body';
		var $holder = $(selector);

		$holder.find('.errorField').removeClass('errorField').each(function () {
			var $field = $(this);
			$field.unbind();
			$field.qtip('destroy');
		});
	}
}

