var AcademyENews = function () {
	var $ = jQuery;
	var _ajaxUrl = "/enews/ajax/";
	var _isSubmitting = false;
	var _bypassCheckboxValidation = false;
	
	var _copy = {
		deleteConfirm: "Are you sure you want to unsubscribe from all Academy email lists?",
		selectCategory: "Please select at least one category.",
		genericError: "Unknown server error.",
		errorMessage: "Oops, there was a problem processing your request. The server returned the following error(s):" 
	};
	
	var _track = function (str) {
		_log("_track: " + str);
		
		if (typeof(pageTracker) == "undefined") return;
		pageTracker._trackEvent("Email Updates", str, location.href);
	}
	
	/**
     * Debug utility
	 * @param {Object} Generic object to log
	 */
	var _log = function (obj) {
		if (typeof(console) == "undefined") {
			if (typeof(dump) == "function") {
				dump(obj);
			} else {
				//alert(obj);
			}
		} else {
			console.log(obj);
		}
	}
	
	/**
	 * Validate form
	 * @param form {Object} Form DOM element
	 * @returns {Boolean} Returns true if valid, false if not
	 * @private
	 */
	var _isValid = function (form) {
		var isValid = true;
		
		// check if required field filled out
		$(".required", form).each(function () {
            if (ValidationUtil.isEmpty(this)) {
				this.errorText = "Required";
				$(this).val(this.errorText);
				$(this).addClass("error");
				
				isValid = false;
			} else {
				$(this).removeClass("error");
			}
		});
		
		// check for a valid email address
		$(".email", form).each(function () {
		    if (ValidationUtil.isEmpty(this)) return;
		            
			if (!ValidationUtil.isEmail($(this).val())) {
				this.errorText = "Invalid email";
				$(this).val(this.errorText);
				$(this).addClass("error");
				
				isValid = false;
			} else {
				$(this).removeClass("error");
			}
		});

        
		if (!_bypassCheckboxValidation) {
			// not clicking delete trigger
			if ($(".checkbox-category:checked", form).length == 0 && isValid) {
				// nothing checked, otherwise valid
				if ($("#modal-enews .delete-trigger").length > 0) {
					// ghost click delete trigger if it exists
					$("#modal-enews .delete-trigger").trigger("click");
					
					// valid submission if user confirms the delete
					// @see _initDeleteTrigger
					isValid = _bypassCheckboxValidation;
				} else {
					// delete trigger doesn't exist, assume a new contact and require at least one selection
					alert(_copy.selectCategory);
					isValid = false;
				}
			}
		}
		
		return isValid;
	}
	
	/**
	 * Handle focus and blur events for input fields with default text
	 * @private
	 */
	var _defaultText = function () {
		var fields = $("#modal-enews .default-text");
		
		//initialize
		fields.each(function () {
			var defaultText;
			
			switch ($(this).attr("id")) {
				case "firstname":
					defaultText = "First Name";
					break;
				case "lastname":
					defaultText = "Last Name";
					break;
				case "email":
					defaultText = "Email Address";
					break;
				case "phone_mobile":
					defaultText = "Mobile Number";
					break;
				case "zipcode":
					defaultText = "Zip Code";
					break;
			}

			if ($(this).val() == "") {
				$(this).val(defaultText);
			}
			
			this.errorText = "";
			this.defaultText = defaultText;
		});
        
		//event handling
		fields.focus(function () {
			$(this).removeClass("error");

			var myVal = $.trim($(this).val());

			if (myVal == this.defaultText || myVal == this.errorText) {
				$(this).val("");
			}
		});

		fields.blur(function () {
			var myVal = $.trim($(this).val());

			if (myVal == "") {
				$(this).val(this.defaultText);
			}
		});
	}
	
	var _getSubmitData = function () {
		var submitData = {};
		
		// make sure we're not submitting default / error values
		$("#modal-enews form input, #modal-enews form select, #modal-enews form textarea").each(function () {
			if ($(this).hasClass("checkbox-category")) {
				// only include checkbox data if checked
				if (!this.checked) return;
			}
			
			if ($.trim($(this).attr("name")) == "") {
				// undefined input name, make up something random
				$(this).attr({
					name: "foo" + Math.random()
				});
			}
			
			if (ValidationUtil.isEmpty(this)) {
				submitData[$(this).attr("name")] = "";
			} else {
				submitData[$(this).attr("name")] = $(this).val();
			}
		});
		
		return submitData;
	}
	
	/**
	 * Handle form submission via JSON
	 * @private
	 */
	var _initForm = function () {
		$("#modal-enews form").submit(function () {
			if (_isSubmitting) return false; // suppress crazy clicks
			_isSubmitting = true;
			
			// validate
			if (_isValid(this)) {
				_track("Submit");
				
				// display loading indicator
				_loading(true);
				
				var submitData = _getSubmitData();

				if (typeof($.jsonp) == "function") {
					// use the jsonp plugin if available
					$.jsonp({
						timeout: 12000,
						callbackParameter: "callback",
						url: _ajaxUrl,
						data: submitData,
						success: function (data, textStatus) {
							_onSubmitSuccess(data);
						},
						error: function (options, textStatus) {
							_onSubmitError();
						}
					});
				} else {
					$.ajax({
						dataType: "jsonp",
						url: _ajaxUrl,
						cache: false,
						data: submitData,
						success: function (data, textStatus, XMLHttpRequest) {
							_onSubmitSuccess(data);
						},
						error: function (XMLHttpRequest, textStatus, errorThrown) {
							_onSubmitError();
						}
					});
				}
			} else {
				_isSubmitting = false;
			}
		   
			// always suppress submission and await response
			return false;
		});
	}
	
	/**
	 * Display or remove a loading indicator to the user
	 * @param boo {Boolean} Display the indicator if TRUE, remove if FALSE
	 * @private
	 */
	var _loading = function (boo) {
		// show
		if (boo) {
			var loading = $("<div class='loading'><span>Loading</span></div>");
			$("#modal-enews").prepend(loading);
			return;
		}
		
		// hide
		$("#modal-enews .loading").remove();
	}
	
	var _resetForm = function (isDelete) {
		if (typeof(isDelete) != "boolean") isDelete = false;
		
		_loading(false);
		_isSubmitting = false;
		_bypassCheckboxValidation = false;
		$("#modal-enews form #delete").val("0");
		$("#modal-enews form #id").val("");
		
		if (isDelete) _clearDeletedContact();
	}
	
	/**
	 * If contact just deleted, run some additional reset routines
	 * @private
	 */
	var _clearDeletedContact = function () {
		// remove delete trigger
		$("#modal-enews .delete-trigger").remove();
		
		// clear all non-default checkboxes
		$("#modal-enews .checkbox-category").each(function () {
			this.checked = $(this).hasClass("default-selection");
		});
		
		$.uniform.update("#modal-enews .checkbox-category");
		
		// reset textfields to defaults
		$("#modal-enews .textfield-standard").each(function () {
			if (typeof(this.defaultText) == "undefined") this.defaultText = "";
			$(this).val(this.defaultText);
		});
	}
	
	var _onSubmitSuccess = function (data) {
		_log("_onSubmitSuccess");
		_log(data);
		
		var isDelete = (data.isDelete && data.success);
		_resetForm(isDelete);
		
		// invalid server response
		if (typeof(data) != "object" || typeof(data.success) == "undefined") {
			_onSubmitError();
			return;
		}
		
		if (data.success) {
			if (isDelete) {
				_track("Unsubscribe Success");
			} else {
				if (data.isNew) {
					_track("Add Success");
				} else {
					_track("Update Success");
				}
			}
			
			_displayResponse("<p>" + data.response.html + "</p>");
		} else {
			if (isDelete) {
				_track("Unsubscribe Error(s)");
			} else {
				_track("Update Error(s)");
			}
			
			_onSubmitError(data.errors);
		}
	}
	
	/**
	 * Handle submissions errors
	 * @param errors {Array} An array of error messages
	 * @private
	 */
	var _onSubmitError = function (errors) {
		_log("_onSubmitError");
		_resetForm();
		
		if (!ValidationUtil.isArray(errors) || errors.length < 1) {
			errors = [_copy.genericError];
		}
		
		// construct html response
		var html = "<p>" + _copy.errorMessage + "</p>";
		html += "<ul>";
		
		var i = 0;
		
		while (i < errors.length) {
			html += "<li>" + errors[i] + "</li>";
			i++;
		}
		
		html += "</ul>";
		
		// display
		_displayResponse(html, true);
	}
	
	var _displayResponse = function (str, isError) {
		if (typeof(isError) != "boolean") isError = false;
		
		// create response
		var originalHeight = $("#modal-enews").height();
		var response = $("<div class='server-response'>" + str + "<p><button id='back'>Back</button></p></div>");
		
		// hide the instructions and form
		$("#modal-enews .instructions, #modal-enews form").hide();
		
		// insert after form
		$("#modal-enews form").after(response);
		
		// bizarre IE 8 bug requires some alteration to the display of this element
		// for the margins to work correctly
		if ($.browser.msie) response.fadeIn();
		
		// set modal to original height to prevent jumpiness
		$("#modal-enews").height(originalHeight);
		
		// init the back button
		var back = $("#modal-enews #back");
		if (isError) back.addClass("try-again");
		back.unbind("click");
		
		back.click(function () {
			if (isError) {
				_track("Try Again");
			} else {
				_track("Back");
			}
			
			_back();
			return false;
		});
	}
	
	var _back = function () {
		$("#modal-enews .server-response").remove();
		$("#modal-enews .instructions, #modal-enews form").show();
	}
	
	var _onModalClose = function (event) {
		if (_isSubmitting) return;
		_track("Modal Close");
		_resetForm();
		_back();
	}
	
	/**
	 * Auto-submit form (bypassing checkbox validation) and get JSON response on confirm instead of get query
	 * @private
	 */
	var _initDeleteTrigger = function () {
		$("#modal-enews .delete-trigger").click(function () {
			// require confirmation from user
			if (confirm(_copy.deleteConfirm)) {
				_track("Unsubscribe");
				
				$("#modal-enews form #delete").val("1");
				$("#modal-enews form #id").val($("#modal-enews form #delete-trigger-id").val());
				
				_bypassCheckboxValidation = true;
				$("#modal-enews form").trigger("submit");
			}
			
			return false;
		});
	}
	
	var _getValueFromQuery = function (variableName) {
		var query = window.location.search;
		var arr = query.substring(1, query.length).split("&");
		var i = arr.length;

		while (i--) {
			var pairArr = arr[i].split("=");

			if (pairArr[0] == variableName) {
				return pairArr[1];
				break;
			}
		}

		return false;
	}
	
	var _editDOM = function () {
		// make sure modal is the last item in the body tag
		// $("#modal-enews").appendTo($("body"));
	}
	
	this.isSubmitting = function () {
		return _isSubmitting;
	}
	
	var _getExplorerEngine = function () {
		if (!$.browser.msie) return false;
		var engine = null;

		// This is an IE browser. What mode is the engine in?
		if (document.documentMode) {
			// IE 8
			engine = document.documentMode;
		} else {
			// IE 5-7
			engine = 5; // Assume quirks mode unless proven otherwise
			
			if (document.compatMode) {
				if (document.compatMode == "CSS1Compat") {
					engine = 7; // standards mode
				}
			}
		}
        
		return engine;
	}
	
	/**
	 * @constructor
	 */
	this.initialize = function () {
		if ($("#modal-enews").length == 0) return;
		
		_editDOM();
		_defaultText();
		_initForm();
		_initDeleteTrigger();
		
		// fancy styles
		if (typeof($.fn.uniform) == "function" && !$.browser.msie) {
			$("#modal-enews .checkbox-category").uniform();
			$("#modal-enews .checkbox-category").show();
		}
        
		if (typeof($.fn.tooltip) == "function") {
			$("#modal-enews .list-description").show();
			
			var myEffect = $.browser.msie ? "toggle" : "slide";
			
			$("#modal-enews .list-description").tooltip({
				effect: myEffect,
				position: "top right"
			});
		}

		// make sure overlay plugin is available
		if (typeof($.fn.overlay) != "function") return;
		
		var isFixed = true;
		var animateSpeed = 200;
		
		$(".enews-overlay-trigger").click(function () {
			_track("Modal Trigger");
		});
		
		var autoInvoke = (_getValueFromQuery("enews") == "1");
		
		var maskObject = {
			color: "#000000",
			loadSpeed: animateSpeed,
			opacity: 0.45  
		};
		
		if ($.browser.msie) {
			// certain versions of IE screw up z-indexing in particular templates,
			// so don't use a mask
			maskObject = false; 
		}
		
		$(".enews-overlay-trigger").overlay({
			onClose: _onModalClose,
			top: "center",
			speed: animateSpeed,
			fixed: isFixed,
			mask: maskObject,
			load: autoInvoke
		});
	}
	
	this.initialize();
}

if (typeof(jQuery) != "undefined") {
	if (typeof(jQuery.fn.uniform) == "function" && !jQuery.browser.msie) {
	   	document.write("<style> #modal-enews .checkbox-category { display: none; } </style>");
		document.write("<link rel=\"stylesheet\" href=\"/enews/css/uniform.avc.css\" type=\"text/css\" media=\"screen\" title=\"no title\" charset=\"utf-8\" />");
	}

	jQuery(document).ready(function ($) {
		var foo = new AcademyENews();
	});
}

