﻿
/// <reference path="Common/jQuery/jquery-1.4.1-vsdoc.js" />
/// <reference path="Common/Common.js" />

var BillingPane = false,
	ProductsPane = false,
	customer_id = '',
	strRewardUnit = 'Token',
	tokenrate = 10;

var Application = {
	oUser: {
		isEmployee: false,
		NAME: '',
		CODE: '',
		PASSWORD: '',
		TOKENRATE: 10,
		TOKENUNIT: 'Token',
		MONTHLYBUDGET: null,
		LANDINGS: null,
		SHIPTIME: null,
		PROVIDER_NAME: null
	},
	bLoggedIn: false,
	docReady: function () {
		$("#btnContactUs").button().click(function () { Application.ContactDialog(); });
		$(".currentYear").text((new Date()).getFullYear());
		//if ($.browser.mozilla) { $("#PageHeader").css({ overflow: "auto" }) };

		$(".ui-table").find("th").addClass("ui-widget-header");

		if (!window.location.hash) {
			window.location.replace("#Home");
		}
		$("#TokenLogo, #MenuBarBlueMan").click(function () { Application.LogoClicked(); });
		$(window).resize(function () {
			switch (window.location.hash) {
				case "#Home": HomePane.resized(); break;
				case "#Awards": awards.resize(); break;
				case "#MyShop": Catalog.windowResized(); break;
				case "#Participants": participants.resize(); break;
			}
		});

		// Ctrl + Shift + M for participant notes
		$(document).keypress(function (event) {
			// console.log(event);
			if (event.ctrlKey && event.shiftKey && event.which == "77" && participants.partyDialogs.length) {
				var nX_TopParty = -1;
				var nMaxZIndex = 0;
				for (var nX = 0; nX < participants.partyDialogs.length; nX++) {
					var nCurZ = participants.partyDialogs[nX].jqParty.parent().css("z-index").toNumber();
					if (nCurZ > nMaxZIndex) {
						nMaxZIndex = nCurZ;
						nX_TopParty = nX;
					}
				}
				$(".lblPartyNotes button", participants.partyDialogs[nX_TopParty].jqParty).click();
			}
		});

		$('#kwicks1').kwicks({
			duration: 500,
			max: 155,
			//			min: 125,
			spacing: 0
		}).
		find('li').click(function () {
			if ($(this).attr("hash_ref") == "#ContactUs") {
				Application.ContactDialog();
				return;
			}
			if ($(this).attr("hash_ref") == "#Currency") {
				certWiz.open();
				return;
			}

			Application.changeHash($(this).attr("hash_ref"));
		})

		$('#ContactUs').kwicks({
			duration: 500,
			max: 155,
			//			min: 125,
			spacing: 0
		}).
		find('li').click(function () {
			if ($(this).attr("hash_ref") == "#ContactUs") {
				Application.ContactDialog();
				return;
			}
			if ($(this).attr("hash_ref") == "#Currency") {
				certWiz.open();
				return;
			}

			Application.changeHash($(this).attr("hash_ref"));
		})


		$("#ContactUs li").css({ left: "auto", right: "0px" });

		Email.init();

		$("#diagLogin #chkPersistLogin")[0].checked = false;
		Application.PostLogin = queryString("PostLogin");

		Application.InitUser();

		jChat = $(".SnapABug_Button").detach().attr("id", "btnChat");
		$("#PageFooter").append(jChat);

	},
	InitUser: function () {
		var cCode = $.cookie("UserName");
		var cPass = $.cookie("Password");

		if (cCode && cPass) {
			//LogEntry("Cookie Login Attempt, password:" + cPass);
			ui.openWait("Attempting automatic login...");
			var oCGI2 = new execQuery(
				"select * from adm$login(" + quoteSQL(cCode) + "," + quoteSQL(cPass) + ");",
				function (aRow) { Application.ValidateUser("InitUser", aRow[0]); });
		}
		else {
			Application.UserNotLoggedIn("InitUser");
		}
	},
	TipAfterLogin: false, PostLogin: false, LoginHash: false,
	sOldHash: '',
	LoginDialog: function () {
		$("#txtLoginPassword").keyup(function (event) {
			if (event.keyCode == 13) {
				Application.SetUser();
			}
		});

		$("#diagLogin").dialog({
			autoOpen: true,
			modal: true,
			height: 190,
			width: 320,
			open: function () {
				var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
				jBtns.eq(0).button({ icons: { primary: "ui-icon-key"} });
				jBtns.eq(1).button({ icons: { primary: "ui-icon-closethick"} });
			},
			close: function () { $(this).dialog('destroy'); },
			buttons: {
				"Log In": function () { Application.SetUser(); },
				"Cancel": function () { $(this).dialog("close"); HomePane.Activate(); }
			}
		});
		$("#txtLoginName").focus();
	},
	ContactDialog: function () {
		LogEntry("Contact Us dialog opened.");

		if (typeof SnapABug == "object") {

		}

		$("#diagContactUs").dialog({
			autoOpen: true, modal: true, height: 440, width: 500,
			buttons: {
				'Send': function () {
					ui.openWait("Sending your message...");
					LogEntry("Contact Us - message delivered.");
					$(this).dialog('close');

					var cContents =
					((!Application.oUser.CUSTOMER_ID) ?
					'From Unknown User (Not Logged In, check Matrix for IP address)' : 'From: ' + Application.oUser.NAME) +
					'<br/><br/>Note Contents:' +
					'<p style="font-weight:bold">' + $('#txtContactUsNote').val().encodeHTML() + '</p>';


					Email.send({
						to_contact_id: '',
						to_name: "Token Employees",
						to_address: "info@tokenrewards.com",
						from_name: "Admin (Contact Us) - " +
							((Application.oUser.CODE) ? Application.oUser.CODE : "Unknown"),

						subject: 'Note from Admin "Contact Us"',
						contents: cContents,
						callback: function (bSuccess, cSentTo) {
							ui.closeWait();
							ui.modalMessage({ title: "Message Delivered", message: "Your message has been successfully delivered to Token Rewards Customer Service." });
						}
					});

				},
				'Cancel': function () {
					LogEntry("Contact Us canceled.");
					$(this).dialog('close');
				}
			},
			close: function (event, ui) { $(this).dialog('destroy'); },
			open: function (event, ui) {
				var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
				jBtns.eq(0).button({ icons: { primary: "ui-icon-mail-closed"} });
				jBtns.eq(1).button({ icons: { primary: "ui-icon-closethick"} });
				$("#txtContactUsNote").focus();
			}
		});
	},

	SetUser: function () {
		$("#diagLogin").dialog("close");
		$("#diagLoginInProgress").dialog(
		{ autoOpen: true, close: function (event, ui) { $(this).dialog('destroy'); },
			width: 400, modal: true,
			buttons: { 'Cancel Login': function () { $(this).dialog('close'); } }
		});

		var cCode = $("#diagLogin #txtLoginName").val();
		var cPass = $("#diagLogin #txtLoginPassword").val();

		if (cCode.length > 0) {
			var oCGI2 = new execQuery(
				"select * from adm$login(" + quoteSQL(cCode) + "," + quoteSQL(cPass) + ");",
			function (aRow) {
				Application.ValidateUser("SetUser", aRow[0]);
			});
		}
	},
	ValidateUser: function (cFromWhere, oUser) {
		ui.closeWait();
		if (oUser.CUSTOMER_ID == undefined || oUser.CUSTOMER_ID == '') {
			if ($("#diagLoginInProgress").is(":visible")) $("#diagLoginInProgress").dialog('close');
			Application.UserNotLoggedIn(cFromWhere);
			return false;
		}
		Application.UserValidated(cFromWhere, oUser);
	},
	UserValidated: function (cFromWhere, oUser) {
		var cDetail = "Login from dialog. - ";
		if (cFromWhere == "InitUser") cDetail = "Login from cookie. - ";
		cDetail += navigator.userAgent;
		LogEntry(cDetail);

		Application.bLoggedIn = true;

		tokenrate = oUser.TOKENRATE;
		customer_id = Number(oUser.CUSTOMER_ID);
		strRewardUnit = oUser.TOKENUNIT;

		Application.oUser = $.extend({}, oUser);

		$.cookie('tr_account_id', Application.oUser.CUSTOMER_ID, { expires: 30, domain: 'tokenrewards.com' });

		var cCode = $("#diagLogin #txtLoginName").val();
		var cPass = $("#diagLogin #txtLoginPassword").val();
		if (cFromWhere == "SetUser") {
			if ($("#diagLogin #chkPersistLogin")[0].checked) {
				$.cookie("UserName", cCode, { expires: 30 });
				$.cookie("Password", cPass, { expires: 30 });
			}
			else {
				$.cookie("UserName", cCode);
				$.cookie("Password", cPass);
			}
		}

		$("#btnLogin").hide();
		if ($("#diagLoginInProgress").is(":visible")) $("#diagLoginInProgress").dialog('close');

		$("#spanUserName").text(oUser.NAME);
		$("#divLogin").hide();
		$("#divLogOut").show();

		setup.refresh.all(function () { });

		// Auto Open first unread tip if at #Home
		if (Application.TipAfterLogin && !Application.PostLogin) {
			//UsageTips.ShowFirstUnread();
			var x = 0;
		}
		else {
			if (Application.PostLogin == "ShowCart") {
				Application.LoginHash = "#Warehouse";
			}
			if (Application.LoginHash) {
				window.location.hash = Application.LoginHash;
				Application.LoginHash = false;
			}
			Application.hashChanged(window.location.hash);
		}

		$(window).hashchange(function () { Application.hashChanged(window.location.hash) });

		//certWiz.open({ type: "plain" });

	},
	UserNotLoggedIn: function (cFromWhere) {
		Application.TipAfterLogin = false;
		window.location.hash = "#Home";
		Application.hashChanged("#Home");
		$("#Home").show();
		HomePane.Activate();
		if (cFromWhere == "SetUser") {
			LogEntry("Login attempt failed, password:" + Application.oUser.Password);

			ui.modalMessage({
				title: "Log In Unsuccessful",
				message: "Sorry, but the Log In Code and/or Password you have entered could not be validated.  Please try typing your login information again.",
				action: function () { Application.LoginDialog(); }
			});
		}

		if (cFromWhere == "InitUser") {
			//Check Search keys
			if (!Application.bLoggedIn && Application.PostLogin) {
				Application.LoginDialog();
			}
		}
		return false;
	},

	LogOut: function () {
		LogEntry("Log Out clicked.");
		$.cookie("UserName", null, { domain: "tokenrewards.com" });
		$.cookie("Password", null, { domain: "tokenrewards.com" });
		$.cookie("UserName", null);
		$.cookie("Password", null);
		window.location = "http://TokenRewards.com";
	},
	LogoClicked: function () {
		LogEntry("TR Logo Clicked (return to home)");
		if (window.location.hash == "#Home") window.location = "http://tokenrewards.com";
		else {
			Application.changeHash("#Home");
			$("ul#kwicks1 li").mouseleave();
		}

	},
	changeHash: function (cNewHash) {
		if (Application.bLoggedIn) {
			window.location.hash = cNewHash;
		}
		else {
			if (!(cNewHash == "#Home")) {
				Application.LoginHash = cNewHash;
				Application.LoginDialog();
			}
		}
	},
	hashChanged: function (cHash) {
		var ShowPane = function (cHash) {
			if ($(".PaneActive").length > 0) { $(".PaneActive").hide(); }
			$(".PaneActive").removeClass("PaneActive");


			$(cHash).show();
			if ($(cHash).attr("aftershow")) eval($(cHash).attr("aftershow"));

			$(cHash).addClass("PaneActive");

			$("#MenuBar li").removeClass("activeHash");
			$("#MenuBar li[hash_ref=" + cHash + "]").mouseenter().addClass("activeHash");

		}
		var LoadPane = function (cHash) {
			var cURL = "";
			if (cHash.indexOf("Participant_") > 0) {
				var cAccountID = cHash.substring(cHash.indexOf("_") + 1, cHash.length).toLowerCase();
				participants.openParticipant(cAccountID);
				return;
			}

			cURL = $(cHash).attr("load");
			var cCallback = $(cHash).attr("afterload");

			if (cURL) { $(cHash).load(cURL, function () { eval(cCallback) }); }
			else { if (cCallback) eval(cCallback); }

			$(cHash).addClass("PaneLoaded");
			ShowPane(cHash);
		}

		if (!Application.bLoggedIn && cHash != "#Home") { window.location.hash = "#Home"; return; }
		if (cHash == Application.sOldHash || cHash == "#") return;
		LogEntry("Hash changed to " + cHash);

		Application.sOldHash = cHash;
		if (cHash == "#Statement") cHash = "#Billing";  //added for old bookmarks
		if (cHash != "#Warehouse" && $("#ShoppingCart").is(":visible")) $("#ShoppingCart").hide('slide', { direction: 'up' }, 500, false);
		if (cHash == "#Warehouse" && !$("#ShoppingCart").is(":visible")) $("#ShoppingCart").show('slide', { direction: 'up' }, 500, false);
		if (cHash != "#Warehouse") $("#Warehouse").hide();
		if (cHash.indexOf("#Participant", 0, 12) == -1) $("#Participants").hide();
		if (cHash != "#Home") {
			$("#Home").hide();
		}
		else {
			if (!HomePane.initialized) HomePane.Init();
		}
		if ($(cHash).hasClass("PaneActive")) return;
		if (!$(cHash).hasClass("PaneLoaded")) { LoadPane(cHash); }
		else { ShowPane(cHash); }
	}
};

var HomePane = {
	initialized: false,
	HomeButton: {
		size: 64,
		preventMouseLeave: false,
		onMouseDown: function (oX) {
			var jthis = $(oX);
			var cPos = " -" + (this.size * 2) + "px ";
			jthis.css("background-position", String(Number(jthis.attr("imageid")) * -1 * this.size) + "px" + cPos);
		},
		onMouseUp: function (oX) {
			var jthis = $(oX);
			var cPos = " 0px ";
			jthis.css("background-position", String(Number(jthis.attr("imageid")) * -1 * this.size) + "px" + cPos);
		},
		onClick: function (oX) {
			var sHash = $(oX).parent().attr("hash_ref")

			if (sHash == "#ContactUs") {
				Application.ContactDialog();
				return;
			}

			if (sHash == "#Currency") {
				certWiz.open();
				return;
			}
			HomePane.HomeButton.preventMouseLeave = true;
			Application.changeHash(sHash);
		},
		hoverIn: function (oX) {
			var jthis = $(oX);
			var cPos = " -" + (jthis.width()) + "px ";

			jthis.css("background-position", String(Number(jthis.attr("imageid")) * -1 * this.size) + "px" + cPos);

			// Menubar anitmations
			var cHash = jthis.parent().attr("hash_ref");
			$("#MenuBar li").removeClass("activeHash");
			$("#MenuBar li[hash_ref=" + cHash + "]").addClass("activeHash").mouseover();
			return;
		},
		hoverOut: function (oX) {
			if (HomePane.HomeButton.preventMouseLeave)
			{ HomePane.HomeButton.preventMouseLeave = false; return; }

			var jthis = $(oX);
			var cPos = " 0px ";

			jthis.css("background-position", String(Number(jthis.attr("imageid")) * -1 * this.size) + "px" + cPos);

			var cHash = jthis.parent().attr("hash_ref");
			$("#MenuBar li[hash_ref=" + cHash + "]").removeClass("activeHash").mouseleave();
		}
	},
	resized: function () {
		if ($("body").height() > 760) {
			$("#HomeContainer").position({ my: "center", at: "center", of: $("body") });
		}
		else $("#HomeContainer").position({ my: "center top", at: "center top", of: $("#Home"), collision: "none" })
		return;
	},
	Init: function () {
		$("#Home, #HomeContainer").show();
		HomePane.resized();
		$("#Home div.HomeContainerButton")
		.click(function () { HomePane.HomeButton.onClick(this); })
		.mouseup(function () { HomePane.HomeButton.onMouseUp(this); })
		.mousedown(function () { HomePane.HomeButton.onMouseDown(this); })
		.hover(function () { HomePane.HomeButton.hoverIn(this); },
				 function () { HomePane.HomeButton.hoverOut(this); })
		.delay(1)
		.each(function () { HomePane.HomeButton.hoverOut(this); });

		$("#Home .HomeMenuTitle")
		.click(function () {
			var sHash = $(this).parent().attr("hash_ref");

			if (sHash == "#Currency") {
				certWiz.open();
				return;
			}

			var jX = $('.kwicks [hash_ref="' + sHash + '"]');
			jX.mouseenter();
			HomePane.HomeButton.preventMouseLeave = true;
			Application.changeHash(sHash);
		})
		.hover(function () {
			var sHash = $(this).parent().attr("hash_ref");

			$("#MenuBar li").removeClass("activeHash");
			$("#MenuBar li[hash_ref=" + sHash + "]").addClass("activeHash").mouseover();
		},
		function () {
			if (HomePane.HomeButton.preventMouseLeave)
			{ HomePane.HomeButton.preventMouseLeave = false; return; }

			var sHash = $(this).parent().attr("hash_ref");
			$("#MenuBar li[hash_ref=" + sHash + "]").removeClass("activeHash").mouseleave();
		});
		$("#HomeLogo").fadeOut(4000, function () { });

		HomePane.initialized = true;
	},
	animateActivate: true,
	skipActivate: true,
	Activate: function () {

		if (HomePane.skipActivate) { HomePane.skipActivate = false; return; }
		return;
		$(".HomeContainerButton")
		.position({ at: "center center", my: "center center", of: $("#HomeContainer"), collision: "none" })
		.delay(1)
		.each(function () {
			HomePane.HomeButton.defaultPosition(this, HomePane.animateActivate);
		});
	}
};

var participants = {
	initialized: false,
	jGrid: null,
	cFilterText: "",
	timerBatchCommands: null,
	timerBatchSelect: null,

	init: function () {
		if (this.initialized) {
			participants.resize();
			return;
		}
		$("#chkAddToAutoComplete").change(function () {
			cNewVal = $(this).attr("checked").toString();
			LogEntry("Reusable description checkbox set to " + cNewVal);
			$.cookie("PostReuseable", cNewVal, { expires: 365 })
		});

		var gridDefaults = {
			"iDisplayLength": 25,
			"aLengthMenu": [[10, 25, 50, 100, 150, -1], [10, 25, 50, 100, 150, "All"]],
			"bStateSave": true,
			"iCookieDuration": 365 * 60 * 60 * 24, /* 1 year */
			"sCookiePrefix": "earth_",
			"bScrollCollapse": true,
			"bJQueryUI": true,
			"bAutoWidth": false,
			"sWidth": "100%",
			"sScrollY": "1px",
			"sScrollX": "100%",
			"sPaginationType": "full_numbers",
			"bProcessing": true,
			"bScrollInfinite": false,
			"aaData": []
		};
		var oConfig = {
			"sDom": '<"dataTables_header ui-widget-header ui-corner-top ui-helper-clearfix"TClfr>t' +
				'<"dataTables_footer ui-widget-header ui-corner-bottom ui-helper-clearfix"ip>',
			"oLanguage": {
				"sInfo": 'Showing _START_ to _END_ of _TOTAL_ <span class="queryFilter"></span>',
				"sInfoFiltered": '  Filtered from _MAX_.',
				"sLengthMenu": "Show _MENU_",
				"sInfoEmpty": 'There are no <span class="queryFilter"></span> to display.',
				"sSearch": "Search for: _INPUT_",
				"sZeroRecords":
				'<div id="zeroPartiesRow" style="margin:.8em">' +
					'There are no <span class="queryFilter"></span> to display.' +
				'</div>'
			},
			"fnStateSaveCallback": function (oSettings, sValue) {
				// Don't save the search filter (save it as blank always)
				sValue = sValue.replace(/"sFilter":".*?"/, '"sFilter":""');
				return sValue;
			},
			"sScrollXInner": "200em",
			"oColVis": { "aiExclude": [0, 19] },
			"bServerSide": true,
			"bDeferRender": true,
			"oSearch": { "sSearch": "" },
			"sAjaxSource": "/Common/cgi-scripts/participants.pl",
			"fnServerData": function (sSource, aoData, fnCallback) {
				/* Add some extra data to the sender */
				aoData.push({ name: "customer_id", value: customer_id });
				aoData.push({ name: "activated", value: participants.filterParams().activated });
				aoData.push({ name: "class_id", value: participants.filterParams().class_id });
				ui.elap.on();
				$.getJSON(sSource, aoData, function (json) {
					fnCallback(json)
					ui.elap.off();
				});
			},
			"aoColumns": [
				{ "sTitle": "", "sWidth": "6em", "bSortable": false, "sClass": "open" },
				{ "sTitle": "Code", "sWidth": "6em", "sClass": "party_code" },
				{ "sTitle": "Name", "sWidth": "18em", "sClass": "name", "asSorting": ["asc", "desc"] },
				{ "sTitle": "Sort Name", "sWidth": "18em", "sClass": "name", "bVisible": false },
				{ "sTitle": "Class", "sWidth": "12em" },
				{ "sTitle": "Balance", "sWidth": "6em", "sClass": "balance integer", "asSorting": ["desc", "asc"] },
				{ "sTitle": "Pending", "sWidth": "7em", "sClass": "pending integer button", "asSorting": ["desc", "asc"], "bVisible": false },
				{ "sTitle": "Earned", "sWidth": "7em", "sClass": "earned integer button", "asSorting": ["desc", "asc"] },
				{ "sTitle": "Spent", "sWidth": "7em", "sClass": "spent integer button", "asSorting": ["desc", "asc"] },
				{ "sTitle": "Awards", "sWidth": "7em", "sClass": "awards integer button", "asSorting": ["desc", "asc"], "bVisible": false },
				{ "sTitle": "E-Mail Address", "sWidth": "20em", "sClass": "email", "bVisible": false },
				{ "sTitle": "Family", "sWidth": "7em", "sClass": "contacts", "bVisible": false },
				{ "sTitle": "Last Deposit", "sWidth": "12em", "sClass": "last_deposit", "asSorting": ["desc", "asc"], "bVisible": false },
				{ "sTitle": "Last Withdrawal", "sWidth": "12em", "sClass": "last_withdraw", "asSorting": ["desc", "asc"], "bVisible": false },
				{ "sTitle": "Shop Visited", "sWidth": "12em", "sClass": "last_login", "asSorting": ["desc", "asc"], "bVisible": false },
				{ "sTitle": "Status", "sWidth": "6em", "sClass": "status", "bVisible": false, "bSortable": true },
				{ "sTitle": "Gender", "sWidth": "6em", "sClass": "gender", "bVisible": false, "bSortable": true },
				{ "sTitle": "Age", "sWidth": "7em", "sClass": "age", "bVisible": false, "bSortable": true },
				{ "sTitle": "Shipping Address", "sWidth": "20em", "sClass": "direct_ship", "bVisible": false, "bSortable": true },
				{ "sClass": "spacerColumn", "sWidth": "auto", "bSortable": false }
			],
			"fnRowCallback": function (nRow, aData, iDisplayIndex) {
				for (var nX = 0; nX < aData.length; nX++) {
					if (aData[nX] == null) { aData[nX] = ''; }
				}
				$(nRow).attr("party_code", aData[1]).data({
					CODE: aData[1],
					NAME: aData[2],
					BALANCE: aData[5],
					ACTIVATED: aData[15],
					CLASS_ID: aData[27]
				});
				$('td.last_deposit', nRow).text(aData[12].toDateFormat("shortDateTime"));
				$('td.last_withdraw', nRow).text(aData[13].toDateFormat("shortDateTime"));
				$('td.last_login', nRow).text(aData[14].toDateFormat("shortDateTime"));

				$('td.open', nRow).attr("party_code", aData[1]).html('<span>Open...</span>')
				.find('span').button({ icons: { primary: ""} }).click(function (event) {
					event.stopPropagation();
					window.location.hash = '#Participant_' + aData[1];
				});


				$('td', nRow).not('.party_code').dblclick(function (event) {
					event.stopPropagation();
					var cPartyCode = $('td.open', $(this).parent()).attr("party_code").toLowerCase();
					window.location.hash = '#Participant_' + cPartyCode;
				})
				.addClass("pointer preventTextSelect").find('span').addClass("pointer");

				$('td.party_code', nRow).text(aData[1].toUpperCase());

				$('td.pending', nRow)
				.html('<span party_code="' + aData[1] + '" party_name="' + aData[2] + '">' +
					'</span><span class="spnIntWithBtn">' +
						aData[6].toEmptyFromZero() +
					'</span>')
				.find('span[party_code]')
				.button({ icons: { primary: "ui-icon-cart" }, text: false })
				.click(function (event) {
					event.stopPropagation();
					var jThis = $(this);
					LogEntry("Place orders button on participants grid clicked for " + jThis.attr("party_name"));
					participants.order.init(jThis.attr("party_code"), jThis.attr("party_name"), false)
				});

				$('td.earned', nRow)
				.html('<span party_code="' + aData[1] + '" party_name="' + aData[2] + '">' +
					'</span><span class="spnIntWithBtn">' +
						aData[7].toEmptyFromZero() +
					'</span>'
				)
				.find('span[party_code]')
				.button({ icons: { primary: "ui-icon-circle-plus" }, text: false })
				.click(function (event) {
					event.stopPropagation();
					var jThis = $(this);
					LogEntry("Deposit button on participants grid clicked for " + jThis.attr("party_name"));
					participants.post.deposit(jThis.attr("party_code"), jThis.attr("party_name"), false)
				});

				$('td.spent', nRow)
				.html('<span party_code="' + aData[1] + '" party_name="' + aData[2] + '">' +
					'</span><span class="spnIntWithBtn">' +
						aData[8].toEmptyFromZero() +
					'</span>'
				)
				.find('span[party_code]')
				.button({ icons: { primary: "ui-icon-circle-minus" }, text: false })
				.click(function (event) {
					event.stopPropagation();
					var jThis = $(this);
					LogEntry("Withdraw button on participants grid clicked for " + jThis.attr("party_name"));
					participants.post.withdrawal(jThis.attr("party_code"), jThis.attr("party_name"), false)
				});

				$('td.awards', nRow).html(
					'<span party_code="' + aData[1] + '" party_name="' + aData[2] + '">' +
					'</span>' +
					'<span class="spnIntWithBtn">' +
							aData[9].toEmptyFromZero() +
					'</span>'
				)
				.find('span[party_code]')
				.button({ icons: { primary: "ui-icon-star" }, text: false })
				.click(function (event) {
					event.stopPropagation();
					var jThis = $(this);
					LogEntry("Grant Award from participants grid clicked for " + jThis.attr("party_name"));
					participants.grant.init(jThis.attr("party_code"), false)
				});

				if (aData[28]) {
					$('td.email', nRow).addClass('verified').html(
						aData[10] +
						'<div class="email_verified">' +
							'Verified ' + //aData[28].toDateFormat("shortDate") +
						'</div>'
					);
				}
				else if (!aData[10].isValidEmail()) {
					$('td.email', nRow).addClass('invalid').html(
						aData[10]
					//						 +
					//						'<span party_code="' + aData[1] + '" class="fakeAnchor">' +
					//							'Edit...' +
					//						'</span>'
					)
					.find('span[party_code]')
					.click(function (event) {
						event.stopPropagation();
						participants.edit.open($(this).attr("party_code"));
					});
				}


				if (aData[11].toNumber() > 0) {
					$('td.contacts', nRow).addClass('active').attr("title", aData[14] + " active contacts")
					.html(aData[25] + " of " + aData[11]);
				}

				var cStatus = "Inactive";
				if (aData[15] == "1") {
					cStatus = "Active";
				}
				$("td.status", nRow).text(cStatus);

				$("td.gender", nRow).text(Gender(aData[16], true));
				$("td.age", nRow).text(Age(aData[17], true));

				if (aData[18]) {
					var oLabel = {
						NAME: aData[2],
						ADDRESS: aData[19],
						CITY: aData[20],
						STATE: aData[21],
						ZIP: aData[22]
					};
					$("td.direct_ship", nRow).html(ContactAddress(oLabel));
				}
				else $("td.direct_ship", nRow).html("Admin Shipping Address").css("color", "#AAAAAA");

				$("td.spacerColumn", nRow).html("&nbsp;&nbsp;&nbsp;");

				return nRow;
			},
			"fnDrawCallback": function () {
				$(".queryFilter").text(participants.cFilterText);
				var jRows = $("#tblParties tbody tr");
				var aoSelected = participants.select.array;

				if (aoSelected.length) {
					jRows.each(function () {
						var jThis = $(this);
						if (aoSelected.searchSortedColumn(jThis.attr("party_code"), 'CODE') > -1) {
							jThis.addClass('DTTT_selected');
						}
					});
				}

				participants.select.refreshBatchSelect();

				$("#tblParties_filter input").focus();

				return;
			}
		};

		oConfig = $.extend(true, {}, oConfig, gridDefaults);
		this.jGrid = $("#tblParties").dataTable(oConfig); //.fnSetFilteringDelay(100);

		$('#tblParties tbody tr').live('click', function (event) {
			participants.select.row($(this), event.shiftKey);
		});

		//new FixedColumns(participants.jGrid, { "columns": 2 });
		this.initHeadFoot();
		this.select.refreshCount();
		$("#tblParties_filter input").focus();
		this.initialized = true;
	},
	initHeadFoot: function () {
		participants.refreshClassFilter();

		// btnPrintInvites is on the Add Participants dialog
		//		$("#btnPrintInvites").button({ label: "Print Certificates Instead...", icons: { primary: ""} })
		//			.click(function () { certWiz.open(); });

		$("#tblParties_wrapper .dataTables_header .ColVis_MasterButton")
		.button({ label: "Choose Columns", icons: { secondary: "ui-icon-triangle-1-s"} });

		$('#tblParties_wrapper .dataTables_header').append($("#partyTools").children().clone());
		$("#partyTools").remove();

		$("#divFilterClass select").live("change", function () {
			participants.jGrid.fnDraw();
			//participants.jGrid.fnD.refresh();
		});


		var wrapMultiPartyCommands = function () {
			$("#wrapMultiPartyCommands")

			.mouseenter(function () {
				if (!$("#chkMultiPartyCommands").is(":checked")) {
					//					$("#chkMultiPartyCommands").attr("checked", true).button("refresh");
					//					$("#menuMultiPartyCommands").slideDown();

					//$("#menuBatchSelect").slideUp().attr("checked", false).button("refresh");
				}
				clearTimeout(participants.timerBatchCommands);
			})

			.mouseleave(function () {
				function hideMenu() {
					if ($("#chkMultiPartyCommands").is(":checked")) {
						$("#chkMultiPartyCommands").attr("checked", false).button("refresh");
						$("#menuMultiPartyCommands").slideUp();
					}
				};
				participants.timerBatchCommands = setTimeout(hideMenu, 700);
			});

			$("#chkMultiPartyCommands")
			.button({ icons: { secondary: "ui-icon-triangle-1-s"} })
			.click(function () {
				if ($(this).is(":checked")) $("#menuMultiPartyCommands").slideDown();
				else $("#menuMultiPartyCommands").slideUp();
			});
			$("#menuMultiPartyCommands").menu({
				selected: function (event, ui) {
					$(this).slideUp();
					$("#chkMultiPartyCommands").attr("checked", false).button("refresh");
				}
			});
		} ();

		var wrapBatchSelect = function () {
			$("#wrapBatchSelect")

			.mouseenter(function () {
				if (!$("#chkBatchSelect").is(":checked")) {
					//$("#chkBatchSelect").attr("checked", true).button("refresh");
					//$("#menuBatchSelect").slideDown();

					//$("#menuMultiPartyCommands").slideUp().attr("checked", false).button("refresh");

				}
				clearTimeout(participants.timerBatchSelect);
			})

			.mouseleave(function () {
				function hideMenu() {
					if ($("#chkBatchSelect").is(":checked")) {
						$("#chkBatchSelect").attr("checked", false).button("refresh");
						$("#menuBatchSelect").slideUp();
					}
				};
				participants.timerBatchSelect = setTimeout(hideMenu, 1000);
			});

			$("#chkBatchSelect")
			.button({ icons: { secondary: "ui-icon-triangle-1-s"} })
			.click(function () {
				if ($(this).is(":checked")) {
					$("#menuBatchSelect").slideDown();
				}
				else $("#menuBatchSelect").slideUp();
			});
			$("#menuBatchSelect").menu({
				selected: function (event, ui) {
					$(this).slideUp();
					$("#chkBatchSelect").attr("checked", false).button("refresh");
					//console.log(ui.item.attr("value"));
				}
			});

		} ();


		$("#selFilterPartyStatus").change(function () {
			participants.jGrid.fnDraw();
			//participants.refresh(); 
		});
		$("#btnAddParticipants").button({ label: "Add Participants...", icons: { primary: "ui-icon-plus"} })
			.click(function () {
				//participants.addParticipants.init(); 
				participants.edit.insert();
			});
		$("#btnEditClasses").button({ label: "Add & Edit Classes...", icons: { primary: "ui-icon-pencil"} })
			.click(function () { participants.editClasses.init(); });

		$("#btnSelectAll").click(function () { participants.select.all(); });
		$("#btnSelectFiltered").click(function () { participants.select.filtered(); });
		$("#btnSelectDisplayed").click(function () { participants.select.displayed(); });
		$("#btnUnselectAll").click(function () { participants.select.none(); });

		var jFooter = $("#tblParties_wrapper .dataTables_footer");

		var jReset = $('<button id="tblParties_reset">Reset Grid...</button>').button().click(function () {
			ui.modalConfirm({
				title: "Resest Grid?",
				message: 'Click "Okay" to reset your Participants grid cookie to its default settings. <br/><br/>' +
					'This will cause all hidden columns to appear in their default positions.',
				action: function () {
					$.cookie("earth_tblParties_", null);
					ui.openWait("Reloading Admin...");
					window.location.reload();
				}
			});
		});
		jFooter.prepend(jReset);

		participants.resize();

		var oSettings = participants.jGrid.fnSettings();
		$("#tblParties_filter").append('<button id="btnPartySearch">Search</button>');
		$("#btnPartySearch").button().hide().click(function () {
			var cStr = $("#tblParties_filter input").val();
			participants.jGrid.fnFilter(cStr);
			$(this).hide();
		});

		$("#tblParties_filter input").val("").focus()
		.keyup(function () {
			if ($(this).val() != "") { $("#filterSearchNote").fadeOut(); }
			else { $("#filterSearchNote").fadeIn(); }
		});
		/*
		.unbind('keyup')
		.keyup(function (event) {
		if ($(this).val() != "") {
		if (event.keyCode == 13) $("#btnPartySearch").click();
		else $("#btnPartySearch").show();
		$("#filterSearchNote").hide();
		}
		else {
		$("#filterSearchNote").show();
		$("#btnPartySearch").hide();

		var oSettings = participants.jGrid.fnSettings();
		if (oSettings.oPreviousSearch.sSearch)
		participants.jGrid.fnFilter('');
		}
		});
		*/
		$("#filterSearchNote").click(function () { $("#tblParties_filter input").focus(); });
	},

	filterParams: function () {
		var cFilterText = "";
		var oFilters = {
			activated: -1,
			class_id: -1
		};
		if ($("#selFilterPartyStatus")[0].selectedIndex == 0) {
			oFilters.activated = 1;
			cFilterText = "active participants";
		}
		else if ($("#selFilterPartyStatus")[0].selectedIndex == 2) {
			oFilters.activated = 0;
			cFilterText = "inactive participants";
		}
		else {
			cFilterText = "participants";
		}
		cFilterText += ". ";

		var cFilterClassId = $("#divFilterClass select").val()
		if (typeof cFilterClassId == "string" && cFilterClassId != "0") {
			oFilters.class_id = cFilterClassId.toNumber();
			cFilterText += "in " + $("#divFilterClass select option[value=" + cFilterClassId + "]").text() + "'s class.";
		}


		participants.cFilterText = cFilterText;
		return oFilters;
	},
	refresh: function () {
		if (!participants.initialized) return;

		this.select.refreshCount();
		this.refreshClassFilter();
		this.jGrid.fnDraw();

		// refresh open party dialogs
		for (var nX = 0; nX < participants.partyDialogs.length; nX++) {
			participants.partyDialogs[nX].fetchParty();
		}

		return;

	},
	refreshClassFilter: function () {
		var refresh = function (aRows) {

			var cCurVal = $("#divFilterClass select").val();

			$("#divFilterClass select").remove();
			if (!aRows.length) {
				$("#divFilterClass").hide();
				return;
			}

			var jSel = $('<select><option value="0">Any Class</option></select>');

			//jSel.empty().append('<option value="0">Any Class</option>');

			for (var nX = 0; nX < aRows.length; nX++) {
				jSel.append(
					'<option value="' + aRows[nX].ID + '">' + aRows[nX].CLASS_NAME + '</option>'
				);
			}

			$("#divFilterClass").append(jSel).show();

			jSel.val(cCurVal);
		};

		var cSQL = "select * from adm$classes(" + quoteSQL(customer_id) + ") order by class_name asc;";
		new execQuery(cSQL, function (aRows) {
			refresh(aRows);
		});

	},
	refreshRow: function (sPartyCode) {
		if (!participants.initialized) return;
		// if sPartyCode has a visible row, do the fnDraw(false)
		if ($('#tblParties tbody tr[party_code="' + sPartyCode + '"]').length)
			participants.jGrid.fnDraw(false);
	},
	resize: function () {

		var jWrap = $("#tblParties_wrapper");
		var nWrapHeight = jWrap.height();
		var nHead = $('.dataTables_header', jWrap).height();
		var nFoot = $('.dataTables_footer', jWrap).height();
		var nScrollHead = $('.dataTables_scrollHead', jWrap).height() + 20;
		// + 20 for height of bottom horizontal scroll bar

		var nScrollHeight = nWrapHeight - (nHead + nFoot + nScrollHead);

		//$('.dataTables_scrollBody', jWrap).height(nScrollHeight); - dont work.

		var aSettings = participants.jGrid.dataTableSettings
		for (var nX = 0; nX < aSettings.length; nX++) {
			if (aSettings[nX].sTableId == "tblParties") aSettings[nX].oScroll.sY = nScrollHeight;
		}
		participants.jGrid.fnDraw(false);
		$("#tblParties_filter input").focus();
	},

	editClasses: {
		aOld: [],
		aNew: [],
		nNewItemCnt: 0,
		Save: function () {
			ui.elap.on();
			var cSQL = "";
			participants.editClasses.PopulateNewArray();

			// Scan through new Data array
			for (var i = 0; i < participants.editClasses.aNew.length; i++) {
				if (participants.editClasses.aNew[i].id.search(/n/) > -1 && participants.editClasses.aNew[i].class_name != "") {
					// new record - insert is skipped if no class name was entered
					cSQL += "execute procedure adm$classes_iud(" +
						"null," +
						customer_id.prepSQL() + "," +
						"null," +
						participants.editClasses.aNew[i].class_name.prepSQL() + ");";
				}
				else {
					// Existing record
					for (var j = 0; j < participants.editClasses.aOld.length; j++) {// Find the record in old data array
						if (participants.editClasses.aOld[j].ID == participants.editClasses.aNew[i].id) {// Check if name field updated
							if (participants.editClasses.aOld[j].CLASS_NAME != participants.editClasses.aNew[i].class_name) {
								// class_name field has been updated
								cSQL += "execute procedure adm$classes_iud(" +
									"null," +
									customer_id.prepSQL() + "," +
									participants.editClasses.aNew[i].id.prepSQL() + "," +
									participants.editClasses.aNew[i].class_name.prepSQL() + ");";
							}
						} // end if - find original record
					} // end for loop (j - find old rec)
				} // end if/else block for insert/update
			} // end for loop (i - newData array)

			for (var i = 0; i < participants.editClasses.aOld.length; i++) {
				// looking for deleted records (not in new array)
				// don't try to delete one of the nonexisting records in OldData "_nX" (prev here for the "no administrator")
				if (participants.editClasses.aOld[i].ID.search(/n/) > -1) continue;

				var bFound = false;
				for (var j = 0; j < participants.editClasses.aNew.length; j++) {
					if ((participants.editClasses.aOld[i].ID == participants.editClasses.aNew[j].id)) {
						bFound = true;
						break;
					}
				} // end for - find in new data
				if (!bFound) {// record's been deleted
					cSQL += "execute procedure adm$classes_iud(" +
						"1," +
						customer_id.prepSQL() + "," +
						participants.editClasses.aOld[i].ID.prepSQL() + "," +
						"null);";
				}
			} // end for loop - old data/ find deleted
			if (cSQL) {
				new execQuery(cSQL, function () {
					participants.refreshClassFilter();
				});
			}
			ui.elap.off();
		},
		CheckEditState: function () {
			// if old and new array are exact copies, disable buttons, otherwise enable
			participants.editClasses.PopulateNewArray();
			if (participants.editClasses.aOld.length != participants.editClasses.aNew.length) {
				$('#btnSaveClasses').button({ disabled: false });
				return;
			}
			for (var i = 0; i < participants.editClasses.aOld.length; i++) {
				if (participants.editClasses.aOld[i].CLASS_NAME != participants.editClasses.aNew[i].class_name) {
					$('#btnSaveClasses').button({ disabled: false });
					return;
				}
			}
			$('#btnSaveClasses').button({ disabled: true });
		},
		btnNewRow_click: function (nID, bFirstBuild) {
			var strID = "";
			if (isNaN(nID)) {
				this.nNewItemCnt++;
				strID = "n" + this.nNewItemCnt.toString();
			}
			else
			{ strID = nID; }

			var oTbl = document.getElementById("tbodyClasses");
			var intLastRow = oTbl.rows.length;

			oTbl.insertRow(intLastRow);
			var objNewRow = oTbl.rows[intLastRow];
			objNewRow.id = "tableRow_" + strID;
			for (var i = 0; i <= 2; i++)
			{ objNewRow.insertCell(0); }
			//alert(objNewRow.cells.length);            

			// New Name Input Text Box
			var NewInput = document.createElement("input");
			NewInput.onchange = function () { participants.editClasses.CheckEditState(); }
			NewInput.onkeyup = function () { participants.editClasses.CheckEditState(); }
			NewInput.id = "txtName_" + strID;
			NewInput.style.width = "99%";
			objNewRow.cells[0].style.textAlign = "center";
			objNewRow.cells[0].appendChild(NewInput);

			// New Accounts Span
			var NewSpan = document.createElement("span");
			NewSpan.innerHTML = "";
			NewSpan.style.margin = "0,15,0,0"
			NewSpan.id = "spanAccounts_" + strID;
			objNewRow.cells[1].style.textAlign = "right";
			objNewRow.cells[1].style.paddingRight = "15px";
			objNewRow.cells[1].appendChild(NewSpan);


			// New remove Button
			var NewRemoveButton = document.createElement("div");
			NewRemoveButton.className = "RemoveButton"
			NewRemoveButton.onclick = function () { participants.editClasses.btnRemoveRow_click(this) };
			NewRemoveButton.title = "Remove this Administrator."
			NewRemoveButton.id = "btnRemove_" + strID;

			var jBtn = $('<span id="btnRemove_' + strID + '" class="cellButton"></span>')
				.button({ text: false, icons: { primary: "ui-icon-trash"} }).click(function () { participants.editClasses.btnRemoveRow_click(this); });
			//objNewRow.cells[2].style.textAlign = "center";
			$(objNewRow.cells[2]).addClass("buttonCell").append(jBtn);

			//Enable the save/revert buttons
			if (!bFirstBuild) {
				participants.editClasses.CheckEditState();
				NewInput.focus();
			}
			return strID
		},
		btnRemoveRow_click: function (pObject) {
			var strRowID = pObject.id.substring(pObject.id.indexOf("_") + 1, pObject.id.length);
			oTbl = document.getElementById("tbodyClasses");
			for (var i = 0; i < oTbl.rows.length; i++) {
				if (oTbl.rows[i].id == "tableRow_" + strRowID) {
					oTbl.deleteRow(i);
				}
			}
			participants.editClasses.CheckEditState();
		},

		createHTML: function () {
			$("#tbodyClasses").empty();
			var strID = "";
			for (var i = 0; i < participants.editClasses.aOld.length; i++) {
				participants.editClasses.btnNewRow_click(participants.editClasses.aOld[i].ID, true);
				strID = participants.editClasses.aOld[i].ID;
				document.getElementById("txtName_" + strID).value = participants.editClasses.aOld[i].CLASS_NAME;
				document.getElementById("spanAccounts_" + strID).innerHTML = participants.editClasses.aOld[i].ACTIVE_PARTICIPANTS;
			}
		},
		PopulateNewArray: function () {
			var oTbl = document.getElementById("tbodyClasses");

			var aryX = new Array();
			for (var i = 0; i < oTbl.rows.length; i++) {
				var oX = oTbl.rows[i].cells[0].childNodes[0];
				aryX[i] = { class_name: "", id: "" }
				aryX[i].id = oX.id.substring(oX.id.indexOf("_") + 1, oX.id.length);
				aryX[i].class_name = oX.value;
			}
			// New Goals, 1st clean out NewGoals array
			participants.editClasses.aNew.length = 0;
			participants.editClasses.aNew = aryX.slice(0, aryX.length);
		},

		open: function () {
			LogEntry("Add & Edit Classes clicked.");
			participants.editClasses.nNewItemCnt = 0;
			participants.editClasses.createHTML();
			participants.editClasses.PopulateNewArray();
			$("#btnNewClass").button({ label: "Add Another Class", icons: { primary: "ui-icon-plus"} })
				.unbind().click(function () { participants.editClasses.btnNewRow_click(); });

			if ($('#tbodyClasses tr').length == 0) participants.editClasses.btnNewRow_click();

			$("#diagEditClasses").dialog({
				autoOpen: true,
				modal: true,
				width: 500,
				height: 400,
				maxHeight: 400,
				open: function (event, ui) {
					var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
					jBtns.eq(0).button({ icons: { primary: "ui-icon-check" }, disabled: true }).attr('id', 'btnSaveClasses');
					jBtns.eq(1).button({ icons: { primary: "ui-icon-closethick"} });
				},
				close: function (event, ui) {
					participants.editClasses.nNewItemCnt = 0;
					$(this).dialog('destroy');
				},
				buttons: {
					'Save Classes': function () {
						LogEntry("Add & Edit Classes saved.");
						participants.editClasses.Save();
						$(this).dialog('close');
					},
					'Cancel': function () {
						LogEntry("Add & Edit Classes canceled.");
						$(this).dialog('close');
					}
				}
			});
			participants.editClasses.nNewItemCnt = 0;
		},
		init: function () {
			new execQuery("SELECT * FROM adm$classes(" + quoteSQL(customer_id) + ") ORDER BY class_name", function (aRows) {
				var nItemCnt = 0;
				//empty the Old array
				participants.editClasses.aOld.length = 0;
				// Old array with item in all array of type nType
				for (var nX = 0; nX < aRows.length; nX++) {
					participants.editClasses.aOld[nX] = $.extend({}, aRows[nX]);
				}
				participants.editClasses.open();
			});
		}
	},

	select: {
		array: [],
		refreshBatchSelect: function () {
			//<li><a id="btnSelectAll" href="#Participants">All</a></li>
			//<li><a id="btnSelectFiltered" href="#Participants">Filtered</a></li>
			//<li><a id="btnSelectDisplayed" href="#Participants">Displayed</a></li>
			//<li><a id="btnUnselectAll" href="#Participants">Clear Selections</a></li>
			var aoSelected = participants.select.array;

			var oSettings = participants.jGrid.fnSettings();
			$("#btnSelectAll a").html('All <span class="floatRight">(' + oSettings._iRecordsTotal + ')</span>');
			$("#btnSelectFiltered a").html('Filtered <span class="floatRight">(' + oSettings._iRecordsDisplay + ')</span>');
			$("#btnSelectDisplayed a").html('Displayed <span class="floatRight">(' + oSettings._iDisplayLength + ')</span>');

			$("#menuBatchSelect li").show();

			if (oSettings._iRecordsTotal == oSettings._iRecordsDisplay) {
				$("#btnSelectFiltered").hide();
				//$("#btnSelectDisplayed").hide();
			}
			if (oSettings._iRecordsDisplay <= oSettings._iDisplayLength) {
				$("#btnSelectDisplayed").hide();
			}

			if (aoSelected.length == 0) { $("#btnUnselectAll").hide(); }
		},
		refreshCount: function () {
			var aoSelected = participants.select.array;
			var nBalanceTot = 0;
			for (var nX = 0; nX < aoSelected.length; nX++) {
				nBalanceTot += aoSelected[nX].BALANCE.toNumber();
			}

			var nSelected = aoSelected.length;
			$("#SelectedPartyCount").text(nSelected);
			$("#SelectedPartyBalance").html(
				nBalanceTot + "<br/>" +
				Application.oUser.TOKENUNIT.toPlural(nBalanceTot) + "<br/>" + //≅
				formatCurrency(nBalanceTot / Application.oUser.TOKENRATE, false, true, false)
			);

			if (nSelected == 0) {
				$("#divSelectedParties").removeClass("active")
				$("#aMultiPartyAction").fadeOut(250);
				$("#wrapMultiPartyCommands").fadeOut(250);
			}
			else {
				$("#divSelectedParties").addClass("active")
				$("#aMultiPartyAction").fadeIn(250);
				$("#wrapMultiPartyCommands").fadeIn(250);
			};
			this.refreshBatchSelect();

		},
		jPrevSelectedRow: null,
		row: function (jRow, bShiftClicked) {
			var aoSelected = participants.select.array;
			var nIndex;
			var bCurrentlySelected;


			if (!bShiftClicked) {
				oData = jRow.data();
				nIndex = aoSelected.searchSortedColumn(oData.CODE, 'CODE');
				if (nIndex == -1) {
					aoSelected[aoSelected.length++] = oData;
					aoSelected.sortColumn('CODE', 1);
					$(jRow).addClass('DTTT_selected');
				}
				else {
					aoSelected.splice(nIndex, 1);
					$(jRow).removeClass('DTTT_selected');
				}
				participants.select.jPrevSelectedRow = jRow;
			}
			else {
				var tableRows = $("#tblParties tr")
				var last = tableRows.index(participants.select.jPrevSelectedRow);
				var first = tableRows.index(jRow);

				var start = Math.min(first, last);
				var end = Math.max(first, last);

				for (var nX = start; nX <= end; nX++) {
					var oData = tableRows.eq(nX).data();
					nIndex = aoSelected.searchSortedColumn(oData.CODE, 'CODE');
					if (nIndex == -1) {
						aoSelected[aoSelected.length++] = oData;
						aoSelected.sortColumn('CODE', 1);
						tableRows.eq(nX).addClass('DTTT_selected');
					}

				}

			}

			this.refreshCount();
		},
		all: function () {
			LogEntry('Select All clicked');
			var aoSelected = participants.select.array;
			var oSettings = participants.jGrid.fnSettings();

			if (oSettings._iRecordsTotal <= oSettings._iRecordsLength) {
				participants.select.displayed();
				return;
			}
			//	in_customer_id integer,
			//	in_party_code varchar(31),
			//	in_activated smallint,
			//	in_class_id int,
			//	in_search varchar(64)
			var oFilters = participants.filterParams();
			ui.elap.on();
			new execQuery("select code, name, balance, activated, class_id from adm$participants(" +
				customer_id.prepSQL() + ", " +
				"null," +
				oFilters.activated.prepSQL() + "," +
				"'-1'," +
				"null) order by code ascending;",
				function (data) {
					aoSelected.length = 0;
					participants.select.array = $.extend([], data);
					$("tbody tr", participants.jGrid).each(function () {
						var jCurRow = $(this);
						jCurRow.addClass('DTTT_selected');
					});

					participants.select.refreshCount();
					ui.elap.off();
				}
			);

		},
		filtered: function () {
			LogEntry('Select Filtered clicked');
			var aoSelected = participants.select.array;
			var oSettings = participants.jGrid.fnSettings();

			if (oSettings._iRecordsDisplay <= oSettings._iRecordsLength) {
				participants.select.displayed();
				return;
			}
			var oFilters = participants.filterParams();
			ui.elap.on();
			new execQuery("select code, name, balance, activated, class_id from adm$participants(" +
				customer_id.prepSQL() + ", " +
				"null," +
				oFilters.activated.prepSQL() + "," +
				oFilters.class_id.prepSQL() + "," +
				oSettings.oPreviousSearch.sSearch.prepSQL() + ") order by code ascending;",
				function (data) {
					aoSelected.length = 0;
					participants.select.array = $.extend([], data);
					$("tbody tr", participants.jGrid).each(function () {
						$(this).addClass('DTTT_selected');
					});

					participants.select.refreshCount();
					ui.elap.off();
				}
			);

		},
		displayed: function () {
			LogEntry('Select Displayed clicked.');
			var aoSelected = participants.select.array;
			$("tbody tr", participants.jGrid).each(function () {
				var oData = $(this).data();
				if (aoSelected.searchSortedColumn(oData.CODE, 'CODE') == -1) {
					aoSelected[aoSelected.length++] = oData;
					aoSelected.sortColumn('CODE', 1);
					$(this).addClass('DTTT_selected');
				}
			});
			participants.select.refreshCount();
		},
		none: function () {
			LogEntry('Select None clicked');
			$("tbody tr", participants.jGrid).removeClass("DTTT_selected");
			participants.select.array.length = 0;
			participants.select.refreshCount();
		}
	},

	batchPost: {
		initialized: false,
		cCurDescript: '',
		cCurAmount: 0,
		init: function () {
			if (this.initialized) {
				this.refresh();
				return;
			}

			$("#txtDefaultDescription").keyup(function () {
				var cVal = $(this).val();
				$("#batchPost tbody .col2 input").each(function () {
					jThis = $(this)
					if (jThis.val() == participants.batchPost.cCurDescript || jThis.val() == '') jThis.val(cVal);
				});
				participants.batchPost.cCurDescript = cVal;
				participants.batchPost.validate();
			});

			$("#txtDefaultAmount").constrainNumeric({ absolute: true, integer: true })
			.keyup(function () {
				var cVal = $(this).val();
				$("#batchPost tbody .col3 input").each(function () {
					jThis = $(this)
					if (jThis.val() == participants.batchPost.cCurAmount) jThis.val(cVal);
				});
				participants.batchPost.cCurAmount = cVal;
				participants.batchPost.validate();
			});

			this.refresh();
		},
		refresh: function () {
			var aoParties = participants.select.array;

			if (aoParties.length > 150) {
				ui.modalMessage({
					title: "Too Many Participants",
					message: "Sorry, but you have too many participants selected for the batch post deposit window."
				});
				return;
				LogEntry("Batch Post Deposit auto-canceled - too many selected (" + aoParties.length + ") participants.");
			}

			LogEntry("Batch Post Deposit window opened for " + aoParties.length + " participants.");
			var jTbl = $("#batchPost tbody").empty();

			for (var nX = 0; nX < aoParties.length; nX++) {
				jTbl.append(
					'<tr code="' + aoParties[nX].CODE + '">' +
						'<td class="col1">' + aoParties[nX].NAME + '</td>' +
						'<td class="col2"><input type="text"/></td>' +
						'<td class="col3"><input type="text"/></td>' +
					'</tr>'
				);
			}
			$("#batchPost .col3 input").constrainNumeric({ absolute: true, integer: true });

			$("#batchPost").dialog({
				title: "Posting Deposit for Multiple Participants",
				modal: true,
				width: 600,
				open: function () {
					var jButtons = $(this).siblings('.ui-dialog-buttonpane').find('button');
					jButtons.eq(0).button({ icons: { primary: 'ui-icon-check' }, disabled: true }).attr("id", "btnSaveBatchPost");
					jButtons.eq(1).button({ icons: { primary: 'ui-icon-closethick'} });

					$("#txtDefaultAmount").val('');
					$("#txtDefaultDescription").val('').focus();
				},
				buttons: {
					"Save": function () {
						LogEntry("Batch deposits posted.");
						participants.batchPost.save();
						$(this).dialog("close");
					},
					"Cancel": function () {
						LogEntry("Batch deposits canceled.");
						$(this).dialog("close");
					}
				},
				close: function () { $(this).dialog("destroy"); }
			});
		},
		validate: function () {
			$("#btnSaveBatchPost").button({ disabled: false });
		},
		save: function () {
			ui.openWait("Saving Deposits...");
			var cSQL = "";
			var nCount = 0;
			$("#batchPost tbody tr").each(function () {
				var cPartyCode = $(this).attr("code");
				var cItemText = $(".col2 input", this).val();
				var cAmount = $(".col3 input", this).val();

				if (cAmount) {
					nCount++;
					cSQL += "select * from ADM$PARTY_LEDGER_IUD(null," +
						cPartyCode.prepSQL() + "," +
						cItemText.prepSQL() + "," +
						cAmount.prepSQL() + "," +
						"null,null,null,null,null);\n" +

						"select * from adm$party_ledger(" + customer_id.prepSQL() + "," + cPartyCode.prepSQL() + ");\n" +
						"select * from adm$participant(" + customer_id.prepSQL() + "," + cPartyCode.prepSQL() + ");";
				}
			});

			if (cSQL) {
				new execQuery(cSQL, function (data) {
					for (var nParty = 0; nParty < nCount; nParty++) {
						for (var nX = 0; nX < participants.partyDialogs.length; nX++) {
							if (participants.partyDialogs[nX].PartyCode == data[nParty * 3][0].CODE)
								participants.partyDialogs[nX].refreshLedger(data[(nParty * 3) + 1]);
						}
						//console.log(data[nParty * 3][0].CODE, data[nParty * 3][0].ITEM, data[nParty * 3][0].AMOUNT);
						new participants.sendDepositMail(data[nParty * 3][0].CODE, data[nParty * 3][0].ITEM, data[nParty * 3][0].AMOUNT);
					}
					participants.refresh();
					ui.closeWait();
				});
			}

		}
	},

	aReport: [],
	printStatements: function () {
		participants.aReport.length = 0;
		participants.aReport = participants.select.array.concat([]);
		participants.nStatusFilter = $("#selFilterPartyStatus")[0].selectedIndex;
		cURL = "/Reports/Participants/ReportParties.html";
		popWindow(cURL, "Participant_Reports");
	},
	printRewardCards: function () {
		LogEntry("Print Reward Cards clicked (for selected participants).");
		participants.aReport = participants.select.array.concat([]);
		popWindow("/Reports/print_reward_cards.html", "Print_Reward_Cards");
	},
	switchClasses: function () {
		var Save = function () {

			var nNewClassId = $("#diagChangeClass select").val();
			var sNewClassName = $("#diagChangeClass select").val();
			var aoSelected = participants.select.array;
			var cSQL = "";
			for (var nX = 0; nX < aoSelected.length; nX++) {
				cSQL += "\n" +
					"execute procedure adm$participant_update(" +
					customer_id.prepSQL() + "," +
					aoSelected[nX].CODE.prepSQL() + "," +
					"null," + // this column null because contact info is not included, just class and status
					aoSelected[nX].ACTIVATED.prepSQL() + "," +
					nNewClassId.prepSQL(true) + "," +

					"null," +
					"null," +
					"null," +
					"null," +
					"null," +
					"null," +

					"null," +
					"null," +
					"null," +
					"null," +
					"null" +
					");";
			}
			LogEntry("Class changed to " + sNewClassName + " for " + aoSelected.length + " selected participants.");
			new execQuery(cSQL, function () {
				ui.modalMessage({ title: "Changes Saved", message: "The " + aoSelected.length + " selected participant(s) now have new class assignments." });
				participants.refresh();
			});
		};

		ui.elap.on();
		new execQuery("SELECT * FROM adm$classes(" + quoteSQL(customer_id) + ") ORDER BY class_name",
		function (aRows) {
			ui.elap.off();
			LogEntry("Change Classes clicked (for selected parties).");

			if (aRows.length == 0) {
				ui.modalMessage({ title: "No Classes", message: "Please add some classes before continuing." });
				return;
			}

			$("body").append(
			'<div id="diagChangeClass" title="Batch Change Participant Classes" class="dialog" style="text-align:center">' +
				'<p style="text-align:left">' +
					'Select which class you like to assign the ' +
					'<span id="spanSelectedPartyToReassignCnt">0</span>&nbsp;selected participants:' +
				'</p>' +
			'</div>'
			);

			var jSelClass = $('<select><option value="">Remove Class Assignment</option></select>');

			for (var nX = 0; nX < aRows.length; nX++) {
				$('<option value="' + aRows[nX].ID + '">' + aRows[nX].CLASS_NAME + '</option>').appendTo(jSelClass);
			}

			$("#spanSelectedPartyToReassignCnt").text($("#SelectedPartyCount").text());
			$("#diagChangeClass").append(jSelClass);

			$("#diagChangeClass").dialog({
				autoOpen: true,
				modal: true,
				width: 360,
				open: function (event, ui) {
					var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
					jBtns.eq(0).button({ icons: { primary: "ui-icon-check"} });
					jBtns.eq(1).button({ icons: { primary: "ui-icon-closethick"} });
				},
				close: function (event, ui) { $(this).dialog('destroy'); $("#diagChangeClass").remove(); },
				buttons: {
					'Save': function () {
						Save();
						$(this).dialog('close');
					},
					'Cancel': function () {
						LogEntry("Change Classes canceled");
						$(this).dialog('close');
					}
				}
			});
		});
	},
	switchStatus: function (cToWhich) {
		var cSQLActive = (cToWhich == "Active") ? "1" : "0";
		var cRemoveClass = (cToWhich == "Active") ? "Inactive" : "Active";

		var aAccounts = [];
		for (var nX = 0; nX < participants.select.array.length; nX++) {
			if (participants.select.array[nX].ACTIVATED != cSQLActive)
				aAccounts.push(participants.select.array[nX]);
		}

		var SaveSwitch = function (aAccounts) {
			ui.elap.on()
			var cSQL = "";
			for (var nX = 0; nX < aAccounts.length; nX++) {
				cSQL += "\n" +
					"execute procedure adm$participant_update(" +
					customer_id.prepSQL() + "," +
					aAccounts[nX].CODE.prepSQL() + "," +
					"null," + // this column null because contact info will be excluded in update
					cSQLActive.prepSQL() + "," +
					aAccounts[nX].CLASS_ID.prepSQL(true) + "," +

					"null," +
					"null," +
					"null," +
					"null," +
					"null," +
					"null," +

					"null," +
					"null," +
					"null," +
					"null," +
					"null" +
					");";
			}
			new execQuery(cSQL, function () {
				participants.select.array.length = 0;
				participants.refresh();
			});
		}

		if (aAccounts.length == 0) {
			ui.modalMessage({ title: "Cannot Change Status",
				message: "You have not selected any " + cRemoveClass.toLowerCase() +
				" participants that can be changed to " + cToWhich.toLowerCase() + "."
			});
			return;
		}

		LogEntry("Batch status change to " + cToWhich + " clicked.");
		ui.modalConfirm({
			title: "Change Participant Status",
			message:
				'<p>' +
					"Are you sure you want to change the status of the " +
					((aAccounts.length == 1) ? "selected " + cRemoveClass.toLowerCase() + " participant" :
					String(aAccounts.length) + " selected  " + cRemoveClass.toLowerCase() + " participants ") +
					" to <b>" + cToWhich.toUpperCase() + "</b>?" +
				'</p>',
			action: function () {
				LogEntry("Status changed for " +
							((aAccounts.length == 1) ? "selected participant" : String(aAccounts.length) + " selected participants ") +
							" to " + cToWhich + ".");
				SaveSwitch(aAccounts);
			},
			cancel: function () { LogEntry("Batch Change Status canceled"); }
		});
	},
	zeroBalance: function () {
		var doit = function () {
			var aoSelected = participants.select.array;
			var SQL = "";
			var cItemText = "Balance Reset"
			for (var nX = 0; nX < aoSelected.length; nX++) {
				var nBal = aoSelected[nX].BALANCE.toString().toNumber();
				if (nBal)
					SQL += "\n" +
					"select * from ADM$PARTY_LEDGER_IUD(" +
					"null," +
					aoSelected[nX].CODE.prepSQL() + "," +
					cItemText.prepSQL() + "," +
					(aoSelected[nX].BALANCE.toString().toNumber() * -1).prepSQL() + "," +
					"null,null,null,null,null);";
			}
			ui.openWait("Posting transactions...");
			new execQuery(SQL, function () {
				ui.closeWait();
				participants.refresh();
			});
		}
		ui.modalConfirm({
			title: "Zero Balance Participants",
			message: 'Click "Okay" to post a withdrawal to each of the selected participants ' +
						'which will reduce their balance to zero ' + Application.oUser.TOKENUNIT.toLowerCase() + 's.' +
						'<br/><br/>' +
						'<b>This is not undoable!</b>',
			action: doit
		});

	},
	createAward_STALE: function () {
		var aoSelected = participants.select.array;

		if (aoSelected.length > 150) {
			ui.modalMessage({
				title: "Too Many Participants",
				message: "Sorry, but you have too many participants selected to limit the eligibilty on a new award.  Try creating an award with eligibilty limited to classes."
			});
			return;
			LogEntry("Batch create Award auto-canceled - too many selected (" + aoSelected.length + ") participants.");
		}

		LogEntry("Batch create Award opened for " + aoSelected.length + " participants.");


		var aParties = [];
		for (var nX = 0; nX < aoSelected.length; nX++) {
			aParties.push(aoSelected[nX].CODE);
		}
		award.insert(aParties, "Award");
	},

	post: {
		title: '',
		PartyCode: '',
		PartyName: '',
		inserting: false,
		current: {
			ledgerID: '',
			description: '',
			amount: ''
		},
		nType: 0, // 1 deposit, -1 withdrawal
		initAutoComplete: function (aData) {
			var aItems = [];
			for (var nX = 0; nX < aData.length; nX++) {
				var nAmount = Math.abs(Number(aData[nX].AMOUNT));
				aItems[nX] = {
					label: aData[nX].DESCRIPTION,
					desc: '<div style="position:relative">' +
								'<span style="font-size:smaller">' +
									nAmount + " " + Application.oUser.TOKENUNIT.toPlural(nAmount) +
									",&nbsp;&nbsp;&nbsp;&nbsp;Last Used: " + (new Date(aData[nX].LAST_USAGE)).format("shortDateTime") +
								'</span>' +
								'<span desc="' + aData[nX].DESCRIPTION + '" class="removeReusable">Remove</span>' +
							'</div>',
					amount: nAmount
				}
			}
			$("#txtDescription")
			.autocomplete("destroy")
			.autocomplete({
				minLength: 0,
				source: aItems,
				focus: function (event, ui) {
					$("#txtDescription").val(ui.item.label).keyup();
					return false;
				},
				select: function (event, ui) {
					$("#txtDescription").val(ui.item.label);
					$("#txtTransactAmount").val(ui.item.amount).keyup();
					return false;
				},
				open: function (event, ui) {
					$(".removeReusable")
					.click(function (event) {
						event.stopPropagation();
						var cDesc = $(this).attr("desc");
						$(this).parents(".ui-menu-item").remove();
						var query = new execQuery(
							"execute procedure adm$reusable_remove(" + customer_id.prepSQL() + "," + cDesc.prepSQL() + ");",
							function () { return false; }
						);

					});
				}
			})
			.data("autocomplete")._renderItem = function (ul, item) {
				return $("<li></li>")
				.data("item.autocomplete", item)
				.append("<a><b>" + item.label + "</b>" + item.desc + "</a>")
				.appendTo(ul);
			};
		},

		deposit: function (sPartyCode, sPartyName, jEditRow) {
			ui.openWait("Preparing Deposit Form...");
			this.PartyCode = sPartyCode;
			this.PartyName = sPartyName;

			$("#wrapEditTransDate").hide();

			if (jEditRow) {
				var jCells = jEditRow.find("td");
				this.inserting = false;
				this.title = "Editing Deposit for " + participants.post.PartyName;
				this.current.ledgerID = jEditRow.data("ID");
				this.current.description = jCells.eq(1).text();
				this.current.amount = jCells.eq(2).text();

				$("#wrapEditTransDate").html('Date Posted:<br/>' + jCells.eq(0).text()).show();
				$("#txtDescription").val(this.current.description);
				$("#txtTransactAmount").val(this.current.amount).attr("disabled", true);
			}
			else {
				this.inserting = true;
				this.title = "Post Deposit for " + participants.post.PartyName;
				this.current.ledgerID = '';
				$("#txtDescription").val('');
				$("#txtTransactAmount").val('').attr("disabled", false)
			}

			this.nType = 1;
			$(".transactType").text("Deposit");
			$("#txtTransactAmount").constrainNumeric({ absolute: true, integer: true });

			var query = new execQuery("select * from adm$reusable_transactions(" + customer_id.prepSQL() + ") where amount > 0;",
			function (aData) {
				participants.post.initAutoComplete(aData);
				ui.closeWait();
				participants.post.openDialog();
			});
		},
		withdrawal: function (sPartyCode, sPartyName, jEditRow) {
			ui.openWait("Preparing Withdrawal Form...");
			this.PartyCode = sPartyCode;
			this.PartyName = sPartyName;

			$("#wrapEditTransDate").hide();

			if (jEditRow) {
				var jCells = jEditRow.find("td");
				this.inserting = false;
				this.title = "Editing Withdrawal for " + participants.post.PartyName + " posted " + jCells.eq(0).text();
				this.current.ledgerID = jEditRow.data("ID");
				this.current.description = jCells.eq(1).text();
				this.current.amount = Number(jCells.eq(2).text()) * -1;

				$("#wrapEditTransDate").html('Date Posted:<br/>' + jCells.eq(0).text()).show();
				$("#txtDescription").val(this.current.description);
				$("#txtTransactAmount").val(this.current.amount).attr("disabled", true);
			}
			else {
				this.inserting = true;
				this.title = "Post Withdrawal for " + participants.post.PartyName;
				this.current.ledgerID = '';
				$("#txtDescription").val('');
				$("#txtTransactAmount").val('').attr("disabled", false)
			}

			this.nType = -1;
			$(".transactType").text("Withdraw");
			$("#txtTransactAmount").constrainNumeric({ absolute: true, integer: true });

			var query = new execQuery("select * from adm$reusable_transactions(" + customer_id.prepSQL() + ") where amount < 0;",
			function (aData) {
				participants.post.initAutoComplete(aData);
				ui.closeWait();
				participants.post.openDialog();
			});

		},

		validateInputs: function () {
			var bValid = true;
			if ($("#txtDescription").val() == '') {
				$("#spnDescValidNote").show();
				bValid = false;
			}
			else $("#spnDescValidNote").fadeOut();

			if (Number($("#txtTransactAmount").val()) == 0) {
				$("#spnAmountValidNote").show();
				bValid = false;
			}
			else $("#spnAmountValidNote").fadeOut();

			if (this.current.ledgerID &&
				this.current.description == $("#txtDescription").val() &&
				this.current.amount == $("#txtTransactAmount").val()) bValid = false;

			$("#btnSaveTransact").button({ disabled: !bValid });
		},
		openDialog: function () {
			$("#postTransaction").dialog({
				title: participants.post.title,
				autoOpen: true,
				modal: true,
				width: 430,
				open: function (event, ui) {
					var cReuseChecked = $.cookie("PostReuseable");
					var bReuse = (cReuseChecked == null || cReuseChecked == "true") ? true : false;
					$("#chkAddToAutoComplete").attr("checked", bReuse);

					var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
					jBtns.eq(0).button({ text: false, icons: { primary: "ui-icon-help"} }).css("float", "left").attr("tabindex", "-1");
					jBtns.eq(1).button({ disabled: true, icons: { primary: "ui-icon-check"} }).attr("id", "btnSaveTransact");
					jBtns.eq(2).button({ icons: { primary: "ui-icon-closethick"} });
					$(".ui-button").bind("focusout", function () { $(this).removeClass("ui-state-focus"); });
					$("#txtDescription").keyup(function () { participants.post.validateInputs(); }).focus();
					$("#txtTransactAmount").keyup(function () { participants.post.validateInputs(); });
					participants.post.validateInputs();
				},
				close: function (event, ui) {
					$("#txtDescription").autocomplete("destroy");
					$(this).dialog('destroy');
				},
				buttons: {
					'Help': function () { UsageTips.HelpMenu(5); },
					'Save': function () {
						participants.post.save();
						$(this).dialog('close');
					},
					'Cancel': function () { $(this).dialog('close'); }
				}
			});
		},
		save: function () {
			ui.elap.on();
			var cItemText = $("#txtDescription").val();
			var cAmount = Number($("#txtTransactAmount").val()) * this.nType;
			var cReusable = ($("#chkAddToAutoComplete").is(":checked")) ? "1" : "";

			var cSQL = "select * from ADM$PARTY_LEDGER_IUD(" +
				participants.post.current.ledgerID.prepSQL(true) + "," +
				participants.post.PartyCode.prepSQL() + "," +
				cItemText.prepSQL() + "," +
				cAmount.prepSQL() + "," +
				cReusable.prepSQL(true) + ",null,null,null,null);";

			participants.execTransaction(participants.post.PartyCode, cSQL, 1, function () {
				if (cAmount.toNumber() > 0 && participants.post.inserting)
					new participants.sendDepositMail(participants.post.PartyCode, cItemText, cAmount);
				LogEntry(cAmount + " " + Application.oUser.TOKENUNIT + "s posted to " + participants.post.PartyName + "'s ledger.");
			});

		}
	},
	grant: {
		oPartyData: {},
		aoAwards: [],
		aoContacts: [],
		nDefaultAward: null,

		init: function (sPartyCode, nDefaultAward) {
			var openDialog = function () {
				$("#dialogGrantAward").dialog({
					title: "Granting Award to " + participants.grant.oPartyData.NAME,
					modal: true,
					width: 500,
					open: function () {
						var jButtons = $(this).siblings('.ui-dialog-buttonpane').find('button');
						jButtons.eq(0).button({ icons: { primary: 'ui-icon-star'} });
						jButtons.eq(1).button({ icons: { primary: 'ui-icon-closethick'} });
					},
					buttons: {
						"Grant Award...": function () {
							LogEntry("Award granted to " + participants.grant.oPartyData.NAME);
							participants.grant.save();
						},
						"Cancel": function () { $(this).dialog("close"); }
					},
					close: function () { $(this).dialog("destroy"); }
				});

			};

			participants.grant.nDefaultAward = nDefaultAward;
			var sQuery = "select * from adm$participant(" + customer_id.prepSQL() + "," + sPartyCode.prepSQL() + ");\n" +
				"select * from adm$awards(" + customer_id.prepSQL() + "," + sPartyCode.prepSQL() + ") where award_type = 0;\n" +
				"select * from adm$party_contacts(" + customer_id.prepSQL() + "," + sPartyCode.prepSQL() + ");";

			new execQuery(sQuery,
			function (data) {
				var oGrant = participants.grant;
				oGrant.oPartyData = $.extend({}, data[0][0]);
				oGrant.aoAwards = $.extend(true, [], data[1]);
				if (oGrant.aoAwards.length == 0) {
					ui.modalMessage({
						title: "No Available Awards",
						message: "There are no awards which " + oGrant.oPartyData.NAME + " is eligible to recieve."
					});
					return;
				}
				oGrant.aoContacts = $.extend(true, [], data[2]);
				oGrant.refreshUI();
				openDialog();
			});
		},
		refreshUI: function () {
			var oGrant = participants.grant;
			var oParty = oGrant.oPartyData;
			var aoAwards = oGrant.aoAwards;
			var aoContacts = oGrant.aoContacts;
			var jSel = $("#selAwardToGrant").empty();
			var nDefaultIndex = null;

			$(".grantPartyName").text(oParty.NAME);

			var refreshAwardSelector = function () {
				var sUnitName = Application.oUser.TOKENUNIT.toLowerCase();
				for (var nX = 0; nX < aoAwards.length; nX++) {
					if (aoAwards[nX].ID == oGrant.nDefaultAward) nDefaultIndex = nX;
					jSel.append(
						'<option value="' + nX + '" amount="' + aoAwards[nX].AMOUNT + '">' +
							aoAwards[nX].TITLE_PLAIN + " (" + aoAwards[nX].AMOUNT + " " + sUnitName.toPlural(aoAwards[nX].AMOUNT) + ")" +
						'</option>'
					);
				}

				jSel.change(function () {
					var sUnitName = Application.oUser.TOKENUNIT.toLowerCase();
					var sAmount = participants.grant.aoAwards[$(this).val()].AMOUNT;
					$("#spnAmtToGrant").text(sAmount + " " + sUnitName.toPlural(sAmount))
				});

			} ();

			var jTbody = $("#dialogGrantAward table tbody").empty();
			jTbody.append(
					'<tr completed="0" posttrans="">' +
						'<td>' +
							'<img class="grantAwardElapsor" src="Common/Images/Elapsors/elapsor.gif">' +
							'<span class="ui-icon ui-icon-check hidden grantAwardCheck"></span>' +
						'</td>' +
						'<td>' +
							'Deposit <span id="spnAmtToGrant"></span>' +
							" into participant's account." +
						'</td>' +
					'</tr>'
				);

			if (nDefaultIndex) { jSel.val(nDefaultIndex); }
			else jSel.val(0);
			jSel.change();

			if (oParty.EMAIL_VERIFIED) {
				jTbody.append(
						'<tr party_email="" completed="0">' +
							'<td>' +
								'<img class="grantAwardElapsor" src="Common/Images/Elapsors/elapsor.gif">' +
								'<span class="ui-icon ui-icon-check hidden grantAwardCheck"></span>' +
							'</td>' +
							'<td>Email award notification to participant: <br />(' + oParty.EMAIL + ').' + '</td>' +
						'</tr>'
					);
			}

			for (var nX = 0; nX < aoContacts.length; nX++) {
				if (!aoContacts[nX].DEACTIVATED && aoContacts[nX].EMAIL_VERIFIED) {
					var cEmail = aoContacts[nX].EMAIL;
					var cName = aoContacts[nX].NAME;
					jTbody.append(
						'<tr contact_id="' + aoContacts[nX].CONTACT_ID + '" ' +
								'contact_name="' + cName + '" ' +
								'contact_email="' + cEmail + '" ' +
								'completed="0">' +
							'<td>' +
								'<img class="grantAwardElapsor" src="Common/Images/Elapsors/elapsor.gif">' +
								'<span class="ui-icon ui-icon-check hidden grantAwardCheck"></span>' +
							'</td>' +
							'<td>' +
								'Email award notification to participant contact: <br />' +
								cName + ' (' + cEmail + ')' +
							'</td>' +
						'</tr>'
					);
				}
			}
		},
		save: function () {
			var oGrant = participants.grant;
			var oParty = oGrant.oPartyData;
			var aoAwards = oGrant.aoAwards;
			var aoContacts = oGrant.aoContacts;

			$("#dialogGrantAward .grantAwardElapsor").show();
			$("#grantCloseNote").css("visibility", "visible");
			var jBtns = $("#dialogGrantAward").siblings('.ui-dialog-buttonpane').find('button');
			jBtns.eq(0).hide();
			jBtns.eq(1).button({ label: "Close" });

			var nX = $("#selAwardToGrant").val();
			var cAwardId = aoAwards[nX].ID;
			var cAwardTitle = aoAwards[nX].TITLE;
			var cAwardTitle_Plain = aoAwards[nX].TITLE_PLAIN;
			var cAwardDescription = aoAwards[nX].DESCRIPTION;
			var cAwardAmount = aoAwards[nX].AMOUNT;
			var cAwardTokens = cAwardAmount + " " + Application.oUser.TOKENUNIT.toPlural(cAwardAmount);

			var oPartyName = oParty.NAME.parseName(oParty.NICK_NAME);
			var pronoun = genderPronouns(oParty.GENDER);

			var checkCompleted = function () {
				if ($('#dialogGrantAward table tbody tr[completed="0"]').length == 0) {
					awards.refresh();
					jBtns.eq(1).button({ label: "Okay, All Done!", icons: { primary: "ui-icon-check"} });
				}
			};

			var postDeposit = function () {
				var SQL = "select * from ADM$PARTY_LEDGER_IUD(" +
					"null," +
					oParty.CODE.prepSQL() + "," +
					cAwardTitle_Plain.prepSQL() + "," +
					cAwardAmount.prepSQL() + "," +
					"null," + // Resuable
					cAwardId.prepSQL() + "," +
					"null,null,null);"; // Delete, Reward_Qty, Reward_Source

				participants.execTransaction(oParty.CODE, SQL, 1, function () {
					$("#dialogGrantAward table tbody tr[posttrans]").attr("completed", "1")
						.find('.grantAwardElapsor').hide().end()
						.find('.grantAwardCheck').removeClass('hidden');
					checkCompleted();
					sendPartyNotification();
				});
			} ();

			var sendPartyNotification = function () {
				if (!oParty.EMAIL.isValidEmail()) return;
				var nNewBalance = oParty.BALANCE.toNumber() + cAwardAmount.toNumber();
				var sNewBalance = (nNewBalance) + " " + Application.oUser.TOKENUNIT.toLowerCase().toPlural(nNewBalance);
				Email.send({
					to_contact_id: oParty.CONTACT_ID,
					to_name: oPartyName.asEntered,
					to_address: oParty.EMAIL,
					from_name: Application.oUser.PROVIDER_NAME,

					subject: "Congratulations! " + Application.oUser.PROVIDER_NAME + " has given you an award!",
					template: 'admin_party_award',
					contents: Email.contentTemplates.admin_party_award
							.replace(/__party_nick_name__/g, oPartyName.nick)
							.replace(/__provider_name__/g, Application.oUser.PROVIDER_NAME)
							.replace(/__award_amount_tokens__/g, cAwardTokens)
							.replace(/__award_title__/g, cAwardTitle)
							.replace(/__award_description__/g, cAwardDescription)
							.replace(/__balance_tokens__/g, sNewBalance)
							.replace(/__token_name__/g, Application.oUser.TOKENUNIT.toLowerCase())
							.replace(/__party_email__/g, oParty.EMAIL)
						,
					callback: function (bSuccess, cSentTo) {
						$("#dialogGrantAward table tbody tr[party_email]").attr("completed", "1")
								.find('.grantAwardElapsor').hide().end()
								.find('.grantAwardCheck').removeClass('hidden');
						checkCompleted();
					}
				});
			};

			var sendContactNotifications = function () {
				for (var nX = 0; nX < aoContacts.length; nX++) {
					if (aoContacts[nX].DEACTIVATED || !aoContacts[nX].EMAIL_VERIFIED) continue;

					var oContact = aoContacts[nX];

					var oContactName = oContact.NAME.parseName();

					var cContents = Email.contentTemplates.admin_contact_award
						.replace(/__contact_first_name__/g, oContactName.first)
						.replace(/__provider_name__/g, Application.oUser.PROVIDER_NAME)
						.replace(/__party_full_name__/g, oPartyName.asEntered)
						.replace(/__party_nick_name__/g, oPartyName.nick)

						.replace(/__award_amount_tokens__/g, cAwardTokens)
						.replace(/__award_title__/g, cAwardTitle)
						.replace(/__award_description__/g, cAwardDescription)

						.replace(/__Nominative__/g, pronoun.nominative.toProperCase(true))
						.replace(/__nominative__/g, pronoun.nominative)
						.replace(/__objective__/g, pronoun.objective)
						.replace(/__Objective__/g, pronoun.objective.toProperCase(true))
						.replace(/__adjective__/g, pronoun.adjective)
						.replace(/__Adjective__/g, pronoun.adjective.toProperCase(true))
						;
					Email.send({
						to_contact_id: oContact.CONTACT_ID,
						to_name: oContactName.asEntered,
						to_address: oContact.EMAIL,
						from_name: Application.oUser.PROVIDER_NAME,
						subject: Application.oUser.PROVIDER_NAME + " awarded " + oParty.NAME + "!",
						template: 'admin_contact_award',
						contents: cContents,
						callback: function (bSuccess, cSentTo, oSendData) {
							$("#dialogGrantAward table tbody tr[contact_id=" + oSendData.to_contact_id + "]")
								.attr("completed", "1")
								.find('.grantAwardElapsor').hide().end()
								.find('.grantAwardCheck').removeClass('hidden');
							checkCompleted();
						}
					});

				}
			} ();
		}

	},
	order: {
		cancel: function (oItem) {
			/* method has nothing to do with the Place Order dialog. 
			Used for cancelling from ledger or orders tab or shop alerts.
			
			called from either PartyDialog.refreshLedger -> $("span.btnDelTransaction")
			or shop.alerts.refresh  -> $(".btnCancelOrder")
			*/
			ui.modalConfirm({
				title: "Confirm Cancel",
				message: "Are you aboslutely sure you want to cancel this order?",
				action: function () {
					/* 
					IN_ID integer,
					IN_CODE varchar(31),
					IN_ITEM varchar(1023),
					IN_AMOUNT integer,
					IN_REUSABLE smallint,
					IN_AWARD_ID integer,
					IN_DELETE smallint,
					IN_REWARD_QTY smallint)
					*/
					var cSQL = "select * from ADM$PARTY_LEDGER_IUD(" +
						oItem.ID.prepSQL() + "," +
						"null," +
						"null," +
						"null," +
						"null," +
						"null," +
						"'1'," +
						"null," +
						"null);";
					participants.execTransaction(oItem.PARTY_CODE, cSQL, 1, function () {
						LogEntry("Transaction #" + oItem.ID + " deleted by admin user.");
					});
				}
			})
		},

		partyName: '',
		partyCode: '',
		initialized: false,
		aProducts: [],
		init: function (sPartyCode, sPartyName) {
			ui.openWait("Loading...");
			participants.order.partyName = sPartyName;
			participants.order.partyCode = sPartyCode;

			new execQuery(
			"select balance from adm$participant(" + customer_id.prepSQL() + "," + sPartyCode.prepSQL() + ");\n" +
			"select * from adm$shop_products(" + customer_id.prepSQL() + "," + sPartyCode.prepSQL() + ");",
			function (aTables) {
				var initUI = function () {
					$("#txtPartyProductSearch").keyup(function (event) {
						var cSearch = $(this).val().trim();
						var jProducts = $("#dialogPartyOrder .divProducts").empty();
						var aProducts = participants.order.aProducts;
						var nMatches = 0;

						if (!cSearch) { return; }

						for (var nX = 0; nX < aProducts.length; nX++) {
							var cFieldData = aProducts[nX].CODE + aProducts[nX].NAME;
							if (cFieldData.match(new RegExp(cSearch, "gi"))) {
								nMatches++;
							}
						}

						if (nMatches == 0) {
							jProducts.append('No products found.');
							return;
						}

						if (nMatches > 30) {
							jProducts.append('More search input required.');
							return;
						}

						for (var nX = 0; nX < aProducts.length; nX++) {
							var cFieldData = aProducts[nX].CODE + aProducts[nX].NAME;
							if (cFieldData.match(new RegExp(cSearch, "gi"))) {
								participants.order.drawProduct(aProducts[nX], jProducts);
							}
						}

					});

					participants.order.initialized = true;
				};

				var aProducts = aTables[1];
				$("#dialogPartyOrder .currentBalance").text(aTables[0][0].BALANCE);
				$("#dialogPartyOrder .newBalance").text(aTables[0][0].BALANCE);

				participants.order.aProducts = $.extend([], aProducts);

				var jProducts = $("#dialogPartyOrder .divProducts").empty();
				if (!participants.order.initialized) { initUI(); }
				participants.order.refreshUI();
				ui.closeWait();
			});
		},
		refreshUI: function () {
			$("#dialogPartyOrder").dialog({
				title: "Placing Orders for " + participants.order.partyName,
				modal: true,
				width: 600,
				open: function () {
					var jButtons = $(this).siblings('.ui-dialog-buttonpane').find('button');
					jButtons.eq(0).button({ icons: { primary: 'ui-icon-check' }, disabled: true }).attr("id", "btnSavePartyOrder");
					jButtons.eq(1).button({ icons: { primary: 'ui-icon-closethick'} });
				},
				buttons: {
					"Place Order": function () {
						LogEntry("Orders placed for " + participants.order.partyName);
						participants.order.save();
						$(this).dialog("close");
					},
					"Cancel": function () { $(this).dialog("close"); }
				},
				close: function () { $(this).dialog("destroy"); }
			});


			$("#dialogPartyOrder .divQty input").val("1");
			$("#txtPartyProductSearch").val("");
			$("#dialogPartyOrder .divProducts").empty();
			$("#dialogPartyOrder tbody").empty();
		},

		drawProduct: function (oProduct, jProducts) {
			var nTokens = Math.ceil(oProduct.TOKENS_EACH.toNumber());
			var sImg = '', sCustomNotice = '';

			if (oProduct.CUSTOM_REWARD == "1") {
				sCustomNotice =
					'<div class="lblCustomReward ui-state-highlight">' +
						'Custom Reward' +
					'</div>';
				sImg = '<img  class="imgEditItem" src="/Common/customer_images/' +
					oProduct.CODE + '.gif?' + Date.now().getTime() + '" />';
				oProduct.NAME = oProduct.TITLE_PLAIN;
			}
			else {
				sImg = '<img  class="imgEditItem" src="http://tokenrewards.com/product_images/small/' + oProduct.CODE + '.gif" />';
			}

			var jRow = $(
				'<div class="divPartyOrderRow">' +
					sImg + sCustomNotice +
					'<div class="divCodeName">' + oProduct.CODE + ": " + oProduct.NAME + '</div>' +
					'<div class="divPrices">' +
							'<span class="">' + Application.oUser.TOKENUNIT + 's Each:&nbsp;</span>' +
							'<b>' + nTokens + '</b>' +
					'</div>' +

					'<div class="divQty">' +
						'Qty:<input type="text" value="1" />' +
					'</div>' +

					'<button class="btnOrder">Order</button>' +
				'</div>'
				);
			jRow.data(oProduct);

			$(".divQty input", jRow).constrainNumeric({ absolute: true, integer: true, minValue: 1 });
			if (oProduct.CUSTOM_REWARD == "1" && (oProduct.GROUP_QTY_AVAILABLE == "0" || oProduct.PARTY_QTY_AVAILABLE == "0")) {
				$(".btnOrder, .divQty", jRow).remove();
				jRow.append('<div class="limitReached">Cannot Order<br/>Limit Reached</div>');
			}
			else {
				$(".btnOrder", jRow).button({ icons: { primary: "ui-icon-cart"} })
				.click(function () {
					var jThisRow = $(this).parent();
					var oData = $(this).parent().data();

					var cCode = oData.CODE;
					var cProductID = oData.ID;
					var cItem = jThisRow.find('.divCodeName').text();
					var nQty = jThisRow.find('input').val().toNumber();
					var nTokens = oData.TOKENS_EACH.toNumber();

					var jTblRow = $("#dialogPartyOrder tbody tr[code=" + cCode + "]");
					if (jTblRow.length == 0) {
						var jOrderRow = $(
						'<tr code="' + cCode + '" product_id="' + cProductID + '">' +
							'<td>' + cItem + '</td>' +
							'<td style="text-align:center">' + nQty + '</td>' +
							'<td style="text-align:right; padding-right:1em">' + (nTokens * nQty) + '</td>' +
							'<td><span class="cellButton btnDelete"></span></td>' +
						'</tr>'
					);
						jOrderRow.data(oData);
						$("#dialogPartyOrder tbody tr[code=" + cCode + "] .btnDelete")
					.button({ text: false, icons: { primary: "ui-icon-close"} })
					.click(function () {
						$(this).parents('tr').remove();
						participants.order.refreshNewBalance();
					});
						$("#dialogPartyOrder tbody").append(jOrderRow);
					}
					else {
						$('td:eq(1)', jTblRow).text(nQty);
						$('td:eq(2)', jTblRow).text(nQty * nTokens);
					}
					$(".divOrders").scrollTop($(".divOrders table").height());
					participants.order.refreshNewBalance();
				});
			}
			jProducts.append(jRow);
		},
		refreshNewBalance: function () {
			var nTot = 0;
			var jRows = $(".divOrders tbody tr");
			jRows.each(function () {
				nTot += $("td:eq(2)", this).text().toNumber();
			});
			var nBal = $("#dialogPartyOrder .currentBalance").text().toNumber() - nTot;
			$("#dialogPartyOrder .newBalance").text(nBal);
			$("#btnSavePartyOrder").button({ disabled: (nTot == 0), label: "Place Order".toPlural(jRows.length) });
		},
		save: function () {
			ui.openWait("Saving...");
			var cSQL = "";
			var jRows = $(".divOrders tbody tr");
			var cPartyCode = participants.order.partyCode;

			jRows.each(function () {
				var oData = $(this).data();
				var cProductId = oData.ID;
				var nQty = $(this).find('td:eq(1)').text().toNumber();

				if (oData.CUSTOM_REWARD == "1") {
					/* {
					IN_ID integer,
					IN_CODE varchar(31),
					IN_ITEM varchar(1023),
					IN_AMOUNT integer,
					IN_REUSABLE smallint,
					IN_AWARD_ID integer,
					IN_DELETE smallint,
					IN_REWARD_QTY smallint )
					} */
					var nAmount = nQty * oData.TOKENS_EACH.toNumber() * -1;
					cSQL += "select * from ADM$PARTY_LEDGER_IUD(" +
						"null," +
						cPartyCode.prepSQL() + "," +
						"null," + // line item description built in procedure
						"null," + // line item amount from awards table in procedure
						"null," +
						oData.ID.prepSQL() + "," + // award (custom reward) record id
						"null," +
						nQty.prepSQL() + ",0);\n";
				}
				else {
					cSQL += "execute procedure adm$orderitem_create " +
							customer_id.prepSQL() + "," +
							cProductId.prepSQL() + "," +
							nQty.prepSQL() + "," +
							"''," +
							cPartyCode.prepSQL() + ";\n";
				}
			});

			participants.execTransaction(cPartyCode, cSQL, jRows.length, null);

		}
	},
	edit: {
		oPartyData: {},
		initialized: false,
		inserting: false,

		init: function () {
			if (participants.edit.initialized) return;

			var nCurYear = Number(new Date().getFullYear()) - 3;
			for (var nX = nCurYear; nX >= 1950; nX--) {
				$("#selPartyBirthYear").append('<option>' + nX + '</option>');
			}


			$("#wrapExtraNames input").focusout(function () { participants.edit.setExtraNames(this, true); });
			$('select', "#diagEditParticipant").change(function () { participants.edit.validate(); });
			$('input[type="text"], textarea, select', "#diagEditParticipant").keyup(function () {
				var sId = $(this).attr("id");
				if (/Name/.test(sId)) { participants.edit.setExtraNames(this, false); }

				if (/Email/.test(sId)) { participants.edit.setEmailNotice(); }

				participants.edit.validate();
			});

			$("#chkDirectShipments").change(function () {
				var centerDialog = function () {
					$("#diagEditParticipant").parent().position({
						my: "center center",
						at: "center center",
						of: $(document.body),
						using: function (to) {
							$(this).animate(to, 500, "", function () { });
						}
					});

				};

				participants.edit.validate();

				if ($(this).is(":checked")) {
					$("#wrapPartyAddress").slideDown("fast", function () {
						centerDialog();
						$("#wrapPartyAddress textarea").focus();
					});
				}
				else $("#wrapPartyAddress").slideUp("fast", function () { centerDialog(); });

			});

			participants.edit.initialized = true;
		},
		refreshClasses: function (aoClasses) {
			var jSelClass = $("#diagEditParticipant #selPartyClass");
			if (aoClasses.length) {
				jSelClass.parent().show();
				jSelClass.empty();
				for (var i = 0; i < aoClasses.length; i++) {
					jSelClass.append('<option value="' + aoClasses[i].ID + '">' + aoClasses[i].CLASS_NAME + '</option>');
				}
				jSelClass.append('<option value="">--No Class Assigned--</option>');
				jSelClass.val(participants.edit.oPartyData.CLASS_ID);
			}
			else jSelClass.parent().hide();
		},
		refresh: function () {
			participants.edit.init();

			var oData = participants.edit.oPartyData;
			$("#diagEditParticipant #txtPartyName").val(oData.NAME);
			var oNames = oData.NAME.parseName();
			var jSortName = $("#diagEditParticipant #txtSortName");
			jSortName.val(oData.SORT_NAME).addClass((oData.SORT_NAME != oNames.sort) ? "edited" : "");

			var jNickName = $("#diagEditParticipant #txtNickName");
			jNickName.val(oData.NICK_NAME).addClass((oData.NICK_NAME != oNames.nick) ? "edited" : "");


			$("#diagEditParticipant #selPartyStatus").val(oData.ACTIVATED);
			$("#diagEditParticipant #selPartyGender").val(oData.GENDER);
			$("#diagEditParticipant #selPartyBirthYear").val(oData.BIRTHYEAR);
			$("#diagEditParticipant #txtPartyEmail").val(oData.EMAIL)
			participants.edit.setEmailNotice();
			if (oData.EMAIL_VERIFIED) {
				$("#wrapPartyEmail span.verified").show();
				$("#wrapPartyEmail span.valid").hide();
				$("#wrapPartyEmail span.invalid").hide();
				$("#txtPartyEmail").attr("disabled", true);
				$("#noteVerifiedEmail").show();
			}
			else {
				$("#noteVerifiedEmail").hide();
				$("#wrapPartyEmail span.verified").hide();
				$("#txtPartyEmail").attr("disabled", false);
			}

			$("#wrapPartyAddress").hide();
			$("#chkDirectShipments").attr("checked", false);
			if (oData.DIRECT_SHIP) {
				oData.DIRECT_SHIP = oData.DIRECT_SHIP.toDateFormat("Firebird");
				$("#wrapPartyAddress").show();
				$("#chkDirectShipments").attr("checked", true);
			}
			$("#wrapPartyAddress [fld]").each(function () {
				var jThis = $(this);
				var sFld = jThis.attr("fld");

				//				if (jThis.is("textarea")) jThis.html(oData[sFld]);
				//				else 
				jThis.val(oData[sFld]);
			});

		},

		newValues: function () {
			this.CODE = '';
			this.NAME = '';
			this.SORT_NAME = '';
			this.NICK_NAME = '';

			this.ACTIVATED = '1';
			this.CLASS_ID = '';

			this.GENDER = '';
			this.BIRTHYEAR = '';

			this.EMAIL = '';

			this.DIRECT_SHIP = '';

			this.ADDRESS = '';
			this.CITY = '';
			this.STATE = '';
			this.ZIP = '';
		},
		updatedValues: function () {
			this.NAME = $("#diagEditParticipant #txtPartyName").val().trim();
			this.SORT_NAME = $("#diagEditParticipant #txtSortName").val().trim();
			this.NICK_NAME = $("#diagEditParticipant #txtNickName").val().trim();

			this.ACTIVATED = $("#selPartyStatus").val();
			this.CLASS_ID = $("#diagEditParticipant #selPartyClass").val();

			this.GENDER = $("#diagEditParticipant #selPartyGender").val();
			this.BIRTHYEAR = $("#diagEditParticipant #selPartyBirthYear").val();

			this.EMAIL = $("#diagEditParticipant #txtPartyEmail").val().trim();

			var bCurrentShip = participants.edit.oPartyData.DIRECT_SHIP ? true : false;
			var bUpdatedShip = $("#chkDirectShipments").is(":checked");
			if (bUpdatedShip && bCurrentShip) {
				this.DIRECT_SHIP = participants.edit.oPartyData.DIRECT_SHIP;
			}
			else if (bUpdatedShip && !bCurrentShip) {
				this.DIRECT_SHIP = 'now';
			}
			else this.DIRECT_SHIP = '';

			this.ADDRESS = $('#wrapPartyAddress textarea').val().trim();
			this.CITY = $('#wrapPartyAddress input[fld="CITY"]').val().trim();
			this.STATE = $('#wrapPartyAddress select[fld="STATE"]').val();
			this.ZIP = $('#wrapPartyAddress input[fld="ZIP"]').val().trim();
		},
		validate: function () {
			var oUpdated = new participants.edit.updatedValues();
			var oCurrent = participants.edit.oPartyData;
			var bEdited = false;
			for (var sField in oUpdated) {
				if (oUpdated[sField] != oCurrent[sField]) {
					bEdited = true;
				}
			}

			$("#NoteRequiredField, .requiredAsterix", $("#diagEditParticipant").parent()).hide();
			var bReqsMet = true;

			if (!oUpdated.NAME) {
				$("#wrapPartyName .requiredAsterix").show();
				bReqsMet = false;
			}
			if (oUpdated.DIRECT_SHIP) {
				if (!oUpdated.ADDRESS) {
					$('#wrapPartyAddress [fld="ADDRESS"]').prev().find(".requiredAsterix").show();
					bReqsMet = false;
				}
				if (!oUpdated.CITY) {
					$('#wrapPartyAddress [fld="CITY"]').prev().find(".requiredAsterix").show();
					bReqsMet = false;
				}
				if (!oUpdated.STATE) {
					$('#wrapPartyAddress [fld="STATE"]').prev().find(".requiredAsterix").show();
					bReqsMet = false;
				}
				if (!oUpdated.ZIP) {
					$('#wrapPartyAddress [fld="ZIP"]').prev().find(".requiredAsterix").show();
					bReqsMet = false;
				}
			}
			if (!bReqsMet) $("#NoteRequiredField, #NoteRequiredField .requiredAsterix").show();

			$(".btnSavePartyEdits").button({ disabled: !bEdited || !bReqsMet });

		},

		setExtraNames: function (elementEdited, bOnBlur) {
			var oNames = $("#diagEditParticipant #txtPartyName").val().parseName();
			var jEle = $(elementEdited);

			switch (elementEdited.id) {
				case "txtPartyName":
					if (!$("#txtSortName").hasClass("edited")) {
						$("#txtSortName").val(oNames.sort);
					}
					else if ($("#txtSortName").hasClass("edited") && $("#txtSortName").val().trim() == oNames.sort) {
						$("#txtSortName").removeClass("edited");
					}

					if (!$("#txtNickName").hasClass("edited")) {
						$("#txtNickName").val(oNames.nick);
					}
					else if ($("#txtNickName").hasClass("edited") && $("#txtNickName").val().trim() == oNames.nick) {
						$("#txtNickName").removeClass("edited");
					}

					break;
				case "txtSortName":
					if (bOnBlur && !jEle.val().trim()) jEle.val(oNames.sort);
					if (oNames.sort == jEle.val().trim()) jEle.removeClass("edited");
					else jEle.addClass("edited");
					break;
				case "txtNickName":
					if (bOnBlur && !jEle.val().trim()) jEle.val(oNames.nick);
					if (oNames.nick == jEle.val().trim()) jEle.removeClass("edited");
					else jEle.addClass("edited");
					break;
			}

		},
		setEmailNotice: function () {
			var sEmail = $("#txtPartyEmail").val().trim();
			$(".valid, .invalid", "#wrapPartyEmail").hide();

			if (sEmail.isValidEmail()) {
				$("#wrapPartyEmail span.valid").show();
			}
			else if (sEmail) $("#wrapPartyEmail span.invalid").show();
		},

		open: function (sPartyCode) {
			ui.elap.on()
			participants.edit.inserting = false;
			$("#wrapPartyStatus").show();
			var SQL =
				"select * from adm$participant(" + customer_id.prepSQL() + "," + sPartyCode.prepSQL() + "); \n" +
				"select id, class_name from adm$classes(" + customer_id.prepSQL() + ")" + " order by class_name";
			new execQuery(SQL, function (aResults) {
				participants.edit.oPartyData = aResults[0][0];
				participants.edit.refreshClasses(aResults[1]);

				participants.edit.refresh();
				participants.edit.openDialog();
				ui.elap.off();
			});

			LogEntry("'Edit Record' clicked for participant " + sPartyCode);
		},
		insert: function () {
			ui.elap.on();
			participants.edit.inserting = true;
			$("#wrapPartyStatus").hide();
			var SQL =
				"select id, class_name from adm$classes(" + customer_id.prepSQL() + ")" + " order by class_name";
			new execQuery(SQL, function (aResults) {
				participants.edit.oPartyData = new participants.edit.newValues();

				participants.edit.refreshClasses(aResults);

				participants.edit.refresh();
				participants.edit.openDialog();
				ui.elap.off();
			});

		},

		openDialog: function () {
			$("#diagEditParticipant").dialog({
				title: (participants.edit.inserting) ? "Add Participant" : "Edit Participant",
				autoOpen: true,
				modal: true,
				width: 425,
				//height: auto,
				open: function (event, ui) {
					var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
					jBtns.eq(0).button({ disabled: true, icons: { primary: "ui-icon-plus"} }).addClass("btnSavePartyEdits");
					jBtns.eq(1).button({ disabled: true, icons: { primary: "ui-icon-check"} }).addClass("btnSavePartyEdits");
					jBtns.eq(2).button({ icons: { primary: "ui-icon-closethick"} });
					if (!participants.edit.inserting) jBtns.eq(0).hide();

					$(this).siblings(".ui-dialog-buttonpane").append(
						'<div id="NoteRequiredField">' +
							'<span class="requiredAsterix">*</span> Indicates that a value is required to save the record.' +
						'</div>'
					);
					participants.edit.validate();
				},
				close: function (event, ui) { $(this).dialog('destroy'); },
				buttons: {
					'Save & Add Another': function () {
						participants.edit.save(function () {
							participants.edit.oPartyData = new participants.edit.newValues();
							participants.edit.refresh();
							$("#txtPartyName").focus();
						});
					},
					'Save': function () {
						participants.edit.save(false);
						$(this).dialog('close');
					},
					'Cancel': function () {
						LogEntry("'Edit Record' canceled for participant " + participants.edit.oPartyData.NAME);
						$(this).dialog('close');
					}
				}
			});

		},

		save: function (fnCallback) {
			var oUpdated = new participants.edit.updatedValues();
			var oCurrent = participants.edit.oPartyData;
			oUpdated.CLASS_ID = (oUpdated.CLASS_ID) ? oUpdated.CLASS_ID : "";
			var SQL =
			"select code from adm$participant_update(" +
				customer_id.prepSQL() + "," +
				oCurrent.CODE.prepSQL(true) + "," +
				"1," + // 1 (true) because contact info included in update
				oUpdated.ACTIVATED.prepSQL() + "," +
				oUpdated.CLASS_ID.prepSQL(true) + "," +

				oUpdated.NAME.prepSQL() + "," +
				oUpdated.SORT_NAME.prepSQL() + "," +
				oUpdated.NICK_NAME.prepSQL() + "," +
				oUpdated.EMAIL.prepSQL(true) + "," +
				oUpdated.GENDER.prepSQL(true) + "," +
				oUpdated.BIRTHYEAR.prepSQL(true) + "," +

				oUpdated.DIRECT_SHIP.prepSQL(true) + "," +
				oUpdated.ADDRESS.prepSQL(true) + "," +
				oUpdated.CITY.prepSQL(true) + "," +
				oUpdated.STATE.prepSQL(true) + "," +
				oUpdated.ZIP.prepSQL(true) +
			");";

			if (participants.edit.inserting) {
				new execQuery(SQL, function (data) {
					LogEntry("New participant saved - " + oUpdated.NAME);
					participants.refresh();
					if (fnCallback) fnCallback();
					else window.location.hash = "#Participant_" + data[0].CODE;
				});
			}
			else participants.execTransaction(oCurrent.CODE, SQL, 1, function () {
				LogEntry("Edits saved for participant - " + oCurrent.CODE + ", " + oUpdated.NAME);
			});

		}
	},

	execTransaction: function (sPartyCode, SQL, nSQLcnt, fnCallback) {
		ui.elap.on();
		SQL += "\n" + "select * from adm$participant(" + customer_id.prepSQL() + "," + sPartyCode.prepSQL() + ");";
		SQL += "\n" + "select * from adm$party_ledger(" + customer_id.prepSQL() + "," + sPartyCode.prepSQL() + ");";
		SQL += "\n" + "select * from adm$awards(" + customer_id.prepSQL() + "," + sPartyCode.prepSQL() + ") where award_type = 0;";
		if ($("#ShopAlerts").is(":visible")) {
			SQL += "\n" + "select * from adm$ordered_items(" + customer_id.prepSQL() + ",null)\n" +
							"   where CUSTOM_REWARD_ID > 0 and DELIVERED is null;";
		}
		new execQuery(SQL, function (data) {
			for (var nX = 0; nX < participants.partyDialogs.length; nX++) {
				if (participants.partyDialogs[nX].PartyCode == sPartyCode) {
					participants.partyDialogs[nX].partyFetched(data[nSQLcnt][0]);
					participants.partyDialogs[nX].refreshLedger(data[nSQLcnt + 1]);
					participants.partyDialogs[nX].refreshOrders();
					participants.partyDialogs[nX].refreshAwards(data[nSQLcnt + 2]);
				}
			}
			participants.refreshRow(sPartyCode);

			if (activity.initialized) {
				activity.fetchLedger();
				activity.fetchOrders();
			}
			if ($("#ShopAlerts").is(":visible")) {
				shop.alerts.refresh(data[nSQLcnt + 3]);
			}

			ui.elap.off();
			ui.closeWait();
			if (fnCallback) { fnCallback(); }
		});
	},
	sendDepositMail: function (partyCode, description, amount) {
		var my = this;
		this.sendCnt = 0;
		this.sentCnt = 0;

		this.sendCompleted = function () {
			my.sentCnt++;
			if (my.sentCnt >= my.sendCnt) ui.elap.off();
		};

		// Failsafe ...
		if (amount <= 0) return;

		this.description = description.encodeHTML();
		this.cAmountString = amount + " " + Application.oUser.TOKENUNIT.toLowerCase().toPlural(amount);

		var cSQL = "select * from adm$participant(" + customer_id.prepSQL() + "," + partyCode.prepSQL() + ");" +
					String.fromCharCode(13) +
					"select * from adm$party_contacts(" + customer_id.prepSQL() + "," + partyCode.prepSQL() + ");";

		var query = new execQuery(cSQL,
		function (data) {
			var oParty = data[0][0];
			var oName = oParty.NAME.parseName(oParty.NICK_NAME);

			if (oParty.EMAIL.isValidEmail()) {
				my.sendCnt++;
			}

			for (var nX = 0; nX < data[1].length; nX++) {
				var oContact = data[1][nX];
				if (oContact.EMAIL_VERIFIED && oContact.DEACTIVATED == '') {
					my.sendCnt++;
				}
			}

			if (my.sendCnt > 0) ui.elap.on("Sending E-Mails...");

			if (oParty.EMAIL.isValidEmail()) {
				var cBalance = oParty.BALANCE + " " + Application.oUser.TOKENUNIT.toLowerCase().toPlural(oParty.BALANCE);
				Email.send({
					to_contact_id: oParty.CONTACT_ID,
					to_name: oName.asEntered,
					to_address: oParty.EMAIL,
					from_name: Application.oUser.PROVIDER_NAME,

					subject: "You've received " + my.cAmountString + " from " + Application.oUser.PROVIDER_NAME + ".",
					template: 'admin_party_deposit',
					contents: Email.contentTemplates.admin_party_deposit
						.replace(/__party_nick_name__/g, oName.nick)
						.replace(/__amount_tokens__/g, my.cAmountString)
						.replace(/__deposit_reason__/g, my.description)
						.replace(/__balance_tokens__/g, cBalance)
						.replace(/__token_name__/g, Application.oUser.TOKENUNIT.toLowerCase())
						.replace(/__provider_name__/g, Application.oUser.PROVIDER_NAME),
					callback: function (bSuccess, cSentTo) {
						my.sendCompleted();
						return;
					}
				});
			}

			var pronoun = new genderPronouns(oParty.GENDER);


			for (var nX = 0; nX < data[1].length; nX++) {
				var oContact = data[1][nX];
				if (oContact.EMAIL_VERIFIED && oContact.DEACTIVATED == '') {
					var oContactName = oContact.NAME.parseName();

					var cContents = Email.contentTemplates.admin_contact_deposit
					if (!oParty.EMAIL_VERIFIED) {
						cContents = cContents.replace(/^(__party_email_exists_begin__)[^\x00]*(__party_email_exists_end__)$/gm, "");
					}
					else {
						cContents = cContents
							.replace(/__party_email_exists_begin__/g, "")
							.replace(/__party_email_exists_end__/g, "");
					}
					cContents = cContents
							.replace(/__contact_first_name__/g, oContactName.first)
							.replace(/__provider_name__/g, Application.oUser.PROVIDER_NAME)
							.replace(/__amount_tokens__/g, my.cAmountString)
							.replace(/__token_name__/g, Application.oUser.TOKENUNIT.toLowerCase())
							.replace(/__deposit_reason__/g, my.description)
							.replace(/__party_full_name__/g, oName.asEntered)
							.replace(/__party_nick_name__/g, oName.nick)
							.replace(/__party_email__/g, oParty.EMAIL)
							.replace(/__Nominative__/g, pronoun.nominative.toProperCase(true))
							.replace(/__nominative__/g, pronoun.nominative)
							.replace(/__objective__/g, pronoun.objective)
							.replace(/__adjective__/g, pronoun.adjective)

					Email.send({
						to_contact_id: oContact.CONTACT_ID,
						to_name: oContactName.asEntered,
						to_address: oContact.EMAIL,
						from_name: Application.oUser.PROVIDER_NAME,

						subject: oParty.NAME + " just received " + my.cAmountString + " from " + Application.oUser.PROVIDER_NAME + ".",
						template: 'admin_contact_deposit',
						contents: cContents,
						callback: function (bSuccess, cSentTo) {
							my.sendCompleted();
							return;
						}
					});

				}
			}
		});
	},

	partyDialogs: [],
	openParticipant: function (cPartyCode) {
		var ePartyDialog = $("#Participant_Prototype").clone();
		$("body").append(ePartyDialog);
		ePartyDialog.attr("id", "Participant_" + cPartyCode);
		var nIndex = this.partyDialogs.length;
		this.partyDialogs[nIndex] = new participants.participant(ePartyDialog);
	},
	participant: function (eParty) {
		// eParty - dialog div DOM element passed from openParticipant
		var my = this;
		this.jqParty = eParty;
		this.oPartyData = {};

		this.PrintRewardCard = function () {
			LogEntry("Print Reward Card clicked for participant " + my.PartyName);
			participants.nStatusFilter = $("#selFilterPartyStatus")[0].selectedIndex;
			participants.aReport.length = 0;
			participants.aReport[0] = my.oPartyData;

			popWindow("/Reports/print_reward_cards.html", "Print_Reward_Cards");
		}
		this.PrintStatement = function () {
			LogEntry("Print (statement/record) clicked for participant " + my.PartyName);

			participants.nStatusFilter = $("#selFilterPartyStatus")[0].selectedIndex;
			participants.aReport.length = 0;
			participants.aReport[0] = my.oPartyData;

			cURL = "/Reports/Participants/ReportParties.html";
			popWindow(cURL, "Participant_Reports");
		}

		this.contact = {
			current: {
				contact_id: '',
				name: '',
				relation: '',
				email: '',
				email_verified: ''
			},
			cTitle: '',
			initialized: false,
			aRelations: [
					"Mother", "Father (Dad)",
					"Grandmother", "Grandfather",
					"Sister", "Brother", "Cousin",
					"Aunt", "Uncle",
					"Tutor", "Teacher", "Doctor",
					"Mentor", "Friend", "Other"
					],
			init: function () {
				$("#txtContactRelation").autocomplete({ minLength: 0, source: my.contact.aRelations });
				$("#diagContact input").keyup(function () {
					my.contact.validateInputs();
				});
				$("#txtContactName").prev().dblclick(function (event) {
					var nX = $("#txtContactName").val().toNumber();
					if (nX > 0 && nX < 4) {
						$("#txtContactName").val("Test" + nX + " Contact" + nX);
						$("#txtContactRelation").val("Contact" + nX + " Releationship");
						$("#txtContactEmail").val("test" + nX + "@tokenrewards.com").keyup();
					}
				});
			},
			validateInputs: function () {
				var bAllValid = true;
				var updated = {
					name: $("#diagContact #txtContactName").val().trim(),
					relation: $("#diagContact #txtContactRelation").val().trim(),
					email: $("#diagContact #txtContactEmail").val().trim()
				};

				if (updated.name.length < 1) { bAllValid = false; $("#diagContact #txtContactName").next().find("span").show(); }
				else $("#diagContact #txtContactName").next().find("span").hide();

				if (updated.relation.length < 1) { bAllValid = false; $("#diagContact #txtContactRelation").next().find("span").show(); }
				else $("#diagContact #txtContactRelation").next().find("span").hide();

				if (!updated.email.validEmail()) { bAllValid = false; $("#diagContact #txtContactEmail").next().find("span").show(); }
				else $("#diagContact #txtContactEmail").next().find("span").hide();

				$("#diagContact #noticeDeactivated").hide();
				//Verify updated.email does not exist in deactivated contacts
				//for (var nX = 0; nX < User.aContacts.length; nX++) {
				//	if (User.aContacts[nX].EMAIL == updated.email && User.aContacts[nX].DEACTIVATED && User.aContacts[nX].DEACTIVATED_BY != "Participant") {
				//		bAllValid = false;
				//		$("#noticeDeactivated").show();
				//		$("#noticeDeactivated span").text(User.aContacts[nX].NAME);
				//	}
				//}
				var current = my.contact.current;
				if (updated.name == current.name && updated.relation == current.relation && updated.email == current.email) bAllValid = false;

				var jBtn = $("#diagContact").siblings('.ui-dialog-buttonpane').find('button').eq(1).button({ disabled: !bAllValid });
			},
			save: function (bDeactivate) {
				my.jqParty.find("#elapContactsTable").show();
				my.jqParty.find("#btnNewContact").hide();
				var updated = {
					name: $("#txtContactName").val().trim(),
					relation: $("#txtContactRelation").val().trim(),
					email: $("#txtContactEmail").val().trim()
				};

				cSQL = "select * from adm$party_contact_iu(" +
				customer_id.prepSQL() + "," +
				my.PartyCode.prepSQL() + "," +
				my.contact.current.contact_id.prepSQL(true) + "," +
				updated.name.prepSQL() + "," +
				updated.relation.prepSQL() + "," +
				updated.email.prepSQL() + "," +
				((bDeactivate) ? "1" : "null") + ");";

				new execQuery(cSQL, function (data) {
					oContact = {
						contact_id: data[0].CONTACT_ID,
						name: updated.name,
						relationship: updated.relation,
						email: updated.email
					};

					if (!bDeactivate && (my.contact.current.contact_id == '' || my.contact.current.email != updated.email))
						my.contact.sendConfirmation(oContact);

					my.refreshContacts(false);
					my.jqParty.find("#elapContactsTable").hide();
					my.jqParty.find("#btnNewContact").show();
				});
			},
			insert: function () {
				my.contact.cTitle = "New Participant Contact";
				my.contact.current.name = '';
				my.contact.current.relation = '';
				my.contact.current.email = '';
				my.contact.current.email_verified = '';
				my.contact.current.contact_id = '';

				my.contact.openDialog();
			},
			update: function (cContactId) {
				ui.openWait("Fetching Contact...")
				new execQuery("select * from adm$party_contacts(" + customer_id.prepSQL() + "," + my.PartyCode.prepSQL() + ") " +
				"where contact_id = " + cContactId.prepSQL(),
			function (data) {
				ui.closeWait();
				my.contact.current.contact_id = cContactId;
				my.contact.current.name = data[0].NAME;
				my.contact.current.relation = data[0].RELATIONSHIP;
				my.contact.current.email = data[0].EMAIL;
				my.contact.current.email_verified = data[0].EMAIL_VERIFIED;

				my.contact.openDialog();
			});
			},

			deleteRec: function (jContactRow) {
				var nContactId = jContactRow.attr("contact_id");

				my.jqParty.find("#elapContactsTable").show();
				my.jqParty.find("#btnNewContact").hide();
				jContactRow.hide();

				cSQL = "select * from adm$party_contact_iu(" +
				customer_id.prepSQL() + "," +
				my.PartyCode.prepSQL() + "," +
				nContactId.prepSQL(true) + "," +
				"null," +
				"null," +
				"null," +
				"2);";

				new execQuery(cSQL, function (data) {
					my.refreshContacts(false);
					my.jqParty.find("#elapContactsTable").hide();
					my.jqParty.find("#btnNewContact").show();
				});

			},

			initUI: function () {
				$("#diagContact #txtContactName").val(my.contact.current.name);
				$("#diagContact #txtContactRelation").val(my.contact.current.relation);
				$("#diagContact #txtContactEmail").val(my.contact.current.email);

				$("#ContactEmailConfirmed").hide();
				if (my.contact.current.email_verified) {
					$("#diagContact #ContactEmail").attr("disabled", "disabled");
					$("#ContactEmailConfirmed").show();
				}
				my.contact.validateInputs();
			},
			openDialog: function () {
				if (!this.initialized) this.init();

				$("#diagContact").dialog({ autoOpen: false, modal: true, width: 380, title: my.contact.cTitle,
					open: function () {
						var jButtons = $("#diagContact").siblings('.ui-dialog-buttonpane').find('button');
						jButtons.eq(0).button({ disabled: ((my.contact.current.contact_id) ? false : true), icons: { primary: 'ui-icon-trash'} }).css("float", "left");
						jButtons.eq(1).button({ disabled: true, icons: { primary: 'ui-icon-check'} });
						jButtons.eq(2).button({ icons: { primary: 'ui-icon-closethick'} });
					},
					close: function () { $(this).dialog('destroy'); },
					buttons: {
						"Deactivate Contact": function () { $(this).dialog('close'); my.contact.save(true); },
						"Save": function () { $(this).dialog('close'); my.contact.save(false); },
						"Cancel": function () { $(this).dialog('close'); }
					}
				});
				my.contact.initUI();
				$("#diagContact").dialog("open");
			},
			sendConfirmation: function (oContact) {
				var oPartyName, cGender, cHisHer, cProvider;
				oPartyName = my.oPartyData.NAME.parseName(my.oPartyData.NICK_NAME);
				cGender = my.oPartyData.GENDER;

				var oContactName = oContact.name.parseName();
				var pronoun = genderPronouns(cGender);

				Email.send({
					to_contact_id: oContact.contact_id,
					to_name: oContactName.asEntered,
					to_address: oContact.email,
					from_name: cProvider,

					subject: 'Enable notifications from ' + Application.oUser.PROVIDER_NAME,
					template: 'admin_contact_confirm',
					contents: Email.contentTemplates.admin_contact_confirm
					.replace(/__first_name__/g, oContactName.nick)
					.replace(/__party_name__/g, oPartyName.asEntered)
					.replace(/__party_first_name__/g, oPartyName.nick)
					.replace(/__token_name__/g, Application.oUser.TOKENUNIT.toLowerCase())
					.replace(/__adjective__/g, pronoun.adjective)
					.replace(/__provider_name__/g, Application.oUser.PROVIDER_NAME)
				,
					callback: function (bSuccess) { return; }
				});
			}
		};

		this.partyFetched = function (oParty) {
			my.oPartyData = oParty;
			my.PartyName = oParty.NAME;
			my.PartyCode = oParty.CODE;

			my.jqParty.find(".partyName .data").text(oParty.NAME);
			my.jqParty.find(".partyClass .data").text(oParty.CLASS_NAME);

			$(".wrapPartyStatus span").hide();
			if (oParty.ACTIVATED == "1") $(".wrapPartyStatus .active", my.jqParty).show();
			else $(".wrapPartyStatus .inactive", my.jqParty).show();

			my.jqParty.find(".partyCode .data").text(oParty.CODE.toUpperCase());
			my.jqParty.find(".partyGender .data").text(Gender(oParty.GENDER));
			my.jqParty.find(".partyAge .data").text(Age(oParty.BIRTHYEAR));
			my.jqParty.find(".partyFirst .data").text(oParty.NICK_NAME);

			my.jqParty.find(".partyEmail .data").text(oParty.EMAIL);
			if (oParty.EMAIL_VERIFIED) { $(".LAD.partyEmail span.verified", my.jqParty).show(); }

			if (oParty.DIRECT_SHIP) $(".partyShip .data", my.jqParty).html(ContactAddress(oParty, "")).removeClass("ui-state-disabled");
			else $(".partyShip .data", my.jqParty).html('(Administrator\'s Shipping Address)').addClass("ui-state-disabled");

			$(".txtPartyNotes", my.jqParty).html(oParty.NOTES);
			participants.refreshRow(oParty.CODE);
		};

		this.refreshAwards = function (aAwards) {
			var refresh = function (aAwards) {
				my.jqParty.find('.divAwards').empty();

				var nAvailable = 0, nAwarded = 0;
				for (var nX = 0; nX < aAwards.length; nX++) {
					var jAward = $(commonHTML.award);
					var oRec = aAwards[nX];

					if (oRec.AWARD_TYPE != 0) continue;


					var cExpires = (oRec.EXPIRES) ? (new Date(oRec.EXPIRES)).getTime() : "Infinity".toNumber();
					var cAvailable = (oRec.GROUP_QTY_AVAILABLE) ? oRec.GROUP_QTY_AVAILABLE : "Infinity".toNumber();
					var cPartyAvailable = (oRec.PARTY_QTY_AVAILABLE) ? oRec.PARTY_QTY_AVAILABLE : "Infinity".toNumber();

					var cObjClasses = 'participantView hideDescription inline allowHover';
					cObjClasses += ((new Date()).getTime() > cExpires) ? " expired" : "";
					cObjClasses += (cAvailable <= 0) ? " completed" : "";
					cObjClasses += (cPartyAvailable <= 0) ? " partyCompleted" : "";
					cObjClasses += (oRec.PARTY_QTY_AWARDED > 0) ? " awarded" : "";

					if (!cObjClasses.match(/expired|completed|partyCompleted/g)) nAvailable++;

					jAward.attr({
						"title_plain": oRec.TITLE_PLAIN,
						"group_qty_available": cAvailable,
						"party_qty_available": cPartyAvailable,
						"award_id": oRec.ID,
						"expires": cExpires
					}).addClass(cObjClasses)
				.find(".title").html(oRec.TITLE).end()
				.find(".awardUnitName").html(Application.oUser.TOKENUNIT.toPlural(oRec.AMOUNT).toUpperCase()).end()
				.find(".description").html(oRec.DESCRIPTION).end()
				.find(".details .deadline .detailValue").html((oRec.EXPIRES) ? (new Date(oRec.EXPIRES)).format("smallDate") : "None").end()
				.find(".details .awarded .detailValue").html(oRec.PARTY_QTY_AWARDED + ((oRec.PARTY_QTY) ? '&nbsp;of&nbsp;' + oRec.PARTY_QTY : ''));

					commonHTML.drawCertAmount(jAward, oRec.AMOUNT);

					jAward.appendTo(my.jqParty.find('.divAwards'));
					jAward.click(function () {
						if (my.jqParty.find(".btnsAwardOptions input:checked").val() != "got") participants.grant.init(my.PartyCode, $(this).attr("award_id"));
					});

					if (oRec.PARTY_QTY_AWARDED.toNumber() > 0) nAwarded++;
				}
				my.jqParty.find(".partyAwardCnt").text(
				(nAvailable == 0 && nAwarded == 0) ? "0" :
				nAwarded + " of " + nAvailable
			);

			};

			if (!aAwards) {
				var cSQL = "select * from adm$awards(" + customer_id.prepSQL() + "," + my.PartyCode.prepSQL() + ") where award_type = 0;";
				var query = new execQuery(cSQL, function (data) { refresh(data) });
			}
			else refresh(aAwards);
		};
		this.refreshLedger = function (aTrans) {

			var nCreditCnt = 0, nCreditAmt = 0, nDebitCnt = 0, nDebitAmt = 0, nPendingCnt = 0, nPendingAmt = 0;

			var jTbody = my.jqParty.find(".tblPartyTransactions tbody").empty();

			for (var nX = 0; nX < aTrans.length; nX++) {
				var bNewTrans = (aTrans[nX].ADDED.toDate().compareTo(Date.today().add(-7).days()) != -1);
				var jRow = $(
				'<tr>' +
					'<td>' + aTrans[nX].ADDED.toDateFormat("shortDateTime") + '</td>' +
					'<td>' + aTrans[nX].DESCRIPTION + '</td>' +
					'<td class="cellAmount">' + aTrans[nX].AMOUNT + '</td>' +
					'<td class="buttonCell"></td>' +
				'</tr>'
			);

				var jBtnCell = $('.buttonCell', jRow);
				var nAmount = aTrans[nX].AMOUNT.toNumber();
				if (nAmount > 0) {
					nCreditAmt += Math.abs(nAmount);
					nCreditCnt++;
					jRow.addClass("ledgerCredit");
					if (aTrans[nX].AWARD_ID)
						jBtnCell.append('<span class="ui-icon ui-icon-star ui-icon-inline"></span> Award!');
					else if (bNewTrans && !aTrans[nX].CERTIFICATE_CODE)
						jBtnCell.append('<span class="btnEditTransaction cellButton" title="Edit this deposit..."></span>');
				}
				else {
					if (aTrans[nX].PENDING) {
						jRow.addClass("ledgerPending");
						nPendingAmt += Math.abs(nAmount);
						nPendingCnt++;
						if (aTrans[nX].CUSTOM_REWARD) {
							jBtnCell.append('<span class="btnMarkDelivered cellButton" title="Mark this custom reward purchase as delivered"></span>');
							jBtnCell.append('<span class="btnDeleteOrder cellButton" title="Cancel this pending reward purchase..." ></span>');
						}
					}
					else {
						nDebitAmt += Math.abs(nAmount);
						nDebitCnt++;
						jRow.addClass("ledgerDebit");
						if (bNewTrans && !aTrans[nX].CUSTOM_REWARD && !aTrans[nX].WISH_ID) {
							jBtnCell.append('<span class="btnEditTransaction cellButton" title="Edit this withdrawal..."></span>');
							jBtnCell.append('<span class="btnDelTransaction cellButton" title="Delete this withdrawal..." ></span>');
						}
					}
				}
				if ($(".cellButton", jBtnCell).length) jRow.data(aTrans[nX]);
				jTbody.append(jRow);
			}

			$("span.btnEditTransaction", jTbody).button({ text: false, icons: { primary: 'ui-icon-pencil'} })
		.click(function () {
			var jRow = $(this).parents("tr");
			if (jRow.hasClass("ledgerCredit")) participants.post.deposit(my.PartyCode, my.PartyName, jRow)
			else participants.post.withdrawal(my.PartyCode, my.PartyName, jRow);
		});

			$("span.btnDelTransaction", jTbody).button({ text: false, icons: { primary: 'ui-icon-trash'} })
		.click(function () {

			// code copied to shop.alerts.cancelOrder
			var jRow = $(this).parents("tr");
			ui.modalConfirm({
				title: "Confirm Deletion",
				message: "Are you aboslutely sure you want to delete this transaction?",
				action: function () {
					/* 
					IN_ID integer,
					IN_CODE varchar(31),
					IN_ITEM varchar(1023),
					IN_AMOUNT integer,
					IN_REUSABLE smallint,
					IN_AWARD_ID integer,
					IN_DELETE smallint,
					IN_REWARD_QTY smallint)
					*/
					var cSQL = "select * from ADM$PARTY_LEDGER_IUD(" +
						jRow.data().ID.prepSQL() + "," +
						"null," +
						"null," +
						"null," +
						"null," +
						"null," +
						"'1'," +
						"null," +
						"null);";
					participants.execTransaction(my.PartyCode, cSQL, 1, function () {
						LogEntry("Transaction #" + jRow.data().ID + " deleted by admin user.");
					});
					jRow.remove();

				}
			})

		});

			$("span.btnDeleteOrder", jTbody).button({ text: false, icons: { primary: 'ui-icon-trash'} })
		.click(function () {
			participants.order.cancel($(this).parents('tr').data());
		});

			$("span.btnMarkDelivered", jTbody).button({ text: false, icons: { primary: 'ui-icon-check'} })
		.click(function () {
			var jRow = $(this).parents("tr");
			$(this).fadeOut();
			$(this).next().fadeOut();

			participants.execTransaction(my.PartyCode,
				"execute procedure adm$REWARD_DELIVERED(" + jRow.data('ID').prepSQL() + ");", 1,
				function () { LogEntry("Custom reward purchased by " + my.PartyName + " marked as delivered."); }
			);
		});


			var nBalance = nCreditAmt - nDebitAmt - nPendingAmt;
			my.oPartyData.BALANCE = nBalance;
			var cBalance = (nBalance == 0) ? "0" : nBalance + " " + Application.oUser.TOKENUNIT.toLowerCase().toPlural(nBalance);
			my.jqParty.find(".partyBalance").text(cBalance);

			my.jqParty.find(".divTransactTotals .totalField.ledgerCredit").html(nCreditCnt + ":&nbsp;&nbsp;" + nCreditAmt);
			my.jqParty.find(".divTransactTotals .totalField.ledgerDebit").html(nDebitCnt + ":&nbsp;&nbsp;" + nDebitAmt);
			my.jqParty.find(".divTransactTotals .totalField.ledgerPending").html(nPendingCnt + ":&nbsp;&nbsp;" + nPendingAmt);
			my.jqParty.find(".divTransactTotals .totalField.balance").html("&nbsp;" + nBalance + "&nbsp;");

			//Refresh balance in main Participants area.
			cBalance = nBalance + "&nbsp;" + Application.oUser.TOKENUNIT.toPlural(nBalance);

		};
		this.refreshContacts = function (aContacts) {
			var refresh = function (aContacts) {
				var jTbody = my.jqParty.find(".tblContacts tbody").empty();
				var nValid = 0;
				for (var nX = 0; nX < aContacts.length; nX++) {
					var jRow = $(
					'<tr class="' + ((aContacts[nX].DEACTIVATED) ? "deactivated" : "") + '" ' +
						'contact_id="' + aContacts[nX].CONTACT_ID + '" email_verified="' + aContacts[nX].EMAIL_VERIFIED + '">' +
						'<td>' + aContacts[nX].NAME + '</td>' +
						'<td>' + aContacts[nX].RELATIONSHIP + '</td>' +
						'<td>' +
							((aContacts[nX].EMAIL_VERIFIED) ?
							'<span class="ui-icon ui-icon-check" style="float:right;" title="Confirmed ' +
								(new Date(aContacts[nX].EMAIL_VERIFIED)).format("shortDateTime") + '"></span>' : '') +
							'<span class="partyContactEmail">' + aContacts[nX].EMAIL + '</span>' +
							((aContacts[nX].DEACTIVATED) ?
							"<br />Deactivated:" + (new Date(aContacts[nX].DEACTIVATED)).format("shortDate") + " by " + aContacts[nX].DEACTIVATED_BY : "") +
						'</td>' +
						'<td style="text-align:center" class="buttonCell" ><span class="btnEditPartyContact cellButton"></span></td>' +
					'</tr>'
				);

					if (aContacts[nX].DEACTIVATED && !aContacts[nX].EMAIL_VERIFIED) {
						// Allow deletion
						$("span.btnEditPartyContact", jRow).button({ text: false, icons: { primary: "ui-icon-trash"} })
					.click(function () {
						my.contact.deleteRec($(this).parents('[contact_id]'));
					});
					}

					jTbody.append(jRow);

					if (aContacts[nX].EMAIL_VERIFIED && !(aContacts[nX].DEACTIVATED)) nValid++;

				}
				jTbody.find("tr:not('.deactivated') span.btnEditPartyContact")
			.button({ text: false, icons: { primary: "ui-icon-pencil"} })
			.click(function () {
				my.contact.update($(this).parents('[contact_id]').attr("contact_id"));
			});

				my.jqParty.find(".partyContactCnt").text(
				((aContacts.length == 0) ? "0" :
				nValid + " of " + aContacts.length)
			);
			}

			if (!aContacts) {
				var query = new execQuery("select * from adm$party_contacts(" + customer_id.prepSQL() + "," + my.PartyCode.prepSQL() + ");",
			function (data) { refresh(data); });
			}
			else {
				refresh(aContacts);
			}

		};
		this.refreshOrders = function (aoOrders) {

			var refresh = function (aoOrders) {
				$(".partyPurchases", my.jqParty).text(aoOrders.length);
				var jRows = my.jqParty.find(".wrapOrderRows").empty();

				if (aoOrders.length == 0) {
					my.jqParty.find(".wrapOrderSummary div.inline,.wrapOrderRows").hide();
					return;
				}
				my.jqParty.find(".wrapOrderSummary div.inline,.wrapOrderRows").show();

				var total = {
					pending: {
						items: 0,
						tokens: 0,
						dollars: 0
					},
					items: 0,
					tokens: 0,
					dollars: 0
				};
				var oData;

				//    ID TYPE OF ID_NUMBER,
				//    PARTY_CODE varchar(31),
				//    PARTICIPANT varchar(100),
				//    CLASS_ID integer,
				//    CLASS_NAME varchar(100),
				//    ORDERED timestamp,
				//    DELIVERED timestamp,
				//    
				//    DESCRIPTION varchar(1024),
				//    custom_reward_id int,
				//    tokens_spent int,
				//    
				//    INVOICE TYPE OF ID_NUMBER,
				//    PRODUCT_CODE varchar(10),
				//    PRODUCT_NAME varchar(40),
				//    QTYWANTED TYPE OF QUANTITY,
				//    QTYGOT TYPE OF QUANTITY,
				//    UNIT$CHILD integer,
				//    PRICE numeric(9,2),
				//    RETAIL numeric(9,2),
				//    SOURCE TYPE OF WISHSOURCE

				for (var nX = 0; nX < aoOrders.length; nX++) {
					oData = aoOrders[nX];
					oData.isCustomReward = oData.CUSTOM_REWARD_ID ? true : false;
					var jRow = $(".wrapOrderRow.prototype").clone().removeClass("prototype").data(oData);
					var nQty;

					if (!oData.DELIVERED) {
						jRow.addClass("ledgerPending");
						nQty = oData.QTYWANTED.toNumber();

						total.pending.items++;
						total.pending.tokens += oData.UNIT$CHILD.toNumber() * nQty;
						total.pending.dollars += !oData.isCustomReward ? oData.PRICE.toNumber() * nQty : 0;

						$(".deliveryInfo", jRow).remove();

						if (oData.isCustomReward) {
							$('.btnDeletePending', jRow).button({ icons: { primary: "ui-icon-trash" }, text: false })
						.show().click(function () {
							oItem = $(this).parent().data();

							if (oItem.isCustomReward) {
								participants.order.cancel(oItem);
								SQL = "select * from ADM$PARTY_LEDGER_IUD(" +
									oItem.ID.prepSQL() + "," +
									"null," +
									"null," +
									"null," +
									"null," +
									"null," +
									"'1'," +
									"null," +
									"null);";
								return;
							}

							ui.openWait("Deleting Order...");
							var SQL = "select * from adm$orderitem_cancel(" + customer_id.prepSQL() + "," + oItem.ID.prepSQL() + ");\n";
							participants.execTransaction(my.PartyCode, SQL, 1, function () {
								LogEntry("Pending " + ((oItem.CUSTOM_REWARD_ID) ? "custom reward" : "warehouse") +
								" order#" + oItem.ID + " for " + my.PartyName + " canceled by admin user.");
							});
						});
						}
					}
					else {
						nQty = oData.QTYGOT.toNumber();
						$(".deliveryInfo .date", jRow).text(oData.DELIVERED.toDateFormat("shortDate"));
					}
					total.items++;
					total.tokens += oData.UNIT$CHILD.toNumber() * nQty;
					total.dollars += !oData.isCustomReward ? oData.PRICE.toNumber() * nQty : 0;

					if (oData.isCustomReward) {
						jRow.addClass("customReward");
						$("img", jRow).attr("src", "/Common/customer_images/" + oData.PRODUCT_CODE + ".gif");
						$(".totals .dollars", jRow).hide();
						$(".prices", jRow).hide();
					}
					else {
						jRow.addClass("warehouseReward");
						$("img", jRow).attr("src", "http://tokenrewards.com/product_images/small/" + oData.PRODUCT_CODE + ".gif");
						$(".totals .dollars", jRow).html(formatCurrency(oData.PRICE.toNumber() * nQty, true)).show();
						$(".prices .retail", jRow).html(formatCurrency(oData.RETAIL, true));
						if (oData.PRICE.toNumber() < oData.RETAIL.toNumber()) {
							$(".prices", jRow).addClass("withDiscount");
							$(".discountPrice", jRow).html(formatCurrency(oData.PRICE, true)).show();
						}
						$(".prices", jRow).show();
						$(".lblCustomReward", jRow).remove();
					}

					if (!oData.DELIVERED && oData.isCustomReward) {
						$('.btnCheckDelivered', jRow).button({ icons: { primary: "ui-icon-check" }, text: false })
					.show().click(function () {
						$(this).fadeOut();
						var jRow = $(this).parents('.wrapOrderRow');
						var oData = jRow.data();
						participants.execTransaction(my.PartyCode,
							"execute procedure adm$REWARD_DELIVERED(" + oData.ID.prepSQL() + ");", 1,
							function () { LogEntry("Custom reward purchased by " + my.PartyName + " marked as delivered."); }
						);

					});

					}

					$(".itemOrdered", jRow).text(oData.PRODUCT_CODE + ": " + oData.PRODUCT_NAME);
					$(".whoOrdered", jRow).text(
					(oData.SOURCE == 1 ? "Participant" : "Administrator") +
					", " + oData.ORDERED.toDateFormat("shortDateTime")
				);

					$(".qty span", jRow).text(nQty);
					$(".totals .tokens", jRow).text(
					oData.TOKENS_SPENT + " " +
					Application.oUser.TOKENUNIT.toLowerCase().toPlural(oData.TOKENS_SPENT)
				);

					jRows.append(jRow);

				}

				var jWrap = $(".wrapOrderSummary", my.jqParty);
				$(".pending .tokens", jWrap).text(
				total.pending.tokens + ' ' +
				Application.oUser.TOKENUNIT.toLowerCase().toPlural(total.pending.tokens)
			);
				$(".pending .dollars", jWrap).html(formatCurrency(total.pending.dollars, true));

				$(".total .tokens", jWrap).text(
				total.tokens + ' ' +
				Application.oUser.TOKENUNIT.toLowerCase().toPlural(total.tokens)
			);
				$(".total .dollars", jWrap).html(formatCurrency(total.dollars, true));
			};

			var SQL = '';
			var nPendingFilter = $(".btnsPartyOrderFilter input:checked", my.jqParty).val().toNumber();
			switch (nPendingFilter) {
				case 1: SQL += "\n      delivered is null"; break;
				case 2: SQL += "\n      delivered is not null"; break;
				default: break;
			}

			var nTypeFilter = $(".btnsPartyRewardTypes input:checked", my.jqParty).val().toNumber();
			switch (nTypeFilter) {
				case 1: SQL += "\n      " + ((SQL) ? "and" : '') + " custom_reward_id is null"; break;
				case 2: SQL += "\n      " + ((SQL) ? "and" : '') + " custom_reward_id is not null"; break;
				default: break;
			}

			SQL = "select * from adm$ordered_items(" +
				customer_id.prepSQL() + "," + my.PartyCode.prepSQL() +
				")" + ((SQL) ? " where " + SQL : '') + ";";

			var oCGI = new execQuery(SQL, function (aResults) { refresh(aResults); });
		};

		this.buildDialog = function () {
			my.jqParty.dialog({
				autoOpen: false,
				title: "Participant Account Record",
				height: 520,
				modal: false,
				width: 720,
				position: "center center",
				buttons: [
				//{ text: "Help", click: function () { UsageTips.HelpMenu(5); } },
				//{ text: "Edit Participant...", click: function () { new participants.editParty(my.PartyCode); } },
				{text: "Print Statement...", click: function () { my.PrintStatement(); } },
				{ text: "Print Account Card..", click: function () { my.PrintRewardCard(); } },
				{ text: "Close", click: function () { $(this).dialog('close'); } }
			],
				open: function () {
					var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
					//jBtns.eq(0).button({ text: false, icons: { primary: "ui-icon-help"} }).css({ "float": "left", "margin-right": "60px", "height": "2.3em" });
					//jBtns.eq(1).button({ icons: { primary: "ui-icon-pencil"} }).attr("title", "Click to change name, class, status, gender, or age.").css("float", "left");
					jBtns.eq(0).button({ icons: { primary: "ui-icon-print"} })
					.attr("title", "Click to print the participant's record and/or statement.")
					.addClass("btnPartyButtonPane");
					jBtns.eq(1)
					.button({ icons: { primary: "ui-icon-print"} })
					.attr("title", "Click to print participant's Account Card.")
					.addClass("btnPartyButtonPane");
					jBtns.eq(2).button({ icons: { primary: "ui-icon-closethick"} });
					$(".ui-button").bind("focusout", function () { $(this).removeClass("ui-state-focus"); }).removeClass("ui-state-focus");

					$(this).siblings(".ui-dialog-titlebar")
				.dblclick(function () {
					var dialog = my.jqParty;
					if (dialog.height() < 200)
						$(my.jqParty).dialog("option", "height", 540);
					else
						$(my.jqParty).dialog("option", "height", 195);
				});

					$(this).parent().position({ my: "right top", at: "right top", of: $(window), offset: "-25 50" });

				},
				close: function () {
					var sTab = my.jqParty.find(".partyTabs").tabs("option", "selected").toString();
					my.jqParty.find(".partyTabs").tabs("destroy");
					$.cookie("participantTabs", sTab, { expires: 30 });
					$(this).dialog("destroy");
					my.jqParty.remove();
					for (var nX = 0; nX < participants.partyDialogs.length; nX++) {
						if (participants.partyDialogs[nX].PartyCode == my.PartyCode) break;
					}
					participants.partyDialogs.splice(nX, 1);
					var jActivePane = $(".PaneActive");
					if (jActivePane.length == 0) window.location.hash = "#Participants";
					else window.location.hash = "#" + $(".PaneActive").attr("id");

				}
			});

		};
		this.fetchParty = function () {
			my.refreshOrders();
			var cSQL =
			"select * from adm$participant(" + customer_id.prepSQL() + "," + my.PartyCode.prepSQL() + ");" + "\n" +
			"select * from adm$party_ledger(" + customer_id.prepSQL() + "," + my.PartyCode.prepSQL() + "); \n" +
			"select * from adm$party_contacts(" + customer_id.prepSQL() + "," + my.PartyCode.prepSQL() + "); \n" +
			"select * from adm$awards(" + customer_id.prepSQL() + "," + my.PartyCode.prepSQL() + ") where award_type = 0;";

			new execQuery(cSQL,
			function (aResults) {
				ui.closeWait();

				my.partyFetched(aResults[0][0]);
				my.refreshLedger(aResults[1]);
				my.refreshContacts(aResults[2]);
				my.refreshAwards(aResults[3]);

				if (!my.jqParty.is(":visible")) {
					my.buildDialog();
					my.jqParty.dialog("open");
				}
				ui.elap.off();
			});
		}

		this.tabDisplayOptions = {
			refresh: function () {
				var oCheckedVals;
				var oData = $.cookie("PartyTabDisplayOptions");
				if (oData) {
					oCheckedVals = $.extend({}, $.evalJSON(oData));
				}
				else {
					oCheckedVals = {
						btnsAwardOptions: 'input[value="get"]',
						btnsAwardDetails: 'input[value="hide"]',
						btnsPartyOrderFilter: 'input[value="0"]',
						btnsPartyRewardTypes: 'input[value="0"]'
					};
				}

				for (var oItem in oCheckedVals) {
					$('.' + oItem + ' ' + oCheckedVals[oItem], my.jqParty).attr("checked", true).button("refresh");
				}

				//$('.btnsAwardOptions input[value="get"]', my.jqParty).attr("checked", true).button("refresh");
				//$('.btnsAwardDetails input[value="hide"]', my.jqParty).attr("checked", true).button("refresh");
				//$('.btnsPartyOrderFilter input[value="0"]', my.jqParty).attr("checked", true).button("refresh");
				//$('.btnsPartyRewardTypes input[value="0"]', my.jqParty).attr("checked", true).button("refresh");

			},
			save: function () {
				var oSave = {
					btnsAwardOptions: '',
					btnsAwardDetails: '',
					btnsPartyOrderFilter: '',
					btnsPartyRewardTypes: ''
				};

				for (var sX in oSave) {
					oSave[sX] =
					'input[value="' +
						$('.' + sX + ' input', participants.partyDialogs[0].jqParty).filter(":checked").val() +
					'"]'
				}

				$.cookie("PartyTabDisplayOptions", $.toJSON(oSave), { expires: 30 });

			}
		};

		this.init = function () {
			var cHash = my.jqParty.attr("id");
			my.PartyCode = cHash.substring(cHash.indexOf("_") + 1, cHash.length).toLowerCase();
			my.PartyName = "";

			ui.elap.on()
			my.jqParty.find(".btnEditPartyInfo")
			.button({ label: "Edit Participant Information...", icons: { primary: "ui-icon-pencil"} })
			.click(function () { participants.edit.open(my.PartyCode); });

			$(".lblPartyNotes button", my.jqParty).button().click(function () {
				function doGetCaretPosition(ctrl) {

					var CaretPos = 0;
					// IE Support
					if (document.selection) {

						ctrl.focus();
						var Sel = document.selection.createRange();

						Sel.moveStart('character', -ctrl.value.length);

						CaretPos = Sel.text.length;
					}
					// Firefox support
					else if (ctrl.selectionStart || ctrl.selectionStart == '0')
						CaretPos = ctrl.selectionStart;

					return (CaretPos);

				}


				function setCaretPosition(ctrl, pos) {

					if (ctrl.setSelectionRange) {
						ctrl.focus();
						ctrl.setSelectionRange(pos, pos);
					}
					else if (ctrl.createTextRange) {
						var range = ctrl.createTextRange();
						range.collapse(true);
						range.moveEnd('character', pos);
						range.moveStart('character', pos);
						range.select();
					}
				}

				var jNotes = $(".txtPartyNotes", my.jqParty);
				var sDateTime = Date('now').toDateFormat("shortDateTime") + ": ";
				jNotes.val(sDateTime + "\n\n" + jNotes.val());
				$("#partyTabs_" + my.PartyCode).tabs("option", "selected", 0);
				$(".txtPartyNotes", my.jqParty).keyup();
				setCaretPosition(jNotes[0], sDateTime.length);

			});

			$(".txtPartyNotes", my.jqParty).keyup(function () {
				var saveNotes = function () {
					$(".elapPartyNotes", my.jqParty).fadeIn();
					if (my.notesXHR) my.notesXHR.abort();

					my.notesXHR = new execQuery(
					"execute procedure ADM$PARTICIPANT_UPDATE_NOTES(" +
						customer_id.prepSQL() + "," + my.PartyCode.prepSQL() + "," +
						$(".txtPartyNotes", my.jqParty).val().prepSQL() + ");",
				function () {
					$(".elapPartyNotes", my.jqParty).fadeOut();
				});
				};


				clearTimeout(my.notesTimer);
				my.notesTimer = setTimeout(saveNotes, 1000);
			});


			my.jqParty.find("#btnDeposit").attr("title", "Click to make a misc. deposit into participant's account.")
			.button({ label: "Deposit " + Application.oUser.TOKENUNIT + "s...", icons: { primary: "ui-icon-circle-plus"} })
			.click(function () { participants.post.deposit(my.PartyCode, my.PartyName, false); });

			my.jqParty.find("#btnWithdraw").attr("title", "Click to make a misc. withdrawal from participant's account.")
			.button({ label: "Withdraw " + Application.oUser.TOKENUNIT + "s...", icons: { primary: "ui-icon-circle-minus"} })
			.click(function () { participants.post.withdrawal(my.PartyCode, my.PartyName, false); });

			my.jqParty.find(".btnAddPendingOrder")
			.button({ label: "Make Purchase for Participant...", icons: { primary: "ui-icon-cart"} })
			.click(function () { participants.order.init(my.PartyCode, my.PartyName); });

			my.jqParty.find("#btnNewPartyAward")
			.button({ label: "Create New Goal...", icons: { primary: "ui-icon-plusthick"} })
			.click(function () { award.insert([my.PartyCode], "Award"); });

			my.jqParty.find("#btnNewContact")
			.button({ label: "Create New Family Contact...", icons: { primary: "ui-icon-plusthick"} })
			.click(function () { my.contact.insert(); });


			var jTabs = my.jqParty.find(".partyTabs");
			jTabs.attr("id", "partyTabs_" + my.PartyCode);
			jTabs.find("ul li a").each(function (nX) {
				$(this).attr("href", "#tab" + nX + "_" + my.PartyCode);
			});
			jTabs.find(".partyTab").each(function (nX) {
				$(this).attr("id", "tab" + nX + "_" + my.PartyCode);
			});
			$("#partyTabs_" + my.PartyCode).tabs({ cookie: { expires: 30, name: 'participantTabs'} });

			$(".partyAwardOptions input, .partyOrderOptions input", my.jqParty).each(function () {
				var cId = $(this).attr("id") + "_";
				$(this).attr("id", cId + my.PartyCode);
				var cFor = $(this).next().attr("for") + "_";
				$(this).next().attr("for", cFor + my.PartyCode);
			});
			$(".btnsPartyOrderFilter, .btnsPartyRewardTypes, .btnsAwardOptions, .btnsAwardDetails", my.jqParty).buttonset();

			$(".btnsPartyOrderFilter input, .btnsPartyRewardTypes input", my.jqParty).change(function () {
				my.refreshOrders();
				my.tabDisplayOptions.save();
			});

			my.jqParty.find(".btnsAwardOptions input").change(function () {
				if ($(this).is(":checked") && $(this).val() == "got") {
					my.jqParty.find(".divAwards .awardObject:not(.awarded)").addClass("notAwarded");
					my.jqParty.find(".divAwards .awardObject").removeClass("allowHover completed partyCompleted expired"); ;
				}
				else my.jqParty.find(".divAwards .awardObject").removeClass("notAwarded").addClass("allowHover").each(function () {
					if ($(this).attr("group_qty_available").toNumber() <= 0) $(this).addClass("completed");
					if ($(this).attr("party_qty_available").toNumber() <= 0) $(this).addClass("partyCompleted");
					if ((new Date()).getTime() > $(this).attr("expires").toNumber()) $(this).addClass("expired");
				});
				my.tabDisplayOptions.save();
			});

			my.jqParty.find(".btnsAwardDetails input").change(function () {
				if ($(this).is(":checked") && $(this).val() == "hide") {
					my.jqParty.find(".divAwards .awardObject").addClass("hideDescription");
				}
				else my.jqParty.find(".divAwards .awardObject").removeClass("hideDescription");
				my.tabDisplayOptions.save();
			});

			my.tabDisplayOptions.refresh();

			my.fetchParty();
		} ();

	}

};

var activity = {
	jTabs: false,
	graphData: false,
	graphsDrawn: false,
	previousPoint: null,
	showTooltip: function (x, y, contents) {
		$('<div id="activitytooltip">' + contents + '</div>').css({
			position: 'absolute',
			display: 'none',
			top: y - 5,
			left: x,
			border: '1px solid #fdd',
			padding: '2px',
			'background-color': '#fee',
			opacity: 0.90
		}).appendTo("body").fadeIn(200);
	},
	drawGraphs: function () {
		var aRows = this.graphData;

		if (aRows.length == 0) {
			$(".elapsorGraph").hide();
			this.graphsDrawn = true;
			return;
		}

		var aDeposits = new Array();
		var aWithdraws = new Array();
		var aBalances = new Array();
		var oOpts = {
			grid: {
				backgroundColor: { colors: ["#666", "#CCC"] },
				hoverable: true,
				clickable: true
			},
			xaxis: {
				mode: "time",
				timeformat: "%b",
				min: Date.today().addYears(-1).getTime(),
				monthNames: ["Jan", "Feb", "Mar", "Apr", "Mar", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
			},
			bars: {
				show: true,
				barWidth: 24 * 60 * 60 * 1000 * 20,
				align: "center",
				lineWidth: 0,
				fill: true,
				fillColor: { colors: ["#FF7E77", "Blue"] }
			}
		}

		var nRunningBal = 0, nIndex = 0;
		for (var nX = 0; nX < aRows.length; nX++) {
			nRunningBal += Number(aRows[nX].SUM_DEPOSITS) + Number(aRows[nX].SUM_WITHDRAWS);

			var nDate = (new Date(aRows[nX].FOR_YEAR + "/" + aRows[nX].FOR_MONTH + "/01")).getTime();
			if (nDate >= oOpts.xaxis.min) {
				nIndex++;
				aDeposits[nIndex] = [nDate, Number(aRows[nX].SUM_DEPOSITS)];
				aWithdraws[nIndex] = [nDate, Number(aRows[nX].SUM_WITHDRAWS) * -1];
				aBalances[nIndex] = [nDate, nRunningBal];
			}
		}
		$("#totalOutstanding").text(aBalances[nIndex][1] + ", " + formatCurrency(aBalances[nIndex][1] / Application.oUser.TOKENRATE, false, true, false));
		$.plot("#DepositsGraph", [aDeposits], oOpts);

		oOpts.bars.fillColor.colors = ["Blue", "#FF7E77"];
		$.plot("#WithdrawsGraph", [aWithdraws], oOpts);

		oOpts.bars.show = false;
		oOpts.lines = { show: true };
		$.plot("#BalanceGraph", [aBalances], oOpts);

		$("#DepositsGraph, #WithdrawsGraph, #BalanceGraph")
			.bind("plothover", function (event, pos, item) {
				if (item) {
					if (activity.previousPoint != item.datapoint) {
						activity.previousPoint = item.datapoint;

						$("#activitytooltip").remove();
						var x = item.datapoint[0].toFixed(0),
						 y = item.datapoint[1].toFixed(0);

						activity.showTooltip(item.pageX, item.pageY,
										  item.series.xaxis.ticks[item.dataIndex].label + " , " + y + " " + Application.oUser.TOKENUNIT + "s");
					}
				}
				else {
					$("#activitytooltip").remove();
					activity.previousPoint = null;
				}
			});

		this.graphsDrawn = true;
	},
	fetchClasses: function () {

		new execQuery("select * from adm$classes(" + customer_id.prepSQL() + ");",
		function (aClasses) {
			var jSel = $("#selActivityClasses");
			var jSel2 = $("#selOrdersClasses");
			for (var nX = 0; nX < aClasses.length; nX++) {
				jSel.append('<option classid="' + aClasses[nX].ID + '">' + aClasses[nX].CLASS_NAME + '</option>');
				jSel2.append('<option classid="' + aClasses[nX].ID + '">' + aClasses[nX].CLASS_NAME + '</option>');
			}
			jSel.append('<option classid="0">--Unassigned Class</option>');
			jSel2.append('<option classid="0">--Unassigned Class</option>');
			jSel[0].selectedIndex = 0;
			jSel2[0].selectedIndex = 0;

		});

	},

	ledgerItemsFetched: function (aRows) {
		var jTbl = $("#tblActivity tbody").empty();
		var sRowClass, aParties = [];
		var nAmount = 0,
			nDeposits = 0, nAmtDeposited = 0,
			nWithdraws = 0, nAmtWithdrawn = 0,
			nPending = 0, nAmtPending = 0

		if (aRows.length == 0) {
			jTbl.append('<tr><td colspan="5" style="text-align:center">There has been no activity in the specified date range.</td></tr>');
		}
		else
			for (var nX = 0; nX < aRows.length; nX++) {
				nAmount = aRows[nX].AMOUNT.toNumber();
				if (nAmount > 0) {
					nDeposits++; nAmtDeposited += nAmount;
					sRowClass = "ledgerCredit";
				}
				else if (aRows[nX].PENDING) {
					sRowClass = "ledgerPending";
					nPending++; nAmtPending += nAmount;
				}
				else {
					sRowClass = "ledgerDebit";
					nWithdraws++; nAmtWithdrawn += nAmount;
				}

				jTbl.append(
					'<tr class="' + sRowClass + '">' +
						'<td>' + (new Date(aRows[nX].ADDED)).format("shortDateTime") + '</td>' +
						'<td><a href="#Participant_' + aRows[nX].PARTY_CODE + '">' + aRows[nX].PARTICIPANT + '</a></td>' +
						'<td>' + aRows[nX].CLASS_NAME + '</td>' +
						'<td>' + aRows[nX].DESCRIPTION + '</td>' +
						'<td class="cellAmount">' + nAmount + '</td>' +
					'</tr>'
				);

				if ($.inArray(aRows[nX].PARTY_CODE, aParties) == -1) {
					aParties.push(aRows[nX].PARTY_CODE);
				}

			}

		$("#activityParties").text(aParties.length);
		$("#activityDeposits").html(
			nDeposits.toString() + ",&nbsp;" + nAmtDeposited + "&nbsp;" +
			Application.oUser.TOKENUNIT + "s&nbsp;(" +
			formatCurrency(nAmtDeposited / Application.oUser.TOKENRATE, false, true, false) + ")"
		);
		$("#activityWithdraws").html(
			nWithdraws.toString() + ",&nbsp;" + nAmtWithdrawn + "&nbsp;" +
			Application.oUser.TOKENUNIT + "s&nbsp;(" +
			formatCurrency(nAmtWithdrawn / Application.oUser.TOKENRATE, false, true, false) + ")"
		);
		$("#activityPending").html(
			nPending.toString() + ",&nbsp;" + nAmtPending + "&nbsp;" +
			Application.oUser.TOKENUNIT + "s&nbsp;(" +
			formatCurrency(nAmtPending / Application.oUser.TOKENRATE, false, true, false) + ")"
		);

		$("#elapActivityData").hide();
		$("#btnActivityDataRefresh").hide();
		$("#divActivitySummaryData").show();

	},
	ordersFetched: function (aRows) {
		var jTbl = $("#tblOrdersHistory tbody").empty();
		var jRow, sRowClass;
		var aParties = [];

		if (aRows.length == 0) {
			jTbl.append('<tr><td colspan="7" style="text-align:center">There are no orders in the specified date range.</td></tr>');
		}
		else
			for (var nX = 0; nX < aRows.length; nX++) {

				//<th>Order Date</th> 
				//<th>Ordered By</th>
				//<th>Class</th>
				//<th>Item</th>
				//<th>Qty</th>
				//<th>Invoice</th>
				//<th>Delivered</th> 

				jRow = $(
				'<tr ' + ((!aRows[nX].DELIVERED) ? 'class="ledgerPending"' : '') + '>' +
					'<td>' + aRows[nX].ORDERED.toDateFormat("shortDateTime") + '</td>' +
					'<td>' +
						((aRows[nX].PARTY_CODE) ? '<a href="#Participant_' + aRows[nX].PARTY_CODE + '">' + aRows[nX].PARTICIPANT + '</a>' :
						aRows[nX].PARTICIPANT) +
					'</td>' +
					'<td>' + aRows[nX].CLASS_NAME + '</td>' +
					'<td>' + aRows[nX].PRODUCT_CODE + ': ' + aRows[nX].PRODUCT_NAME + '</td>' +
					'<td class="center">' + aRows[nX].QTYWANTED + '</td>' +
					'<td>' +
						((aRows[nX].CUSTOM_REWARD_ID) ? "Custom Reward" :
						'<a class="fakeAnchor" href="#Activity" invoice_id="' + aRows[nX].INVOICE + '">' +
							aRows[nX].INVOICE +
						'</a>') +
					'</td>' +
					'<td>' +
						((aRows[nX].DELIVERED) ?
							(new Date(aRows[nX].DELIVERED)).format("shortDate") + ' (Qty:&nbsp;' + aRows[nX].QTYGOT + ')' :
							'') +
					'</td>' +
				'</tr>'
				);
				jTbl.append(jRow);

				if ($.inArray(aRows[nX].CODE, aParties) == -1) {
					aParties.push(aRows[nX].CODE);
				}

			}

		$("#tblOrdersHistory a[invoice_id]").click(function () {
			window.aPrintInvoices = [$(this).text()];
			popWindow("/Common/Invoice/PrintInvoice.html", "Print_Invoice");
		});

		$("#elapOrdersData").hide();
		$("#btnOrdersRefresh").hide();

	},
	fetchOrders: function () {
		$("#elapOrdersData").show();
		$("#divInvalidOrdersDates").hide();

		var jRows = $("#tblOrders tbody tr");
		var dFrom = new Date($("#txtOrdersFrom").val());
		var dTo = new Date($("#txtOrdersTo").val());
		dFrom = dFrom.format("Firebird") + " 00:00:00";
		dTo = dTo.add(1).days().format("Firebird") + " 00:00:00";



		var SQL =
			"select * from ADM$ORDERED_ITEMS(" + customer_id.prepSQL() + ",null)\n" +
			"   where ordered >= " + quoteSQL(dFrom) + " and ordered < " + quoteSQL(dTo) + "\n";

		var nClassFilter = $("#selOrdersClasses option:selected").attr("classid").toNumber();
		switch (nClassFilter) {
			case -1: break;
			case 0: SQL += "  and class_id is null"; break;
			default: SQL += "  and class_id = " + nClassFilter.prepSQL(); break;
		}

		var nPendingFilter = $("#btnsOrderFilter input:checked").val().toNumber();
		switch (nPendingFilter) {
			case 1: SQL += "\n      and delivered is null"; break;
			case 2: SQL += "\n      and delivered is not null"; break;
			default: break;
		}

		var nTypeFilter = $("#btnsRewardTypes input:checked").val().toNumber();
		switch (nTypeFilter) {
			case 1: SQL += "\n      and custom_reward_id is null"; break;
			case 2: SQL += "\n      and custom_reward_id is not null"; break;
			default: break;
		}
		SQL += ";";

		$("elapOrdersData").show();

		new execQuery(SQL, function (aRows) {
			activity.ordersFetched(aRows);
		});


	},
	fetchLedger: function () {
		$("#divActivitySummaryData").hide();
		$("elapActivityData").show();
		var jRows = $("#tblActivity tbody tr");
		var dFrom = new Date($("#txtActivityFrom").val());
		var dTo = new Date($("#txtActivityTo").val());
		dFrom = dFrom.format("Firebird") + " 00:00:00";
		dTo = dTo.add(1).days().format("Firebird") + " 00:00:00";

		var nClassFilter = Number(
		$("#selActivityClasses option").eq($("#selActivityClasses")[0].selectedIndex)
		.attr("classid")
		);

		var SQL =
			"select * from adm$party_ledger(" + customer_id.prepSQL() + ",null)\n" +
			"   where added >= " + dFrom.prepSQL() + " and added < " + dTo.prepSQL() + "\n";

		var nClassFilter = $("#selActivityClasses option:selected").attr("classid").toNumber();
		switch (nClassFilter) {
			case -1: break;
			case 0: SQL += "  and class_id is null"; break;
			default: SQL += "  and class_id = " + nClassFilter.prepSQL(); break;
		}
		SQL += ";";

		var oSQL = new execQuery(SQL, function (aRows) {
			activity.ledgerItemsFetched(aRows);
		});
	},
	fetchGraph: function () {
		var cSQL = "select * from adm$activity_graphs(" + customer_id.prepSQL() + ");"

		var oSQL = new execQuery(cSQL, function (aRows) {
			activity.graphData = aRows;
			if ($("#ActivityTabs").tabs("option", "selected") == 2) {
				activity.drawGraphs();
			}
		});

	},
	fetchAll: function () {
		this.fetchClasses();
		this.fetchGraph();
		activity.fetchLedger();
		activity.fetchOrders();
	},

	initialized: false,
	init: function () {
		$("#txtActivityFrom,#txtOrdersFrom").val(Date.today().add(-30).days().moveToFirstDayOfMonth().format("jsDate"));
		$("#txtActivityTo,#txtOrdersTo").val(Date.today().format("jsDate"));

		activity.fetchAll();
		activity.jTabs = $("#ActivityTabs").tabs({
			cookie: { expires: 30, name: "ActivityTabs" },
			show: function (event, tabui) {
				//console.log(tabui);
				if (tabui.index == 2 && activity.graphData) activity.drawGraphs();
			}
		});
		var dates = $(".dateInput").datepicker({
			showOn: 'button',
			buttonImage: "Common/Images/tiny_calendar.gif",
			buttonImageOnly: true,

			defaultDate: null,
			changeMonth: true,
			numberOfMonths: 1,
			onSelect: function (selectedDate) {
				var option = /From/gi.test(this.id) ? "minDate" : "maxDate",
					instance = $(this).data("datepicker");
				date = $.datepicker.parseDate(
						instance.settings.dateFormat ||
						$.datepicker._defaults.dateFormat,
						selectedDate, instance.settings);
				dates.not(this).datepicker("option", option, date);
				if (/Activity/gi.test(this.id))
					activity.fetchLedger();
				else activity.fetchOrders();
			}
		});

		$("#selActivityClasses").change(function () {
			activity.fetchLedger();
		});
		$("#txtActivityFrom, #txtActivityTo").keyup(function () {
			var dMin = new Date('01/01/1900');
			var dMax = new Date('01/01/2200');
			var dFrom = new Date($("#txtActivityFrom").val());
			var dTo = new Date($("#txtActivityTo").val());
			if ((/Invalid|NaN/.test(dFrom) || /Invalid|NaN/.test(dTo)) || (dFrom < dMin || dFrom > dMax || dTo < dMin || dTo > dMax || dFrom > dTo)) {
				//Date(s) invalid, do not refresh
				$("#divInvalidActivityDates").show();
				$("#btnActivityDataRefresh").hide();
				return;
			}
			$("#divInvalidActivityDates").hide();
			$("#btnActivityDataRefresh").show();
		});
		$("#btnActivityDataRefresh").button().hide().click(function () {
			activity.fetchLedger();
			$(this).hide();
		});

		$("#selOrdersClasses").change(function () {
			activity.fetchOrders();
		});
		$("#btnOrdersRefresh").button().hide().click(function () {
			activity.fetchOrders();
			$(this).hide();
		});
		$("#txtOrdersFrom, #txtOrdersTo").keyup(function () {
			var dMin = new Date('01/01/1900');
			var dMax = new Date('01/01/2200');
			var dFrom = new Date($("#txtOrdersFrom").val());
			var dTo = new Date($("#txtOrdersTo").val());
			if ((/Invalid|NaN/.test(dFrom) || /Invalid|NaN/.test(dTo)) || (dFrom < dMin || dFrom > dMax || dTo < dMin || dTo > dMax || dFrom > dTo)) {
				//Date(s) invalid, do not refresh
				$("#divInvalidOrdersDates").show();
				$("#btnOrdersRefresh").button({ disabled: true }).hide();
				return;
			}
			$("#divInvalidOrdersDates").hide();
			$("#btnOrdersRefresh").button({ disabled: false }).show();
		});

		$("#btnsOrderFilter input, #btnsRewardTypes input").change(function () {
			activity.fetchOrders();
		});
		$("#btnsOrderFilter,#btnsRewardTypes").buttonset();

		this.initialized = true;
	}
};
var award = {
	initialized: false,
	isEditing: true,
	titleBarText: '',
	isReward: false,
	sType: 'Award',

	current: {
		aParties: [],
		aClasses: [],
		id: '',
		assigned_to: '', // convert to numeric (0 or 1)
		title: '',
		title_plain: '',
		description: '',
		amount: '',
		expires: '', // convert to date object if not empty
		group_qty: '',
		party_qty: '',
		hidden_from_parties: '',
		html_used: '', // convert to numeric (0 or 1)
		award_type: '',
		default_class: '',
		category: ''
	},
	updated: {
		aParties: [],
		aClasses: [],
		id: '',
		assigned_to: '',
		title: '',
		title_plain: '',
		description: '',
		amount: '',
		expires: '',
		group_qty: '',
		party_qty: '',
		hidden_from_parties: '',
		html_used: '',
		award_type: '',
		default_class: '',
		category: ''
	},
	customTitlePlain: false,

	rewardImage: {
		shrinkTimeOut: null,
		grow: function () {
			var jWrap = $("#divRewardPreviewWrapper");
			var jImg = $(".ProductPopUpImage", jWrap);
			var jDetails = $(".ProductPopUpDetails", jWrap);
			jImg.stop(true, false);
			jDetails.stop(true, true);

			if (jImg.width() < 288) jImg.animate({ width: "288px", height: "288px" }, 750, "easeOutBounce");
			jDetails.fadeOut(500, function () { });
		},
		shrink: function () {
			var jWrap = $("#divRewardPreviewWrapper");
			var jImg = $(".ProductPopUpImage", jWrap);
			var jDetails = $(".ProductPopUpDetails", jWrap);
			jImg.stop(true, false);
			jDetails.stop(true, true);

			var nSpeed = 500;

			jImg.stop(true, false).animate({ width: "95px", height: "95px" }, nSpeed, "easeOutBack", function () { });
			jDetails.fadeIn(nSpeed * .6, function () { });
		},
		uploader: function (btn) {
			btn.button({ label: "Upload Image...", icons: { primary: "ui-icon-circle-arrow-n"} }).removeClass("ui-state-focus ui-state-hover");

			btn.file().choose(function (e, input) {
				$("#hiddenRewardFileName").attr("value", customer_id + "-" + award.current.id + ".gif");

				btn.removeClass("ui-state-focus ui-state-hover");

				input.attr("name", "file_being_uploaded").attr("id", "rewardImageFile");
				$('body').append(input);

				ui.elap.on();
				$.ajaxFileUpload({
					url: 'http://earth.admin.tokenrewards.com/Common/cgi-scripts/save_reward_image.pl',
					secureuri: false,
					fileElementId: 'rewardImageFile',
					fileNameElementId: 'hiddenRewardFileName',
					dataType: null,
					success: function (data, status) {
						ui.elap.off();
						$("#rewardImageFile").remove();
						award.refreshRewardPreview("all");
						award.rewardImage.refreshShopImage();

						if (typeof (data.error) != 'undefined') {
							if (data.error != '') {
								alert(data.error);
							} else {
								alert(data.msg);
							}
						}
					},
					error: function (data, status, e) {
						//$("#divCustomLogo div").html("An error occurred when uploading.<br/>" + e);
					}
				}
				)
			});
		},
		refresh: function () {
			new Run_CGI("/Common/cgi-scripts/customer_image_exists.cgi", { file: customer_id + "-" + award.current.id + ".gif" },
			function (cResult) {

				$(".ProductThumb-Image, .ProductPopUpImage", "#award")
					.attr("src", "/Common/customer_images/" + customer_id + "-" + award.current.id + ".gif" + "?" + Date.now().getTime());

				if (cResult == "false") {
					$("#btnClearRewardImage").hide();
					return false;
				}
				else {
					$("#btnClearRewardImage").show();
					return true;
				}
			});
		},
		remove: function (bDeletingReward) {
			new Run_CGI("/Common/cgi-scripts/customer_image_remove.cgi", { file: customer_id + "-" + award.current.id + ".gif" },
				function () {
					if (bDeletingReward) return;
					award.rewardImage.refresh();
					award.rewardImage.refreshShopImage();
				}
			);
		},
			refreshShopImage: function () {
			var sCode = customer_id + "-" + award.current.id;
			$("#MyShop .ProductThumb[code=" + sCode + "] .ProductThumb-Image," +
				".ProductPopUp[code=" + sCode + "] .ProductPopUpImage")
				.attr("src", "/Common/customer_images/" + sCode + ".gif" + "?" + Date.now().getTime());
		}
	},

	XHR: null,
	init: function () {
		if (this.initialized) return;

		$("#AwardTabs").tabs(
		{ cookie: { expires: 30} }
		);
		var main = function () {

			$("#award .numMinOne").constrainNumeric({ absolute: true, integer: true, minValue: 1 });

			$("#txtAwardExpires").datepicker({
				onSelect: function (dateText, inst) { award.validate(this) },
				showOn: 'button',
				buttonImage: "Common/Images/tiny_calendar.gif",
				buttonImageOnly: true
			});

			$("#chkAwardExpires").change(function () {
				if ($(this).is(":checked")) {
					$("#divAwardExpires").show();
					award.updated.expires = Date.today().add(1).months();
					$("#txtAwardExpires").datepicker("enable").datepicker("setDate", award.updated.expires).datepicker("show");
				}
				else {
					$("#txtAwardExpires").datepicker("setDate", null).datepicker("disable");
					award.updated.expires = '';
					$("#divAwardExpires").hide();
				}
				award.validate(this);
			});

			$("#chkLimitParty, #chkLimitGroup").change(function () {
				var jThis = $(this);
				if (jThis.is(":checked")) {
					jThis.parents('.divCheckInput').find('.divInput').show().find('input').focus();
					var jInput = jThis.siblings('input');
					if (!jInput.val()) {
						jInput.val("1");
						if (jThis.attr("id") == "chkLimitParty") award.updated.party_qty = 1;
						else award.updated.group_qty = 1;
					}
				}
				else {
					jThis.parents('.divCheckInput').find('.divInput').hide();
				}

				award.validate(this);
			});

			$("#award input:text, #award textarea").keyup(function (event) {
				if (event.keyCode != 9) award.validate(this);
			});
			$("#award input:checkbox").change(function () { award.validate(this); });
		} ();

		var tabCertPreviews = function () {
			customerLogo.events($("#btnUpImage"));

			$("#btnClearImage").button({ icons: { primary: "ui-icon-circle-close"} }).click(function () {
				$("#divPrintedPreview .providerLogo").hide();
				$("#divPrintedPreview .providerName").show();
				new Run_CGI("/Common/cgi-scripts/save_customer_logo.pl", { cid: Application.oUser.CUSTOMER_ID, reset: true },
				function () { customerLogo.refresh(); });
			});

			$("#divPrintedPreview").append(certWiz.data.certHTML(true));
			$("#divOnlinePreview").append(awards.getAwardObject(false).addClass("participantView"));
			$("#btnsPartyAwardedView").buttonset().find('input').change(function () {
				if ($(this).val() == "yes")
					$("#divOnlinePreview .awardObject").addClass("awarded");
				else
					$("#divOnlinePreview .awardObject").removeClass("awarded");

				award.refreshCertificate("all");
			});
			if ($("#btnsPartyAwardedView input:checked").val() == "yes")
				$("#divOnlinePreview .awardObject").addClass("awarded");
			else
				$("#divOnlinePreview .awardObject").removeClass("awarded");
			customerLogo.refresh();

			$("#btnsAwardPreview").buttonset().find('input').change(function () {
				award.refreshCertificate("all");
			});
		} ();

		var tabRewardPreview = function () {
			award.rewardImage.uploader($("#btnUploadRewardImage"));

			$("#btnClearRewardImage").button({ icons: { primary: "ui-icon-circle-close"} }).click(function () {
				award.rewardImage.remove();
			});

			var jWrap = $("#divRewardPreviewWrapper");
			$(".ProductPopUpBottom", jWrap).removeClass("hidden");
			$(".ProductPopUpDetails", jWrap).show();

			jWrap.find(".ProductZoomTrigger").hover(
				function () { award.rewardImage.grow(); },
				function () { award.rewardImage.shrink(); })
			.end().find(".ProductPopUpImage").mouseenter(
			function () {
				clearTimeout(award.rewardImage.shrinkTimeOut);
				award.rewardImage.shrink();
			})

		} ();

		var tabEligibilty = function () {
			$("#btnsEligibility").buttonset();
			$("#btnsEligibility input").change(function () {
				award.updated.assigned_to = $(this).val();
				award.refreshEligibility();
				award.validate(this);
			});

			$("#divEligLimits").tabs();

			$("#txtAddEligibleParty").keyup(function () {
				if (award.XHR) award.XHR.abort();
				if (!$(this).val().trim()) {
					$("#wrapAddEligibleParty #noteLimitSearchEmpty").hide();
					$("#wrapAddEligibleParty #noteLimitSearch").hide();
					$("#wrapAddEligibleParty table").hide();
					$("#wrapAddEligibleParty img").hide();
					return;
				}

				$("#wrapAddEligibleParty img").show();

				var SQL =
					"select first 11 code, name, class_name, balance from adm$participants(" +
						customer_id.prepSQL() + ", " +
						"null,'1','-1'," +
						$(this).val().prepSQL() + ");"

				award.XHR = new execQuery(SQL,
				function (aRows) {
					$("#wrapAddEligibleParty img").hide();

					if (aRows.length == 0) {
						$("#wrapAddEligibleParty #noteLimitSearchEmpty").show();
						$("#wrapAddEligibleParty #noteLimitSearch").hide();
						$("#wrapAddEligibleParty table").hide();
						return;
					}
					if (aRows.length > 10) {
						$("#wrapAddEligibleParty #noteLimitSearch").show();
						$("#wrapAddEligibleParty #noteLimitSearchEmpty").hide();
						$("#wrapAddEligibleParty table").hide();
						return;
					}
					$("#wrapAddEligibleParty #noteLimitSearch").hide();
					$("#wrapAddEligibleParty #noteLimitSearchEmpty").hide();
					var jTbody = $("#wrapAddEligibleParty table tbody").empty();

					for (var nX = 0; nX < aRows.length; nX++) {
						var jRow = $(
							'<tr>' +
								'<td>' + aRows[nX].CODE.toUpperCase() + '</td>' +
								'<td>' + aRows[nX].NAME + '</td>' +
								'<td>' + aRows[nX].CLASS_NAME + '</td>' +
								'<td style="text-align:right;">' + aRows[nX].BALANCE + '</td>' +
								'<td class="buttonCell"><span class="cellButton">Add</span></td>' +
							'</tr>'
						);

						$(".cellButton", jRow).data(aRows[nX]).button().click(function () {
							var jThis = $(this);
							if ($.inArray(jThis.data().CODE, award.updated.aParties) == -1) {
								award.updated.aParties.push(jThis.data().CODE);
								award.validate('');
								award.refreshEligibility();
								$("#wrapAddEligibleParty input").focus();
							}
							$("#wrapAddEligibleParty input").val('');
							$("table, .note", "#wrapAddEligibleParty").hide();
						});

						jTbody.append(jRow);
					}
					$("#wrapAddEligibleParty table").show();

				});
			});

			$("#btnAddEligibleClass").button().click(function () {
				var sSelectedClass = $("#wrapAddEligibleClass select").val();
				if ($.inArray(sSelectedClass, award.updated.aClasses) == -1) {
					award.updated.aClasses.push(sSelectedClass);
					award.validate('');
					award.refreshEligibility();
				}
				$(this).addClass('invisible')
			});
			$("#wrapAddEligibleClass select").change(function () {
				var nClassId = $(this).val().toNumber();
				if (nClassId > 0) $("#btnAddEligibleClass").removeClass("invisible");
				else $("#btnAddEligibleClass").addClass("invisible");
			});

		} ();

		var tabAdvanced = function () {
			$("#chkHTML").change(function () {
				if ($(this).is(':checked')) {
					$("#txtAwardTitle, #txtAwardDescription").tabby().keyup(function (event) {
						if (event.keyCode != 9) award.validate(this);
					});
				}
				else {
					$("#txtAwardTitle, #txtAwardDescription").unbind().keyup(function (event) {
						if (event.keyCode != 9) award.validate(this);
					});
				}
			});

			$("#btnTemplate").button().click(function () {
				$("#txtAwardDescription").val(
				'<div class="customCert customFull">\n' +
				'	<span class="certCode">\n' +
				'		CERTCODE\n' +
				'	</span>\n' +
				'</div>\n'
			).keyup();
			});

			$("#btnTemplateHalf").button().click(function () {
				$("#txtAwardDescription").val(
				'<div class="customCert customHalf">\n\n' +
				'</div>\n'
			).keyup();
			});

		} ();

		SetRewardUnitElements("#award");

		this.initialized = true;
	},
	validate: function (elementEdited) {
		//console.log(elementEdited.id);
		var bValid = true;
		var cValidNote = "";
		var updated = award.updated;


		updated.title = $("#txtAwardTitle").val();
		if (!updated.title) {
			$("#titleValidation").fadeIn();
			bValid = false;
			if (this.isReward)
				cValidNote = "Reward Name is missing.";
			else
				cValidNote = "Goal and Award Title is missing.";

		}
		else $("#titleValidation").hide();

		updated.description = $("#txtAwardDescription").val();
		/*
		if (!updated.description) {
		$("#reqsValidation").fadeIn();
		bValid = false;
		if (!cValidNote) cValidNote = "Award Objectives are missing.";
		}
		else $("#reqsValidation").hide();
		*/

		updated.amount = $("#txtAwardAmount").val();
		updated.category = $("#txtAwardCategory").val();

		updated.hidden_from_parties = ($("#chkPartyHide").is(':checked')) ? "1" : "";

		if ($("#chkHTML").is(":checked")) {
			updated.html_used = 1
		}
		else {
			updated.html_used = 0;
		}

		var cNonCustomTP = (updated.html_used) ? updated.title.toSingleLineText() : updated.title.encodeHTML().toSingleLineText();
		if (elementEdited.id == "txtAwardTitlePlain") {
			award.customTitlePlain = (cNonCustomTP != $("#txtAwardTitlePlain").val().trim());
			if (award.customTitlePlain) { updated.title_plain = $("#txtAwardTitlePlain").val().trim(); }
		}
		if (award.customTitlePlain) $("#customTitlePlain").show(); else $("#customTitlePlain").hide();

		if (elementEdited.id == "txtAwardTitle" && !award.customTitlePlain) {
			if (updated.html_used) updated.title_plain = updated.title.toSingleLineText();
			else updated.title_plain = updated.title.encodeHTML().toSingleLineText();
			$("#txtAwardTitlePlain").val(updated.title_plain);
		}

		if ($("#chkAwardExpires").is(":checked")) {
			if (!(new Date($("#txtAwardExpires").val())).isValidDate()) {
				bValid = false;
				if (!cValidNote) cValidNote = "Deadline date is invalid.";
			}
			updated.expires = $("#txtAwardExpires").datepicker("getDate");
		}
		else updated.expires = '';

		if ($("#chkLimitParty").is(":checked"))
			updated.party_qty = $("#txtLimitParty").val();
		else updated.party_qty = '';

		if ($("#chkLimitGroup").is(":checked"))
			updated.group_qty = $("#txtLimitGroup").val();
		else updated.group_qty = '';

		var bDataChanged = false;
		if (bValid) {
			for (var cKey in award.current) {
				if (cKey == "aParties") {
					if (this.arrayToCSV(award.current.aParties) != this.arrayToCSV(updated.aParties)) bDataChanged = true;
				}
				else if (cKey == "aClasses") {
					if (this.arrayToCSV(award.current.aClasses) != this.arrayToCSV(updated.aClasses)) bDataChanged = true;
				}
				else {
					if (award.current[cKey].toString() != updated[cKey].toString())
						bDataChanged = true;
				}
			}
		}

		var jBtnPane = $("#award").siblings(".ui-dialog-buttonpane")
		$("#awardInputValidation").remove();
		if (!bValid) jBtnPane.append('<span id="awardInputValidation">' + cValidNote + '</span>');

		award.isEditing = !bValid || bDataChanged

		jBtnPane.find('button:contains("Save")').button({ disabled: !award.isEditing || !bValid });

		if (elementEdited) {
			if (this.isReward) award.refreshRewardPreview(elementEdited.id)
			else award.refreshCertificate(elementEdited.id);
		}

		award.isEditing = !bValid || bDataChanged || !award.updated.id;
		$('.awardDialogTools').button({ disabled: award.isEditing });
		if (award.isEditing) {
			$("#btnCloseAward").button({ label: "Cancel" });
			$('.awardDialogTools').hide();
		}
		else {
			$("#btnCloseAward").button({ label: "Close" });
			$('.awardDialogTools').show();
		}
	},

	refresh: function () {
		award.updated = $.extend(true, {}, award.current);
		var updated = award.updated;

		var mainInputs = function () {
			$("#txtAwardTitle").val(updated.title);
			$("#txtAwardTitlePlain").val(updated.title_plain);
			$("#txtAwardAmount").val(updated.amount);
			$("#txtAwardDescription").val(updated.description);
			$("#txtAwardCategory").val(updated.category);

			if (updated.expires) {
				$("#chkAwardExpires").attr("checked", "checked");
				$("#txtAwardExpires").datepicker("setDate", updated.expires).datepicker("enable");
				$("#divAwardExpires").show();
			}
			else {
				$("#chkAwardExpires").attr("checked", false);
				$("#txtAwardExpires").val("").datepicker("setDate", null).datepicker("disable");
				$("#divAwardExpires").hide();
			}
			$("#ui-datepicker-div").hide();

			if (updated.party_qty) {
				$("#chkLimitParty").attr("checked", "checked");
				$("#txtLimitParty").val(updated.party_qty).parent().show();
			}
			else {
				$("#chkLimitParty").attr("checked", false);
				$("#txtLimitParty").val("").parent().hide();
			}

			if (updated.group_qty) {
				$("#chkLimitGroup").attr("checked", "checked");
				$("#txtLimitGroup").val(updated.group_qty).parent().show();
			}
			else {
				$("#chkLimitGroup").attr("checked", false);
				$("#txtLimitGroup").val("").parent().hide()
			}
		} ();

		if (award.isReward) award.refreshRewardPreview('all')
		else award.refreshCertificate("all");

		var advancedTab = function () {
			$("#chkPartyHide").attr("checked", (updated.hidden_from_parties == "1"));

			if (updated.html_used == 1) {
				$("#chkHTML").attr("checked", true);
				$("#txtAwardTitle, #txtAwardDescription").tabby().keyup(function (event) { if (event.keyCode != 9) award.validate(this); });
			}
			else {
				$("#chkHTML").attr("checked", false);
				$("#txtAwardTitle, #txtAwardDescription").unbind().keyup(function (event) { award.validate(this); });
			}

			var cNonCustomTP = (updated.html_used) ? updated.title.toSingleLineText() : updated.title.encodeHTML().toSingleLineText();
			award.customTitlePlain = (cNonCustomTP != updated.title_plain);
			if (award.customTitlePlain) $("#customTitlePlain").show(); else $("#customTitlePlain").hide();
		} ();

		if (updated.id) {
			award.isEditing = false;
			var jBtnPane = $("#award").siblings(".ui-dialog-buttonpane");
			$('.awardDialogTools').button({ disabled: false });
			$("#btnCloseAward").button({ label: "Close" });
		}
		this.refreshEligibility();

		award.isEditing = true;
		this.validate(false);
	},
	refreshCertificate: function (cItemEdited) {
		if (!cItemEdited) return;
		var updated = award.updated;
		var cert = $.extend({}, updated);

		if (updated.html_used == 0) {
			cert.title = cert.title.encodeHTML();
			cert.description = cert.description.encodeHTML();
		}


		$(".awardPreviewPane").hide();
		var cViewId = $("#btnsAwardPreview input:checked").val() + " ";
		var cExpires = (award.updated.expires) ? award.updated.expires.getTime() : "Infinity".toNumber();

		if (cItemEdited == "all" || cItemEdited == "chkHTML") {
			$(cViewId).show()
			.find(".title").html(cert.title).end()
			.find(".description").html(cert.description).end();

			commonHTML.drawCertAmount(cViewId, cert.amount);

			if (cViewId.trim() == "#divOnlinePreview") {
				$(cViewId)
				.find(".details .deadline").addClass((Date.today().getTime() > cExpires) ? "attentionOnStat" : "")
					.find(".detailValue").html((updated.expires) ? (new Date(updated.expires)).format("shortDate") : "None").end().end()
				.find(".details .awarded")
					.find(".detailValue").html((($("#btnsPartyAwardedView input:checked").val() == "yes") ? "1" : "0") +
					 ((award.updated.party_qty) ? '&nbsp;of&nbsp;' + award.updated.party_qty : ''));
			}
		}
		else {
			$(cViewId).show();
			if (cItemEdited.match(/title/i)) $(cViewId + " .title").html(cert.title);
			if (cItemEdited.match(/description/i)) $(cViewId + " .description").html(cert.description);
			if (cItemEdited.match(/amount/i)) {
				commonHTML.drawCertAmount(cViewId, cert.amount);
			}

			if (cViewId.trim() == "#divOnlinePreview") {
				if (cItemEdited.match(/AwardExpires/i)) {
					$(cViewId)
					.find(".details .deadline").addClass((Date.today().getTime() > cExpires) ? "attentionOnStat" : "")
						.find(".detailValue").html((updated.expires) ? (new Date(updated.expires)).format("shortDate") : "None").end().end()
				}
				if (cItemEdited.match(/LimitParty/i)) {
					$(cViewId).find(".details .awarded")
					.find(".detailValue").html((($("#btnsPartyAwardedView input:checked").val() == "yes") ? "1" : "0") +
					 ((award.updated.party_qty) ? '&nbsp;of&nbsp;' + award.updated.party_qty : ''));
				}

			}

		}
	},
	refreshRewardPreview: function (cItemEdited) {
		if (!cItemEdited) return;
		var updated = award.updated;
		var sTitle = updated.title;
		var sDescription = updated.description;

		if (updated.html_used == 0) {
			sTitle = sTitle.encodeHTML();
			sDescription = sDescription.encodeHTML();
		}

		var jPreviews = $(".ProductThumb, .ProductPopUp", "#divRewardPreviewWrapper");

		if (cItemEdited == 'all') {
			jPreviews.find(".ProductThumb-Name,.ProductPopUpName").html(sTitle).end()
				.find(".ProductPopUpDescript").html(sDescription).end()
				.find(".UserPrice,.TokenPrice").text(updated.amount).end()
				.find(".categoryName").text(updated.category).end()
				.find(".TextRewardUnits").text(Application.oUser.TOKENUNIT.toPlural(updated.amount));


			if (updated.id) {
				$("#divImageButtons").show();
				award.rewardImage.refresh();
			}

			return;
		}
		if (cItemEdited.match(/title/i)) jPreviews.find(".ProductThumb-Name,.ProductPopUpName").html(sTitle);
		if (cItemEdited.match(/description/i)) jPreviews.find(".ProductPopUpDescript").html(sDescription);
		if (cItemEdited.match(/category/i)) $(".categoryName", jPreviews).text(updated.category)
		if (cItemEdited.match(/amount/i)) {
			jPreviews.find(".UserPrice,.TokenPrice").text(updated.amount).end()
			.find(".TextRewardUnits").text(Application.oUser.TOKENUNIT.toPlural(updated.amount));
		}

	},
	refreshEligibility: function () {
		var aParties = award.updated.aParties;
		var aClasses = award.updated.aClasses;
		if (award.updated.assigned_to == 0) {
			$("#btnsEligibilityAll").attr("checked", true)
			$("#btnsEligibilityLimited").attr("checked", false)
			$("#btnsEligibility").buttonset("refresh");
			$("#divEligLimits").hide();
			$("#eligiblePartyCount").text("Open");
			return;
		}

		if (aParties.length == 0 && aClasses.length == 0) {
			$("#eligiblePartyCount").text("None");
		}
		else {
			$("#eligiblePartyCount").text("Limited");
		}

		$("#btnsEligibilityAll").attr("checked", false)
		$("#btnsEligibilityLimited").attr("checked", true)
		$("#btnsEligibility").buttonset("refresh");
		$("#divEligLimits").show();

		var refreshParties = function () {
			if (!aParties.length) {
				$("#tblEligibleParties").hide();
				return;
			}
			$("#tblEligibleParties").show();

			var cCodes = '';
			var jTbody = $("#tblEligibleParties tbody").empty();

			for (var nX = 0; nX < aParties.length; nX++) {
				if (cCodes) cCodes += ",";
				cCodes += aParties[nX].prepSQL();
				var jRow = $(
					'<tr party_code="' + aParties[nX] + '">' +
						'<td></td>' +
						'<td></td>' +
						'<td></td>' +
						'<td style="text-align:right; padding-right:10px"></td>' +
						'<td class="buttonCell">' +
							'<span class="cellButton" title="Remove participant from eligibility list."></span>' +
						'</td>' +
					'</tr>'
				);
				$(".cellButton", jRow).button({ text: false, icons: { primary: 'ui-icon-trash'} })
				.click(function () {
					var sCode = $(this).parents('[party_code]').attr('party_code');
					var nX = $.inArray(sCode, award.updated.aParties);
					award.updated.aParties.splice(nX, 1);
					award.validate('');
					award.refreshEligibility();
				});
				jTbody.append(jRow);
			}
			var query = new execQuery("select code, name, class_name, balance \n" +
				"  from adm$participants(" + Application.oUser.CUSTOMER_ID.prepSQL() + ",null,'-1','-1',null) \n" +
				"  where code in (" + cCodes + ");",
			function (data) {
				for (var nX = 0; nX < data.length; nX++) {
					jTbody.find('tr[party_code="' + data[nX].CODE + '"] td')
					.eq(0).text(data[nX].CODE.toUpperCase()).end()
					.eq(1).text(data[nX].NAME).end()
					.eq(2).text(data[nX].CLASS_NAME).end()
					.eq(3).text(data[nX].BALANCE);
				}
			});
		} ();

		var refreshClasses = function () {

			$("#AssignClassNote, #tblEligibleClasses").hide();

			new execQuery("select * from adm$classes(" + customer_id.prepSQL() + ");",
			function (aClasses) {
				if (!aClasses.length) { $("#wrapAddEligibleClass").hide(); return; }

				$("#wrapAddEligibleClass").show();

				var jTbody = $("#tblEligibleClasses tbody").empty();
				$("#wrapAddEligibleClass select").empty().append('<option value="">Select One..</option>');
				for (var nX = 0; nX < aClasses.length; nX++) {
					var nIndex = $.inArray(aClasses[nX].ID, award.updated.aClasses);
					if (nIndex == -1) {
						$("#wrapAddEligibleClass select").append(
							'<option value="' + aClasses[nX].ID + '">' +
								aClasses[nX].CLASS_NAME +
							'</option>');
					}
					else {
						var jRow = $(
	'<tr class_id="' + aClasses[nX].ID + '">' +
		'<td>' +
			aClasses[nX].CLASS_NAME +
			'<span class="floatRight">' + aClasses[nX].ACTIVE_PARTICIPANTS + '</span>' +
		'</td>' +

		((award.isReward) ? '<td style="display:none;"></td>' :
		'<td style="text-align:center;">' +
			'<input type="checkbox" ' + ((award.updated.default_class == aClasses[nX].ID) ? 'checked="checked"' : '') + ' />' +
		'</td>'
		) +
		'<td class="buttonCell">' +
			'<span class="cellButton" title="Remove from list of eligible classes."></span>' +
		'</td>' +
	'</tr>'
						);
						$('input', jRow).click(function () {
							if ($(this).is(":checked")) {
								$("#tblEligibleClasses input").not($(this)).attr("checked", false);
								award.updated.default_class = $(this).parents("[class_id]").attr("class_id");
							}
							else
								award.updated.default_class = '';

							award.validate(this);
							//award.refreshEligibility();
						});
						$(".cellButton", jRow).button({ text: false, icons: { primary: 'ui-icon-trash'} })
						.click(function () {
							var nIndex = $.inArray($(this).parents("[class_id]").attr("class_id"), aClasses);
							award.updated.aClasses.splice(nIndex, 1);
							award.validate(this);
							award.refreshEligibility();
						});

						jTbody.append(jRow);

					}
				}

				if (award.updated.aClasses.length) {
					$("#tblEligibleClasses").show();
					if (!award.isReward) $("#AssignClassNote").show();
				}
			});
		} ();
	},
	refreshHistory: function (aRows) {
		var jTbody = $("#tabAwardHistory tbody").empty();

		for (var nX = 0; nX < aRows.length; nX++) {
			jTbody.append(
				'<tr>' +
					'<td>' + aRows[nX].AWARD_DATE.toDate().format("shortDateTime") + '</td>' +
					'<td><a href="#Participant_' + aRows[nX].PARTY_CODE + '">' + aRows[nX].NAME + '</a></td>' +
					'<td>' + aRows[nX].CLASS_NAME + '</td>' +
					'<td class="cellAmount">' + aRows[nX].AMOUNT + '</td>' +
					((!award.isReward) ? '<td>' + aRows[nX].CERTIFICATE_CODE.toUpperCase() + '</td>' : '') +
				'</tr>'
			);
		}
	},
	refreshParties: function (aRows) {
		var jTbody = $("#tabAwardRecipients tbody").empty();

		for (var nX = 0; nX < aRows.length; nX++) {
			jTbody.append(
				'<tr>' +
					'<td><a href="#Participant_' + aRows[nX].PARTY_CODE + '">' + aRows[nX].NAME + '</a></td>' +
					'<td>' + aRows[nX].CLASS_NAME + '</td>' +
					'<td class="cellAmount">' + aRows[nX].OCCURS + '</td>' +
					'<td>' + aRows[nX].LAST_OCCURS.toDate().format("shortDateTime") + '</td>' +
					'<td class="cellAmount">' + aRows[nX].BALANCE + '</td>' +
				'</tr>'
			);
		}



	},

	insert: function (aParties, sType) {
		ui.openWait("Loading New " + sType + "...");

		this.init();
		this.sType = sType;
		LogEntry("New " + sType + " dialog opened.");

		for (var cKey in award.current) {
			award.current[cKey] = '';
		}

		if (sType == "Award") {
			this.current.award_type = "0";
			this.isReward = false;
			$("#award .show-Award").show();
			$("#award .show-Reward").hide();
			$("#AwardTabs").tabs('select', 0);
			this.titleBarText = "Create New Goal and Award";
		}
		else {
			this.current.award_type = "1";
			this.isReward = true;
			$("#award .show-Award").hide();
			$("#award .show-Reward").show();
			$("#AwardTabs").tabs('select', 1);
			$("#divImageButtons").hide();
			this.titleBarText = "Create New Custom Reward";
		}

		if (aParties != null && aParties.length > 0) {
			this.current.aParties = aParties.slice(0, aParties.length);
			this.current.assigned_to = 1;
		}
		else {
			this.current.assigned_to = 0;
			this.current.aParties = [];
		}

		this.current.aClasses = [];
		this.current.hidden_from_parties = "";
		this.current.html_used = 0;
		this.current.amount = "1";
		this.current.category = "";
		this.current.default_class = "";

		award.isEditing = true;

		award.refreshHistory([]);
		award.refreshParties([]);

		this.open();
	},
	update: function (cId, sType) {
		ui.openWait("Loading Existing " + sType + "...");
		this.init();

		if (sType == "Award") {
			this.isReward = false;
			$("#award .show-Award").show();
			$("#award .show-Reward").hide();
			$("#AwardTabs").tabs('select', 0);
			this.titleBarText = "Edit Existing Goal and Award";
		}
		else {
			this.isReward = true;
			$("#award .show-Award").hide();
			$("#award .show-Reward").show();
			$("#AwardTabs").tabs('select', 1);
			this.titleBarText = "Edit Existing Custom Reward";
		}

		LogEntry("Edit Existing " + sType + " dialog opened. id #" + cId);

		var cSQL =
			"select * from adm$awards(" + Application.oUser.CUSTOMER_ID.prepSQL() + ", null) where id = " + cId.prepSQL() + ";" +
		String.fromCharCode(13) +
			"select * from adm$award_history(" + Application.oUser.CUSTOMER_ID.prepSQL() + "," + cId.prepSQL() + ");" +
		String.fromCharCode(13) +
			"select party_code, count(*) as occurs, max(award_date) as last_occurs, " + String.fromCharCode(13) +
				"max(name) as name, max(balance) as balance, max(class_name) as class_name " + String.fromCharCode(13) +
			"from adm$award_history(" + Application.oUser.CUSTOMER_ID.prepSQL() + "," + cId.prepSQL() + ") " +
			"group by party_code order by name ascending";
		new execQuery(cSQL, function (data) {
			if (data.length == 0) return;

			var cur = award.current;
			var rec = data[0][0];

			cur.id = cId;
			cur.assigned_to = Number(rec.ASSIGNED_TO);
			cur.hidden_from_parties = rec.HIDDEN_FROM_PARTIES;
			cur.html_used = Number(rec.HTML_USED);
			cur.title = (cur.html_used == 1) ? rec.TITLE.replace(/\r/g, "") : rec.TITLE.decodeHTML();
			cur.title_plain = rec.TITLE_PLAIN;
			cur.description = (cur.html_used == 1) ? rec.DESCRIPTION.replace(/\r/g, "") : rec.DESCRIPTION.decodeHTML();

			cur.amount = rec.AMOUNT;
			cur.expires = (rec.EXPIRES) ? (new Date(rec.EXPIRES)) : "";
			cur.group_qty = rec.GROUP_QTY;
			cur.party_qty = rec.PARTY_QTY;
			if (rec.ASSIGNED_IDS.split(",")[0].length == 0) cur.aParties.length = 0;
			else cur.aParties = rec.ASSIGNED_IDS.split(",");

			if (rec.CLASS_IDS.split(",")[0].length == 0) cur.aClasses.length = 0;
			else cur.aClasses = rec.CLASS_IDS.split(",");

			cur.award_type = rec.AWARD_TYPE;
			cur.default_class = rec.DEFAULT_CLASS;
			cur.category = rec.CATEGORY;

			award.refreshHistory(data[1]);
			award.refreshParties(data[2]);

			award.open();
		});
	},

	open: function () {
		this.initCategoryAutoComplete(function () {
			$("#award").dialog({
				autoOpen: false,
				title: award.titleBarText,
				modal: true,
				width: 840,
				height: 510,
				buttons: [
					{ text: "Help", click: function () { UsageTips.HelpMenu(5); } },
					{ text: "Delete...", click: function () { award.deleteRec(); } },
					{ text: "Print Certificates...", click: function () { award.print(); } },
					{ text: "Save", click: function () { award.save(); } },
					{ text: "Cancel", click: function () { award.cancel(); } }
				],
				open: function () {
					var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
					jBtns.eq(0).button({ text: false, icons: { primary: "ui-icon-help"} }).css("float", "left").hide();
					jBtns.eq(1).button({ icons: { primary: "ui-icon-trash" }, disabled: true }).addClass("awardDialogTools").css({ "float": "left", "margin-left": "30px" });
					jBtns.eq(2).button({ icons: { primary: "ui-icon-print" }, disabled: true }).addClass("awardDialogTools").css({ "float": "left", "margin-left": "30px" });
					//				jBtns.eq(3).button({ icons: { primary: "ui-icon-star" }, disabled: true }).addClass("awardDialogTools");
					jBtns.eq(3).button({ icons: { primary: "ui-icon-check" }, disabled: true });
					jBtns.eq(4).button({ icons: { primary: "ui-icon-closethick"} }).attr("id", "btnCloseAward");

					if (award.isReward) {
						jBtns.eq(2).remove();
						jBtns.eq(1).button({ label: "Delete Reward..." });
					}

					$(".ui-button").bind("focusout", function () { $(this).removeClass("ui-state-focus"); });

					award.refresh();
					ui.closeWait();

					$("#txtAwardTitle").focus();
				},
				close: function () {
					$(this).dialog("destroy");
				}
			});
			$("#award").dialog("open");
		});
	},

	save: function () {
		ui.elap.on();
		var updated = award.updated;
		LogEntry("Changes to award id #" + updated.id + " saved.")
		var jBtnPane = $("#award").siblings(".ui-dialog-buttonpane")
		jBtnPane.find('button:contains("Save")').button({ disabled: true });
		$("#panelEligibility").accordion("activate", false);

		var cExpires = (updated.expires) ? updated.expires.format("Firebird") : '';
		var cPartyCodes = this.arrayToCSV(updated.aParties);
		var cClassIds = this.arrayToCSV(updated.aClasses);

		var cTitle = (updated.html_used == 1) ? updated.title : updated.title.encodeHTML();
		if (!updated.title_plain) {
			award.customTitlePlain = false;
			updated.title_plain = cTitle.toSingleLineText();
		}
		var cDescript = (updated.html_used == 1) ? updated.description : updated.description.encodeHTML();

		if (updated.title.length > 1000) updated.title = updated.title.slice(0, 1000);

		var cSQL = "select * from ADM$AWARDS_IUD(" +
						Application.oUser.CUSTOMER_ID.prepSQL() + "," +
						"null, " +
						updated.id.prepSQL(true) + ", " +
						updated.assigned_to.prepSQL() + ", " +
						cTitle.prepSQL() + ", " +
						updated.title_plain.prepSQL() + ", " +
						cDescript.prepSQL() + ", " +
						updated.amount.prepSQL() + ", " +
						cExpires.prepSQL(true) + ", " +
						updated.party_qty.prepSQL(true) + ", " +
						updated.group_qty.prepSQL(true) + ", " +
						updated.hidden_from_parties.prepSQL(true) + ", " +
						updated.html_used.prepSQL(true) + ", " +
						updated.award_type.prepSQL() + "," +
						cPartyCodes.prepSQL() + "," +
						cClassIds.prepSQL() + "," +
						updated.default_class.prepSQL(true) + "," +
						updated.category.prepSQL(true) + ")";

		var query = new execQuery(cSQL, function (data) {
			$("#award").dialog("options", "title", "Edit Award");
			award.updated.id = data[0].UPDATED_ID;
			award.current = false;
			award.current = $.extend(true, {}, award.updated);

			if (award.isReward) {
				shop.refresh();
				var sCode = customer_id + "-" + award.current.id;
				for (var nX = 0; nX < Catalog.aPopups.length; nX++) {
					// Kill the pop so a new one will be built.
					if (Catalog.aPopups[nX].tip.attr('code') == sCode) {
						Catalog.aPopups[nX].tip.remove();
						Catalog.aPopups.splice(nX);
						break;
					}
				}
			}
			else {
				awards.refresh();
				for (var nX = 0; nX < participants.partyDialogs.length; nX++) {
					participants.partyDialogs[nX].refreshAwards(false);
				}
			}

			award.refresh();
			ui.elap.off();
		});

	},
	cancel: function () {
		if ((!award.updated.id && award.isEditing) || (award.updated.id && !award.isEditing)) {
			if (!award.updated.id) LogEntry("New Award dialog canceled.");
			$("#award").dialog('close');
		}
		else {
			LogEntry("Award Dialog edits canceled.");
			award.updated = $.extend(true, {}, award.current);
			award.refresh();
		}
		$("#panelEligibility").accordion("activate", false);
	},
	deleteRec: function () {
		var oMessage = {};
		if (award.isReward) oMessage = {
			title: "Delete Reward?",
			message: "Are you absolutely sure want to permanently delete this reward?<br/><br/>" +
			"<b>This cannot be undone!</b>"
		}
		else oMessage = {
			title: "Delete Award?",
			message: 'Are you absolutely sure want to permanently delete this award?<br/><br/>' +
				'Please note that any outstanding certificates printed for this award <b>cannot be redeemed</b> by participants.' +
				'They will recieve a message stating that the award is <b>"not&nbsp;being&nbsp;honored."</b>'
		}
		oMessage.action = function () {
			ui.openWait("Deleting " + award.sType + "...");
			if (award.isReward) award.rewardImage.remove(true);

			var cSQL = "select * from ADM$AWARDS_IUD(" + Application.oUser.CUSTOMER_ID.prepSQL() + ", 1, " +
						award.updated.id.prepSQL() + ", " +
						"null, " +
						"null, " +
						"null, " +
						"null, " +
						"null, " +
						"null, " +
						"null, " +
						"null, " +
						"null, " +
						"null, " +
						"null, " +
						"null, " +
						"null, " +
						"null, " +
						"null);";

			new execQuery(cSQL, function (data) {
				$("#award").dialog("close");
				ui.closeWait();
				ui.modalMessage({
					title: award.sType + " Deleted",
					message: "The " + award.sType.toLowerCase() + " has been successfully deleted."
				});
				for (var nX = 0; nX < participants.partyDialogs.length; nX++) {
					participants.partyDialogs[nX].refreshAwards(false);
				}
				if (award.isReward) shop.refresh();
				else awards.refresh();
			});
		}
		ui.modalConfirm(oMessage);
	},
	print: function () {
		certWiz.open({ type: "redeem", award_id: award.updated.id });
		$("#award").dialog('close');
	},

	initCategoryAutoComplete: function (fnCallback) {
		new execQuery(
			"select distinct category \n" +
			"  from adm$awards(" + Application.oUser.CUSTOMER_ID.prepSQL() + ",null)\n" +
			"  where category is not null and award_type = " + this.current.award_type.prepSQL() + ";",
			function (data) {
				var aRows = [];
				if (data.length) {
					for (var nX = 0; nX < data.length; nX++) {
						aRows[nX] = data[nX].CATEGORY;
					}
				}
				else {
					if (award.isReward) {
						aRows[0] = Application.oUser.PROVIDER_NAME + " Rewards";
						award.current.category = Application.oUser.PROVIDER_NAME + " Rewards";
					}
				}

				$("#txtAwardCategory")
				.autocomplete("destroy")
				.autocomplete({ minLength: 0, source: aRows });
				if (award.isReward && !award.current.id) {
					award.current.category = Application.oUser.PROVIDER_NAME + " Rewards";
					//$("#txtAwardCategory").val()
				}

				if (fnCallback) fnCallback();
			}
		);
	},

	arrayToCSV: function (array) {
		var aNew = array.slice(0, array.length).sort();
		var cReturn = '';
		for (var nX = 0; nX < aNew.length; nX++) {
			if (cReturn) cReturn += ",";
			cReturn += aNew[nX];
		}
		return cReturn;
	}
};
var awards = {
	initialized: false,
	jGrid: null,
	aoData: [],

	init: function () {
		if (this.initialized) {
			awards.resize();
			return;
		}

		var gridDefaults = {
			"iDisplayLength": 25,
			"aLengthMenu": [[10, 25, 50, 100, 150, -1], [10, 25, 50, 100, 150, "All"]],
			"bStateSave": true,
			"iCookieDuration": 365 * 60 * 60 * 24, /* 1 year */
			"sCookiePrefix": "earth_",
			"bScrollCollapse": true,
			"bJQueryUI": true,
			"bAutoWidth": false,
			"sWidth": "100%",
			"sScrollY": "1px",
			"sScrollX": "100%",
			"sPaginationType": "full_numbers",
			"bProcessing": true,
			"bScrollInfinite": false,
			"aaData": []
		};
		var oConfig = {
			"sDom": '<"dataTables_header ui-widget-header ui-corner-top ui-helper-clearfix"TClfr>t' +
				'<"dataTables_footer ui-widget-header ui-corner-bottom ui-helper-clearfix"ip>',
			"oLanguage": {
				"sInfo": "Showing _START_ to _END_ of _TOTAL_ awards",
				"sInfoFiltered": "(filtered from _MAX_ total awards)",
				"sLengthMenu": "Show _MENU_ awards at a  time",
				"sInfoEmpty": "There are no awards to display.",
				"sZeroRecords": '<div style="margin:.7em">There are no awards to display.&nbsp;&nbsp;Click "Create New Goal..." to make a new goal.</div>'
			},
			"fnStateSaveCallback": function (oSettings, sValue) {
				// Don't save the search filter (save it as blank always)
				sValue = sValue.replace(/"sFilter":".*?"/, '"sFilter":""');
				return sValue;
			},
			"fnDrawCallback": function () {

				return;
			},
			"sScrollXInner": "145em",
			"aoColumns": [
				{ "sTitle": "", "sWidth": "6em", "bSortable": false, "bSearchable": false, "sClass": "open" },
				{ "sTitle": "Goal and Award Title", "sWidth": "20em", "sClass": "title" },
				{ "sTitle": "Details (objectives, instructions, etc.)", "sWidth": "30em", "sClass": "awarddetails" },
				{ "sTitle": "Category", "sWidth": "8em", "sClass": "category", "bVisible": false },
				{ "sTitle": Application.oUser.TOKENUNIT + "s", "sWidth": "8em", "sClass": "integer", "bSearchable": false },
				{ "sTitle": "Eligibility", "sWidth": "8em", "bVisible": false },

				{ "sTitle": "Expires", "sWidth": "6em", "bSearchable": false, "asSorting": ["desc", "asc"], "iDataSort": 14, "sType": "numeric", "bVisible": false },

				{ "sTitle": "Awarded", "sWidth": "6em", "bSearchable": false, "sClass": "integer", "asSorting": ["desc", "asc"], "bVisible": false },
				{ "sTitle": "Remaining", "sWidth": "7em", "bSearchable": false, "sClass": "integer", "asSorting": ["desc", "asc"], "bVisible": false },
				{ "sTitle": "Award Limit", "sWidth": "5em", "bSearchable": false, "sClass": "integer", "asSorting": ["desc", "asc"], "bVisible": false },
				{ "sTitle": "Indv. Limit", "sWidth": "5em", "bSearchable": false, "sClass": "integer", "asSorting": ["desc", "asc"], "bVisible": false },

				{ "sTitle": "Assign Class", "sWidth": "10em", "bSearchable": true, "asSorting": ["asc", "desc"], "bVisible": false },

				{ "sTitle": "Updated", "sWidth": "14em", "sClass": "", "bSearchable": false, "asSorting": ["desc", "asc"], "iDataSort": 15, "sType": "numeric" },
				{ "sTitle": "Created", "sWidth": "14em", "sClass": "", "bSearchable": false, "asSorting": ["desc", "asc"], "iDataSort": 16, "sType": "numeric" },

				{ "sTitle": "Displayed", "sWidth": "8em", "sClass": "", "bSearchable": false },
				{ "sTitle": "Layout", "sWidth": "7em", "sClass": "", "bSearchable": false, "bVisible": false },

				{ "sTitle": "expires_int", "sWidth": "1px", "bVisible": false, "bSearchable": false },
				{ "sTitle": "updated_int", "sWidth": "1px", "bVisible": false, "bSearchable": false },
				{ "sTitle": "created_int", "sWidth": "1px", "bVisible": false, "bSearchable": false },
				{ "sTitle": "award_type", "sWidth": "1px", "bVisible": false, "bSearchable": false },

				{ "sWidth": "auto", "bSearchable": false, "bSortable": false }

			],
			"oColVis": {
				"aiExclude": [0, 16, 17, 18, 19, 20],
				"fnStateChange": function () { }
			},
			"fnRowCallback": function (nRow, aData, iDisplayIndex) {
				$('td.open', nRow).attr("award_id", aData[0]).html('<span>Open...</span>')
				.find('span').button({ icons: { primary: ""} })
				.click(function (event) {
					event.stopPropagation();
					award.update($(this).attr("award_id"), "Award");
				}).attr("award_id", aData[0]);

				$('td:eq(1) .AdmitAward', nRow).remove();
				if (aData[19] == "-1") {
					$('td:eq(1)', nRow).append(
						'<div class="AdmitAward">(Auto-created by Certificate Wizard)</div>'
					);
				}

				var oAward = {};
				for (var nX = 0; nX < awards.aoData.length; nX++) {
					if (awards.aoData[nX].ID == aData[0]) {
						oAward = awards.aoData[nX];
						break;
					}
				}


				$('td:eq(1) .awardWarning', nRow).remove();
				var jDiv = $(
					'<div class="awardWarning inline">' +
						'<div class="warningSign"></div>' +
					'<\div>'
				);
				jDiv = Catalog.setWarnings(oAward, jDiv);
				if ($(".warningSign", jDiv).attr("title")) {
					$('td:eq(1)', nRow).prepend(jDiv);
				}

				$(nRow).unbind().dblclick(function (event) {
					event.stopPropagation();
					var cAwardId = $('td.open', this).attr("award_id");
					award.update(cAwardId, "Award");
				});

				return nRow;
			}
		}

		oConfig = $.extend(true, {}, oConfig, gridDefaults);
		this.jGrid = $("#tblAwards").dataTable(oConfig);

		var initHeadFoot = function () {
			var jHead = $("#tblAwards_wrapper .dataTables_header");
			$(".ColVis_MasterButton", jHead).button({ label: "Choose Columns...", icons: { secondary: "ui-icon-triangle-1-s"} });
			var jBtn = $('<button id="btnNewAward"></button>')
			.button({ label: "Create New Goal and Award...", icons: { primary: "ui-icon-plus"} })
			.click(function () { award.insert(null, "Award"); });
			jHead.append(jBtn);
			var jPrint = $('<button id="btnOpenCertWiz"></button>')
			.button({ label: "Print " + Application.oUser.TOKENUNIT + "s &amp; Certificates...", icons: { primary: "ui-icon-print"} })
			.click(function () { certWiz.open(); });
			jHead.append(jPrint);

			var jFooter = $("#tblAwards_wrapper .dataTables_footer");
			var jReload = $('<button id="tblAwards_reload">Refresh Data</button>').button().click(function () { awards.refresh(); });
			$(jFooter).prepend(jReload);

			var jReset = $('<button id="tblAwards_reset">Reset Grid...</button>').button().click(function () {
				ui.modalConfirm({
					title: "Resest Grid?",
					message: 'Click "Okay" to reset your Awards grid cookie to its default settings. <br/><br/>' +
					'This will cause all hidden columns to appear in their default positions.',
					action: function () {
						$.cookie("earth_tblAwards_", null);
						ui.openWait("Reloading Admin...");
						window.location.reload();
					}
				});
			});
			$(jFooter).prepend(jReset);
		} ();

		this.initialized = true;
		this.refresh();
	},
	createRowArray: function (aRow) {
		return [
		/* 0 */aRow.ID,
		/* 1 */aRow.TITLE_PLAIN,
		/* 2 */aRow.DESCRIPTION,
		/* 3 */aRow.CATEGORY,
		/* 4 */aRow.AMOUNT,
		/* 5 */(aRow.ASSIGNED_TO == 1) ? "Limited" : "Open to All",
		/* 6 */aRow.EXPIRES.toDateFormat("shortDateTime"),

		/* 7 */aRow.GROUP_QTY_AWARDED.toEmptyFromZero(),
		/* 8 */aRow.GROUP_QTY_AVAILABLE.toEmptyFromZero(),

		/* 9 */aRow.GROUP_QTY.toEmptyFromZero(),
		/* 10*/aRow.PARTY_QTY.toEmptyFromZero(),

		/*11 */aRow.DEFAULT_CLASS_NAME,

		/*12 */aRow.LAST_UPDATE.toDateFormat("shortDateTime"),
		/*13 */aRow.CREATED.toDateFormat("shortDateTime"),
		/*14 */(aRow.HIDDEN_FROM_PARTIES) ? "No" : "Yes",
		/*15 */(aRow.HTML_USED) ? "Standard" : "Advanced",

		/*16 */(aRow.EXPIRES) ? aRow.EXPIRES.toDate().getTime() : 0,
		/*17 */(aRow.LAST_UPDATE) ? aRow.LAST_UPDATE.toDate().getTime() : 0,
		/*18 */(aRow.CREATED) ? aRow.CREATED.toDate().getTime() : 0,

		/*19 */aRow.AWARD_TYPE,

		/*20 */"&nbsp;&nbsp;&nbsp;"		//dummy spacing column
		]
	},

	resize: function () {
		var jWrap = $("#tblAwards_wrapper");
		var nWrapHeight = jWrap.height();
		var nHead = $('.dataTables_header', jWrap).height();
		var nFoot = $('.dataTables_footer', jWrap).height();
		var nScrollHead = $('.dataTables_scrollHead', jWrap).height() + 20;
		// + 20 for height of bottom horizontal scroll bar

		var nScrollHeight = nWrapHeight - (nHead + nFoot + nScrollHead);

		//$('.dataTables_scrollBody', jWrap).height(nScrollHeight); - dont work.

		var aSettings = awards.jGrid.dataTableSettings
		for (var nX = 0; nX < aSettings.length; nX++) {
			if (aSettings[nX].sTableId == "tblAwards") aSettings[nX].oScroll.sY = nScrollHeight;
		}
		awards.jGrid.fnDraw(false);
		$("#tblAwards_filter input").focus();

	},
	refresh: function () {
		if (!awards.initialized) return;
		ui.elap.on();

		var sQuery = "select * from adm$awards(" + customer_id.prepSQL() + ",null) where award_type <= 0 order by TITLE ascending;";
		new execQuery(sQuery, function (aRows) {
			var dtRows = new Array();
			awards.aoData = $.extend([], aRows);
			for (var nX = 0; nX < aRows.length; nX++) {
				dtRows.push(awards.createRowArray(aRows[nX]));
			}

			var jGrid = awards.jGrid;

			jGrid.fnClearTable();
			jGrid.fnAddData(dtRows);
			awards.resize();
			ui.elap.off();
		});
	},

	getAwardObject: function (oRec) {
		var cHTML = commonHTML.award;
		var jAward = $(cHTML);

		if (oRec) {
			var cExpires = (oRec.EXPIRES) ? (new Date(oRec.EXPIRES)).getTime() : "Infinity".toNumber();
			var cAvailable = (oRec.GROUP_QTY_AVAILABLE) ? oRec.GROUP_QTY_AVAILABLE : "Infinity".toNumber();
			var cEligibleCnt = (oRec.ASSIGNED_TO == "0") ? "Infinity".toNumber() :
				(oRec.ASSIGNED_IDS.split(",")[0].length == 0) ? 0 : oRec.ASSIGNED_IDS.split(",").length;

			var cObjClasses = 'inline allowHover';
			cObjClasses += ($("#btnsExpired input[value='hide']").is(':checked') && Date.today().getTime() > cExpires) ? " expired" : "";
			cObjClasses += ($("#btnsExhausted input[value='hide']").is(':checked') && cAvailable <= 0) ? " completed" : "";
			cObjClasses += ($("#btnsInactive input[value='hide']").is(':checked') && cEligibleCnt == 0) ? " inactive" : "";
			cObjClasses += ($("#btnsAwardElig_All input[value='hide']").is(':checked') && cEligibleCnt == Infinity) ? " unlimited" : "";
			cObjClasses += ($("#btnsAwardElig_Some input[value='hide']").is(':checked') && cEligibleCnt < Infinity && cEligibleCnt > 0) ? " limited" : "";

			jAward.attr({
				"group_qty_available": cAvailable,
				"award_id": oRec.ID,
				"expires": cExpires,
				"eligible": cEligibleCnt
			}).addClass(cObjClasses)
			.find(".title").html(oRec.TITLE).end()
			.find(".awardUnitName").html(Application.oUser.TOKENUNIT.toPlural(oRec.AMOUNT).toUpperCase()).end()
			.find(".description").html(oRec.DESCRIPTION).end()
			.find(".details .eligibility").addClass((cEligibleCnt == 0 && oRec.ASSIGNED_TO == "1") ? "attentionOnStat" : "")
				.find(".detailValue").html((oRec.ASSIGNED_TO == "0") ? "All" : cEligibleCnt).end().end()
			.find(".details .deadline").addClass((Date.today().getTime() > cExpires) ? "attentionOnStat" : "")
				.find(".detailValue").html((oRec.EXPIRES) ? (new Date(oRec.EXPIRES)).format("smallDate") : "None").end().end()
			.find(".details .awarded").addClass((cAvailable <= 0) ? "attentionOnStat" : "")
				.find(".detailValue").html(oRec.GROUP_QTY_AWARDED + ((oRec.GROUP_QTY) ? '&nbsp;of&nbsp;' + oRec.GROUP_QTY : ''));

			commonHTML.drawCertAmount(jAward, oRec.AMOUNT);
		}
		return jAward;
	},


	activate: function () {
		awards.init();
		//award.insert([], "Award");
		//certWiz.open(); //{ type: "invite" }
		//award.insert();
	}
};
var customerLogo = {
	refresh: function () {
		$("#hiddenAccountID").attr("value", Application.oUser.CUSTOMER_ID);
		$("#elapCustomLogo").show();
		var oCGI = new Run_CGI("/Common/cgi-scripts/customer_logo_exists.cgi", { cid: Application.oUser.CUSTOMER_ID },
			function (cResult) {
				$("#elapCustomLogo").hide();
				if (cResult == "false") {
					$("#btnClearCustomLogo").hide();
					certWiz.data.logo = "";
					$("#imgCustomerLogo, .cert .providerLogo img").attr("src", "").hide();
					$("#divCustomLogo div, .cert .providerName").show();
					$("#imgCustomerLogo, #divHideShowLogo").hide();
					$("#divHideShowLogo").hide().find("input[value=hide]").attr("checked", "checked").end().buttonset("refresh");
					$(".cert .providerLogo").hide();
				}
				else {
					$("#btnClearCustomLogo").show();
					certWiz.data.logo = "/Common/customer_logos/" + Application.oUser.CUSTOMER_ID + "Logo.jpg" + "?" + Date.now().getTime();
					$("#imgCustomerLogo, .cert .providerLogo img").attr("src", certWiz.data.logo).show();
					$("#divCustomLogo div, .cert .providerName").hide();
					$("#divHideShowLogo").show().find("input[value=show]").attr("checked", "checked").end().buttonset("refresh");
					$(".cert .providerLogo").show();
				}
			});
	},
	events: function (btn) {
		btn.button({ label: "Upload Logo...", icons: { primary: "ui-icon-circle-arrow-n"} }).removeClass("ui-state-focus ui-state-hover");

		btn.file().choose(function (e, input) {

			btn.removeClass("ui-state-focus ui-state-hover");
			$("#elapCustomLogo").show();
			$("#divCustomLogo div").hide();
			$("#imgCustomerLogo").hide().attr("src", "");
			$(".providerLogo img").attr("src", "");

			input.attr("id", "inputFile").attr("name", "logo")
			$('body').append(input);

			$.ajaxFileUpload({
				url: '/Common/cgi-scripts/save_customer_logo.pl',
				secureuri: false,
				fileElementId: 'inputFile',
				fileNameElementId: 'hiddenAccountID',
				dataType: null,
				success: function (data, status) {
					$("#inputFile").remove();
					customerLogo.refresh();

					if (typeof (data.error) != 'undefined') {
						if (data.error != '') {
							alert(data.error);
						} else {
							alert(data.msg);
						}
					}
				},
				error: function (data, status, e) {
					$("#divCustomLogo div").html("An error occurred when uploading.<br/>" + e);
				}
			}
				)
		});
	}
}
var certWiz = {
	initialized: false,
	options: {
		type: null,
		award_id: null,
		certsPerPage: 4,
		qty: 4,
		cutlines: true,
		showLogo: true
	},
	data: {
		tokenLogo: "Common/Images/CertTokenLogo-800x524.jpg",
		awardImage: "Common/Images/CertAwardAmount-360x360.png",
		leftBackground: "Common/Images/CertLeftFrame-400x685.png",
		logo: '',
		cert: {
			title: '',
			description: '',
			amount: '',
			id: '',
			default_class: '',
			default_class_name: ''
		},
		invite: null,
		awards: [],
		classes: [],
		ledger_awards: null,
		certHTML: function (bAwardDialogPreview) {
			var cLayout;
			if (!bAwardDialogPreview) {
				var layout = certWiz.utility.certLayout();
				cLayout = certWiz.options.type + ' ' + layout.className + ' ' + layout.classAbbr + '1';
			}
			else cLayout = "redeem sixth awardDialogPreview"
			var html =
				'<div class="cert ' + cLayout + '">' +
					'<div class="innerBorder">' +

						'<div class="leftFrame">' +
							'<img src="' + certWiz.data.leftBackground + '" class="certItem" />' +
						'</div>' +

						'<div class="amountContainer certItem">' +
							'<div class="awardAmount certItem"></div>' +
							'<div class="awardUnitName certItem"></div>' + //'<img src="' + certWiz.data.awardImage + '" class="certItem" />' +
						'</div>' +

						'<div class="codeContainer certItem">' +
							'<div class="codeText">' +
								'<span>####</span>' +
								'<span>####</span>' +
							'</div>' +
						'</div>' +

						'<div class="providerLogo certItem ">' +
							'<img src="' + certWiz.data.logo + '" />' +
						'</div>' +

						'<div class="providerName certItem">' + Application.oUser.PROVIDER_NAME + '</div>' +

						'<div class="title certItem"></div>' +

						'<div class="description certItem"></div>' +

					'</div>' +

					'<div class="certDetails certItem">' +
						'<span class="certDate">' + Date.now().format("longDateTime") + '</span>' +
						Application.oUser.NAME +
						'<span class="certAssignClass"></span>' +
					'</div>' +

				'</div>';
			return html;
		}
	},
	utility: {
		defaultInvite: function () {
			certWiz.data.invite = {
				ID: '',
				ASSIGNED_TO: '0',
				TITLE: "Welcome to Our Award Program",
				TITLE_PLAIN: "Welcome to Our Award Program",
				DESCRIPTION:
				"Use this certificate to get started.<br />" +
				" &nbsp; 1. Go to Shop.TokenRewards.com.<br />" +
				" &nbsp; 2. Click the button to start account.<br />" +
				" &nbsp; 3. Enter the code on the left.<br /><br />" +
				" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Have fun shopping!"
				,
				AMOUNT: "10",
				HIDDEN_FROM_PARTIES: '1',
				CLASS_IDS: '',
				DEFAULT_CLASS: '',
				CATEGORY: 'New Participants'
			};
		},
		refreshInvite: function () {
			var bSaveNew = false;

			if (certWiz.data.invite == null) {
				certWiz.utility.defaultInvite();
				bSaveNew = true;
			}
			else { certWiz.data.cert.id = certWiz.data.invite.ID; }

			var invite = certWiz.data.invite;

			$('#inviteTitle').val(invite.TITLE.decodeHTML());
			$('#inviteDescription').val(invite.DESCRIPTION.decodeHTML());
			$('#inviteAmount').val(invite.AMOUNT);

			if (invite.DEFAULT_CLASS) {
				$("#chkCertClass").attr("checked", true);
				$("#selCertClass").val(invite.DEFAULT_CLASS).show();
			}
			else {
				$("#chkCertClass").attr("checked", false);
				$("#selCertClass").val(invite.DEFAULT_CLASS).hide();
			}

			if (bSaveNew) { $('#btnSaveInvite').click(); }
		},
		saveInvite: function () {
			$("#btnsSaveInvite").hide();
			$("#btnsSaveInvite img").show();
			certWiz.data.invite.TITLE = $('#inviteTitle').val().encodeHTML();
			certWiz.data.invite.TITLE_PLAIN = certWiz.data.invite.TITLE.toSingleLineText();
			certWiz.data.invite.DESCRIPTION = $('#inviteDescription').val().encodeHTML();
			certWiz.data.invite.AMOUNT = $('#inviteAmount').val();

			if ($("#chkCertClass").is(":checked")) {
				certWiz.data.invite.ASSIGNED_TO = '1';
				certWiz.data.invite.DEFAULT_CLASS = certWiz.data.cert.default_class;
				certWiz.data.invite.CLASS_IDS = certWiz.data.cert.default_class;
			}
			else {
				certWiz.data.invite.ASSIGNED_TO = '0';
				certWiz.data.invite.DEFAULT_CLASS = '';
				certWiz.data.invite.CLASS_IDS = '';
			}

			var invite = certWiz.data.invite;
			var cSQL = "select * from ADM$AWARDS_IUD(" +
						Application.oUser.CUSTOMER_ID.prepSQL() + "," +
						'null,' +
						invite.ID.prepSQL(true) + ',' +
						invite.ASSIGNED_TO + ',' +
						invite.TITLE.prepSQL() + ',' +
						invite.TITLE_PLAIN.prepSQL() + ',' +
						invite.DESCRIPTION.prepSQL() + ',' +
						invite.AMOUNT.prepSQL() + ',' +
						'null,' +
						'1,' +
						'null,' +
						invite.HIDDEN_FROM_PARTIES.prepSQL() + ',' +
						'0,' +
						'-1,' +
						'null,' +
						invite.CLASS_IDS.prepSQL(true) + ',' +
						invite.DEFAULT_CLASS.prepSQL(true) + ',' +
						invite.CATEGORY.prepSQL(true) +
						');';
			new execQuery(cSQL, function (data) {
				$("#btnsSaveInvite img").hide(); //elapsor
				certWiz.data.invite.ID = data[0].UPDATED_ID;
				certWiz.data.cert.id = data[0].UPDATED_ID;
				certWiz.validate[1]();
				awards.refresh();
			});

		},

		certLayout: function () {
			if ($.inArray(certWiz.options.certsPerPage, [1, 2, 4, 6, 9]) == -1) {
				certWiz.options.certsPerPage = 4;
				$("#certTab_2 input[name=certSize]").attr("checked", false);
				$("#certTab_2 input[name=certSize][value='" + certWiz.options.certsPerPage + "']").attr("checked", "checked");
				$("#btnsCertSize").buttonset("refresh");
			}

			switch (certWiz.options.certsPerPage) {
				case 1: return { className: "full", classAbbr: "f", orientation: "landscape" };
				case 2: return { className: "half", classAbbr: "h", orientation: "portrait" };
				case 4: return { className: "quarter", classAbbr: "q", orientation: "landscape" };
				case 6: return { className: "sixth", classAbbr: "s", orientation: "portrait" };
				case 9: return { className: "ninth", classAbbr: "n", orientation: "landscape" };
			}
		},
		genCodes: function () {
			LogEntry("Certificate Wizard codes generated.");
			$("#CertificateWizard").tabs("option", "disabled", [0, 1, 2, 3, 4]);
			$("#CertificateWizard a[href='#certTab_5']").text("Finished");
			$("#certTab_5 .certTabTitle").html(
				'<img src="Common/Images/Elapsors/elapsor.gif"/>' +
				'<span style="position:relative; top:-5px;">&nbsp;&nbsp;Getting new certificate codes....</span>'
			);
			$("#btnCertPrev, #btnCertNext").fadeOut();
			$("#btnCertClose").button({ label: "Close" });
			$("#divCodeGenWarning").fadeOut();

			var cert = certWiz.data.cert;

			if (certWiz.options.type == "plain") {
				cert.id = '';
				cert.title_plain = '';
				cert.defualt_class = '';
			}

			var cSQL = "select * from ADM$CERTIFICATES_CREATE (" +
				Application.oUser.CUSTOMER_ID.prepSQL() + "," +
				cert.amount.prepSQL() + "," +
				cert.id.prepSQL(true) + "," +
				cert.title_plain.prepSQL(true) + "," +
				cert.default_class.prepSQL(true) + "," +
				certWiz.options.qty.prepSQL() + ");";

			new execQuery(cSQL, function (data) {
				var aCerts = data;
				$('.certPage .cert').each(function (index) {
					var dCertDate = new Date(aCerts[index].ISSUED);
					$(this).find('.codeContainer .codeText').html(
						'<span>' + aCerts[index].CODE.slice(0, 4).toUpperCase() + '</span>' +
						'<span>' + aCerts[index].CODE.slice(4, 8).toUpperCase() + '</span>'
					).end()
					.find('.certDetails').html(
						'<span class="certDate">' + dCertDate.format("longDate") + " " + dCertDate.format("longTime") + '</span>' +
						Application.oUser.NAME +
						((cert.default_class_name) ? '<span class="certAssignClass">Assign Class: ' + cert.default_class_name + '</span>' : '')
					);
				});
				$("#certTab_5 .certTabTitle").html(
					'Your certificates are ready to be printed.'
				);
			});

		}
	},
	refreshCertificates: function () {
		var layout = certWiz.utility.certLayout();
		var cHideLogo = (certWiz.options.showLogo) ? '' : ' hidden';
		$(".certPage-cab").remove();

		//'<img class="certRibbon certItem" src="/Common/Images/CertRibbon-214x421.JPG" />' +
		//'<img src="/Common/Images/CertificateBorder-771x572.png" class="certBGImg" />' +/// 

		var cAppend =
			'<div class="certPage-cab ' + layout.orientation + '">' +
				'<div class="pageNumber">Page 1</div>' +
				'<div class="certPage ' + layout.orientation + '">' +
					certWiz.data.certHTML(false) +
				'</div>' +
			'</div>';

		$('body').removeClass('portrait landscape').addClass(layout.orientation).append(cAppend);

		var jCert = $('.certPage .cert');
		if (certWiz.options.type == "plain") {
			jCert.addClass("plain");
			$('.title, .description', jCert).remove();
		}
		jCert
			.find('.title').html(certWiz.data.cert.title).end()
			.find('.description').html(certWiz.data.cert.description).end()
			.find('.awardUnitName').text(Application.oUser.TOKENUNIT.toPlural(certWiz.data.cert.amount).toUpperCase());

		commonHTML.drawCertAmount('.certPage .cert', certWiz.data.cert.amount);

		if (certWiz.data.cert.default_class_name) {
			$('.certPage .cert .certAssignClass').text("Assign Class: " + certWiz.data.cert.default_class_name).show();
		}
		else $('.certPage .cert .certAssignClass').hide();

		$("#divHideShowLogo input[value=hide]").change();

		// make duplicates and cutliness only after logo tab
		if ($("#CertificateWizard").tabs("option", "selected") < 3) return;


		var nCPP = certWiz.options.certsPerPage;
		var cHideLines = (certWiz.options.cutlines) ? '' : ' hidden';
		switch (nCPP) {
			case 2:
				$('.certPage').append('<div class="cutline h1' + cHideLines + '"></div>');
				break;
			case 4:
				$('.certPage').append('<div class="cutline q1' + cHideLines + '"></div>');
				$('.certPage').append('<div class="cutline q2' + cHideLines + '"></div>');
				break;
			case 6:
				$('.certPage').append('<div class="cutline s1' + cHideLines + '"></div>');
				$('.certPage').append('<div class="cutline s2' + cHideLines + '"></div>');
				$('.certPage').append('<div class="cutline s3' + cHideLines + '"></div>');
				break;
			case 9:
				$('.certPage').append('<div class="cutline n1' + cHideLines + '"></div>');
				$('.certPage').append('<div class="cutline n2' + cHideLines + '"></div>');
				$('.certPage').append('<div class="cutline n3' + cHideLines + '"></div>');
				$('.certPage').append('<div class="cutline n4' + cHideLines + '"></div>');
				break;
		}

		if (certWiz.options.qty == null) certWiz.options.qty == nCPP;

		var nQty = certWiz.options.qty;
		var jPages = $("#certPageOpts input[name=certPageOpts]:checked");
		var nPages = (jPages.length) ? jPages.val().toNumber() : 1;
		var nFirstPageQty = 1;

		if (nQty != null) {
			nFirstPageQty = nQty;
			if (nQty > nCPP) {
				nFirstPageQty = nCPP;
			}
		}

		for (var nX = 2; nX <= nFirstPageQty; nX++) {
			var jClone = $(".certPage:eq(0) .cert:eq(0)").clone().removeClass(layout.classAbbr + "1").addClass(layout.classAbbr + nX);
			$(".certPage:eq(0)").append(jClone);
		}

		for (var nX = 2; nX <= nPages; nX++) {
			var jClone = $(".certPage-cab:eq(0)").clone();
			jClone.find(".pageNumber").text("Page " + nX);
			$('body').append(jClone);
		}
	},
	next: function () {
		var jCert = $("#CertificateWizard");
		var nNextTab = jCert.tabs("option", "selected") + 1;

		if (nNextTab == 6) { certWiz.utility.genCodes(); return; }

		var aDisTabs = [];
		for (var nX = nNextTab + 1; nX <= 6; nX++) aDisTabs[aDisTabs.length] = nX;

		jCert.tabs("option", "disabled", aDisTabs);
		jCert.tabs("option", "selected", nNextTab);

	},
	prev: function () {
		var jCert = $("#CertificateWizard");
		var nTab = jCert.tabs("option", "selected");
		jCert.tabs("option", "selected", nTab - 1);
	},
	activate: function (tabIndex) {
		var jCert = $("#CertificateWizard");
		var setTab = {
			0: function () {
				$(".certPage-cab").remove();
				$("body").addClass("backgroundWhite");

				switch (certWiz.options.type) {
					case "invite":
						$("#certTab_0 input[value='invite']", jCert).attr("checked", true)
						.button("refresh").button({ icons: { primary: "ui-icon-check"} });
						break;
					case "redeem":
						$("#certTab_0 input[value='redeem']", jCert).attr("checked", true)
						.button("refresh").button({ icons: { primary: "ui-icon-check"} });
						break;
					case "plain":
						$("#certTab_0 input[value='plain']", jCert).attr("checked", true)
						.button("refresh").button({ icons: { primary: "ui-icon-check"} });
						break;

					default:
						$("#certTab_0 input", jCert).attr("checked", false)
						.button("refresh").button({ icons: { primary: ""} });
						break;
				}
			},
			1: function () {
				$("body").removeClass("backgroundWhite");
				jCert.find('.divCertType').hide();
				jCert.find('.divCertType[type=' + certWiz.options.type + ']').show();

				if (certWiz.options.type == "invite") {
					certWiz.utility.refreshInvite();
				}
			},
			2: function () {
				if (certWiz.data.logo && certWiz.options.showLogo) $("#divHideShowLogo input[value=show]").attr("checked", true);
				else $("#divHideShowLogo input[value=hide]").attr("checked", true);
				$("#divHideShowLogo").buttonset("refresh");
			},
			3: function () {
				if (certWiz.options.cutlines) $("#divCutLines input[value=show]").attr("checked", "checked");
				else $("#divCutLines input[value=hide]").attr("checked", "checked");
				$("#divCutLines").buttonset("refresh");

				if (certWiz.options.certsPerPage) {
					$("#btnsCertSize input[value=" + certWiz.options.certsPerPage + "]").attr("checked", "checked");
					$("#btnsCertSize").buttonset("refresh");
				}
			},
			4: function () {
				var nCPP = certWiz.options.certsPerPage;
				var nQty = certWiz.options.qty;
				$("#certPageOpts input[name=certPageOpts]").each(function (index) {
					var nPages = $(this).val().toNumber();
					if (nPages == 0) return;
					$(this).next().find('span').text((nPages * nCPP) + " Certificates");
				});


				var cOptions;
				for (var nX = 1; nX <= nCPP; nX++) {
					cOptions += '<option value="' + nX + '">' + nX + (' Certificate').toPlural(nX) + '</option>';
				}

				$("#certOnePageQty").empty().append(cOptions);

				if (certWiz.options.qty == null) {
					$("#certPageOpts input[name=certPageOpts][value=1]").attr("checked", "checked");
					$("#certOnePageQty").val(nCPP);
					certWiz.options.qty = nCPP;
				}
				else {
					$("#certPageOpts input[name=certPageOpts][value=" + Math.ceil(nQty / nCPP) + "]").attr("checked", "checked");
					if (nQty <= nCPP) $("#certOnePageQty").val(nQty);
				}
			},
			5: function () {
				layout = certWiz.utility.certLayout();
				$("#certTab_5")
				.find("#certSize").text(layout.className.toProperCase() + " Page").end()
				.find("#certQty").text(certWiz.options.qty).end()
				.find("#certPages").text(Math.ceil(certWiz.options.qty / certWiz.options.certsPerPage)).end()
				.find("#certLayout").text(layout.orientation.toProperCase()).end()
				.find("#certNotesLayout").text(layout.orientation);

				$("#btnCertPrev").button({ disabled: false }).css({ float: "left" });
				$("#btnCertNext").button({ label: "Finish", icons: { secondary: "ui-icon-flag"} })
				.css({ margin: "0 135px 0 0" });
			}
		};
		$("#btnCertPrev").css({ float: "none" });
		$("#btnCertNext").button({ label: "Next", icons: { secondary: "ui-icon-seek-next"} }).css({ margin: "0 20px 0 0px" });
		$(".ui-button").removeClass("ui-state-hover ui-state-focus");

		setTab[tabIndex]();
		certWiz.validate[tabIndex]();

	},
	validate: {
		0: function () {
			var jCert = $("#CertificateWizard");

			$("#btnCertPrev").button({ disabled: true });
			$("#btnCertNext").button({ disabled: false });
			jCert.tabs("option", "disabled", [2, 3, 4, 5]);

			switch (certWiz.options.type) {
				case "invite":
					break;
				case "redeem":
					break;
				case "plain":
					break;
				default:
					jCert.tabs("option", "disabled", [1, 2, 3, 4, 5]);
					$("#btnCertPrev,#btnCertNext").button({ disabled: true });
					break;
			}

		},
		1: function () {
			var jCert = $("#CertificateWizard");
			var cert = certWiz.data.cert;

			var validateCertType = {
				invite: function () {
					cert.title = $('#inviteTitle').val().encodeHTML();
					cert.title_plain = cert.title.toSingleLineText();
					cert.description = $('#inviteDescription').val().encodeHTML();
					cert.amount = $('#inviteAmount').val();
					cert.group_qty_available = '';

					if ($("#chkCertClass").is(":checked")) {
						$("#selCertClass").show();
						certWiz.data.cert.default_class = $("#selCertClass").val();
						certWiz.data.cert.default_class_name = $("#selCertClass option[value=" + certWiz.data.cert.default_class + "]").text();
					}
					else {
						$("#selCertClass").hide();
						certWiz.data.cert.default_class = '';
						certWiz.data.cert.default_class_name = '';
					}

					if (cert.title != certWiz.data.invite.TITLE ||
						cert.description != certWiz.data.invite.DESCRIPTION ||
						cert.amount != certWiz.data.invite.AMOUNT ||
						cert.default_class != certWiz.data.invite.DEFAULT_CLASS) {
						$("#btnsSaveInvite").fadeIn();

						$("#btnCertPrev,#btnCertNext").button({ disabled: true });
						jCert.tabs("option", "disabled", [0, 2, 3, 4, 5]);
					}
					else {
						$("#btnCertPrev,#btnCertNext").button({ disabled: false });
						$("#btnsSaveInvite").fadeOut();
						jCert.tabs("option", "disabled", [3, 4, 5]);
					}
					certWiz.refreshCertificates();
				},
				redeem: function () {
					var aAwards = certWiz.data.awards;
					var nX = $("#divCertAwards_Cab tbody input:checked").val();
					if (nX) {
						certWiz.data.cert.id = aAwards[nX].ID;
						certWiz.data.cert.title = aAwards[nX].TITLE;
						certWiz.data.cert.title_plain = aAwards[nX].TITLE_PLAIN;
						certWiz.data.cert.description = aAwards[nX].DESCRIPTION;
						certWiz.data.cert.amount = aAwards[nX].AMOUNT;
						certWiz.data.cert.group_qty_available = aAwards[nX].GROUP_QTY_AVAILABLE;

						certWiz.data.cert.default_class = '';
						certWiz.data.cert.default_class_name = '';

						if (aAwards[nX].DEFAULT_CLASS) {
							for (var nY = 0; nY < certWiz.data.classes.length; nY++) {
								if (certWiz.data.classes[nY].ID == aAwards[nX].DEFAULT_CLASS) {
									certWiz.data.cert.default_class = aAwards[nX].DEFAULT_CLASS;
									certWiz.data.cert.default_class_name = certWiz.data.classes[nY].CLASS_NAME;
								}
							}
						}

						jCert.tabs("option", "disabled", [3, 4, 5]);
						$("#btnCertNext").button({ disabled: false });
						certWiz.refreshCertificates();
					}
					else $("#btnCertNext").button({ disabled: true });
				},
				plain: function () {
					cert.amount = $('#txtPlainCertAmount').val();
					certWiz.refreshCertificates();
				}
			};

			$("#btnCertPrev").button({ disabled: false });

			validateCertType[certWiz.options.type]();
		},
		2: function () {
			$("#btnCertPrev,#btnCertNext").button({ disabled: false });
			$("#CertificateWizard").tabs("option", "disabled", [4, 5, 6]);
		},
		3: function () {
			var jCert = $("#CertificateWizard");
			var jChecked = $("#btnsCertSize input[name=certSize]:checked");
			if (jChecked.length == 0) {
				$("#btnCertNext").button({ disabled: true });
				jCert.tabs("option", "disabled", [4, 5]);
				return;
			}
			$("#btnCertPrev,#btnCertNext").button({ disabled: false });
			jCert.tabs("option", "disabled", [5]);

			var nCPP = jChecked.val().toNumber();

			var jPages = $("#certPageOpts input[name=certPageOpts]:checked");
			var nPages = (jPages.length) ? jPages.val().toNumber() : 1;

			if (certWiz.options.qty >= nPages) {

				certWiz.options.qty = nCPP * nPages;
			}
			certWiz.options.certsPerPage = nCPP;

			certWiz.refreshCertificates();
		},
		4: function () {
			var jChecked = $("#certPageOpts input[name=certPageOpts]:checked");
			if (jChecked.length == 0) { $("#CertificateWizard").tabs("option", "disabled", [5]); }

			var nPages = jChecked.val().toNumber();

			if (nPages == 1) { certWiz.options.qty = $("#certOnePageQty").val().toNumber(); }
			else certWiz.options.qty = certWiz.options.certsPerPage * nPages;

			if (certWiz.data.cert.group_qty_available && certWiz.options.qty > certWiz.data.cert.group_qty_available.toNumber()) {
				$("#spanQtyWarning").text(certWiz.data.cert.group_qty_available);
				$("#divAwardQtyWarning").show("pulsate");
			}
			else $("#divAwardQtyWarning").hide();

			certWiz.refreshCertificates();
			$("#btnCertNext").button({ disabled: false });
			$("#CertificateWizard").tabs("option", "disabled", []);
		},
		5: function () { return; }
	},
	init: function () {
		customerLogo.refresh();
		var refresh_awards = function () {
			var jTbody = $("#divCertAwards_Cab tbody").empty();

			var aAwards = certWiz.data.awards;
			if (aAwards == null) {
				jTbody.append(
						'<tr>' +
							'<td colspan="3" style="text-align:center; border-right:none">' +
								'You have not created any awards for redeemable certificates.' +
							'</td>' +
						'</tr>'
					);
				return;
			}

			var nDefaultRow = 0;
			for (var nX = 0; nX < aAwards.length; nX++) {
				jTbody.append(
						'<tr award_id="' + aAwards[nX].ID + '">' +
							'<td style="border-right:none; width:30px">' +
								'<input type="radio" name="redeem_awards" value="' + nX + '" id="certAward_' + aAwards[nX].ID + '"/>' +
								'<label for="certAward_' + aAwards[nX].ID + '"></label>' +
							'</td>' +
							'<td>' + aAwards[nX].TITLE_PLAIN + '</td>' +
							'<td style="text-align:right; width:60px;">' + aAwards[nX].AMOUNT + '</td>' +
						'</tr>'
					);
				if (certWiz.options.award_id == aAwards[nX].ID) nDefaultRow = nX;
			}

			jTbody.find('input:radio')
				.button({ icons: { primary: "ui-icon-circle-minus" }, label: "" })
				.bind("focusout", function () { $(this).removeClass("ui-state-focus ui-state-hover"); })
				.end().find('tr')
				.click(function (event) {
					event.stopPropagation()
					jTbody.find('tr').removeClass('ui-state-active').end()
					.find('input:radio').button({ icons: { primary: "ui-icon-circle-minus" }, label: "" });

					var jThis = $(this);
					jThis.addClass("ui-state-active")
					.find('input:radio').attr("checked", "checked")
					.button({ icons: { primary: "ui-icon-circle-plus" }, label: "" })

					jTbody.find('input:radio').button("refresh");
					certWiz.validate[1]();
				});

			if (certWiz.options.award_id) {
				var jRow = $('tr[award_id="' + certWiz.options.award_id + '"]', jTbody)
				jRow.addClass("ui-state-active").find('input').click();
				if (nDefaultRow > 8) $("#divCertAwards_Cab").scrollTop((nDefaultRow - 8) * jRow.height() - 12);
			}
		} ();

		if (certWiz.initialized) {
			certWiz.openDialog();
			return;
		}
		// Tab 0 - Type
		var Tab0 = function () {
			$("#certTab_0 input").button().click(function () {
				certWiz.options.type = $(this).val();
				certWiz.validate[0]();
				$(this).button({ icons: { primary: "ui-icon-check"} });
				$("#certTab_0 input").not($(this)).button({ icons: { primary: ""} });
			});
		} ();

		// Tab 1 - Details
		var Tab1 = function () {
			var init_invite = function () {
				$('#certTab_1')
				.find('#inviteTitle').keyup(function () { certWiz.validate[1](); }).end()
				.find('#inviteDescription').keyup(function () { certWiz.validate[1](); }).end()
				.find('#inviteAmount').constrainNumeric({ absolute: true, integer: true, minValue: 1 })
				.keyup(function () { certWiz.validate[1](); }).end()

				var Default_Class = function () {
					if (certWiz.data.classes.length > 0) {
						$("#assignToClassNote,#CertAssignClass").show();
						$("#CertAssignClass #selCertClass").empty();
						for (var nX = 0; nX < certWiz.data.classes.length; nX++) {
							$("#CertAssignClass #selCertClass").append(
								'<option value="' + certWiz.data.classes[nX].ID + '">' + certWiz.data.classes[nX].CLASS_NAME + '</option>'
							);
						}
					}
					else {
						$("#assignToClassNote,#CertAssignClass").hide();
					}

					$("#chkCertClass").click(function () {
						certWiz.validate[1]();
					});

					$("#selCertClass").change(function () {
						certWiz.validate[1]();
					});
				} ();

				$('#btnsSaveInvite').buttonset()
				$('#btnSaveInvite').button({ label: "Save", icons: { primary: "ui-icon-check"} })
				.click(function () { certWiz.utility.saveInvite(); });
				$("#btnUndoInvite").button({ label: "Undo", icons: { secondary: "ui-icon-arrowreturnthick-1-w"} })
				.click(function () {
					certWiz.utility.refreshInvite();
					certWiz.validate[1]();
				});
			} (); // end init_invite

			var init_granted = function () {
				return;
				var jTbody = $("#divCertGranted_Cab tbody").empty();

				var aAwards = certWiz.data.ledger_awards;
				for (var nX = 0; nX < aAwards.length; nX++) {
					jTbody.append(
						'<tr ledger_id="' + aAwards[nX].LEDGER_ID + '">' +
							'<td style="border-right:none">' +
								'<input type="checkbox" value="' + nX + '" id="certGranted_' + aAwards[nX].LEDGER_ID + '"/>' +
								'<label for="certGranted_' + aAwards[nX].LEDGER_ID + '"></label>' +
							'</td>' +
							'<td>' + aAwards[nX].NAME + '</td>' +
							'<td>' + aAwards[nX].AWARD_TITLE + '</td>' +
						'</tr>'
					);
				}

				jTbody.find('input:checkbox')
				.button({ icons: { primary: "ui-icon-circle-minus" }, label: "" })
				.bind("focusout", function () { $(this).removeClass("ui-state-focus ui-state-hover"); })
				.click(function () {
					jTbody.find('tr').removeClass('ui-state-active').end()
					.find('input:radio').button({ icons: { primary: "ui-icon-circle-minus" }, label: "" });
					var jThis = $(this);
					if (jThis.is(":checked"))
						jThis.button({ icons: { primary: "ui-icon-circle-plus" }, label: "" }).parents('tr').addClass("ui-state-active")
					else
						jThis.button({ icons: { primary: "ui-icon-circle-minus" }, label: "" })

					certWiz.validate[1]();

				});

				if (certWiz.options.award_id)
					jTbody.find('tr[award_id="' + certWiz.options.award_id + '"]')
					.addClass("ui-state-active").find('input').click();

			}; // () DISABLED FOR NOW

			var init_plain = function () {
				var nAmount = $.cookie("plain_token_amount");
				if (!nAmount) nAmount = 1;
				$("#txtPlainCertAmount").val(nAmount).constrainNumeric({ absolute: true, integer: true, minValue: 1 })
				.keyup(function () {
					$.cookie("plain_token_amount", $(this).val());
					certWiz.validate[1]();
				});
			} ();

		} ();

		// Tab 2 - Logo
		var Tab2 = function () {
			$("#btnClearCustomLogo").button({ icons: { primary: "ui-icon-circle-close"} })
			.click(function () {
				$("#imgCustomerLogo").hide();
				$("#elapCustomLogo").show();
				var oCGI = new Run_CGI("/Common/cgi-scripts/save_customer_logo.pl", { cid: Application.oUser.CUSTOMER_ID, reset: true },
				function () { customerLogo.refresh(); });
			});
			$("#divHideShowLogo").buttonset()
			$("#divHideShowLogo input")
			.change(function () {
				if ($(this).val() == "hide" && $(this).is(":checked"))
					certWiz.options.showLogo = false;
				else certWiz.options.showLogo = true;

				if (certWiz.options.showLogo) {
					$(".cert .providerLogo").show();
					$(".cert .providerName").hide();
				}
				else {
					$(".cert .providerLogo").hide();
					$(".cert .providerName").show();
				}
			});
		} ();

		// Tab 3 - Size
		var Tab3 = function () {
			$("#btnsCertSize").buttonset();
			$("#btnsCertSize input").change(function (event) { event.stopPropagation(); certWiz.validate[3](); });

			$("#divCutLines").buttonset();
			$("#divCutLines input").change(function () {
				if ($(this).val() == "hide" && $(this).is(":checked"))
					certWiz.options.cutlines = false;
				else certWiz.options.cutlines = true;

				if (certWiz.options.cutlines)
					$(".cutline").show();
				else $(".cutline").hide();
			});
		} ();

		// Tab 4 - Quantity
		var Tab4 = function () {
			$("#certPageOpts input[name=certPageOpts]").change(function () { certWiz.validate[4](); });
			$("#certOnePageQty").change(function () {
				$("#certPageOpts input[name=certPageOpts]:eq(0)").attr("checked", "checked");
				certWiz.validate[4]();
			});
		} ();
		certWiz.initialized = true;
		certWiz.openDialog();
	},
	open: function (oDefaultOptions) {
		if (!Application.bLoggedIn) {
			ui.modalMessage({
				title: "Not Logged In",
				message: "Please log in to print currency."
			});
			return;
		}
		ui.openWait("Preparing Certificate Wizard...");
		LogEntry("Certificate Wizard opened.");
		certWiz.options = $.extend(certWiz.options, oDefaultOptions);

		var cSQL = "select * from adm$awards(" + Application.oUser.CUSTOMER_ID.prepSQL() + ", null) where award_type = -1;\n" +
			"select * from adm$awards(" + Application.oUser.CUSTOMER_ID.prepSQL() + ", null) where award_type = 0;\n" +
			"select * from adm$classes(" + Application.oUser.CUSTOMER_ID.prepSQL() + ")  order by class_name";

		new execQuery(cSQL, function (data) {
			ui.closeWait();
			if (typeof data[0][0] != "undefined") { certWiz.data.invite = $.extend(true, {}, data[0][0]); }
			else certWiz.data.invite = null;
			if (typeof data[1][0] != "undefined") certWiz.data.awards = $.extend(true, [], data[1]);
			else certWiz.data.awards = null;
			if (typeof data[2][0] != "undefined") certWiz.data.classes = $.extend(true, [], data[2]);
			else certWiz.data.classes = [];

			//			if (data[2][0] != undefined) certWiz.data.ledger_awards = $.extend(true, [], data[2]);
			//			else certWiz.data.ledger_awards = null;
			certWiz.init();
		});
	},
	openDialog: function () {
		$('body').removeClass('appMode').addClass('printMode').find('*').addClass('hideForPrint');
		$('html').addClass('printHTML');
		var jCert = $("#CertificateWizard");
		jCert.removeClass('hideForPrint').find('*').removeClass('hideForPrint');

		$('#CertificateWizard')
		.tabs({
			select: function (event, ui) {
				certWiz.activate(ui.index);
			},
			show: function (event, ui) {
				if (ui.index == 2) customerLogo.events($("#btn_inputCustomLogoDummy"));
			}
		})
		.dialog({
			width: 550,
			height: 420,
			modal: false,
			position: "center center",
			buttons: [
				{ text: "Prev", click: function () { certWiz.prev(); } },
				{ text: "Next", click: function () { certWiz.next(); } },
				{ text: "Cancel", click: function () { $(this).dialog('close'); } },
			],
			open: function () {
				var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
				jBtns.eq(0).button({ icons: { primary: "ui-icon-seek-prev"} }).attr("id", "btnCertPrev");
				jBtns.eq(1).button({ icons: { secondary: "ui-icon-seek-next"} }).attr("id", "btnCertNext").css("margin", "0 20px 0 0");
				jBtns.eq(2).button({ icons: { primary: "ui-icon-closethick"} }).attr("id", "btnCertClose");


				$(".ui-button").bind("focusout", function () { $(this).removeClass("ui-state-focus ui-state-hover"); });

				$(this).siblings(".ui-dialog-titlebar")
				.dblclick(function () {
					var dialog = $('#CertificateWizard').parent();
					if (dialog.height() < 50)
						dialog.height(420).width(528).find(".ui-dialog-titlebar-close").show();
					else
						dialog.height(23).width(490).find(".ui-dialog-titlebar-close").hide();
				});

				$(this).parent().position({ my: "right top", at: "right top", of: $(window), offset: "-50 20" });

				$(".ui-dialog").css({ "display": "" });

				if (certWiz.options.type != null) {
					// special option case to jump right to tab 1 for already selected award
					jCert.tabs("option", "selected", 1);
					certWiz.activate(1);
				}
				else certWiz.activate(0);
			},
			close: function () {
				LogEntry("Certificate Wizard closed.");
				$('.certPage-cab').remove();
				$('#certAccordion').accordion("destroy");
				$(this).tabs("destroy").dialog("destroy");
				$('body').removeClass('printMode').addClass('appMode').find('*').removeClass('hideForPrint');
				$('html').removeClass('printHTML');
				//$("#CertificateWizard").find("*").unbind();

				certWiz.data.invite = null;
				certWiz.data.awards = null;
				certWiz.data.ledger_awards = null;
				certWiz.options.type = null;
				certWiz.options.award_id = null;
				for (cX in certWiz.data.cert) { certWiz.data.cert[cX] = ''; }

				if (/Participant/gi.test(window.location.hash)) { participants.resize(); }
				if (/Awards/gi.test(window.location.hash)) { awards.refresh(); }
				if (/Home/gi.test(window.location.hash)) { HomePane.Activate(); }

			}
		});

	}
};

var shop = {
	initialized: false,
	init: function () {
		$("#btnCreateReward").button({ icons: { primary: "ui-icon-plusthick" }, disabled: false })
		.click(function () {
			if (contact.data.shop && contact.data.shop.EMAIL_VERIFIED)
				award.insert(null, "Reward");
			else shop.contact.open();
		});

		$(".fakeAnchor, img", "#NoCustomRewards").click(function () {
			$("#btnCreateReward").click();
		});

		$('#btnEditShopContact').button({ icons: { primary: "ui-icon-triangle-1-w"} })
			.click(function () { shop.contact.open('shop'); });

		//		$('#btnShopSettings').button({ icons: { primary: "ui-icon-wrench"} }).click(function () {
		//			if (AccountSetupPane) $("#SettingsTabs").tabs('option', 'selected', 1);
		//			else $.cookie('ui-tabs-1', 1);
		//			window.location.hash = "#Settings";
		//		});


		$("#btnsShowRewards").buttonset();
		$("#btnsShowRewards input").change(function () { shop.refresh(); });

		Catalog.fetchProducts(function () { $("#btnCreateReward").button({ disabled: false }) });
		this.initialized = true;
	},


	refresh: function () {
		Catalog.fetchProducts();
	},
	activate: function () {
		if (ui.IE7) {
			ui.modalMessage({
				title: "Browser Too Old",
				message: "Please upgrade your browser to the latest version to use the My Shop features."
			});
			return;
		}
		shop.contact.refresh();
		if (!this.initialized) this.init();
		else Catalog.show();

	},

	contact: {
		initialized: false,
		init: function () {

			$("#btnConfirmShopAdmin").button({ icons: { primary: "ui-icon-mail-closed" }, disabled: true })
				.click(function () { shop.contact.confirm(); });
			$("#ShopAdministrator input").keyup(function () { shop.contact.validate() });


			$("#btnCheckConfirmCode").button({ icons: { primary: "ui-icon-triangle-1-w" }, disabled: true })
			.click(function () {
				new execQuery("select * from com$email_verify(" +
					$("#txtConfirmCode").val().prepSQL() + "," +
					$("#ShopAdminEmail").val().prepSQL() + ");",
					function (data) {
						if (data.length > 0) {
							shop.contact.save();
							$("#ShopAdministrator").dialog("close");
							ui.modalMessage({
								title: "Contact E-mail Confirmed",
								message: "The Shop Administrator Contact e-mail address is confirmed."
							});
							shop.contact.refresh();
							shop.refresh();
						}
						else {
							ui.modalMessage({
								title: "Wrong Confirmation Code",
								message: "The confirmation code you entered does not appear to be correct. <br/><br/>" +
								"Please try again.",
								action: function () { $("#txtConfirmCode").val('').focus(); }
							});
						}

					}
				);
			});

			shop.contact.initialized = true;
		},
		refresh: function () {
			var oContact = contact.data.shop;
			if (oContact) {
				if (oContact.EMAIL_VERIFIED) {
					$("#ShopContact").text(oContact.NAME + ", " + oContact.EMAIL);
				}
				else {
					$("#ShopContact").html(oContact.EMAIL + ' <span class="unconfirmed">(not confirmed)</span>');
				}
				$("#ShopAdminEmail").val(oContact.EMAIL);
				$("#ShopAdminName").val(oContact.NAME);
			}
			else {
				$("#ShopContact").text("Contact person is missing and required.");
			}
		},

		open: function () {
			if (!shop.contact.initialized) shop.contact.init();
			$("#btnCreateReward, #btnEditShopContact").button({ disabled: true });
			$("#MyShopObjects, #NoCustomRewards").hide();

			$("#ShopAdministrator").dialog({
				autoOpen: true,
				modal: true,
				width: 550,
				title: "Shop Administrator Contact Setup",
				open: function (event, ui) {
					var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
					jBtns.eq(0).button({ disabled: true, icons: { primary: "ui-icon-check"} }).attr("id", "btnSaveShopAdmin");
					jBtns.eq(1).button({ icons: { primary: "ui-icon-closethick"} });
					$(".ui-button").bind("focusout", function () { $(this).removeClass("ui-state-focus"); });
				},
				close: function (event, ui) {
					$(this).dialog('destroy');
					$("#MyShopObjects").show();
					$("#btnCreateReward, #btnEditShopContact").button({ disabled: false });
					//shop.refresh();
				},
				buttons: {
					'Save': function () { $(this).dialog('close'); shop.contact.save(); },
					'Cancel': function () { $(this).dialog('close'); }
				}
			});

			shop.contact.validate();
			$("#ShopAdminName").focus();

		},
		confirm: function () {
			var oContactName = $("#ShopAdminName").val().parseName();
			var sEmail = $("#ShopAdminEmail").val();

			$("#btnConfirmShopAdmin, #wrapEmailValidation").hide();
			$("#elapSendConfirm").show();

			Email.send({
				to_name: oContactName.asEntered,
				to_address: sEmail,
				template: 'admin_shop_contact_confirm',
				contents: Email.contentTemplates.admin_shop_contact_confirm
					.replace(/__first_name__/g, oContactName.nick)
					.replace(/__token_name__/g, Application.oUser.TOKENUNIT.toLowerCase())
					.replace(/__provider_name__/g, Application.oUser.PROVIDER_NAME)
				,
				callback: function (bSuccess, sSentTo, oSend) {
					$("#elapSendConfirm").hide();
					$("#SendConfirmSuccess").show();
				}
			});

		},
		validate: function () {
			var sName = $("#ShopAdminName").val();
			var sEmail = $("#ShopAdminEmail").val();

			var bValidEmail = sEmail.isValidEmail();
			var bValidName = sName > '';
			var bValidCode = $("#txtConfirmCode").val().length == 4;

			if (bValidCode) $("#btnCheckConfirmCode").button({ disabled: false });
			else $("#btnCheckConfirmCode").button({ disabled: true });

			if (bValidEmail && bValidName) {
				$("#btnConfirmShopAdmin").button({ disabled: false });
				var oContact = contact.data.shop;
				if (!oContact || (oContact && (oContact.EMAIL != sEmail || oContact.NAME != sName)))
					$("#btnSaveShopAdmin").button({ disabled: false });
				else $("#btnSaveShopAdmin").button({ disabled: true });
			}
			else {
				$("#btnConfirmShopAdmin").button({ disabled: true });
				$("#btnSaveShopAdmin").button({ disabled: true });
			}

			if (sEmail == '') {
				$("#wrapEmailValidation .valid").hide();
				$("#wrapEmailValidation .invalid").hide();
				$("#wrapEmailValidation .empty").show();
			}
			else if (!bValidEmail) {
				$("#wrapEmailValidation .empty").hide();
				$("#wrapEmailValidation .valid").hide();
				$("#wrapEmailValidation .invalid").show();
			}
			else {
				$("#wrapEmailValidation .empty").hide();
				$("#wrapEmailValidation .invalid").hide();
				$("#wrapEmailValidation .valid").show();
			}
		},
		save: function () {
			ui.openWait("Saving Shop Administrator Contact...");
			var oData;
			if (contact.data.shop) oData = contact.data.shop;
			else oData = new contact.blankRecord();

			new execQuery(
			"select * from adm$customer_contact_iu(" +
				Application.oUser.CUSTOMER_ID.prepSQL() + "," +
				"'shop'," +
				oData.ID.prepSQL(true) + "," +
				$("#ShopAdminName").val().prepSQL() + "," +
				oData.COMPANY.prepSQL(true) + "," +
				oData.TITLE.prepSQL(true) + "," +
				oData.ADDRESS.prepSQL(true) + "," +
				oData.CITY.prepSQL(true) + "," +
				oData.STATE.prepSQL(true) + "," +
				oData.ZIP.prepSQL(true) + "," +
				oData.PHONE.prepSQL(true) + "," +
				oData.FAX.prepSQL(true) + "," +
				$("#ShopAdminEmail").val().prepSQL() +
			");\n" +
			"select * from adm$customer_contacts(" + Application.oUser.CUSTOMER_ID.prepSQL() + ");",
				function (data) {
					ui.closeWait();
					setup.contacts.refresh(data[1]);
					setup.contacts.elapsors.off();
					shop.contact.refresh();

					LogEntry(contact.titleBar + " Saved.");
				}
			);
		}
	},
	alerts: {
		initialized: false,
		aoAlerts: [],

		init: function () {
			if (shop.alerts.initialized) return;
			$("#btnShopAlerts").button({ icons: { primary: "ui-icon-signal-diag"} })
			.click(function () { shop.alerts.open(); });
			$("#ShopAlertNote .fakeAnchor").click(function () {
				$.cookie("ActivityTabs", 1);
				if (activity.initialized) {
					$("#ActivityTabs").tabs("select", 1);
				}
				else $.cookie("ActivityTabs", 1, { expires: 30 });
				window.location.hash = "#Activity";
				//$("#ShopAlerts").dialog('close');
			});
		},
		refresh: function (aoAlerts) {

			var refreshAlerts = function (aoAlerts) {

				if (aoAlerts.length == 0) {
					$("#ShopAlerts").dialog('close');
					return;
				}
				var jTbody = $("#ShopAlerts tbody").empty();
				var jRow;
				for (var nX = 0; nX < aoAlerts.length; nX++) {
					jRow = $(
						'<tr>' +
							'<td class="buttonCell">' +
								'<span class="btnHideAlert cellButton"></span>' +
							'</td>' +
							'<td class="buttonCell">' +
								'<span class="btnCancelOrder cellButton"></span>' +
							'</td>' +
							'<td>' +
								'<span class="">' + aoAlerts[nX].ORDERED.toDateFormat("shortDateTime") + '</span>' +
							'</td>' +
							'<td>' +
								'<a class="fakeAnchor" href="#Participant_' + aoAlerts[nX].PARTY_CODE + '">' +
									aoAlerts[nX].PARTICIPANT +
								'</a>' +
							'</td>' +
							'<td>' +
								'<span class="">' + aoAlerts[nX].DESCRIPTION + '</span>' +
							'</td>' +
						'</tr>'
					);
					jRow.data(aoAlerts[nX]);
					$(".btnHideAlert", jRow).button({ text: false, icons: { primary: "ui-icon-check"} })
					.click(function () { shop.alerts.markDeliverd($(this).parents('tr')); });
					$(".btnCancelOrder", jRow).button({ text: false, icons: { primary: "ui-icon-trash"} })
					.click(function () {
						participants.order.cancel($(this).parents('tr').data());
					});



					jTbody.append(jRow);
				}
			};

			if (!aoAlerts) {
				new execQuery(
					"select * from adm$ordered_items(" + customer_id.prepSQL() + ",null)\n" +
					"   where CUSTOM_REWARD_ID > 0 and DELIVERED is null;",
					function (data) {
						if (data.length) refreshAlerts(data);
						else {
							$("#ShopAlerts").dialog('close');
							$("#btnShopAlerts").button({ disabled: true }).hide();
						}
					}
				);
			}
			else refreshAlerts(aoAlerts);

		},

		open: function (aoAlerts) {
			shop.alerts.init();
			if (aoAlerts && aoAlerts.length == 0) {
				$("#btnShopAlerts").button({ disabled: true }).hide();
				return;
			}
			$("#btnShopAlerts").show();
			shop.alerts.refresh(aoAlerts);

			$("#ShopAlerts").dialog({
				autoOpen: false,
				modal: false,
				width: 650,
				open: function (event, ui) {
					var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
					jBtns.eq(0).button({ icons: { primary: "ui-icon-closethick"} });
				},
				close: function (event, ui) { $(this).dialog('destroy'); }
			});

			$("#ShopAlerts").dialog('open');

			$("#ShopAlerts").parent().position({
				my: "right bottom", at: "right top", of: $('body'), offset: "-20 0", collision: "none"
			});

			$("#ShopAlerts").parent().position({
				my: "right top", at: "right top", of: $('body'), offset: "-20 60", collision: "none",
				using: function (to) {
					$(this).animate(to, 1500, "", function () {
						$("#ShopAlertNote .warningSign").effect("pulsate", { times: 3 });
					});
				}
			});
		},

		markDeliverd: function (jRow) {
			$(".btnHideAlert", jRow).button({ disabled: true });
			jRow.css("text-decoration", "line-through");
			jRow.fadeOut('slow', function () {
				jRow.remove();
				if ($("#ShopAlerts tbody tr").length == 0) {
					$("#ShopAlerts").dialog("close");
					$("#btnShopAlerts").hide();
				}
			});

			var sPartyCode = jRow.data("PARTY_CODE");

			participants.execTransaction(sPartyCode,
				"execute procedure adm$REWARD_DELIVERED(" + jRow.data('ID').prepSQL() + ");", 1,
				function () { LogEntry("Custom reward purchased by " + jRow.data('PARTICIPANT') + " marked as delivered."); }
			);
		}
	}
};
var Catalog = {
	cDefaultCategory: "Everything",
	bProductsLoaded: false,
	nCurrentPage: -1,
	nCurrentCatIndex: -1,
	aPopups: new Array(),
	aDisplayProducts: new Array(),
	aMasterProducts: new Array(),
	aProductDescriptions: new Array(),
	oDimensions: {
		thumb: { width: 126, height: 158 },
		header: { width: $(window).width(), height: 200 }
	},
	thumbsPerPage: {
		min: 8,
		max: 105,
		prev: 0,
		current: 12,
		setCurrent: function () {
			var nX = Math.floor($(window).width() / Catalog.oDimensions.thumb.width)
						* Math.floor(($(window).height() - Catalog.oDimensions.header.height) / Catalog.oDimensions.thumb.height);
			if (nX < Catalog.thumbsPerPage.min) {
				nX = Catalog.thumbsPerPage.min;
				$('body').css("overflow", "visible");
			} else $('body').css("overflow", "");
			if (nX > Catalog.thumbsPerPage.max) nX = Catalog.thumbsPerPage.max;
			Catalog.thumbsPerPage.current = nX;

			if (!Catalog.bProductsLoaded) {
				Catalog.thumbsPerPage.prev = Catalog.thumbsPerPage.current;
			}
		}
	},

	show: function () {
		Catalog.windowResized();
		Catalog.categoryChanged("static,leftright", function () { });
	},
	hide: function (callback) {
		Catalog.pageChanged("leftright,hide", function () {
			if (callback) callback();
		});
	},
	windowResized: function () {
		if ($(document).width() < 700)
			$("#TokenLogo").hide();
		else
			$("#TokenLogo").show();

		if (!Catalog.bProductsLoaded) return;

		var catThumbs = Catalog.thumbsPerPage;
		catThumbs.setCurrent();

		if (catThumbs.current == catThumbs.prev) return;

		var nFirstVisible = $(".ProductThumb:first").data("index");
		var bLastPage = ($("#selPageFilter").val() == $("#selPageFilter option").length) ? true : false;
		if (bLastPage) {
			$(".ProductThumb").addClass("hidden");
		}
		var nX = 0;
		if (catThumbs.current < catThumbs.prev) {
			//remove thumbs, recalc page filters
			for (nX = catThumbs.prev - 1; nX > catThumbs.current - 1; nX--) {
				$(".ProductThumb").eq(nX).remove();
			}
		}
		if (catThumbs.current > catThumbs.prev) {
			//add thumbs, recalc page filters
			for (nX = catThumbs.prev; nX < catThumbs.current; nX++) {
				Catalog.appendProduct($(".ProductThumb:last").data("index") + 1);
			}
			SetRewardUnitElements(".ProductThumb .ProductThumb-Price");
		}
		catThumbs.prev = catThumbs.current;
		Catalog.createPageOptions();
		var nNewPageCnt = $("#selPageFilter option").length;
		if (bLastPage) {
			$("#selPageFilter").val(nNewPageCnt);
			Catalog.pageChanged("none");
			return;
		}
		//find which page the last visible product is now on, and changed to that page.
		var nNewPage = Math.ceil(nFirstVisible / Catalog.thumbsPerPage.current) + 1;
		$("#selPageFilter").val(nNewPage);
		Catalog.pageChanged("none");
	},

	fetchProducts: function (callback) {
		ui.elap.on();
		var cSQL = "select * from adm$shop_products(" + customer_id.prepSQL() + ",null) " +
			(($("#btnsShowRewards input").eq(0).is(":checked")) ? "where custom_reward='1'" : "") + ";\n" +
			"select distinct categories from adm$shop_products(" + customer_id.prepSQL() + ",null);";

		new execQuery(cSQL, function (aTables) {
			Catalog.categoriesFetched(aTables[1]);
			Catalog.productsFetched(aTables[0], function () {
				Catalog.show();
				ui.elap.off();
				if (callback) callback();
			});
		});
	},

	categoriesFetched: function (aCats) {
		for (var nX = 0; nX < aCats.length; nX++) {
			Catalog.createCategories.appendArray(aCats[nX].CATEGORIES);
		}

		Catalog.createCategories.appendHTML();
	},
	createCategories: {
		aCats: [],
		appendArray: function (cCategories) {

			var aX = cCategories.split(/,/);
			if (aX[0].length == 0) return;
			var aCats = Catalog.createCategories.aCats;
			var bCatFound = false;

			for (var nX = 0; nX < aX.length; nX++) {
				bCatFound = false;
				for (var nY = 0; nY < aCats.length; nY++) {
					if (aX[nX] == aCats[nY].name) { aCats[nY].count++; bCatFound = true; break; }
				}
				if (!bCatFound) { aCats[aCats.length] = { name: aX[nX], count: 1 }; }
			}
		},
		appendHTML: function () {

			var aCats = Catalog.createCategories.aCats;
			aCats.sort(function (a, b) {
				var compA = a.name.toUpperCase();
				var compB = b.name.toUpperCase();
				return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
			})
			var jSelCategory = $("#selCategory").empty();
			jSelCategory.append('<option value="All" style="font-weight:bold">Everything</option>');
			for (var nX = 0; nX < aCats.length; nX++) {
				jSelCategory.append('<option value="' + aCats[nX].name + '" count="' + aCats[nX].count + '">&nbsp;' + aCats[nX].name + '</option>');
			}
			jSelCategory.append('<option value="OrderedItems" style="font-weight:bold">My Custom Rewards</option>');

			//IE6 workaround - DOM needs a millisec to "catchup" before setting default value
			try { jSelCategory.val(Catalog.cDefaultCategory); }
			catch (ex) { setTimeout(function () { jSelCategory.val(Catalog.cDefaultCategory); }, 1); }

			Catalog.bProductsLoaded = true;
		}
	},

	productsFetched: function (aTables, callback) {
		Catalog.aMasterProducts = $.extend(true, [], aTables);
		$("#MyShopObjects").empty();


		if ($("#btnsShowRewards input").eq(0).is(":checked") && (!aTables[0] || aTables[0].length == 0)) {
			$("#NavigationWrapper #NavCatPages").hide();
			$("#MyShopObjects").hide();
			$("#NoCustomRewards").show();
		}
		else {
			$("#NavigationWrapper #NavCatPages").show();
			$("#NoCustomRewards").hide();
			$("#MyShopObjects").show();

			Catalog.thumbsPerPage.setCurrent();
			for (var nX = 0; nX < Catalog.aMasterProducts.length; nX++) {
				if (Catalog.aMasterProducts[nX].CUSTOM_REWARD != "1")
					preLoadImages("http://tokenrewards.com/product_images/small/" + Catalog.aMasterProducts[nX].CODE + ".gif");

				if (nX < Catalog.thumbsPerPage.current) { Catalog.appendProduct(nX); }
			}

			Catalog.initPageNavBtns();
		}
		if (callback) callback();
	},
	appendProduct: function (nProductIndex) {
		var jThumb = $(".ProductThumb.prototype").clone().removeClass("prototype").attr("index", nProductIndex)
		.click(function () {
			Catalog.thumbClicked(this);
		});
		$("#MyShopObjects").append(jThumb);
	},
	updateDisplayProducts: function () {
		Catalog.aDisplayProducts = $.extend(true, [], Catalog.aMasterProducts);
		var oSel = $("#selCategory");
		if (oSel.val() != "All" && oSel.val() != "OrderedItems") {
			Catalog.aDisplayProducts = $.grep(Catalog.aDisplayProducts, function (oProduct, nIndex) {
				return (oProduct.CATEGORIES.indexOf(oSel.val()) != -1);
			});
		}
		if (oSel.val() == "OrderedItems") {
			Catalog.aDisplayProducts = $.grep(Catalog.aDisplayProducts, function (oProduct, nIndex) {
				return (oProduct.QTY_ON_ORDER > 0);
			});
		}

		var aOrders = $.grep(Catalog.aMasterProducts, function (oProduct, nIndex) { return (oProduct.QTY_ON_ORDER > 0); });
		if (aOrders.length == 0) {
			$("label[for=btnOrders]").hide();
			oSel.find("option").last().text("No Orders").hide();
		}
		else {
			$("label[for=btnOrders]").show();
			$("#btnOrders").button({ label: aOrders.length });
			oSel.find("option").last().text("My Orders (" + aOrders.length + ")").show();
		}
	},
	createPageOptions: function () {
		var nPages = Math.ceil(Catalog.aDisplayProducts.length / Catalog.thumbsPerPage.current);
		var jSelPageFilter = $("#selPageFilter");
		jSelPageFilter.find("option").remove();
		for (var nPage = 0; nPage < nPages; nPage++) {
			var nFirstProduct = nPage * Catalog.thumbsPerPage.current;
			var nLastProduct = (nPage == nPages - 1) ? Catalog.aDisplayProducts.length - 1 : ((nPage + 1) * Catalog.thumbsPerPage.current) - 1;
			var nHigh = (nPage == 0) ? "Up" : Catalog.aDisplayProducts[nFirstProduct].TOKENS_EACH;
			var nLow = Catalog.aDisplayProducts[nLastProduct].TOKENS_EACH;
			jSelPageFilter.append(
				'<option value="' + String(nPage + 1) + '">' + //Page ' + String(nPage + 1) + ': ' +
				nHigh + ' to ' + nLow + ' ' + Application.oUser.TOKENUNIT + 's' +
				'</option>');
		}

		if (nPages <= 1) {
			//Disable Page Navigation
		} else {
			//Enabled
		}

	},
	initPageNavBtns: function () {
		var jSelPage = $("#selPageFilter").change(function () {
			LogEntry("Page " + $(this).val() + " selected.");
			Catalog.pageChanged();
		});
		var jSelCat = $("#selCategory").change(function () {
			LogEntry($(this).val() + " category selected.");
			Catalog.categoryChanged();
		});

		$("#Navigator .navButton")
		.click(function () {
			if ($(this).attr("disabled")) return;
			LogEntry("Nav. button '" + $(this).attr("navorder") + "' clicked.");
			switch ($(this).attr("navorder")) {
				case "prevcat": jSelCat[0].selectedIndex--; Catalog.categoryChanged(); break;
				case "nextcat": jSelCat[0].selectedIndex++; Catalog.categoryChanged(); break;

				case "start": jSelPage.val(1); Catalog.pageChanged(); break;
				case "prev": jSelPage.val(Number(jSelPage.val()) - 1); Catalog.pageChanged(); break;
				case "next": jSelPage.val(Number(jSelPage.val()) + 1); Catalog.pageChanged(); break;
				case "end": jSelPage.val(jSelPage.find("option").length); Catalog.pageChanged(); break;
			}
		})
		.filter("[navorder='prevcat']").button({ text: false, icons: { primary: 'ui-icon-arrowthick-1-n', secondary: null} }).end()
		.filter("[navorder='nextcat']").button({ text: false, icons: { primary: 'ui-icon-arrowthick-1-s', secondary: null} }).end()
		.filter("[navorder='start']").button({ text: false, icons: { primary: 'ui-icon-seek-start', secondary: null} }).end()
		.filter("[navorder='prev']").button({ text: false, icons: { primary: 'ui-icon-seek-prev', secondary: null} }).end()
		.filter("[navorder='next']").button({ text: false, icons: { primary: 'ui-icon-seek-next', secondary: null} }).end()
		.filter("[navorder='end']").button({ text: false, icons: { primary: 'ui-icon-seek-end', secondary: null} }).end()
		;
		$("#Navigator .buttonSet").buttonset();
		$("#NavigationWrapper").show();
	},
	thumbClicked: function (oClicked) {
		var nProductId = $(oClicked).data("ID");
		for (var nX = 0; nX < Catalog.aPopups.length; nX++) {
			if (Catalog.aPopups[nX].nProductId == nProductId) {
				if (Catalog.aPopups[nX].tip.css("display") != "none") {  //is(":visible"))
					Catalog.aPopups[nX].hidePopup();
					return;
				}
				Catalog.aPopups[nX].trigger = $(oClicked);
				Catalog.aPopups[nX].showPopup();
				return;
			}
		}
		// Product's popup had not been created yet.  Go ahead and new it.
		Catalog.aPopups[Catalog.aPopups.length] = new ProductPopup($(oClicked));
	},
	categoryChanged: function (cAnimationOrder, callback) {
		var oSel = $("#selCategory");

		var nSelectedCat = oSel[0].selectedIndex;
		var nTotCats = oSel.find("option").length;

		$(".navCategoryButtonSet .navButton").mouseleave().button("enable");
		if (nSelectedCat == 0) {
			$(".navButton[navorder='prevcat']").button("disable");
		}

		if (nSelectedCat + 1 == nTotCats) {
			$(".navButton[navorder='nextcat']").button("disable");
		}

		Catalog.updateDisplayProducts();
		Catalog.createPageOptions();
		if (cAnimationOrder == undefined) {
			if (nSelectedCat > Catalog.nCurrentCatIndex) cAnimationOrder = "bottom,top";
			else if (nSelectedCat < Catalog.nCurrentCatIndex) cAnimationOrder = "top,bottom";
			else cAnimationOrder = "none";
		}
		Catalog.nCurrentCatIndex = nSelectedCat;
		Catalog.pageChanged(cAnimationOrder, callback);
	},
	pageChanged: function (cAnimationOrder, callback) {
		var jThumbs = $("#MyShopObjects .ProductThumb");
		var my = this;
		this.moveIn = false;
		var jPageFilter = $("#selPageFilter");
		var nSelectedPage = Number(jPageFilter.val()) - 1;
		var nTotPages = jPageFilter.find("option").length;

		// Animtation[0] is move to positiob, Animation[1] = move from position, Animation[2] is final position (undefined==0px or "hide")
		var aAnimations = [];
		if (cAnimationOrder != undefined)
			var aAnimations = cAnimationOrder.split(',');

		if (aAnimations[1] == undefined) aAnimations[1] = aAnimations[0];

		if (aAnimations[0] == undefined) {
			if (nSelectedPage > Catalog.nCurrentPage) aAnimations = ["left", "right"];
			else if (nSelectedPage < Catalog.nCurrentPage) aAnimations = ["right", "left"];
			else aAnimations[0] = "none";
		}

		aAnimations[0] = "none";

		Catalog.nCurrentPage = nSelectedPage;

		this.fixNavigators = function () {
			//Enable-Disable Nav buttons as necessary

			$(".navPageButtonSet .navButton").mouseleave().button("enable")
			if (nSelectedPage == 0) {
				$(".navButton[navorder='start'],.navButton[navorder='prev']").button("disable");
			}

			if (nSelectedPage + 1 == nTotPages) {
				$(".navButton[navorder='next'],.navButton[navorder='end']").button("disable");
			}

		}

		var oDoc = { width: $(document).width() + 120, height: $(document).height() + 150 };

		this.oMove = {
			cOrder: function (cPosOrder, nIndex) {
				if (cPosOrder == "random") {
					var nInt = Math.floor(Math.random() * 4);
				}
				if (cPosOrder == "leftright") {
					var nInt = nIndex % 2;
				}
				if (cPosOrder == "updown") {
					var nInt = (nIndex % 2) + 2;
				}
				if (cPosOrder == "fourway") {
					var nInt = nIndex % 4;
				}
				switch (nInt) {
					case 0: return "left"; break;
					case 1: return "right"; break;
					case 2: return "top"; break;
					case 3: return "bottom"; break;
				}

				return cPosOrder;
			},
			left: function (cToFrom, nIndex) {
				var nToFrom = (cToFrom == "to") ? 0 : 1;
				var cOrder = my.oMove.cOrder(aAnimations[nToFrom], nIndex);
				switch (cOrder) {
					case "left": return "-" + oDoc.width + "px"; break;
					case "right": return "0" + oDoc.width + "px"; break;
					case "top": return "0px"; break;
					case "bottom": return "0px"; break;

				}
			},
			top: function (cToFrom, nIndex) {
				var nToFrom = (cToFrom == "to") ? 0 : 1;
				switch (my.oMove.cOrder(aAnimations[nToFrom], nIndex)) {
					case "left": return "0px"; break;
					case "right": return "0px"; break;
					case "top": return "-" + oDoc.height + "px"; break;
					case "bottom": return "" + oDoc.height + "px"; break;
				}

			}
		}

		this.moveOut = function () {
			var moveBack = function () {
				Catalog.drawPage();
				jThumbs.css({ "display": "" }).each(function (index, element) {
					$(element).animate({ "left": "0px", "top": "0px" }, 1500, "easeOutBack", function () {
						if (index == jThumbs.length - 1) {
							if (callback) callback();
						}
					});
				});
			}

			jThumbs.stop(true, false).each(function (index, element) {
				if (aAnimations[0] == "static") {
					$(element).css({ "left": my.oMove.left("from", index), "top": my.oMove.top("from", index) });
					return;
				}
				$(element).animate({ "left": my.oMove.left("to", index), "top": my.oMove.top("to", index) }, 750, 'easeInQuad',
					function () {
						$(this).css({ "left": my.oMove.left("from", index), "top": my.oMove.top("from", index) });
						if (index == jThumbs.length - 1) {
							if (aAnimations[1] != "hide") { moveBack(); }
							else if (callback) callback();
						}
					});
			});
			if (aAnimations[0] == "static") { moveBack(); }
		}
		this.fixNavigators();

		if (aAnimations[0] == "none") Catalog.drawPage();
		else this.moveOut();
	},
	drawPage: function () {
		var nSelectedPage = Number($("#selPageFilter").val()) - 1;
		var jThumbs = $("#MyShopObjects .ProductThumb");
		if (Catalog.aDisplayProducts.length == 0) { jThumbs.addClass("hidden"); return; }

		for (var nX = 0; nX < Catalog.thumbsPerPage.current; nX++) {
			var nProductIndex = nSelectedPage * Catalog.thumbsPerPage.current + nX;

			var jProduct = jThumbs.eq(nX);
			if (nProductIndex >= Catalog.aDisplayProducts.length) {
				jProduct.addClass("hidden");
				continue;
			}
			var oProduct = Catalog.aDisplayProducts[nProductIndex];

			jProduct.find('.ProductThumb-Image')[0].src = "/Common/Images/Elapsors/SmallLoading.gif";
			if (oProduct.CUSTOM_REWARD == "1") {
				Catalog.setWarnings(oProduct, jProduct);
				jProduct.find('.ProductThumb-Image')[0].src = "/Common/customer_images/" + oProduct.CODE + ".gif?" + Date.now().getTime();
				if (oProduct.HTML_USED == "1") {
					oProduct.NAME = oProduct.NAME.encodeHTML();
					oProduct.DESCRIPTION = oProduct.DESCRIPTION.encodeHTML();
				}
			}
			else {
				$(".warningSign", jProduct).hide();
				jProduct.find('.ProductThumb-Image')
				.attr("src", "http://tokenrewards.com/product_images/small/" + oProduct.CODE + ".gif");
			}

			jProduct.removeClass("hidden")
			.data({ "index": nProductIndex })
			.data(oProduct)
			.attr("code", oProduct.CODE)
			.find('.ProductThumb-Name').html(oProduct.NAME);

			if (Number(oProduct.TOKENS_EACH) > 0) {
				jProduct.find(".ProductThumb-Price").removeClass("hidden")
				.find(".UserPrice").text(oProduct.TOKENS_EACH).end()
				.find(".TextRewardUnits").text(Application.oUser.TOKENUNIT.toPlural(oProduct.TOKENS_EACH));
			}
			jProduct.find(".shipLogo").hide();

		}

	},
	setWarnings: function (oProduct, jProduct) {
		/*
		ASSIGNED_TO smallint,
		ASSIGNED_PARTY_CNT int,
		ASSIGNED_CLASS_CNT int,
		HIDDEN_FROM_PARTIES smallint,
		EXPIRES timestamp,
		GROUP_QTY integer,
		PARTY_QTY integer,
		GROUP_QTY_AWARDED integer,
		GROUP_QTY_AVAILABLE integer,
		HTML_USED smallint
		*/

		var bAward = false;
		if (jProduct.hasClass("awardWarning")) bAward = true;

		$(".warningSign", jProduct).removeClass("caution").attr("title", "");
		if (oProduct.HIDDEN_FROM_PARTIES == "1") {
			$(".warningSign", jProduct).show().attr("title",
				"Not displayed at Shop because of custom setting.");
		}
		else if (oProduct.EXPIRES && oProduct.EXPIRES.toDate() < Date('now').toDate()) {
			$(".warningSign", jProduct).show().attr("title",
				"Not displayed at Shop because deadline has expired.");
		}
		else if (oProduct.GROUP_QTY && oProduct.GROUP_QTY_AVAILABLE.toNumber() <= 0) {
			$(".warningSign", jProduct).show().attr("title",
				"Not displayed at Shop because total quantity exhausted - none remianing.");
		}
		else if (oProduct.ASSIGNED_TO == "1"
			&& oProduct.ASSIGNED_PARTY_CNT == 0
			&& oProduct.ASSIGNED_CLASS_CNT == 0) {
			$(".warningSign", jProduct).show().attr("title",
				"Not displayed at Shop because no eligible participants or classes.");
		}
		else if (oProduct.EXPIRES && oProduct.EXPIRES.toDate() > Date('now').toDate()) {
			$(".warningSign", jProduct).addClass('caution').show().attr("title",
				"Deadline exists: " + oProduct.EXPIRES.toDateFormat('shortDate') + ".");
		}
		else if (oProduct.ASSIGNED_TO == "1") {
			$(".warningSign", jProduct).addClass('caution').show().attr("title",
				"Not all participants will see these because eligibility is limited."
			//				" to " +
			//				((oProduct.ASSIGNED_PARTY_CNT != "0") ? oProduct.ASSIGNED_PARTY_CNT + " participant".toPlural(oProduct.ASSIGNED_PARTY_CNT) : '') +
			//				((oProduct.ASSIGNED_PARTY_CNT != "0" && oProduct.ASSIGNED_CLASS_CNT != "0") ? " and " : '') +
			//				((oProduct.ASSIGNED_CLASS_CNT != "0") ? oProduct.ASSIGNED_CLASS_CNT + " class".toPlural(oProduct.ASSIGNED_CLASS_CNT) : '') +
			//				"."
			);
		}
		else if (!oProduct.CATEGORIES && !bAward) {
			$(".warningSign", jProduct).addClass('caution').show().attr("title",
				"No category assigned, making it difficult for participants to locate.");
		}
		else if (oProduct.GROUP_QTY && oProduct.GROUP_QTY_AVAILABLE.toNumber() > 0) {
			$(".warningSign", jProduct).addClass('caution').show().attr("title",
				"There are only " + (oProduct.GROUP_QTY_AVAILABLE) + " of these remaining.");
		}
		else if (oProduct.PARTY_QTY) {
			$(".warningSign", jProduct).addClass('caution').show().attr("title",
				"Participants are limited to " + oProduct.PARTY_QTY + " of these.");
		}
		else $(".warningSign", jProduct).hide();

		return jProduct;
	}
};
var ProductPopup = function (jClicked) {
	var self = this;
	this.tip;
	this.triggertimer;
	this.tiptimer;
	this.shrinkTimeOut;
	this.trigger = jClicked;
	this.nProductId = jClicked.data('ID');

	LogEntry("My Shop Product " + jClicked.data('CODE') + " - " + jClicked.data("NAME") + " - clicked.");

	this.shrinkImage = function (cSpeed) {
		var nSpeed = 2500;
		switch (cSpeed) {
			case false: nSpeed = 1500; break;
			case "fast": nSpeed = 500; break;
			case "slow": nSpeed = 2500; break;
		}

		var jImg = self.tip.find(".ProductPopUpImage");
		var jDetails = self.tip.find(".ProductPopUpDetails")

		jImg.stop(true, false).animate({ width: "95px", height: "95px" }, nSpeed, "easeOutBack", function () { });
		jDetails.fadeIn(nSpeed * .6, function () { });
	};
	this.growImage = function () {
		var jImg = self.tip.find(".ProductPopUpImage");
		var jDetails = self.tip.find(".ProductPopUpDetails")

		jImg.stop();
		if (jImg.width() < 288)
			jImg.animate({ width: "288px", height: "288px" }, 750, "easeOutBounce");
		jDetails.fadeOut(500, function () { });
	};

	this.createPopup = function () {
		var sDescription = '';
		var oProduct = self.trigger.data();
		oProduct.isCustomReward = (oProduct.CUSTOM_REWARD == "1");
		if (oProduct.isCustomReward) {
			if (oProduct.HIDDEN_FROM_PARTIES == "1")
				sDescription =
				'<div class="warning">' +
					'<div class="warningSign"></div>' +
					'Unavailable to participants because "Do Not Display" is checked.' +
				'</div>';
			if (oProduct.EXPIRES && oProduct.EXPIRES.toDate() < Date('now').toDate())
				sDescription +=
				'<div class="warning">' +
					'<div class="warningSign"></div>' +
					"Participants will not see reward because it expired " + oProduct.EXPIRES.toDateFormat('shortDate') + "." +
				'</div>';
			if (oProduct.GROUP_QTY && oProduct.GROUP_QTY_AVAILABLE <= 0)
				sDescription +=
				'<div class="warning">' +
					'<div class="warningSign"></div>' +
					"Participants will not see reward because quantity limit reached." +
				'</div>';
			if (oProduct.ASSIGNED_TO == "1" && oProduct.ASSIGNED_PARTY_CNT == 0 && oProduct.ASSIGNED_CLASS_CNT == 0)
				sDescription +=
				'<div class="warning">' +
					'<div class="warningSign"></div>' +
					"Not displayed because reward has no eligible participants or classes." +
				'</div>';

			if (oProduct.EXPIRES && oProduct.EXPIRES.toDate() > Date('now').toDate())
				sDescription +=
				'<div class="warning">' +
					'<div class="warningSign caution"></div>' +
					"Participant deadline to purchase reward is " + oProduct.EXPIRES.toDateFormat('shortDate') + "." +
				'</div>';

			if (oProduct.ASSIGNED_TO == "1" &&
				(oProduct.ASSIGNED_PARTY_CNT.toNumber() > 0 || oProduct.ASSIGNED_CLASS_CNT.toNumber() > 0))
				sDescription +=
				'<div class="warning">' +
					'<div class="warningSign caution"></div>' +
					"Reward eligibility is limited to " +
					((oProduct.ASSIGNED_PARTY_CNT != "0") ? oProduct.ASSIGNED_PARTY_CNT + " participant".toPlural(oProduct.ASSIGNED_PARTY_CNT) : '') +
					((oProduct.ASSIGNED_PARTY_CNT != "0" && oProduct.ASSIGNED_CLASS_CNT != "0") ? " and " : '') +
					((oProduct.ASSIGNED_CLASS_CNT != "0") ? oProduct.ASSIGNED_CLASS_CNT + " class".toPlural(oProduct.ASSIGNED_CLASS_CNT) : '') +
					"." +
				'</div>';

			if (!oProduct.CATEGORIES)
				sDescription +=
				'<div class="warning">' +
					'<div class="warningSign caution"></div>' +
					"Reward has no category assigned, making it difficult for participants to locate." +
				'</div>';

			if (oProduct.GROUP_QTY && oProduct.GROUP_QTY_AVAILABLE.toNumber() > 0)
				sDescription +=
				'<div class="warning">' +
					'<div class="warningSign caution"></div>' +
					"There are only " + (oProduct.GROUP_QTY_AVAILABLE) + " of these rewards remaining." +
				'</div>';
			if (oProduct.PARTY_QTY)
				sDescription +=
				'<div class="warning">' +
					'<div class="warningSign caution"></div>' +
					"Participants are limited to " + oProduct.PARTY_QTY +
					" purchase".toPlural(oProduct.PARTY_QTY) + " of this reward." +
				'</div>';
		}

		sDescription += '<div>' + oProduct.DESCRIPTION + '</div>' +
			((!oProduct.isCustomReward) ?
			"<br/><br /><b>Warning:</b> CHOKING HAZARD - Not for Children Under 3 years." : '');


		self.tip = $('.ProductPopUp.prototype').clone().removeClass('prototype')
		.attr("code", self.trigger.data("CODE"));
		if (ui.IE6) {
			self.tip.addClass("useBGImg");
			$(".imgPopupBG", self.tip).remove();
		}

		$(".categoryName", self.tip).text(oProduct.CATEGORIES);
		$(".productCode", self.tip).text(oProduct.CODE);
		$(".ProductPopUpName", self.tip).html(oProduct.NAME);
		$(".ProductPopUpDescript", self.tip).html(sDescription);
		$(".ProductPopUpImage", self.tip).attr("src", !oProduct.isCustomReward ?
			"http://tokenrewards.com/product_images/large/" + oProduct.CODE + ".gif?" + Date.now().getTime() :
			"/Common/customer_images/" + oProduct.CODE + ".gif?" + Date.now().getTime());

		if (oProduct.isCustomReward) {
			$(".editReward", self.tip).removeClass('hidden').show()
			.button({ label: "Edit Reward", icons: { primary: "ui-icon-pencil"} })
			.click(function () {
				award.update(oProduct.ID, "Reward");
			});
		}


		self.tip
		.hover(
			function () {
				clearTimeout(self.triggertimer);
				clearTimeout(self.tiptimer);
			},
			function () { self.tiptimer = setTimeout(function () { self.hidePopup(); }, 500) })
		.find(".ProductZoomTrigger").hover(
			function () { self.growImage(); },
			function () { self.shrinkImage("fast"); })
		.end().find(".ProductPopUpImage").mouseenter(
			function () {
				clearTimeout(self.shrinkTimeOut);
				$(this).stop(true, false);
				self.tip.find(".ProductPopUpDetails").stop(true, true);
				self.shrinkImage("fast");
			})
		.end().find(".ProductPopUpClose").click(function () { self.hidePopup(); });


		$(document.body).append(self.tip);

	};
	this.showPopup = function () {
		var tip = self.tip;
		var trigger = self.trigger;
		var SetPosition = function () {
			var TestPosition = function (aPos, aOffset) {
				var bVSuccess = false, bHSuccess = false;
				var nTipTop = 0, nTipLeft = 0, nTipRight = 0, nTipBottom = 0;

				var nWithin = -25;
				switch (aPos[0]) {
					case "left":
						nTipLeft = aOffset[0] + nTriggerLeft - nTipWidth;
						bHSuccess = nTipLeft > nWithin && (nTipLeft + nTipWidth < nViewWidth - nWithin);
						break;
					case "center":
						nTipLeft = aOffset[0] + nTriggerLeft + nTriggerWidth / 2 - nTipWidth / 2;
						nTipRight = aOffset[0] + nTriggerLeft + nTriggerWidth / 2 + nTipWidth / 2;
						bHSuccess = (nTipLeft > nWithin && nTipRight < nViewWidth - nWithin);
						break;
					case "right":
						nTipLeft = aOffset[0] + nTriggerLeft + nTriggerWidth;
						bHSuccess = (nTipLeft + nTipWidth < nViewWidth - nWithin);
						break;
				}

				var nWithin = 50;
				switch (aPos[1]) {
					case "top":
						nTipTop = aOffset[1] + nTriggerTop - nTipHeight;
						bVSuccess = nTipTop > -nWithin;
						break;
					case "center":
						nTipTop = aOffset[1] + nTriggerTop + (nTriggerHeight / 2) - nTipHeight / 2;
						nTipBottom = nTipTop + nTipHeight;
						bVSuccess = (nTipTop > -nWithin && nTipBottom < nViewHeight + nWithin);
						break;
					case "bottom":
						nTipTop = aOffset[1] + nTriggerTop + nTriggerHeight;
						bVSuccess = (nTipTop + nTipHeight < nViewHeight + nWithin);
						break;
				}

				if (bVSuccess && bHSuccess) {
					tip.css({ top: String(nTipTop) + "px", left: String(nTipLeft) + "px" });
					return true;
				} else return false;
			}

			var viewport = $(window);
			var nViewHeight = Number(viewport.height());
			var nViewWidth = Number(viewport.width());


			var nTipHeight = 435; // Number(tip.height());
			var nTipWidth = 400; // Number(tip.width());

			var nTriggerHeight = Number(trigger.height());
			var nTriggerWidth = Number(trigger.width());

			var TriggerOffset = trigger.offset();

			var nTriggerTop = TriggerOffset.top
			var nTriggerLeft = TriggerOffset.left;

			var jPointer = tip.find(".Pointer");
			jPointer.removeClass("North South East West Left Right Top Bottom hidden");
			var aTestOffSet = [0, 0];

			if (TestPosition(["right", "center"], [-25, 75])) { jPointer.addClass("West Top"); return true; }
			if (TestPosition(["left", "center"], [25, 75])) { jPointer.addClass("East Top"); return true; }

			if (TestPosition(["right", "center"], [-25, -3])) { jPointer.addClass("West"); return true; }
			if (TestPosition(["left", "center"], [25, -3])) { jPointer.addClass("East"); return true; }

			if (TestPosition(["right", "center"], [-25, -100])) { jPointer.addClass("West Bottom"); return true; }
			if (TestPosition(["left", "center"], [25, -100])) { jPointer.addClass("East Bottom"); return true; }

			if (TestPosition(["center", "top"], [-3, 28])) { jPointer.addClass("South"); return true; }
			if (TestPosition(["center", "bottom"], [-3, -25])) { jPointer.addClass("North"); return true; }

			if (TestPosition(["center", "bottom"], [90, -25])) { jPointer.addClass("North Left"); return true; }
			if (TestPosition(["center", "bottom"], [-100, -25])) { jPointer.addClass("North Right"); return true; }

			if (TestPosition(["center", "top"], [90, 28])) { jPointer.addClass("South Left"); return true; }
			if (TestPosition(["center", "top"], [-100, 28])) { jPointer.addClass("South Right"); return true; }


			//			if (TestPosition(["bottom", "right"], [-nTriggerHeight - 20, -30])) { jPointer.addClass("East Top"); return true; }
			//			if (TestPosition(["top", "left"], [nTriggerHeight + 20, 30])) { jPointer.addClass("East Bottom"); return true; }
			//			if (TestPosition(["top", "right"], [nTriggerHeight + 20, -30])) { jPointer.addClass("West Bottom"); return true; }

			//If doesn't fit anywhere else, then middle of screen
			tip.css({ top: String((nViewHeight / 2) - (nTipHeight / 2) + 20) + "px",
				left: String((nViewWidth / 2) - (nTipWidth / 2)) + "px"
			})
			jPointer.addClass("hidden");

		}

		var oImg = tip.find(".ProductPopUpImage");
		oImg.css({ width: "288px", height: "288px" });
		tip.find(".ProductPopUpDetails").css("display", "none");

		SetPosition();

		self.trigger.mouseenter(function () {
			clearTimeout(self.triggertimer);
			clearTimeout(self.tiptimer);
		})
		.mouseleave(function () {
			self.triggertimer = setTimeout(function () { self.hidePopup(); }, 500);
		});

		if (true) {
			tip.find(".ProductPopUpBottom")
			.find(".TokenPrice").text(trigger.data("TOKENS_EACH")).removeClass("hidden").end()
			.find(".TokenUnit").text(Application.oUser.TOKENUNIT.toPlural(self.trigger.data("TOKENS_EACH")))
			.removeClass("hidden").end()
			.removeClass("hidden");
		}

		//$.sound.play("claves.wav", { timeout: 1000 });
		tip.fadeIn(250);
		self.shrinkTimeOut = setTimeout(function () {
			self.shrinkImage("slow"); clearTimeout(self.shrinkTimeOut);
		}, 500);
	}
	this.hidePopup = function () {
		clearTimeout(self.shrinkTimeOut);
		self.tip.children().stop(true, true);
		self.trigger.unbind('mouseenter').unbind('mouseleave');
		self.tip.fadeOut(500);
	}

	this.createPopup();
	this.showPopup();
};


var setup = {
	initialized: false,

	changePassword: function () {
		var my = this;
		this.chkShowPassword_onclick = function () {
			if ($("#chkResetShowPassword").attr("checked")) {
				$("#ResetPassword_Hidden").hide('slide', { direction: "left" }, 500, function () {
					$("#ResetPassword_Visible").show('slide', { direction: "right" }, 500)
				});
				$("#Reset_Password2").attr("value", $("#Reset_Password1").attr("value"));
				my.Password_onchange();
				$("#Reset_Password3").focus()
			}
			else {
				$("#ResetPassword_Visible").hide('slide', { direction: "left" }, 500, function () {
					$("#ResetPassword_Hidden").show('slide', { direction: "right" }, 500)
				});
				$("#Reset_Password2").attr("value", "");
				my.Password_onchange();
				$("#Reset_Password1").focus()
			}
		}

		this.Password_onchange = function (nX) {
			var Pass1 = $("#Reset_Password1").val();
			var Pass2 = $("#Reset_Password2").val();

			if (Pass1 != Pass2) { $("#ResetWarnPasswords").show(); my.EnableSave(false); }
			else { $("#ResetWarnPasswords").hide(); my.EnableSave(true) }
		}
		this.EnableSave = function (bEnable) {
			var saveButton = $(":button:contains('Save Password')");
			saveButton.button({ disabled: !bEnable });
		}
		this.chkShowCurrentPassword_onclick = function () { $("#spanCurrentPassword").toggle() }

		$("#diagChangePassword").dialog({
			autoOpen: false,
			modal: true,
			width: 350,
			open: function (event, ui) {
				var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
				jBtns.eq(0).button({ disabled: true, icons: { primary: "ui-icon-check"} });
				jBtns.eq(1).button({ icons: { primary: "ui-icon-closethick"} });
				$(".ui-button").bind("focusout", function () { $(this).removeClass("ui-state-focus"); });
			},
			close: function (event, ui) { $(this).dialog('destroy') },
			buttons: {
				'Save Password': function () {
					cPassword = $("#Reset_Password1").val();
					my.EnableSave(false);
					var cSQL = "execute procedure adm$customer_update(" + Application.oUser.CUSTOMER_ID.prepSQL() + "," +
						cPassword.prepSQL() + "," +
						Application.oUser.PROVIDER_NAME.prepSQL() + ");";
					var oSQL = new execQuery(cSQL, function () {
						$("#diagChangePassword").dialog('close');
						ui.modalMessage({ title: "Password Changed", message: "Your new password was saved successfully." });
					});
				},
				'Cancel': function () { $(this).dialog('close'); }
			}

		});
		$("#diagChangePassword").dialog('open');
		$("#spanCurrentPassword").text(Application.oUser.PASSWORD)
		$("#Reset_Password1, #Reset_Password2").attr("value", "");

		$("#Reset_Password1").keyup(function () { my.Password_onchange(1) }).focus();
		$("#Reset_Password2").keyup(function () { my.Password_onchange(2) });
		$("#chkShowCurrentPassword").change(function () { my.chkShowCurrentPassword_onclick() });
	},
	editProviderName: function () {
		$("#diagChangeProviderName").dialog({
			autoOpen: true,
			modal: true,
			width: 350,
			open: function (event, ui) {
				var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
				jBtns.eq(0).button({ disabled: true, icons: { primary: "ui-icon-check"} });
				jBtns.eq(1).button({ icons: { primary: "ui-icon-closethick"} });
				$(".ui-button").bind("focusout", function () { $(this).removeClass("ui-state-focus"); });
			},
			close: function (event, ui) { $(this).dialog('destroy') },
			buttons: {
				'Save': function () {
					ui.openWait("Saving...");
					$("#diagChangeProviderName").dialog('close');
					var cSQL = "execute procedure adm$customer_update(" +
						Application.oUser.CUSTOMER_ID.prepSQL() + "," +
						Application.oUser.PASSWORD.prepSQL() + "," +
						$("#txtNewProviderName").val().prepSQL() + ");";
					var oSQL = new execQuery(cSQL, function () {
						ui.closeWait();
						var cName = $("#txtNewProviderName").val();
						Application.oUser.PROVIDER_NAME = cName;
						$("#spanSetupAccountName").text(cName);
						ui.modalMessage({ title: "Name Changed", message: "Your Reward Provider Name was saved successfully changed to: " +
						'<div style="text-align:center; font-weight:bold">' + cName + '</div>'
						});
					});
				},
				'Cancel': function () { $(this).dialog('close'); }
			}

		});

		$("#txtNewProviderName").val(Application.oUser.PROVIDER_NAME).keyup(function () {
			var bDisableSave = false;
			var cCurVal = $(this).val();
			if (cCurVal == Application.oUser.PROVIDER_NAME || !cCurVal) bDisableSave = true;
			$("#diagChangeProviderName").siblings(".ui-dialog-buttonpane").find("button").eq(0).button({ disabled: bDisableSave });
		});
	},

	demographics: {
		current: null,
		elapsors: {
			on: function () {
				$('#btnsDems').hide();
				$('#elapDems').show();
			},
			off: function () {
				$('#elapDems').hide();
				$('#btnsDems').show();
			}
		},

		edit: function () {
			$('[dem_input]').each(function () {
				$(this).attr('disabled', false);
			});

			$('#btnEdit_Dems').hide();
			$('#divSaveCancel_Dems').fadeIn(1500);
			$('#btnSave_Dems').button({ disabled: false });

			$('[dem_input="MB"]').focus();
		},
		save: function () {
			setup.demographics.elapsors.on();
			var oData = {};
			$("[dem_input]").each(function () {
				oData[$(this).attr('dem_input')] = $(this).val();
			});

			new execQuery(
			"execute procedure adm$demographics_update(" +
				Application.oUser.CUSTOMER_ID.prepSQL() + "," +
				oData.MB.toNumber().prepSQL() + "," +
				oData.MC.toNumber().prepSQL() + "," +
				oData.MD.toNumber().prepSQL() + "," +
				oData.ME.toNumber().prepSQL() + "," +
				oData.FB.toNumber().prepSQL() + "," +
				oData.FC.toNumber().prepSQL() + "," +
				oData.FD.toNumber().prepSQL() + "," +
				oData.FE.toNumber().prepSQL() +
			");",
			function (data) {
				new execQuery("select * from adm$demographics(" + Application.oUser.CUSTOMER_ID.prepSQL() + ");",
				function (data) {
					setup.demographics.refresh(data[0]);
					setup.demographics.elapsors.off();
					setup.demographics.cancel();
					LogEntry("Demographics Saved.");
				});
			}
		);

		},
		cancel: function () {
			setup.demographics.refresh(setup.demographics.current);

			$('[dem_input]').each(function () {
				$(this).attr('disabled', true);
			});
			$('#btnSave_Dems').button({ disabled: false });
			$('#divSaveCancel_Dems').hide();
			$('#btnEdit_Dems').fadeIn(1500);
		},

		validate: function () {
			var oDem = setup.demographics.current;
			var bEnableSave = false, nTot = 0;
			$('[dem_input]').each(function () {
				jThis = $(this);
				nTot += jThis.val().toNumber();

				if (!bEnableSave && oDem[jThis.attr('dem_input')] != jThis.val()) {
					bEnableSave = true;
				}
			});

			$('#DemographicsTotal').text(nTot);
			$('#btnSave_Dems').button({ disabled: !bEnableSave });
		},
		init: function () {
			$('#btnEdit_Dems').button({ icons: { primary: "ui-icon-pencil"} })
				.click(function () { setup.demographics.edit(); });
			$('#btnSave_Dems').button({ icons: { primary: "ui-icon-check" }, disabled: true })
				.click(function () { setup.demographics.save(); });
			$('#btnCancel_Dems').button({ icons: { primary: "ui-icon-closethick"} })
				.click(function () { setup.demographics.cancel(); });
			$('#divSaveCancel_Dems').hide();
			$('[dem_input]').each(function () {
				$(this).attr('disabled', true).keyup(function () { setup.demographics.validate(); });
			});
		},
		refresh: function (oDem) {
			setup.demographics.current = oDem;
			$('[dem_input]').each(function () {
				$(this).val(oDem[$(this).attr('dem_input')].toEmptyFromZero());
			});
			$('#DemographicsTotal').text(oDem.TOTALPOP);
			$('#DemsASOF').text(oDem.ASOF.toDateFormat('shortDate'));
			setup.demographics.elapsors.off();
		}
	},
	contacts: {
		elapsors: {
			on: function () {
				$('.elapContactInfo').show();
			},
			off: function () {
				$('.elapContactInfo').hide();
			}
		},

		init: function () {
			$('#btnEditBilling').button({ icons: { primary: "ui-icon-pencil"} })
			.click(function () { contact.open('bill'); });

			$('#btnEditShipping').button({ icons: { primary: "ui-icon-pencil"} })
			.click(function () { contact.open('ship'); });
		},
		refreshOne: function (jContext, oData, sMissingText) {
			if (!oData) {
				if (sMissingText) {
					$('.contactName', jContext).addClass('missing').text(sMissingText + ' Contact');
					$('.contactAddress .contactInfo', jContext).addClass('missing').text(sMissingText + ' Address Label');
				}
				else {
					$('.contactName', jContext).addClass('missing').text('(Contact Data Missing)');
					$('.contactAddress .contactInfo', jContext).addClass('missing').text('(Address Data Missing)');
				}
				return;
			}
			else {
				$('.contactName', jContext).removeClass('missing').text('');
				$('.contactAddress .contactInfo', jContext).removeClass('missing').text('');
			}

			if (oData.NAME) {
				$('.contactName', jContext).text(oData.NAME);
				$('.contactEmail', jContext).text(oData.EMAIL);
				$('.contactPhones', jContext).html(oData.PHONE +
						((oData.FAX) ? '<span style="margin-left:2em">Fax: ' + oData.FAX + '</span>' : ''));
				if (oData.EMAIL) {
					if (oData.EMAIL_VERIFIED) {
						$('.contactEmailValidation', jContext)
						.addClass('validated')
						.text("Verified " + oData.EMAIL_VERIFIED.toDateFormat("shortDateTime"));
					}
					else { $('.contactEmailValidation', jContext).text("Unverified"); }

					$('.contactEmail', jContext).show();
				}
				else $('.contactEmail', jContext).hide();
			}
			else $('.contactName', jContext).addClass('missing').text('(Contact Data Missing)');

			if (oData.ADDRESS) $('.contactAddress .contactInfo', jContext).html(ContactAddress(oData, ''));
			else $('.contactAddress .contactInfo', jContext).addClass('missing').text('(Address Data Missing)');
		},
		refresh: function (aoContacts) {
			var oData = contact.data;
			oData.bill = null;
			oData.ship = null;
			oData.shop = null;
			oData.aoOthers.length = 0;

			for (var nX = 0; nX < aoContacts.length; nX++) {
				switch (aoContacts[nX].CONTACT_ROLE) {
					case "__BILL": oData.bill = aoContacts[nX]; break;
					case "__SHIP": oData.ship = aoContacts[nX]; break;
					case "__SHOP": oData.shop = aoContacts[nX]; break;
					default: oData.aoOthers.push(aoContacts[nX]); break;
				}
			}

			if (!oData.bill && !oData.ship) {
				// Err...problem....no bill or ship contact
				$('#btnEditBilling').button({ label: "Enter Billing<br/>Information..." });
				$('#btnEditShipping').button({ label: "Enter Shipping<br/>Information..." });
			}
			else if ((oData.bill || oData.ship) && aoContacts[0].SAME_BILL_SHIP) {
				if (oData.bill) {
					contact.data.ship = oData.bill;
					$('#btnEditShipping').button({ label: "Enter Different<br/>Shipping Info..." });
					this.refreshOne($("#BillingInfo"), oData.bill);
					this.refreshOne($("#ShippingInfo"), null, "Same as Billing ");
					this.refreshOne($("#divCartShippingAddress"), oData.bill);
				}
				else {
					contact.data.bill = oData.ship;
					$('#btnEditBilling').button({ label: "Enter Different<br/>Billing Info..." });
					this.refreshOne($("#BillingInfo"), oData.ship);
					this.refreshOne($("#divCartShippingAddress"), oData.ship);
					this.refreshOne($("#ShippingInfo"), null, "Same as Shipping ");
				}
			}
			else {
				this.refreshOne($("#BillingInfo"), oData.bill);
				this.refreshOne($("#ShippingInfo"), oData.ship);
				this.refreshOne($("#divCartShippingAddress"), oData.ship);
			}

			setup.contacts.elapsors.off();
		}
	},

	init: function () {
		$("#SettingsTabs").tabs({ cookie: { expires: 30} });

		$("#btnChangeShopAdmin").button({ icons: { primary: "ui-icon-pencil"} });

		setup.demographics.init();
		setup.contacts.init();

		$("#btnChangePassword").button({ icons: { primary: "ui-icon-pencil"} })
			.click(function () { setup.changePassword(); });
		$("#btnEditProviderName").button({ icons: { primary: "ui-icon-pencil"} })
			.click(function () { setup.editProviderName(); });

		this.initialized = true
	},
	refresh: {
		globalElements: function () {
			// Method also called from Application.UserValidated to set these elements globally
			$(".providerName").text(Application.oUser.PROVIDER_NAME);
			$(".exchangeRate").text(Application.oUser.TOKENRATE + " " +
				Application.oUser.TOKENUNIT.toPlural(Application.oUser.TOKENRATE) +
				" = $1");

			$(".customerCode").text(Application.oUser.CODE);
			$('#spanSetupPassword input').val(Application.oUser.PASSWORD);

			SetRewardUnitElements();
		},
		all: function (fnCallback) {
			setup.refresh.globalElements();
			setup.contacts.elapsors.on();
			setup.demographics.elapsors.on();

			new execQuery(
				"select * from com$shipment_shedule(" + customer_id.prepSQL() + ",6);\n" +
				"select * from adm$customer_contacts(" + customer_id.prepSQL() + ");\n" +
				"select * from adm$demographics(" + customer_id.prepSQL() + ");\n" +
				"select * from adm$ordered_items(" + customer_id.prepSQL() + ",null)\n" +
				"   where CUSTOM_REWARD_ID > 0 and DELIVERED is null;",
				function (data) {
					setup.refresh.shippingSchedule(data[0]);
					setup.contacts.refresh(data[1]);
					setup.demographics.refresh(data[2][0]);

					if (fnCallback) fnCallback();
					shop.contact.refresh();
					shop.alerts.open(data[3]);
				}
			);
		},
		shippingSchedule: function (oShipSchedule) {
			var nBudget = Number(Application.oUser.MONTHLYBUDGET);
			var cX = '';
			var aLandDays = Application.oUser.LANDINGS.split(",");
			var cShiptime = Application.oUser.SHIPTIME + " day".toPlural(Application.oUser.SHIPTIME);
			$("#shiptime").text(cShiptime);

			var StaticFields = function () {
				if (Application.oUser.LANDINGS.length == 0) {
					$("#scheduleNotSet").show();
					$("#scheduleSet").hide();
					$("#spanShipSchedule").text("No schedule - unscheduled shipments only.");
				}
				else {
					cX = "On or around the ";
					for (var nX = 0; nX < aLandDays.length; nX++) {
						cX += Number(aLandDays[nX]).toOrdinal();
						if (nX <= aLandDays.length - 3) cX += ", ";
						if (nX == aLandDays.length - 2) cX += " and ";
					}
					cX += " of each month.";
					$("#spanShipSchedule").text(cX);
					$("#scheduleNotSet").hide();
					$("#scheduleSet").show();
				}

				if (nBudget > 1) {
					$("#budgetNotSet").hide();
					$("#spanMonthlyBudget").text(formatCurrency(nBudget, false, true));
					cX = '';
					nBudget = nBudget / aLandDays.length;
					for (var nX = 0; nX < aLandDays.length; nX++) {
						cX += "An order of approximately <b>" + formatCurrency(nBudget, false, true) + "</b>" +
				" in rewards is to arrive on the <b>" + Number(aLandDays[nX]).toOrdinal() + " of each month.</b><br/><br/>";
					}
					cX += 'Please <span class="spanFakeAnchor" onclick="Application.ContactDialog()">contact us</span> to adjust your fullfillment budget.'
					$("#budgetSet div").html(cX);


					$("#budgetSet").show();
				}
				else {
					$("#budgetNotSet").show();
					$("#budgetSet").hide();
				};

				if (Application.oUser.NEXT_SHIPMENT1) {
					var dX = new Date(Application.oUser.NEXT_SHIPMENT1);

					$("#NextShipment1").text(dX.format("longDate"));
					$("#NextOrderCutOff1").text(dX.add(-6).days().format("longDate"));
				}
			} ();

			var RefreshShopShipDates = function (data) {
				$("#divNextShipment").hide();
				$("#divOrderShipmentDeadline").hide();
				if (data.length == 0) {
					$("#divOrderShipment .shipdate").text("Ask Administrator");
					return;
				}

				var dX = new Date(data[0].ADJ_LANDING_DATE);

				if (data[0].ORDER_DEADLINE_AGE.toNumber() > 0) {
					$("#divNextShipment .shipdate").text(dX.format("dddd, mmmm d, yyyy") + ", " + data[0].ADJ_LANDING_DATE_AGE.toDaysLeft());
					$("#divNextShipment").show();
				}

				for (var nX = 0; nX < data.length; nX++) {
					if (data[nX].ORDER_DEADLINE_AGE.toNumber() <= 0) {
						var dX = new Date(data[nX].ADJ_LANDING_DATE);
						$("#divOrderShipment .shipdate").text(dX.format("dddd, mmmm d, yyyy") + ", " + data[nX].ADJ_LANDING_DATE_AGE.toDaysLeft());
						$("#divOrderShipmentDeadline .shipdate").text(dX.format("m/d"));

						var dX = new Date(data[nX].ORDER_DEADLINE);
						$("#divOrderShipmentDeadline .orderdate").text(dX.format("dddd, mmmm d") + ", " + data[nX].ORDER_DEADLINE_AGE.toDaysLeft());
						$("#divOrderShipmentDeadline").show();
						break;
					}
				}

			}
			var RefeshSchedule = function (data) {
				var jTbl = $("#tabSettingsShipSchedule tbody").empty();
				if (data.length == 0) { jTbl.find('td').show(); return; }

				var c1, c2, c3, c4, c5, nAstrix, cAstrix, cFootnotes;
				nAstrix = 0;
				cAstrix = "";
				cFootnotes = "";
				for (var nX = 0; nX < data.length; nX++) {
					c1 = (data[nX].SCHEDULED_DATE) ? (new Date(data[nX].SCHEDULED_DATE)).format("dddd, mmmm d, yyyy") : "Unscheduled Shipment";
					if (data[nX].SCHEDULED_DATE_DETAIL) {
						nAstrix++; for (var nY = 0; nY < nAstrix; nY++) { cAstrix += "*"; }
						c1 += ' <b>' + cAstrix + '</b>';
						cFootnotes += '<b>' + cAstrix + '</b> ' + data[nX].SCHEDULED_DATE_DETAIL + '<br/>';
					}
					c2 = (new Date(data[nX].ADJ_LANDING_DATE)).format("dddd, mmmm d");
					c3 = (new Date(data[nX].SHIP_DATE)).format("ddd, mmmm d");
					c4 = (new Date(data[nX].ORDER_DEADLINE)).format("dddd, mmm d");
					c5 = (data[nX].INVOICE_BUDGET.toNumber() > 1) ? formatCurrency(data[nX].INVOICE_BUDGET, false, true) : "N/A";
					jTbl.append(
					'<tr>' +
						'<td>' + c1 + '</td>' +
						'<td>' + c2 + '</td>' +
						'<td>' + c3 + '</td>' +
						'<td>' + c4 + '</td>' +
						'<td style="text-align:center;">' + c5 + '</td>' +
					'</tr>'
				)
				}
				$("#scheduleFootnotes").append(cFootnotes);
			}

			if (oShipSchedule) {
				RefreshShopShipDates(oShipSchedule);
				RefeshSchedule(oShipSchedule);
				return;
			}

			new execQuery("select * from com$shipment_shedule(" + Application.oUser.CUSTOMER_ID.prepSQL() + ",6);",
			function (data) {
				RefreshShopShipDates(data);
				RefeshSchedule(data);
			});

		}
	},
	activate: function () {
		if (!this.initialized) this.init();
	}
};
var contact = {
	initialized: false,
	sRole: '',
	data: {
		bill: null,
		ship: null,
		shop: null,
		aoOthers: []
	},
	titleBar: '',
	current: {},
	blankRecord: function () {
		return {
			ID: '',
			NAME: '',
			COMPANY: Application.oUser.NAME,
			TITLE: '',
			ADDRESS: '',
			CITY: '',
			STATE: '',
			ZIP: '',
			PHONE: '',
			FAX: '',
			EMAIL: ''
		}
	},

	init: function () {
		$("input, textarea", "#CustomerContact").keyup(function () {
			contact.validate();
		});
		$("select", "#CustomerContact").change(function () {
			contact.validate();
		});

		this.initialized = true;
	},
	refresh: function () {
		var sRole = this.sRole;
		if (contact.data[sRole]) {
			contact.current = contact.data[sRole];
			switch (sRole) {
				case 'bill': contact.titleBar = "Edit Billing Information"; break;
				case 'ship': contact.titleBar = "Edit Shipping Information"; break;
				case 'shop': contact.titleBar = "Edit Shop Administrator"; break;
			}
		}
		else {
			contact.current = contact.blankRecord();
			switch (sRole) {
				case 'bill': contact.titleBar = "New Billing Information"; break;
				case 'ship': contact.titleBar = "New Shipping Information"; break;
				case 'shop': contact.titleBar = "New Shop Administrator"; break;
			}
		}

		$("#CustomerContact [fld]").each(function () {
			var jThis = $(this);
			var sFld = jThis.attr('fld');

			//if (jThis.is("textarea")) jThis.html(contact.current[sFld]);
			jThis.val(contact.current[sFld]);
		});
	},
	validate: function () {
		var bEnableSave = false;
		$("#CustomerContact [fld]").each(function () {
			var jThis = $(this);
			var sFld = jThis.attr('fld');
			if (!bEnableSave && jThis.val() != contact.current[sFld]) {
				bEnableSave = true;
			}
		});
		$("#btnSave_CustomerContact").button({ disabled: !bEnableSave });
	},

	save: function () {
		setup.contacts.elapsors.on();
		var oData = {};
		$("#CustomerContact [fld]").each(function () {
			oData[$(this).attr('fld')] = $(this).val();
		});
		new execQuery(
			"select * from adm$customer_contact_iu(" +
				Application.oUser.CUSTOMER_ID.prepSQL() + "," +
				contact.sRole.prepSQL(true) + "," +
				contact.current.ID.prepSQL(true) + "," +
				oData.NAME.prepSQL(true) + "," +
				oData.COMPANY.prepSQL(true) + "," +
				oData.TITLE.prepSQL(true) + "," +
				oData.ADDRESS.prepSQL(true) + "," +
				oData.CITY.prepSQL(true) + "," +
				oData.STATE.prepSQL(true) + "," +
				oData.ZIP.prepSQL(true) + "," +
				oData.PHONE.prepSQL(true) + "," +
				oData.FAX.prepSQL(true) + "," +
				oData.EMAIL.prepSQL(true) +
			");\n" +
			"select * from adm$customer_contacts(" + Application.oUser.CUSTOMER_ID.prepSQL() + ");",
			function (data) {
				setup.contacts.refresh(data[1]);
				setup.contacts.elapsors.off();

				LogEntry(contact.titleBar + " Saved.");
			}
		);
	},

	open: function (sRole) {
		if (!this.initialized) this.init();
		this.sRole = sRole;

		contact.refresh();

		$('#CustomerContact').dialog({
			autoOpen: true,
			modal: true,
			width: 430,
			title: contact.titleBar,
			open: function (event, ui) {
				var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
				jBtns.eq(0).button({ disabled: true, icons: { primary: "ui-icon-check"} })
					.attr("id", "btnSave_CustomerContact");
				jBtns.eq(1).button({ icons: { primary: "ui-icon-closethick"} });
				$(".ui-button").bind("focusout", function () { $(this).removeClass("ui-state-focus"); });
			},
			close: function (event, ui) { $(this).dialog('destroy') },
			buttons: {
				'Save': function () { contact.save(); $(this).dialog('close'); },
				'Cancel': function () { $(this).dialog('close'); }
			}

		});
	}
};

var billing = {
	initialized: false,
	init: function () {
		if (this.initialized) return;
		$("#BillingTabs").tabs({ cookie: { expires: 30} });
		$("#BillingInvoiceTotalColumn").dblclick(function () { $(".invoiceShipCharge").show(); });

		this.refresh();
		this.initialized = true;
	},

	refresh: function () {
		$("#AccountBalance span").text("");
		$("#LastPaymentDate").text("");
		$("#LastPaymentAmount").text("");
		var cSQL = "select * from adm$customer_ledger(" + quoteSQL(customer_id) + ") order by trdate descending, id descending;" + String.fromCharCode(13) +
						"select * from adm$orders_fetch(" + quoteSQL(customer_id) + ");";
		var oCGI2 = new execQuery( cSQL,
			function (aResults) {
				billing.dataFetched(aResults[0]);
				billing.ordersFetched(aResults[1]);
				$("#BillingTabs .web_order_date").click(function () {
					//alert($(this).attr("order_id"));
					viewAdminOrder.open($(this).attr("order_id"));
				});
				$("#BillingTabs .invoice_id").click(function () {
					window.aPrintInvoices = [$(this).attr("invoice_id")];
					popWindow("/Common/Invoice/PrintInvoice.html", "Print_Invoice");
				});
			});
	},

	transacts:[],
	dataFetched: function (aResults) {
		billing.transacts = $.extend([], aResults);
		var cLastPayDate = "", cLastPayAmount = "", cBalance = "0"
		var bLastPayFound = false;
		//		$("#Statement_LedgerItems").empty();
		var jInvoices = $("#tblInvoices tbody").empty();
		var jPayments = $("#tblPayments tbody").empty();
		var jLedger = $("#tblBillingLedger tbody").empty();

		if (!aResults || aResults.length == 0) {
			jInvoices.append('<tr><td colspan="4">No transactions have been posted to your account.</td></tr>');
			jPayments.append('<tr><td colspan="3">No transactions have been posted to your account.</td></tr>');
			jLedger.append('<tr><td colspan="3">No transactions have been posted to your account.</td></tr>');
			return;
		}

		for (var nX = 0; nX < aResults.length; nX++) {
			var cDate = new Date(aResults[nX].TRDATE).format("longDate");
			var cDescript = (aResults[nX].INVOICE_CODE) ?
				'<a href="#Billing" class="invoice_id" invoice_id="' + aResults[nX].INVOICE_CODE + '">' + aResults[nX].DESCRIPTION + '</a>' :
				 aResults[nX].DESCRIPTION;
			var cDebit = (aResults[nX].DEBIT != "") ? formatCurrency(Number(aResults[nX].DEBIT)) : "";
			var cCredit = (aResults[nX].CREDIT != "") ? formatCurrency(Number(aResults[nX].CREDIT)) : "";

			jLedger.append(
				'<tr>' +
					'<td>' + cDate + '</td>' +
					'<td>' + cDescript + '</td>' +
					'<td style="text-align:right; padding-right:10px">' + formatCurrency(aResults[nX].AMOUNT) + '</td>' +
				'</tr>'
			);
			if (/0/.test(billing.transacts[nX].TRTYPE_CODE)) {
				jInvoices.append(
					'<tr>' +
						'<td>' + cDate + '</td>' +
						'<td style="text-align:center">' +
							'<a href="#Billing" class="invoice_id" invoice_id="' + aResults[nX].INVOICE_CODE + '">' +
								aResults[nX].INVOICE_CODE + 
							'</a></td>' +
						'<td><a href="' + aResults[nX].TRACKING_URL + '" target="Track_Shipments" >' + aResults[nX].TRACKING_NUMBERS + '</a></td>' +
						'<td class="invoiceShipCharge" style="text-align:right; padding-right:10px">' +
							formatCurrency(aResults[nX].INVOICE_SHIPCHARGE) + '</td>' +
						'<td style="text-align:right; padding-right:10px">' + cDebit + '</td>' +
					'</tr>'
				);
			}

			if (/1|3/.test(billing.transacts[nX].TRTYPE_CODE)) {
				jPayments.append(
					'<tr>' +
						'<td>' + cDate + '</td>' +
						'<td>' + cDescript + '</td>' +
						'<td style="text-align:right; padding-right:10px">' + cCredit + '</td>' +
					'</tr>'
				);
			}

			var cRow = '<tr>\
				<td style="text-align:center"	>' + cDate + '</td>\
				<td style="text-align:left"		>' + cDescript + '</td>\
				<td style="text-align:right"	>' + cDebit + '</td>\
				<td style="text-align:right"	>' + cCredit + '</td>\
				<td style="text-align:right"	>' + cBalance + '</td></tr>'
			//			$("#Statement_LedgerItems").append(cRow);
			if (!bLastPayFound && aResults[nX].TRTYPE_CODE == 3) {
				bLastPayFound = true;
				cLastPayAmount = cCredit + " - ";
				cLastPayDate = cDate;
			}
		}
		var cBalance = aResults[0].BALANCE;


		$("#AccountBalance span").text(formatCurrency(cBalance));
		$("#LastPaymentDate").text(cLastPayDate);
		$("#LastPaymentAmount").text(cLastPayAmount);

	},

	ordersFetched: function (aResults) {
		var jOrders = $("#tblOrders tbody").empty();
		if (aResults.length == 0) {
			jOrders.append(
				'<tr>' +
					'<td colspan="4">' +
						'No Warehouse Carts have been submitted.' +
					'</td>' +
				'</tr>'
			);
			return;
		}
		for (var nX = 0; nX < aResults.length; nX++) {
			var dX = new Date(aResults[nX].SUBMITTED);
			var cInvoice = (aResults[nX].INVOICE_ID > "") ? '<a href="#Billing" class="invoice_id">' + aResults[nX].INVOICE_ID + '</a>' :
				'Processing order, invoice will be ready soon.';
			jOrders.append(
				'<tr>' +
					'<td><a href="#Billing" order_id="' + aResults[nX].ORDER_ID + '" class="web_order_date">' + dX.format("mediumDate") + ' @ ' + dX.format("shortTime") + '</a></td>' +
					'<td style="text-align:left">' + cInvoice + '</td>' +
					'<td style="text-align:right; padding-right:10px">' + formatCurrency(aResults[nX].BUDGET) + '</td>' +
					'<td style="text-align:right; padding-right:10px">' + formatCurrency(aResults[nX].TOTAL) + '</td>' +
				'</tr>'
			);
		}
	}

};


var UsageTips = {
	TipMenuDD: false,
	cCurrentTip: "",
	initMenu: function () {
		return;


		if (!UsageTips.TipMenuDD) {
			UsageTips.TipMenuDD = new drilldownmenu({
				menuid: 'TipsDrillMenu',
				menuheight: 235,
				speed: 500,
				persist: { enable: false, overrideselectedul: true }
			});
		}
	},
	ReturnToMenuFromTip: function () {
		var jUTip = $("#UsageTips");
		UsageTips.cCurrentTip = "UsageTipsMenu";

		jUTip.find(".UsageTipTitle").html('Need Help?<br/><span style="font-size:13px; padding-top:2px;">You came to the right place.</span>');
		jUTip.find("div[tip_id]").hide();
		$("#UsageTipsTools,#ShowTipsMenu,#TipsMenuBackButton").hide();

		if (UsageTips.TipMenuDD.currentul > 0) $("#TipsMenuBackButton").show();
		else $("#TipsMenuBackButton").hide();

		jUTip.find("div[tip_id='UsageTipsMenu']").fadeIn(500);
	},
	HelpMenu: function (nMenuID) {
		UsageTips.ShowTipsBubble();

		return;
		UsageTips.cCurrentTip = "UsageTipsMenu";
		var jUTip = $("#UsageTips");

		jUTip.find("div[tip_id]").hide();
		$("#UsageTipsTools,#ShowTipsMenu,#TipsMenuBackButton").hide();
		jUTip.find("div[tip_id='UsageTipsMenu']").fadeIn(500);
		UsageTips.ShowTipsBubble();

		UsageTips.initMenu();

		jUTip.find(".UsageTipTitle").html('Need Help?<br/><span style="font-size:13px; padding-top:2px;">You came to the right place.</span>');

		UsageTips.TipMenuDD.currentul = nMenuID;
		UsageTips.TipMenuDD.slidemenu(nMenuID);

		$("#TipsMenuBackButton").show();

	},
	ShowFirstUnread: function () {
		// Load the tip menu first		
		if ($("#UsageTips").length == 0) {
			$("#UsageTipsContainer").load("UsageTips/index.html", false, function () {
				SetRewardUnitElements("#UsageTips");
				UsageTips.ShowFirstUnread();
			});
			return;
		}


		var jTips = $("#TipsDrillMenu [tip_id][autoshow]");
		jTips.each(function (nX) {
			var cTipId = $(this).attr("tip_id");
			if (cX == null) {
				UsageTips.ShowTip(cTipId, false);
				return false;
			}
		});

	},
	PrevTip: function () {
		var $Tips = $("#TipsDrillMenu [tip_id]");
		var nIndex = $Tips.index($("#TipsDrillMenu [tip_id='" + UsageTips.cCurrentTip + "']")[0]);
		if (nIndex == 0) nIndex = $Tips.length;
		UsageTips.ShowTip($Tips.eq(nIndex - 1).attr("tip_id"));
	},

	NextTip: function () {
		var $Tips = $("#TipsDrillMenu [tip_id]");
		var nIndex = $Tips.index($("#TipsDrillMenu [tip_id='" + UsageTips.cCurrentTip + "']")[0]);
		if (nIndex == $Tips.length - 1) nIndex = -1;
		UsageTips.ShowTip($Tips.eq(nIndex + 1).attr("tip_id"));
	},
	ShowTipsBubble: function () {
		$("#UsageTips .ProductPopUpClose").click(function () {
			$("#UsageTips").animate({ bottom: "-350px" }, 1000, function () { $(this).hide(); });
			//$("#HelpBubble").fadeIn();
		});

		var jUTip = $("#UsageTips");
		if (!jUTip.is(":visible")) {
			if (ui.IE7)
				jUTip.css({ bottom: "32px" }).show();
			else
				jUTip.css({ bottom: "-350px" }).show().animate({ bottom: "32px" }, 1000);
			//jUTip.show("slide", { direction: 'down' }, 1500);
		}
	},
	ShowTip: function (cTipId, bFromTipMenu) {
		UsageTips.ShowTipsBubble();
		return;

		$("#HelpBubble").fadeOut();

		if (!Application.bLoggedIn) { Application.LoginDialog(); return; }
		LogEntry("Usage Tip Opened: " + cTipId);


		UsageTips.cCurrentTip = cTipId;
		UsageTipTimer = false;

		var jUTip = $("#UsageTips");

		jUTip.find("div[tip_id]").hide();
		var cDir = jUTip.find("a[tip_id='" + cTipId + "']").parents("[area]").attr("area");


		//Load tip from file if not found in DOM
		if (cTipId != "UsageTipsMenu" && jUTip.find("div[tip_id='" + cTipId + "']").length == 0) {
			jUTip.append('<div tip_id="' + cTipId + '" class="UsageTip"></div>');

			jUTip.find("div[tip_id='" + cTipId + "']")
				.load("UsageTips/Tips/" + cDir + "/" + cTipId + ".html?" + Math.random(), false,
				function () {
					jUTip.find("div[tip_id='" + cTipId + "']").fadeIn(500);
					SetRewardUnitElements("#UsageTips div[tip_id='" + cTipId + "']");
					UsageTips.ShowTipsBubble();

					jUTip.find("[target_selector]")
					//					.effect("pulsate", {times:2}, 300)
					.hover(function () {

						var cElement = $($(this).attr("target_selector"));

						if (cElement.is(":visible")) {
							if (!ui.IE7 && !$(".ui-effects-transfer").is(":animated") && !$(this).attr("no_transfer")) {
								$(this).effect("transfer", { to: cElement }, 1500);
							}
							cElement.effect("pulsate", {}, 500, function () {
								$(this).css({ opacity: '' });
							});
						}
					},
					function () {
						var cElement = $($(this).attr("target_selector"));
						if (cElement.is(":animated"))
							cElement.stop({ clearQueue: true }).css({ opacity: '' });
					}
				);
				});
		} else {
			jUTip.find("div[tip_id='" + cTipId + "']").fadeIn(500);
			UsageTips.ShowTipsBubble();
		}


		if (cTipId == "UsageTipsMenu") {
			UsageTips.initMenu();

			jUTip.find(".UsageTipTitle").html('Need Help?<br/><span style="font-size:13px; padding-top:2px;">You came to the right place.</span>');

			$("#UsageTipsTools,#ShowTipsMenu,#TipsMenuBackButton").hide();

			UsageTips.TipMenuDD.currentul = 0;
			UsageTips.TipMenuDD.slidemenu(0);

		} else {
			//$("#chkTipMarked").attr("checked", ($.cookie("TIP_" + cCurrentTip) == "yes") ? true : false);

			var cTipArea = jUTip.find("#TipsDrillMenu a[tip_id='" + cTipId + "']").parents("[area]").attr("area");
			jUTip.find(".UsageTipTitle").html(
									'<div onclick="Application.changeHash(' + "'#" + cTipArea + "'" + ')" class="TipAreaIcon Icon' + cTipArea + '"></div>' +
									'<div class="TipAreaTitle" onclick="Application.changeHash(' + "'#" + cTipArea + "'" + ')">' + cTipArea + '</div>' +
									'<div class="TipTitle" title="' + UsageTips.MarkTip() + '">' + jUTip.find("a[tip_id='" + cTipId + "']").text() + '</div>'
			);
			if (window.location.hash.substring(0, cTipArea.length) != "#" + cTipArea.substring(0, cTipArea.length - 1) && Application.bLoggedIn)
				Application.changeHash("#" + cTipArea);



			$("#UsageTipsTools,#ShowTipsMenu").show();
			$("#TipsMenuBackButton").hide();
		}

		//jUTip.find("#TipsDrillMenu a[tip_id='" + cTipId + "']").parent().parent().parent().find("a").eq(0).text()
	},

	MarkTip: function () {
		var cX = new String();
		var nViewCnt = 1;
		var cLastViewed = "Unknown";
		//		cX = $.cookie("UsageTip_" + UsageTips.cCurrentTip);

		if (cX > "") {
			nViewCnt = Number(cX.substr(cX.indexOf("|") + 1, cX.length)) + 1;
			cLastViewed = cX.substr(0, cX.indexOf("|"));
		}

		//		$.cookie("UsageTip_" + UsageTips.cCurrentTip, Date.now().format("shortDateTime") + "|" + nViewCnt, { expires: 1000 });
		return "Last Viewed: " + cLastViewed + ", View Count: " + nViewCnt;
	}
}


$(document).ready(function() { Application.docReady(); });


