var Core = {

	Locations : {

		Root : 'http://www.mhsf.us/'

	},
	Library : {

		Load : function(Name, Callback) {
			
			var head = Core.DOM.GetHead();
			if(!head) {
				alert('An unknown error has occurred');
				return;
			}
			if(!Core.DOM.GetEl(Name.replace(/[.\/]+/g, '') + '_library')) {
				var lib = Core.DOM.CreateEl('SCRIPT', {
					type : 'text/javascript',
					id : Name.replace(/[.\/]+/g, '') + '_library',
					src : Core.Locations.Root + 'assets/javascript/Libraries/' + Name + '_library.js'
				}, head);
			}

			if(Callback)
				Core.Library.PollLoaded(Name, Callback);

		},
		PollLoaded : function(Name, Callback) {
			var libC = eval('Core.' + Name.replace(/[.\/]+/g, ''));
			if(!libC || typeof(libC) == 'undefined') {
				setTimeout(function() {
					Core.Library.PollLoaded(Name, Callback);
				}, 10);
			} else
				Callback(Name);
		}

	},
	PageLibrary : {

		Load : function(Name, Callback) {
			
			var head = Core.DOM.GetHead();
			if(!head) {
				alert('An unknown error has occurred');
				return;
			}
			if(!Core.DOM.GetEl(Name.replace(/[.\/]+/g, '') + '_pagelibrary')) {
				var lib = Core.DOM.CreateEl('SCRIPT', {
					type : 'text/javascript',
					id : Name.replace(/[.\/]+/g, '') + '_pagelibrary',
					src : Core.Locations.Root + 'assets/javascript/PageLibraries/' + Name + '_library.js'
				}, head);
			}

			if(Callback)
				Core.PageLibrary.PollLoaded(Name, Callback);

		},
		PollLoaded : function(Name, callback) {
			var libC = eval('Core.' + Name.replace(/[.\/]+/g, ''));
			if(!libC || typeof(libC) == 'undefined') {
				setTimeout(function() {
					Core.PageLibrary.PollLoaded(Name, Callback);
				}, 10);
			} else
				Callback(Name);
		}

	},
	Helpers : {

		Load : function(Name, Callback) {
			
			var head = Core.DOM.GetHead();
			if(!head) {
				alert('An unknown error has occurred');
				return;
			}
			if(!Core.DOM.GetEl(Name.replace(/[.\/]+/g, '') + '_helper')) {
				var lib = Core.DOM.CreateEl('SCRIPT', {
					type : 'text/javascript',
					id : Name.replace(/[.\/]+/g, '') + '_helper',
					src : Core.Locations.Root + 'assets/javascript/Helpers/' + Name
				}, head);
			}

			if(Callback)
				Core.Helpers.PollLoaded(Name, Callback);

		},
		PollLoaded : function(Name, Callback) {
			var libC = eval(Name);
			if(!libC || typeof(libC) == 'undefined') {
				setTimeout(function() {
					Core.Helpers.PollLoaded(Name, Callback);
				}, 10);
			} else
				Callback(Name);
		}

	},
	EventHandler : {

		Onload : function(callback) {
			var jsloader = Core.DOM.GetEl('jsloader');
			if(!jsloader) {
				setTimeout(function() {
					Core.EventHandler.Onload(callback);
				}, 10);
				return; 
			}
			callback();
		},
		Add : function(element, event, callback) {
			if (element.addEventListener)
				element.addEventListener(event, function(e) {
					if(!e) e = window.event;
					return callback(e);
				}, false);
			else if (element.attachEvent) {
				element["e"+event+callback] = callback;
				element[event+callback] = function() {
					return element["e"+event+callback](window.event);
				};
				element.attachEvent("on"+event, element[event+callback]);
			}
		},
		Remove : function(element, event, callback) {

			if ( element.detachEvent ) {
				element.detachEvent( 'on'+event, element[event+callback] );
				element[event+callback] = null;
			} else
				element.removeEventListener( event, callback, false );

		},
		Cancel : function(e) {
			if(!e) e = window.event;

			try { e.preventDefault(); } catch(e){}
			try { e.cancelBubble = true; } catch(e){}
			try { e.stopPropagation(); } catch(e) {}
			try { e.returnValue = false; } catch(e){}

			return false;
		}

	},
	DOM : {

		GetEl : function(el, parent, asArray) {
			var original = el;
			if(!parent) parent = document;
			if(typeof(el) == 'string') {
				if(el.indexOf('.') == 0) {
					el = el.substring(1, el.length);
					var elements = Core.DOM.GetElementsByClassName(el, '*', parent);
					if(elements.length == 1 && !asArray)
						return elements[0];
					else if(elements.length == 0)
						el = null;
					else
						el = elements;
				} else if(el.indexOf('.') > 0) {
					var parts = el.split('.');
					var elements = Core.DOM.GetElementsByClassName(parts[1], parts[0], parent);
					if(elements.length == 1 && !asArray)
						el = elements[0];
					else if(elements.length == 0)
						el = null;
					else
						el = elements;
				} else
					el = document.getElementById(el);
			}
			return el;
		},
		CreateEl : function(type, attributes, parent) {

			var el = document.createElement(type);
			for(var attribute in attributes) {
				try {
					el[attribute] = attributes[attribute];
				} catch(e) {
					alert('Unable to create element of type [' + type + '] as the attribute [' + attribute + '] does not exist!');
					return false;
				}
			}
			if(typeof(parent) != 'undefined')
				parent.appendChild(el);
			return el;

		},
		RemoveEl : function(el) {
			el.parentNode.removeChild(el);
		},
		GetHead : function() {
			var heads = document.getElementsByTagName('HEAD');
			if(heads.length == 0)
				return false;
			return heads[0];
		},
		GetBody : function() {
			var bodies = document.getElementsByTagName('BODY');
			if(bodies.length == 0)
				return false;
			return bodies[0];
		},
		GetForm : function(id) {
			if(id)
				return Core.DOM.GetEl(id);
			var forms = document.getElementsByTagName('FORM');
			if(forms.length == 0)
				return false;
			return forms[0];
		},
		SetAttributes : function(el, attributes) {
			for(var attribute in attributes) {
				try {
					el[attribute] = attributes[attribute];
				} catch(e) {
					alert('Unable to set attribute [' + attribute + '] as it does not exist!');
					return false;
				}
			}
			return true;
		},
		Disable : function(el) {
			var el = Core.DOM.GetEl(el);
				el.disabled = true;
		},
		Enable : function(el) {
			var el = Core.DOM.GetEl(el);
				el.disabled = false;			
		},
		AppendText : function(text, el, clearFirst) {
			if(clearFirst)
				el.innerHTML = '';
			el.appendChild(document.createTextNode(text));
		},
		RemoveEl : function(el) {
			el = Core.DOM.GetEl(el);
			if(!el)
				return;
			el.parentNode.removeChild(el);
		},	
		GetElementsByName : function(name, parent) {
			var root = document;
			if(parent)
				root = parent;
			var elements = root.getElementsByTagName('*');
			var ret = [];
			for(var i = 0; i < elements.length; i++) {
				if(elements[i].name && elements[i].name == name)
					ret.push(elements[i]);
			}
			return (ret.length == 1 ? ret[0] : ret);
		},
		GetElementsByClassName : function(className, tag, elm){
			var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
			var tag = tag || "*";
			var elm = elm || document;
			var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
			var returnElements = [];
			var current;
			var length = elements.length;
			for(var i=0; i<length; i++){
				current = elements[i];
				if(testClass.test(current.className)){
					returnElements.push(current);
				}
			}
			return returnElements;
		}

	},
	Ajax : {

		ErrorHandler : function(data) {
			if(typeof(data.ErrorDescription) != 'undefined') {
				alert('An error has occurred: \n\n' + data.ErrorDescription);
			} else if (typeof(data.responseText) != 'undefined') {
				alert('An error has occurred: \n\n' + data.responseText);
			}
		},
		PrepareUrl : function(url) {

			if(url.indexOf('http') > -1)
				return url;
			// once the htaccess/mod_rewrite issue is solved, remove the
			// index.php from below
			return Core.Locations.Root + '/' + url;

		},
		Request : function(url, params, callback) {
		
			var paramStr = null;
			var method = params ? 'POST' : 'GET';

			var request = Core.Ajax.CreateRequest();
			if(!request) return;

				request.open(method, url, typeof(callback) == 'function');
			if(method == 'POST') {
				request.setRequestHeader('Content-type','application/x-www-form-urlencoded');
				paramStr = '&Ajax=1';
				for(var i in params) { paramStr += '&' + i + '=' + params[i]; }
			}
			if(typeof(callback) == 'function') {
				request.onreadystatechange = function() {
					if(request.readyState != 4) return;
					if(request.status != 200 && request.status != 304) {
						Core.Ajax.ErrorHandler(request);
						return;
					}
					var resp = Core.Ajax.RequestToJSON(request);
					callback(request);
				}
				request.send(paramStr);
			} else {
				request.send(paramStr);
				if(request.status != 200 && request.status != 304) {
					Core.Ajax.ErrorHandler(request);
					return;
				}
				var resp = Core.Ajax.RequestToJSON(request);
				return request;
			}

		},
		RequestToJSON : function(res) {
			var resp = false;
			try {
				resp = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(res.responseText.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + res.responseText + ')');
			} catch(e) {}
			return resp;
		},
		CreateRequest : function() {
			var XMLHttpFactories = [
				function () {return new XMLHttpRequest()},
				function () {return new ActiveXObject("Msxml2.XMLHTTP")},
				function () {return new ActiveXObject("Msxml3.XMLHTTP")},
				function () {return new ActiveXObject("Microsoft.XMLHTTP")}
			];
			var request = false;
			for (var i=0;i<XMLHttpFactories.length;i++) {
				try { request = XMLHttpFactories[i](); }
				catch (e) { continue; }
				break;
			}
			return request;

		}

	},
	Validation : {

		Email : function(email) {

			if(!email.match(/^[^@]{1,64}@[^@]{1,255}$/))
				return false;

			var email_array = email.split('@');
			var local_array = email_array[0].split('.');

			for(var i = 0; i < local_array.length; i++) {
				if(!local_array[i].match(/^(([A-Za-z0-9!#$%&\'*+/=?^_`{|}~-][A-Za-z0-9!#$%&*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$/))
					return false;
			}

			if(!email_array[1].match(/^\[?[0-9\.]+\]?$/)) {
				var domain_array = email_array[1].split('.');
				if(domain_array.length < 2)
					return false;
				for(var i = 0; i < domain_array.length; i++) {
					if(!domain_array[i].match(/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/))
						return false;
				}
			}

			return true;

		}

	}

};