var gDisableJSValidation = false;
var gStaticMessages = [];
var gJsHandlers = [];
var gValidateRules = new Object;
var gMessages = new Object;

var pageloadflag = true;
var lasthash = "";
if (location.hash) {
	Utils.handlePageload(location.hash);
}

jQuery(function() {
	if (Global.supportHistoryPlugin) {
		$.historyInit(Utils.handlePageload);
	}

	$.ajaxSetup( {
		cache : false,
		dataFilter : Global.sanitizeResponseData
	});
	$("form").submit(function() {
		return FormUtils.validateForm(this);
	});
	$.fn.clearForm = FormUtils.clearForm;

	$("#loading").hide();
	$("#loading").ajaxSend(function(event, xhr, options) {
		xhr.setRequestHeader('Fw-Ajax', 1);
		$(this).show();
	});
	$("#loading").ajaxComplete(function(event, xhr, options) {
		$(this).hide();
		if (Global.pendingJs.length > 0) {
			var js = Global.pendingJs.pop();
			eval(js);
		}
	});
	$("#loading").ajaxError(function(event, request, settings) {
		Global.handleAjaxError(request.responseText, settings.url);
		return false;
	});

	$(".alpha_browser .page").live("click", function() {
		var letter = $(this).text().toLowerCase();
		var parent = $(this).parents(".alpha_browser").get(0);
		if ($(parent).hasClass("primary")) {
			if (Global.supportHistoryPlugin) {
				Global.updateHash("letter", [ letter ]);
			} else {
				Global.loadAlphaPage(parent, letter);
			}
		} else {
			Global.loadAlphaPage(parent, letter);
		}

		return false;
	});

	$(".pagination .page, .pagination_prevnext .page").live(
			"click",
			function() {
				var page = this.id.substr(6);
				var parent = $(this).parents(
						".pagination, .pagination_prevnext").get(0);
				if ($(parent).hasClass("primary")) {
					if (!$(parent).hasClass("pgn_ajax")) {
						return true;
					}
					if (Global.supportHistoryPlugin) {
						Global.updateHash("page", [ page ]);
					} else {
						Global.loadNumericPage(parent, page);
					}
				} else {
					Global.loadNumericPage(parent, page);
				}

				return false;
			});

	if ($("#debugger_details").length > 0) {
		Debug.handleDebugEvents();
	}
});

