/* jQuery ready state */
$(document).ready(function() {
	SiteController.initialize();
});

/* Namespaced JSON singleton */
var SiteController = (function() {

	var self = {
	
		"initialize": function() {
			
			/* Initialize Top Navigation */
			self.navigation.attachTopNav();
			
			/* Event listeners */
			$("a.external").live("click",function() {
				window.open(this.href);
				return false;
			});
			
			/* Randomize background */
			self.layout.randomBackground("3");
		},
		
		"navigation": {
		
			"attachTopNav": function() {
			
				$("ul.subnav").siblings().wrap("<span></span>");
				$("ul.topnav li span").hover(function() {
					
					$(this).parent().find("ul.subnav").slideDown('fast');
					$(this).parent().hover(function() {
						//Do nothing
					}, function() {	
						$(this).parent().find("ul.subnav").slideUp();
					});
				});
							
				//Override the default click on parent nav items
				$("ul.topnav li span > a").live("click", function(event) {
					 //prevent the URL change
					event.preventDefault();
					return false;
				});
			}
		
		},
		
		"layout": {
			
			"randomBackground": function(numberOfBkgs) {
				var rndNum = Math.ceil(Math.random() * numberOfBkgs);
				$("body").css("background-image", "url(../image/bg-body" + rndNum + ".jpg)");
			}
		
		}
	};
	return self;
})();


var Utilities = (function() {
	//Private members
	var _log = "";
	var _logerrors = "";
	
	//Priveleged members
	var self = {
		"values": {
			"isPresent": function(element) {
				return typeof element !== "undefined" && element !== null && element !== "";
			}
		},
		"message": {
			"alert": function(output) {
				if( self.values.isPresent(output) ) {
					switch (typeof output) {
						case "string":
							_log += output;
							break;
						case "object":
							for (alertitem in output) {
								_log += alertitem + ": " + output[alertitem] + "\n";
							}
							break;
					}
					alert(_log);
					//Reset the message log
					_log = "";
				}
			},
			"display": function(displayTitle, output) {
				if ( self.values.isPresent(displayTitle) && self.values.isPresent(output) ) {
					switch (typeof output) {
						case "string":
							_log += output;
							break;
						case "object":
							for (displayitem in output){
								_log += displayitem + ": " + output[displayitem] + "<br/>";
							}
							break;
					}
					$("#dialog-message").remove();
					var dialog = $("<div>" + _log + "</div>");
					$(dialog).attr("id","dialog-message");
					$(dialog).attr("title",displayTitle);
					$("body").append(dialog);
					$("#dialog-message").dialog({
						modal: true,
						width: 500,
						buttons: {
							OK: function() {
								$(this).dialog('close');
							}
						}
					});
					//Reset the message log
					_log = "";
				}
			},
			"error": function(type, output) {
				if( self.values.isPresent(output) ) {
					var returnChar = "\n";
					if (type === "display") {
						returnChar = "<br/>";
					}
					switch (typeof output) {
						case "string":
							_logerrors += output;
							break;
						case "object":
							for (erroritem in output) {
								_logerrors += erroritem + ": " + output[erroritem] + returnChar;
							}
							break;
						default:
							break;
					}
					switch (type) {
						case "alert":
							self.message.alert("Please correct the following errors:\n" + _logerrors);
							break;
						case "display":
							self.message.display("Please correct the following errors:", _logerrors);
							break;
						default:
							break;
					}
					//Reset the error log
					_logerrors = "";
				}
			},
			"console": function(output) {
				if( self.values.isPresent(window.console) && self.values.isPresent(output) ) {
					switch (typeof output) {
						case "string":
							_log += output;
							break;
						case "object":
							for (item in output) {
								_log += item + ": " + output[item] + "\n";
							}
							break;
					}
					console.log(_log);
					//Reset the error log
					_log = "";
				}
			}
		},
		"forms": {
			//Validate the value of the input fields
			"isValid": function(value, type) {
				if ( !self.values.isPresent(value) ) {
					return false;
				}
				var charpos;	
				switch (type) {
					case "alphanumeric":
						charpos = value.search("[^A-Za-z0-9\-.' ]");
						break;
					case "alpha":
						charpos = value.search("[^A-Za-z' ]");
						break;
					case "numeric":
						charpos = value.search("[^0-9']");
						break; 
					case "email":
						if ( /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(value) ) {
							charpos = -1;
						}
						break;
					case "notempty":
						if ( !self.values.isPresent(value) || value === "---" ) {
							charpos = -1;
						}
						break;
					default:
						return false;
				}
				if (charpos >= 0) {
					return false;
				}
				return true;
			},
			"validateAndSendForm": function(FormElements) {
				//reset error message if form re-submitted
				var Errors = {};
				var ErrorsFiltered = {};
				var hasErrors = false;
				for (var element in FormElements) {
					if ( !self.forms.isValid( $( FormElements[element].id ).val(), FormElements[element].type ) ) {
						$( FormElements[element].id ).addClass(FormElements[element].errorClass );
						Errors[FormElements[element].name] = FormElements[element].message;
					}
					else {
						$( FormElements[element].id ).removeClass(FormElements[element].errorClass );
						Errors[FormElements[element].name] = null;
					}
				}
				for (var error in Errors) {
					if (Errors[error] !== null){
						hasErrors = true;
						ErrorsFiltered[error] = Errors[error];
					}
				}
				if (hasErrors === true){
					self.message.error("display", ErrorsFiltered);
					return false;
				}
				return true;
			}
		}
	};
	return self;

})();