var Global = {

	supportHistoryPlugin : false,
	dialogElement : null,
	pendingJs : [],
	executedHandlers : [],

	sanitizeResponseData : function(data, type) {
    if(data.indexOf("<!--FW_SEPARATOR-->") <= 0) return data;
    var temp = data.split("<!--FW_SEPARATOR-->");
    var fwdata = temp[0];
    data = temp[1];
		if (fwdata.match(/[\s\S]*<!--FW_DEBUG-->[\s\S]*/)) {
			var debugData = fwdata.replace(
							/^[\s\S]*?<!--FW_DEBUG-->([\s\S]*?)<!--FW_DEBUG-->[\s\S]*?$/,
							"$1");
			if (debugData) {
				$("#fw_debug_ajax_actions").append(debugData);
			}
		}
		if (fwdata.match(/[\s\S]*<!--FW_JS-->[\s\S]*/)) {
			var js = fwdata.replace(
					/^[\s\S]*?<!--FW_JS-->([\s\S]*?)<!--FW_JS-->[\s\S]*?$/,
					"$1");
			if (js) {
				Global.pendingJs.push(js);
			}
		}
		return data;
	},

	executeJsHandler : function(handler, alwaysExec) {
		if (!alwaysExec
				&& jQuery.inArray(handler, Global.executedHandlers) != -1)
			return;
		if (handler == '')
			return;
		eval(handler + '()');
		if (jQuery.inArray(handler, Global.executedHandlers) == -1)
			Global.executedHandlers.push(handler);
	},

	updateHash : function(action, params) {
		// remove leading #,/ and trailing /
		var hash = location.hash.replace(/^#\/?/, "").replace(/\/?$/, "/");
		if (action == 'page') {
			hash = hash.replace(/page\/\d+/, "") + "page/" + params[0];
		}
		if (action == 'letter') {
			hash = hash.replace(/page\/\d+/, "");
			hash = hash.replace(/letter\/[\w-09]+/, "") + "letter/" + params[0];
		}
		if (location.hash != "#" + hash) {
			$.historyLoad(hash);
		}
		return false;
	},

	getMsg : function(msg_id, args) {
		arg_array = Utils.is_array(args);
		msg = gStaticMessages[msg_id];
		if (arg_array) {
			for ( var i = 0; i < args.length; i++) {
				msg = msg.replace("{" + (i + 1) + "}", args[i]);
			}
		} else {
			msg = msg.replace("{1}", args);
		}
		return msg;
	},

	alertMsg : function(msg_id, args) {
		alert(Global.getMsg(msg_id, args));
	},

	confirmMsg : function(msg_id, args) {
		return confirm(Global.getMsg(msg_id, args));
	},

	// not used as of now
	extractValidateRules : function() {
		if ($("#gValidateRules").length == 0)
			return;
		var rules = window["eval"]("(" + $("#gValidateRules").text() + ")");
		for ( var action in rules) {
			gValidateRules[action] = rules[action];
		}
		$("#gValidateRules").remove();
	},

	getAction : function(action, params, callback, customLoader) {
		var actionUrl = URL_PREFIX_AJAX + action;
		return jQuery.get(actionUrl, params, function(data) {
			var ret = Global.handleAjaxError(data, action);
			if (!ret)
				return;
			if (callback)
				callback(data);
		});
	},

	postAction : function(action, params, callback) {
		var actionUrl = URL_PREFIX_AJAX + action;
		return jQuery.post(actionUrl, params, function(data) {
			var ret = Global.handleAjaxError(data, action);
			if (!ret)
				return;
			if (callback)
				callback(data);
		});
	},

	getJSONAction : function(action, params, callback) {
		var actionUrl = URL_PREFIX_AJAX + action;
		return jQuery.getJSON(actionUrl, params, function(data) {
			var error_flag = false;
			for ( var i in data['messages']) {
				if (data['messages'][i]['type'] == 'E') {
					error_flag = true;
				}
			}

			for ( var i in data['verrors']) {
				error_flag = true;
			}

			Validation.displayMessages(action, data['messages'], true);

			for ( var h in data['handlers']) {
				var alwaysExec = data['handlers'][h];
				Global.executeJsHandler(handler, alwaysExec);
			}

			if (callback && !error_flag) {
				callback(data);
			}
		});
	},

	loadAction : function(target, action, params, callback) {
		var actionUrl = URL_PREFIX_AJAX + action;

		return jQuery.get(actionUrl, params, function(data) {
			var ret = Global.handleAjaxError(data, action);
			if (!ret)
				return;

			$(target).html(data);
			if (callback) {
				callback(data);
			}
		});
	},

	ajaxSubmitAction : function(form_id, callback) {
		var form = document.getElementById(form_id);
		var action = Global.getFormAction(form);
		var ret = FormUtils.validateForm(form);
		if (!ret)
			return;
		$(form).ajaxSubmit( {
			success : function(data) {
				var ret = Global.handleAjaxError(data, action);
				if (!ret)
					return;
				if (callback) {
					callback(data);
				}
			}
		});
	},

	ajaxSubmitJSON : function(form_id, callback, errorcallback) {
		var form = document.getElementById(form_id);
		var ret = FormUtils.validateForm(form);
		var action = Global.getFormAction(form);
		if (!ret) {
			return;
		}

		$(form).ajaxSubmit( {
			dataType : 'json',
			success : function(data) {
				var error_flag = false;
				for (i in data['messages']) {
					if (data['messages'][i]['type'] == 'E') {
						error_flag = true;
					}
				}

				for (i in data['verrors']) {
					error_flag = true;
				}

				Validation.displayMessages(action, data['messages'], true);

				for ( var h in data['handlers']) {
					var alwaysExec = data['handlers'][h];
					Global.executeJsHandler(handler, alwaysExec);
				}

				if (errorcallback && error_flag) {
					errorcallback(data);
				}

				if (callback && !error_flag) {
					callback(data);
				}
			},

			error : function(data) {
				if (errorcallback) {
					errorcallback(data);
				}
			}
		});
	},

	handleAjaxError : function(data, url) {
		if (!data)
			return true;
		if (data.match(/FW_PHP_ERROR/)) {
			var error = data.replace(/<!--FW_PHP_ERROR-->/g, '');
			alert("Oops! Something went wrong. Please try again.");
			return false;
		} else if (data.match(/FW_PHP_EXCEPTION/)) {
			alert("Oops! Something went wrong. Please try again.");
			return false;
		} else if (data.match(/FW_AJAX_REDIRECT/)) {
			var redirect_url = data.replace(
					/.*<!--FW_AJAX_REDIRECT-->(.*?)<!--FW_AJAX_REDIRECT-->.*/m,
					"$1");
			window.location.href = redirect_url;
			return false;
		}
		return true;
	},

	clearActionMessages : function(action) {
		$(".alert, .alertbox").each(
				function() {
					if (!this.className
							.match("m_" + action.toLowerCase() + "-")) {
						return;
					}
					$(this).html("");
					$(this).hide();
					$(this).parents('form.normal').find('label').removeClass(
							'error_label');
				});
	},

	loadNumericPage : function(elem, page) {
		if ($(elem).length == 0)
			return;
		var container = $(elem).parents(".container").get(0);
		if ($(elem).hasClass("pgn_scrolltop")) {
			if (jQuery().scrollTo) {
				$.scrollTo($(container));
			}
		}
		var primary = $(elem).hasClass("primary") ? 1 : 0;
		var action = $(elem).find(".pgn_action").text();
		Global.loadAction($(container), action, {
			page : page,
			_primary : primary
		}, function() {
		});
	},

	loadAlphaPage : function(elem, letter) {
		if ($(elem).length == 0)
			return;
		var container = $(elem).parents(".container").get(0);
		var action = $(elem).find(".pgn_action").text();
		Global.loadAction($(container), action, {
			letter : letter
		}, function() {
		});
	},

	alertObj : function(obj) {
		var output = "";
		for ( var i in obj) {
			output += i + "=" + obj[i];
		}
	},

	getFormAction : function(form) {
		var action = form.action;
		if (!action) {
			var path = location.pathname;
			action = path.replace(/^(\w+).*/, "$1");
		}
		action = action.toLowerCase();
		action = action.replace(/(\w+)\?/, "$1");
		action = action.replace(/^.*?(\w+)$/g, "$1");
		return action;
	},

	typeAhead : function($input, func, minChars, maxChars, delay) {
		var timeout = false;
		if ($.browser.mozilla)
			$input.keypress(processKey); // onkeypress repeats arrow keys in
											// Mozilla/Opera
		else
			$input.keydown(processKey); // onkeydown repeats arrow keys in
										// IE/Safari

		function processKey(e) {
			// printable chars
			if (($(this).val().length < minChars - 1)
					|| ($(this).val().length > maxChars - 1))
				return;
			if (e.which >= 32 && e.which < 127 || e.which == 8) {
				if (timeout)
					clearTimeout(timeout);
				timeout = setTimeout(func, delay);
			}
		}
	},

	dialog : function(jelem, params) {

		// if(typeof jelem == "string") {
		// jelem = $("<div>" + jelem + "</div>");
		// }

		// If jquery ui is not enabled then use jqm modal
		if (!jQuery().dialog) {
			Global.modal(jelem, params);
			return;
		}

		if (Global.dialogElement != null) {
			Global.closeDialog();
		}

		if (params == null) {
			params = {};
		}

		if (params.width == null) {
			params.width = jelem.width();
		}

		if (params.minHeight == null) {
			params.minHeight = 50;
		}

		params.draggable = false;
		params.modal = true;
		jelem.dialog(params).dialog('open');
		if (params.padding == null) {
			params.padding = 20;
		}

		$(".ui-dialog").css("padding", params.padding);
		if (params.top != null) {
			$(".ui-dialog").css("top", params.top);
		} else {
			if ($(window).height() <= $(".ui-dialog").height() + 20) {
				$(".ui-dialog").css("margin-top", 10);
			}
		}
		Global.dialogElement = jelem;
	},

	closeDialog : function() {
		if (!jQuery().dialog) {
			$('#jqm_window').jqmHide();
			return;
		}
		if (Global.dialogElement != null) {
			Global.dialogElement.dialog('destroy');
			Global.dialogElement.remove();
			Global.dialogElement = null;
		}
		return false;
	},

	actionDialog : function(msg, callbacks, params) {
		$("#action_dialog").remove();
		var html = '<div id="action_dialog"><div id="action_dialog_msg">' + msg + '</div>';
		if (callbacks) {
			for ( var action in callbacks) {
				html += '<a id="action_dialog_' + action
						+ '" href="javascript:void(0);" class="btn">' + action
						+ '</a>';
			}
		}
		if (params == null) {
			params = {};
		}
		if (params.width == null)
			params.width = 300;
		Global.dialog($(html), params);
		if (callbacks) {
			for ( var action in callbacks) {
				var cb = callbacks[action];
				$("#action_dialog_" + action).click(cb);
			}
		}
	},

	modal : function(jelem, params) {
		if ($('#jqm_window').length == 0) {
			$("body")
					.append(
							'<div id="jqm_container" ><div id="jqm_window" class="jqmWindow"><a href="#" class="jqmClose"></a></div></div>');
		}
		$('#jqm_window').append(jelem.html());
		$('#jqm_window').jqm( {
			modal : true
		});
		$('#jqm_window').jqmShow();
	},
	// Encoding HTML special characters(<, >, &, ', ") present in the string
	htmlSpecialCharsEncode : function(string) {
		string = string.replace(/\&/g, "&amp;");
		string = string.replace(/>/g, "&gt;");
		string = string.replace(/</g, "&lt;");
		string = string.replace(/\"/g, "&quot;");
		string = string.replace(/\'/g, "&#39;");

		return string;
	},

	// Decoding HTML special characters(<, >, &, ', ") present in the string
	htmlSpecialCharsDecode : function(string) {
		string = string.replace(/\&gt;/g, ">");
		string = string.replace(/\&lt;/g, "<");
		string = string.replace(/\&quot;/g, "\"");
		string = string.replace(/\&#039;/g, "'");
		string = string.replace(/\&#39;/g, "'");
		string = string.replace(/\&apos;/g, "'");
		string = string.replace(/\&amp;/g, "&");

		return string;
	}
};

var Validation = {

	validateAction : function(form) {

		if (gDisableJSValidation)
			return true;
		
		var action = Global.getFormAction(form);
		var validateRules = gValidateRules[action];

		var ret = true;
		for ( var elem in validateRules) {
			var elemRules = validateRules[elem];
			if (elemRules != null) {
				ret1 = this.validateElem(action, form, elem, elemRules);
				ret = ret && ret1;
			}
		}

		return ret;
	},

	validateElem : function(action, form, elem, rules) {
		jform = $(form);
		jelem = jform.find(":input[name='" + elem + "']");
		var required = true;
		var label = elem;
		var jLabel = jform.find("label[for='" + elem + "']");
		if (jLabel) {
			label = jLabel.text();
		}
		if (!label) {
			label = elem;
		}

		/*
		 * if(required && jQuery.trim(jelem.val()) == "") {
		 * this.displayActionMessage(action, '-e-' + elem, label + " is
		 * required.", 'E', ''); return false; }
		 */
		for ( var id in rules) {
			var rule = rules[id];
			var message = rule['message'];
			var type = rule['rule'];
			var args = rule['args'];

			message = message.replace("{label}", label);
			if (type == 'matchOther') {
				var otherLabel = jform.find("label[for='" + args[0] + "']");
				if (otherLabel) {
					otherLabel = otherLabel.text();
				} else {
					otherLabel = elem;
				}
				message = message.replace("{label1}", otherLabel);
			}

			for ( var i = 0; i < args.length; i++) {
				message = message.replace("{" + (i + 1) + "}", args[i]);
			}

			if (required && jQuery.trim(jelem.val()) == "") {
				this.displayActionMessage(action, '-e-' + elem, message, 'E',
						'');
				return false;
			}

			if (!this.validateElemType(jform, jelem, type, args)) {
				this.displayActionMessage(action, '-e-' + elem, message, 'E',
						'');
				return false;
			}
		}

		return true;
	},

	validateElemType : function(jform, jelem, type, args) {
		if (type == 'alphanumeric') {
			if (jelem.val().match(/[^\d\w]/i)) {
				return false;
			}
		} else if (type == 'postalcode') {
			if (jelem.val().match(/[^\d\w\s-]/i)) {
				return false;
			}
		} else if (type == 'minLength') {
			if (jelem.val().length < args[0]) {
				return false;
			}
		} else if (type == 'maxLength') {
			if (jelem.val().length > args[0]) {
				return false;
			}
		} else if (type == 'matchOther') {
			var jOther = jform.find(":input[name='" + args[0] + "']");
			if (jelem.val() != jOther.val()) {
				return false;
			}
		} else if (type == 'ip') {
			var bytes = jelem.val().split('.');
			if (!bytes || bytes.length != 4)
				return false;
			for ( var i in bytes) {
				var byte1 = bytes[i];
				if (isNaN(byte1) || byte1 < 0 || byte1 > 255) {
					return false;
				}
			}
		} else if (type == 'email') {
			return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i
					.test(jelem.val());
		} else if (type == 'required') {
			if (jQuery.trim(jelem.val()) == '') {
				return false;
			}
		}
		return true;
	},
	displayMessages : function(action, messages, ajax) {
		var alert_flag = false;

		// Hide existing alert messages for an action
		for ( var msg_id1 in messages) {
			var msg_style = messages[msg_id1]['style'];
			if (msg_style == 'A') {
				alert_flag = true;
			}
		}
		if (alert_flag) {
			if ($("#alert_messages").length > 0) {
				$("#alert_messages").html("");
			} else {
				$("body").append('<div id="alert_messages"></div>');
			}
		}
		jQuery(".m_global").html("");
		jQuery(".m_global").hide("");

		if (ajax) {
			Global.clearActionMessages(action);
		}

		for ( var msg_id1 in messages) {

			var msg_str = messages[msg_id1]['msg'];
			var msg_type = messages[msg_id1]['type'];
			var msg_style = messages[msg_id1]['style'];
			var global_flag = messages[msg_id1]['global'];
			// for normal loading actions, do not show messages other than alert
			// and flash
			// those messages are shown by function.msg.php
			if (!ajax && !msg_style)
				continue;
			if (global_flag) {
				this.displayGlobalMessage(msg_str, msg_type);
			} else {
				this.displayActionMessage(action, msg_id1, msg_str, msg_type,
						msg_style);
			}
		}
		if (alert_flag) {
			if (jQuery().dialog) {
				Global.dialog($("#alert_messages"), {
					buttons : {
						"Ok" : function() {
							Global.closeDialog();
						}
					},
					closeText : ''
				});
			} else {
				Global.modal($("#alert_messages"));
			}
		}
	},

	displayGlobalMessage : function(msg_str, msg_type) {
		var error_class = "";
		if (msg_type == 'S') {
			error_class = "success";
		} else if (msg_type == 'W') {
			error_class = "warning";
		} else if (msg_type == 'E') {
			error_class = "error";
		} else if (msg_type == 'I') {
			error_class = "info";
		}
		$(".m_global").append(
				"<div class='" + error_class + "'>" + msg_str + "</div>");
		$(".m_global").show();
	},

	displayActionMessage : function(action, msg_id, msg_str, msg_type,
			msg_style) {
		var elem_id = ".m_" + action.toLowerCase() + "-" + msg_id;
		var rest_id = ".m_" + action.toLowerCase() + "-REST";
		var all_id = ".m_" + action.toLowerCase() + "-ALL";

		var error_class = "";
		if (msg_type == 'S') {
			error_class = "success";
		} else if (msg_type == 'W') {
			error_class = "warning";
		} else if (msg_type == 'E') {
			error_class = "error";
		} else if (msg_type == 'I') {
			error_class = "info";
		}

		if (!msg_style)
			msg_style = "";

		if (msg_style == 'A') {
			$("#alert_messages").append(
					"<div class='" + error_class + "'>" + msg_str + "</div>");
		} else {
			if ($(elem_id).length > 0) {
				$(elem_id).html(msg_str);
				$(elem_id).height("");
				$(elem_id).addClass(error_class);
				$(elem_id).show();
				if (msg_style == "F") {
					$(elem_id).show("fast", function() {
						setTimeout('$("' + elem_id + '").hide()', 5000);
					});
				}
			} else if ($(rest_id).length > 0) {
				$(rest_id).height("");
				$(rest_id).append(
						"<div class='" + error_class + "' >" + msg_str
								+ "</div>");
				$(rest_id).show();
				if (msg_style == "F") {
					$(rest_id).show("fast", function() {
						setTimeout('$("' + rest_id + '").hide()', 5000);
					});
				}
			}
			if ($(all_id).length > 0) {
				$(all_id).height("");
				$(all_id).append(
						"<div class='" + error_class + "' >" + msg_str
								+ "</div>");
				$(all_id).show();
				if (msg_style == "F") {
					$(all_id).show("fast", function() {
						setTimeout('$("' + all_id + '").hide()', 5000);
					});
				}
			}

			if (msg_id.match('-e-')) {
				var elem = msg_id.replace('-e-', '');
				$("form").find("label[for='" + elem + "']").addClass(
						"error_label");
			}

		}
	}

};

var Utils = {
	is_array : function(mixed_var) {
		return (mixed_var instanceof Array);
	},
	is_object : function(mixed_var) {
		if (mixed_var instanceof Array) {
			return false;
		} else {
			return (mixed_var !== null) && (typeof (mixed_var) == 'object');
		}
	},

	stripslashes : function(elem) {
		return elem.replace(/^\/+|\/+$/g, "");
	},

	handlePageload : function(hash) {
		var hash = hash.replace(/^[#\/]+/, "");
		if (hash != "") {
			var parts = hash.split("/");
			var actions = [];
			pathname = location.pathname.replace(/\/?$/, "");
			var page, letter;
			for ( var i = 0; i < parts.length; i++) {
				var action = parts[i++];
				var value = parts[i];
				if (action == 'page') {
					hash = hash.replace(/\/?page\/\d+/, "");
					pathname = pathname.replace(/\/page\/\d+/, "") + "/page/"
							+ value;
					page = value;
				}

				if (action == 'letter') {
					// remove page number when letter is changed
					hash = hash.replace(/\/?page\/\d+/, "");
					pathname = pathname.replace(/\/page\/\d+/, "");
					hash = hash.replace(/\/?letter\/[\w-09]+/, "");
					pathname = pathname.replace(/\/letter\/[\w-09]+/, "")
							+ "/letter/" + value;
					letter = value;
					page = 1;
				}
			}

			pathname += "/";
			if (hash) {
				hash = "#" + hash;
			}

			if (pageloadflag) {
				location.href = location.protocol + "//" + location.host
						+ pathname + location.search + hash;
				return false;
			} else {
				if (page && !letter) {
					Global
							.loadNumericPage(
									$(".pagination.primary, .pagination_prevnext.primary"),
									page);
				}

				if (letter) {
					// $("#alpha_browser .load_page").html(letter).click();
					Global.loadAlphaPage($(".alpha_browser"), letter);

				}
			}
		} else {
			if (!pageloadflag) {
				var page = "1";
				var pathname = location.pathname.replace(/\/?$/, "");
				if (pathname.match(/\/page\/\d+/)) {
					page = pathname.replace(/.*\/page\/(\d+).*/, "$1");
				}

				if (pathname.match(/\/letter\/[\w-09]+/)) {
					page = pathname.replace(/.*\/letter\/([\w-09]+).*/, "$1");
				}

				if (lasthash != "" && lasthash.match(/\/page\/\d+/)) {
					Global
							.loadNumericPage(
									$(".pagination.primary, .pagination_prevnext.primary"),
									page);
				}

				if (lasthash != "" && lasthash.match(/\/letter\/[\w-09]+/)) {
					Global.loadAlphaPage($(".alpha_browser"), letter);
				}
			}
		}

		lasthash = location.hash;
		pageloadflag = false;
		return false;
	}
};

var FormUtils = {
	validateForm : function(form) {
		$(form).find("label").removeClass("error_label");

		var action = Global.getFormAction(form);
		if (action) {
			Global.clearActionMessages(action);
		}

		var ret = Validation.validateAction(form);
		if (!ret) {
			return ret;
		}

		// Append the labels
	var labels = {};
	$(form).find("label").each(function() {
		name = $(this).attr("for");
		label = $(this).text();
		labels[name] = label;
	});

	for (name in labels) {
		$(form).append(
				"<input type='hidden' name='_label_" + name + "' value='"	+ labels[name] + "' />");
	}
	;

	// Append the form name
	var formName = '';
	if (form.name) {
		formName = form.name
	}

	$(form).append(
			"<input type='hidden' name='_form_' value='" + formName + "' />");
	return true;
},

clearForm : function() {
	// iterate each matching form
	return this.each(function() {
		// iterate the elements within the form
			$(':input', this).each(function() {
				var type = this.type, tag = this.tagName.toLowerCase();
				if (type == 'text' || type == 'password' || tag == 'textarea') {
					this.value = '';
				} else if (type == 'checkbox' || type == 'radio') {
					this.checked = false;
				} else if (tag == 'select') {
					this.selectedIndex = -1;
				}
			});
		});
},

// Reset all the form values
	formReset : function(frm) {
		for ( var i = 0; i < frm.elements.length; i++) {
			if (!(frm.elements[i].type && frm.elements[i].type == "submit"
					|| frm.elements[i].type == "button" || frm.elements[i].type == "hidden")) {
				if (frm.elements[i].type == "radio"
						|| frm.elements[i].type == "checkbox") {
					frm.elements[i].checked = false;
				} else if (frm.elements[i].type == "select-one") {
					frm.elements[i].selectedIndex = -1;
				} else {
					frm.elements[i].value = "";
				}
			}
		}
	}
};

var Debug = {
	highlight : function(action) {
		$(".debug_action_container").toggleClass("selected");
	},
	toggleActionDetails : function(elem) {
		var id = elem.id.substr(12);
		$("#debugdata_" + id).toggleClass('hidden');
	},
	handleDebugEvents : function() {

		$("#debugger_details .collapsed").live("click", function() {
			$(this).removeClass("collapsed");
			$(this).addClass("expanded");
		});
		$("#debugger_details .expanded").live("click", function() {
			$(this).removeClass("expanded");
			$(this).addClass("collapsed");
		});
		$("#debugger_details .tab").live("click", function() {
			var id = this.id;
			$(this).parents(".debugdata").find(".tab").removeClass("selected");
			$(this).parents(".debugdata").find(".data").hide();
			$("#" + id + "_data").show();
			$(this).addClass("selected");
		});
	}
};

