/**
 * Nestle Very Best Baking - Global functionality
 */
(function ($) {

	// javascript void
	window.Void = function () { }; $.fn.VoidLink = function () { return $(this).attr('href', 'javascript:Void()'); };

	window.debug = function (b, c) {
		if (!c) {
			c = 'log';
		}

		if (window.console) {
			if (console[c]) {
				return console[c](b);
			} else {
				var a = 'Error: Attempt to log with unknown level: ' + c + ' with message: ' + b;
				if (console.error) {
					console.error(a);
				} else {
					if (console.log) {
						console.log(a);
					}
				}
			}
		}
	}

	function dump(args) {
		debug(args);
	}

	window.VBB = window.VBB || {};

	// VBB Utility Functions
	window.VBB.util = {
		isNumber: function (o) { // num
			return typeof o === 'number' && isFinite(o);
		},
		trimNumber: function (o, p) { // num, max decimal places
			var coef = Math.pow(10, p);
			return Math.round(o * coef) / coef;
		},
		isStringNumeric: function (o) { // num
			return (o == parseFloat(o));
		},
		trimString: function (s, p, elip) { // string, max characters, use elises
			elip = (!elip) ? true : elip;
			s = s.replace(/^\s+|\s+$/, ''); // trim whitespace
			if (s.length > p) {
				if (elip) {
					return s.substr(p - 3) + "..."
				} else {
					return s.substr(p);
				}
			}
			return s;
		},
		getQueryStringVal: function (key, href) { // key for lookup in query string, if href blank use URL
			href = (!href) ? window.location.href : href;
			var results = new RegExp('[\\?&]' + key + '=([^&#]*)').exec(href);
			return results[1] || 0;
		},
		sanitize: function (val) {
			return encodeURIComponent(val);
		},
		getString: function (msg) {
			if ((typeof STRINGS !== 'undefined') && (typeof STRINGS[msg] !== 'undefined')) {
				return STRINGS[msg];
			}
			return "";
		},
		makeOptions: function (options, valField, labelField) {
			var htmls = "";
			if (!valField) { // multidemensional array
				for (var i = 0; i < options.length; i++) {
					htmls += '<option value="' + options[i][0] + '">' + options[i][1] + '</option>';
				}
			} else { // array of objects
				for (var i = 0; i < options.length; i++) {
					htmls += '<option value="' + options[i][valField] + '">' + options[i][labelField] + '</option>';
				}
			}
			return htmls;
		},
		setFieldStates: function (fieldCache) {
			if (fieldCache && fieldCache.length) {
				$.each(fieldCache, function (i, val) {
					$("#" + val.name).val(val.value);
					$("input[name=" + val.name + "][value=" + val.value + "]:radio").click();
					if ($.uniform) {
						$.uniform.update("input[name=" + val.name + "]");
					}
				});
			}
		},
		setFieldErrorStates: function (fieldErrors, sel) {
			sel = (!sel) ? "body" : sel;

			// reset states
			$(".field .errorMsg").remove();

			if (fieldErrors && fieldErrors.length) {
				$.each(fieldErrors, function (i, val) {
					// append .NET style error flag
					$("[name=" + val.id + "]").parent().append('<span class="errorMsg"><span style="color: red; display:block">Error</span></span>');
				});
			}
		},
		serializedArrayToReqJSON: function (serializedArray) { // Flatten $.seriailzeArray() output a bit & JSONify
			var reqData = {};
			if (serializedArray && serializedArray.length) {
				$.each(serializedArray, function (i, field) {
					reqData[field.name] = field.value;
				});
			}
			return $.toJSON(reqData);
		},
		objectCompliement: function (o1, o2, matchOnField) { // returns the elements in o1 that don't appear in o2
			var o3 = [];
			if (o2) {
				for (var i = 0; i < o1.length; i++) {
					var in2 = false;
					for (var j = 0; j < o2.length; j++) {
						if (o1[i][matchOnField] == o2[j][matchOnField]) {
							in2 = true;
						}
					}
					if (!in2) {
						o3.push(o1[i]);
					}
				}
				return o3;
			} else {
				return o1;
			}
		}
	};

	// VBB Pluck Utilities
	window.VBB.pluck = {
		resultHasErrors: function (result) { // single pluck result object
			for (var i = 0; i < result.ResponseStatus.Exceptions.length; i++) {
				if (result.ResponseStatus.Exceptions[i].ExceptionLevel == "Error") {
					debug("Pluck Request Error. Exception to Follow:");
					debug(result.ResponseStatus.Exceptions[i]);
					return true;
				}
			}
			return false;
		},
		havePluck: function () { // tests that we have a PLUCK SDK
			return typeof PluckSDK !== 'undefined';
		}
	};

	window.VBB.overlay = (function () {
		var _handle = null,
        _defaultHandle = $("body"),
        _sel = "#overlay",
        _outerSel = "#outsideOverlay",
        _isOpen = false;

		var _defaults = {
			mask: {
				color: '#000',
				loadSpeed: 1,
				opacity: 0.75
			},
			close: '.close',
			target: "#overlay",
			closeOnClick: true,
			load: true,
			onClose: _onClose,
			onLoad: _onLoad
		}

		function _onClose() {
			if (_handle != null && $.isFunction(_handle.customClose)) {
				_handle.customClose();
			}

			_handle = null;
			_isOpen = false;
		}

		function _onLoad() {
			_isOpen = true;
			$("select, input:checkbox, input:radio", ".std_overlay").uniform();
		};

		return {
			init: function () {
				$("body>form").append('<div class="std_overlay" id="overlay"><a href="javascript:Void()" class="close"></a><div class="contentWrap"></div></div>'); // place empty content overlay inside of traditional form
				$("body").prepend('<div class="std_overlay" id="outsideOverlay"><a href="javascript:Void()" class="close"></a><div class="contentWrap"></div></div>'); // place empty content overlay outside of traditional form
				$(".std_overlay .close").live("click", VBB.overlay.close);
			},

			swapType: function (type) {
				$(_sel).attr("class", "std_overlay " + type);
			},

			updateContent: function (markup, useOuter) {
				var wrap = useOuter ? $(_outerSel).find(".contentWrap") : $(_sel).find(".contentWrap");
				wrap.html(markup);

				// return the content wrapper
				return wrap;
			},

			open: function (type, opts, elm) {
				if (_isOpen) {
					// if already open, we have to close first
					VBB.overlay.close(function () {
						// we need to set a timeout otherwise the lightbox will never completely closed
						// as long as we're in this event, then 
						setTimeout(function () {
							VBB.overlay.open(type, opts, elm);
						}, 1);
					});
				} else {
					if (elm) {
						_handle = $(elm);
					} else {
						_handle = _defaultHandle;
					}

					VBB.overlay.swapType(type);

					$(elm).overlay($.extend({}, _defaults, opts)).load();
				}
			},

			close: function (callback) {
				if (_handle != null) {
					if ($.isFunction(callback)) {
						_handle.customClose = callback;
					}

					_handle.overlay().close();
				}
			}
		};
	} ());

	window.VBB.app = {};

	/**
	* .NET makes it very difficult to handle events when the user presses the enter button.
	* This function will allow you to create "nested forms" by simply adding a class name. If 
	* enter is pressed within one of these nested forms, then the postback will be corrected.
	*/
	window.VBB.app.PostbackOverride = (function () {
		// the options that can be passed for this plugin
		var _defaultOptions = {
			// this is the class name that is used to create a nested form
			NestedFormClassName: 'nestedForm',

			// selector that this plugin will use when trying to figure out who should have actually submitted the form
			NewEventTargetSelector: 'input[type="submit"], input[type="image"]',

			// the selector to use that we should listen for enter
			EnterEventSelector: 'input'
		};

		/**
		* This function will set the .NET "event target" so that it knows which element
		* actually caused this postback. This will also submit the form.
		* @function
		* @private
		* @param {HtmlElement} $ele the element that we should be posting back. 
		**/
		var _doPostBack = function (ele) {
			// the event target value should be the name of the element that caused this to happen
			$("#__EVENTTARGET").val($(ele).attr('name'));

			// postback to the server
			$($("form").get(0)).submit();
		};

		/**
		* This function handles all enters that were pressed. First, we find a nested form element.
		* If one is found, then we find the first button type="submit" within the nested form and 
		* postback with this one instead. 
		* @private 
		* @function
		* @param {Event} e the event that fired
		**/
		var _handleEnter = function (e) {
			// if we pressed enter then we need to make sure that we should change anything
			if (e.keyCode == 13) {

				// check if we're inside a nested form
				var $nestedForm = $(e.currentTarget).parents("." + _options.NestedFormClassName);
				if ($nestedForm.length > 0) {
					// find the real element that should be causing this submit
					var newEventTarget = $nestedForm.find(_options.NewEventTargetSelector).get(0);

					// go set this element and submit
					_doPostBack(newEventTarget);
				}

				return false;
			}
		};

		return {
			/**
			* Main init. Attach our event and set our options.
			* @function
			* @param {object} an object to override default options
			*/
			Init: function (options) {
				// set our options
				_options = $.extend({}, options, _defaultOptions);

				// we need to use live b/c of dynamic pages and such
				$(_options.EnterEventSelector).live("keypress", _handleEnter);
			}
		};
	} ());

	window.VBB.app.Tracking = function () {
		var _globalVarPlugin = {
			Data: {
				'eVar25': '[Brand Name]',
				'channel': '[Brand Name]',
				'events': '[User Login Event]'
			},
			/**
			* Init function for the global brand tracking plugin.
			* 
			* @function
			* @name Init
			* @memberOf TrackItPlugins.CopyPropToEVar
			*/
			Init: function () { this.ready(_globalVarPlugin.Go); },
			/**
			* Go function for the Copy prop to eVar. Implementation for this plugin is here.
			* 
			* @function
			* @name Go
			* @memberOf TrackItPlugins.CopyPropToEVar
			*/
			Go: function () {
				;;; if (this.settings.ShowDebugInfo) { console.groupCollapsed("VBB.app.Tracking._globalVarPlugin.Go() - Results"); }
				for (var newVar in _globalVarPlugin.Data) {
					var newData = _globalVarPlugin.Data[newVar];

					// go through all track keys and add.
					for (var key in this.Data) {
						for (var varName in this.Data[key]) {
							this.Data[key][newVar] = newData;
						}
					}

					;;; if (this.settings.ShowDebugInfo) { console.log("New Variable '" + newVar + "' - ", newData); }
				}
				;;; if (this.settings.ShowDebugInfo) { console.groupEnd(); }
			}
		}

		function parsePluckBreadcrumb() {
			var retVal = "";
			var rawBreadcrumb = $(".Forums_Breadcrumbs").text();
			var fullBreadcrumb = rawBreadcrumb.split(String.fromCharCode(187));

			$.each(fullBreadcrumb, function (index, str) {
				var breadcrumb = $.trim(str);
				retVal += breadcrumb;
				if (index < fullBreadcrumb.length - 1) { retVal += " > "; }
			});

			if( retVal.length == 0 ) {
				retVal = "Main";
			}
			return retVal;
		}

		return {
			Init: function () {
				window.tracker = new $.TrackIt("omniture", {
					Plugins: [_globalVarPlugin,$.TrackItPlugins.CssSelector],
					XmlUrl: $("#trackItXmlFile").val(),
					Settings: { ShowDebugInfo: true },
					Holders: {
					    'Link Url': function () { var fileName = $(this).attr("href").substring($(this).attr("href").lastIndexOf('/') + 1); fileName = fileName.substring(0, fileName.indexOf('.')); return fileName; },
					    'Redirect Url': function () { var url = $(this).attr("href"); return url; },
                        'Recipe Name': function () { return $("#trackIt-RecipeName-HolderValue").val(); },
						'Article Title': function () { return $("#trackIt-ArticleTitle-HolderValue").val(); },
						'Pluck Forum Breadcrumb': function () { return parsePluckBreadcrumb(); },
						'Brand': function () { return $("#trackIt-BrandName-HolderValue").val(); },
						'Category Name': function () { return $("#trackIt-Category-HolderValue").val(); },
						'User Login Event': function () {
							if ($("#loginSuccessEvent").length > 0) {
								return "login success";
							} else if ($("#loginFailedEvent").length > 0) {
								return "login fail";
							}
							return "";
						}

					}
				});
			}
		};
	} ();

	$.extend(VBB.app, {
		pluck: false,
		queuedElementsByKey: [], // { event__key : html } element pairs

		populatePhotoUploads: function ($ele, recipeId) {
			var recipeId = $("#RecipeId").val();

			$("#photoGallery ul.photoList").each(function () {
				var $ele = $(this);
				if (VBB.app.pluck) {
					var reqs = [];

					// attach to custom collection of recipe+photo
					var req1 = new PluckSDK.AddCustomCollectionActionRequest();
					req1.CustomCollectionKey = new PluckSDK.CustomCollectionKey();
					req1.CustomCollectionKey.Key = recipeId;
					req1.CustomCollectionName = "RecipeId";

					// push request
					reqs.push(req1);

					var req2 = new PluckSDK.CustomCollectionsPageRequest();
					req2.CustomCollectionKey = new PluckSDK.CustomCollectionKey();
					req2.CustomCollectionKey.Key = recipeId;
					req2.ItemsPerPage = 4;
					req2.OneBasedOnPage = 1;
					req2.SortType = new PluckSDK.TimestampSort();
					req2.SortType.SortOrder = "Descending"; // or "Ascending", refer to Pluck.SiteLife.SDK.Models.System.Sorting.SortOrder
					reqs.push(req2);

					// pass along the element that is being updated
					PluckSDK.SendRequests(reqs, function (results) {
						VBB.app.handlePopulatePhotoUploads(results, $ele);
					});
				}
			});
		},
		handlePopulatePhotoUploads: function (results, $ele) {
			if (VBB.pluck.resultHasErrors(results[0])) {
				VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), "There was an unknown error trying to create the CustomCollection.");
			} else if (VBB.pluck.resultHasErrors(results[1])) {
				VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), "There was an unknown error trying to retrieve the CustomCollection.");
			} else {
				$ele.empty();
				$.each(results[1].Items, function () {
					var dataObject = {
						ImageHeight: '120',
						ImageWidth: "160",
						ImageUrl: this.Image.Medium,
						AuthorName: this.Owner.DisplayName,
						AuthorProfile: this.Owner.PersonaUrl,
						Title: this.Title
					};
					$("#tmpl-photoList-item").tmpl(dataObject).appendTo($ele);
				});
			}
		},
		getRecipeRatingRollups: function (sel) {
			if (VBB.app.pluck) {
				sel = (!sel) ? ".ratingHolder" : sel + " .ratingHolder";
				var reviews = $(sel);
				var req;
				var reqs = [];
				var reviewKeys = [];
				for (var i = 0; i < reviews.length; i++) {
					var reviewKey = $(reviews[i]).attr("data-recipeKey");
					if ($.inArray(reviewKey, reviewKeys) == -1) {
						reviewKeys.push(reviewKey);
					}
				}
				for (var i = 0; i < reviewKeys.length; i++) {
					req = new PluckSDK.ReviewRollupRequest();
					req.ReviewedKey = new PluckSDK.ExternalResourceKey({ Key: reviewKeys[i] });
					reqs.push(req);
				}
				PluckSDK.SendRequests(reqs, VBB.app.handleRecipeRatingRollupsRequest);
			}
		},
		handleRecipeRatingRollupsRequest: function (results) {
			var dataObject, key;
			if(results)
			for (var i = 0; i < results.length; i++) {
				if (!VBB.pluck.resultHasErrors(results[i])) {
					key = results[i].ReviewRollup.ReviewedKey.Key;
					dataObject = {
						Rating: Math.round(results[i].ReviewRollup.Rating),
						TotalReviews: results[i].ReviewRollup.TotalReviews,
						Label: (results[i].ReviewRollup.TotalReviews == 1) ? "rating" : "ratings"
					};
					//$(VBB.app.queuedElementsByKey["ratings__"+key]).html($("#tmpl-review").tmpl(dataObject));
					$(".ratingHolder[data-recipeKey=" + key + "]").html($("#tmpl-review").tmpl(dataObject));
				}
			}
		},
		saveToShoppingList: function (elm) { // clicked link element
			// save elm under recipeId for lookup later
			VBB.app.queuedElementsByKey["shoplist__" + VBB.util.getQueryStringVal("recipeId", elm.attr("href"))] = elm;
			$.ajax({
				url: elm.attr("href"),
				dataType: 'json',
				success: VBB.app.handleSaveToShoppingListRequest,
				error: VBB.app.handleAjaxError
			});
		},
		handleSaveToShoppingListRequest: function (data) { // JSON response
			var elm = VBB.app.queuedElementsByKey["shoplist__" + data.id];
			debug(data);
			if (data.error != null) {
				alert(data.error.msg); // TODO: Replace with dialog call
			} else {
				alert(data.result.msg);
				elm.addClass("disabled").unbind("click"); // TODO: Replace with designed display dialog call
			}
		},
		handleAddToRecipeboxRequest: function (data) { // JSON response
			var elm = VBB.app.queuedElementsByKey["boxadd__" + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"];

			if (data.error != null) {
				alert(data.error.msg); // TODO: Replace with dialog call
			} else {
				alert(data.result.msg);
				//			elm.addClass("disabled").unbind("click"); // TODO: Replace with designed display dialog call
			}
			$(elm).overlay().close(); // close overlay
		},
		handleAjaxError: function (xhr, textStatus) {
			var output = $.parseJSON(xhr.responseText);
			VBB.actions.showGenericMsg("Error", output.Detail);
			;;; debug(xhr, "warn");
		},
		treeToggle: function (e) {
			e.preventDefault();
			$(this).parent().toggleClass("toggleClosed").toggleClass("toggleOpen");
		},

recipeFinderInit: function () {

    // turn multiselects into scrollpanes and transition hidden classes

    var multiSelectsHidden = $(".recipeFinder-TypesSelect .fakeMultiSelect.hide");

    multiSelectsHidden.removeClass("hide"); // can't hide to set up scrollpane

    $(".recipeFinder .fakeMultiSelect").closest('.scroll-pane').jScrollPane();

    multiSelectsHidden.parent().parent().addClass("hide");



    $(".recipeFinder-Nav a.openFinder").bind("click", function (e) {

        e.preventDefault();

        $(this).parent().addClass("open active").siblings().removeClass("open active");

        $(".recipeFinderWrap").animate({ "width": "840px" });


        var selectId = $(this).attr("href");

        // swap items in first box - scrollpane is the parent

        $(selectId).closest('.scroll-pane')
			.siblings()
			.addClass("hide")
			.end()
			.removeClass("hide");
    });

    $(".recipeFinder .close").bind("click", function (e) {

        e.preventDefault();

        $(".recipeFinderWrap").animate({ "width": "180px" });

    });

    $(".recipeFinder-TypesSelect .fakeMultiSelect li").bind("click", function (e) {

        e.preventDefault();

        var adding = $(this).is(".selected") ? false : true;

        // swap appearance

        $(this).toggleClass("selected");

        // add or remove from selected list

        var categoryTerms = $(this).attr("data-categoryTerms");

        var categoryLabel = $(this).text();

        if (adding) {

            $(".recipeFinder-TypesSelected .fakeMultiSelect").append('<li class="category" data-categoryTerms="' + categoryTerms + '">' + categoryLabel + ' <a class="remove">x</a></li>');

        } else {

            $(".recipeFinder-TypesSelected .fakeMultiSelect li[data-categoryTerms=\"" + categoryTerms + "\"]").remove();

        }

        $(".recipeFinder-TypesSelected .fakeMultiSelect").closest('.scroll-pane').jScrollPane();

    });


    $(".recipeFinder-TypesSelected .fakeMultiSelect .remove").live("click", function (e) {

        e.preventDefault();


        if ($(this).parent().is(".keyword")) {

            $(this).parent().remove();

        } else {

            var categoryTerms = $(this).parent().attr("data-categoryTerms");


            // click the corresponding item in first column

            $(".recipeFinder-TypesSelect li[data-categoryTerms=" + categoryTerms + "]").click();

        }

    });

    $(".recipeFinder-Content .rfClearAll").bind("click", function (e) {

        e.preventDefault();

        // click each selected item in the current pane

        //		$(".recipeFinder-TypesSelect .fakeMultiSelect").not(".hide").find(".selected").click();

        $(".recipeFinder-TypesSelect .fakeMultiSelect:not('.hide') .selected").click();

    });

    $(".recipeFinder-Content .rfAddKeyword").bind("click", function (e) {

        e.preventDefault();

        var keyword = $(".recipeFinder-Content #rfNewKeyword").val();

        $(".recipeFinder-Content #rfNewKeyword").val("");


        if (keyword.length) {

            // make new keyword item

            $(".recipeFinder-TypesSelected .fakeMultiSelect").append('<li class="keyword" data-categoryTerms="' + VBB.util.sanitize(keyword) + '">' + keyword + ' <a class="remove">x</a></li>');

        }

    });


    $(".recipeFinder-Actions input[type=submit]").live("click", function (e) {

        e.preventDefault();

        var searchUrl = $("#recipeSearchResults").val() + "?&q={1}&cats={2}";



        var selectedCats = [];

        if ($("input:radio[name=rfProductFilter]:checked").val().length) {

            selectedCats.push($("input:radio[name=rfProductFilter]:checked").val());

        }

        $(".recipeFinder-TypesSelected .fakeMultiSelect li.category").each(function () {

            selectedCats.push($(this).attr("data-categoryTerms"));

        });


        searchUrl = searchUrl.replace("{1}", $("#rfNewKeyword").val());

        searchUrl = searchUrl.replace("{2}", selectedCats.join(","));


        //		debug(searchUrl);

        window.location.href = searchUrl;

    });

},
		getCustomCatsForRecipe: function (id, elm) {
			$.ajax({
				url: "/services/RecipeBox.svc/categories/recipe/" + id,
				async: false,
				type: "get",
				dataType: "json",
				context: elm,
				success: function (data) {
					$(this).data("recipeCustomCats", data);
				},
				error: function (xhr) {
					debug(xhr);
					$(this).data("recipeCustomCats", null);
				}
			});
		}
	});


	window.VBB.actions = {
		triggerOnloadAction: function () { // turns value if onloadAction field to an action
			var login = $("#onloadLoginWindow");
			var normal = $("#onloadAction");

			if (login.length && login.val().length && (login.val() === 'true')) {
				// redisplay login dialog
				this.login();
			} else if (normal.length && normal.val().length) {
				// trigger current action
				// clear action cache
				debug(normal);
				var hmmm = eval(normal.val());
				this.doAction(hmmm[0], hmmm[1]);
				this.clearOnloadAction();
			} else {
				//			debug("onload: no saved actions");
			}
		},
		setOnloadAction: function (action, elm) { // sets value of onloadAction field
			debug("setOnloadAction");
			$("#onloadAction").val("['" + action + "','#" + $(elm).attr("id") + "']");
		},
		clearOnloadAction: function () { // clears value of onloadAction
			debug("clearOnloadAction");
			$("#onloadAction").val("");
		},
		doAction: function (f, elm) {
			debug("doAction");
			// find related button and click it???
			if ($(elm).length) {
				eval("this." + f + "('" + elm + "')");
			}
		},
		unimplemented: function () {
			debug("unimplemented action");
			return false;
		},
		login: function (elm, nextAction) {
			debug("login");
			if (elm) {
				this.setOnloadAction(nextAction, elm);
			}

			// display login overlay
			VBB.overlay.open("login_overlay", { onBeforeLoad: function () {
				var trigger = this.getTrigger();
				var contentElm = VBB.overlay.updateContent(trigger.html());

				// clean up form field submissions
				trigger.find("input").attr("disabled", true);
				contentElm.find("input").attr("disabled", false);
			}
			}, $("#logindialog-wrapper"));
			return false;
		},
		rbAlreadyAdded: function (elm) {
			// toss up warning message
			VBB.actions.showGenericMsg(VBB.util.getString("recipeBoxAlreadyAddedTitle"), VBB.util.getString("recipeBoxAlreadyAddedMsg"), "#tmpl-rbWarning-msg-overlay");
			return false;
		},
		/**
		* since we don't know if you've actually added this recipe to your recipe box, 
		* just click on whatever link .NET gives back and it'll handle what should happen
		*/
		rbAddPicker: function () { $("#addRecipeBox").click(); },
		rbAdd: function (elm) { // recipebox add item
			debug("rbAdd");
			VBB.app.queuedElementsByKey["rbAdd__"] = elm;
			var recipeId = $(elm).attr("data-recipeKey");

			VBB.app.getCustomCatsForRecipe(recipeId, elm);
			var useCats = VBB.util.objectCompliement(recipeCustomCats, $(elm).data("recipeCustomCats"), "Id");
			$(elm).data("useCats", useCats);

			if (useCats.length == 0) { // show dialog with no options
				VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
					var temp = $("#tmpl-add-recipebox-overlay2");
					var dataObject = {
						recipeTitle: ($(".recipeBoxContent").length) ? $(elm).parents("tr").find(".lgTooltipTrigger").text() : $(".hrecipe h2.fn").text(),
						recipeId: $(VBB.app.queuedElementsByKey["rbAdd__"]).attr("data-recipeKey")
					};
					VBB.overlay.updateContent(temp.tmpl(dataObject));
				}
				}, $("#tmpl-add-recipebox-overlay2"));
			} else { // show dialog with some options
				VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
					var temp = $("#tmpl-add-recipebox-overlay1");
					var dataObject = {
						recipeTitle: ($(".recipeBoxContent").length) ? $(elm).parents("tr").find(".lgTooltipTrigger").text() : $(".hrecipe h2.fn").text(),
						recipeId: $(VBB.app.queuedElementsByKey["rbAdd__"]).attr("data-recipeKey")
					};
					VBB.overlay.updateContent(temp.tmpl(dataObject));
					$("select#overlay_rb_oldcat").append(VBB.util.makeOptions($(VBB.app.queuedElementsByKey["rbAdd__"]).data("useCats"), "Id", "Name"));
				}
				}, $("#tmpl-add-recipebox-overlay1"));
			}
			return false;
		},
        rbAddToCat: function (elm) { // recipebox add item
            debug("rbAddToCat");
            VBB.app.queuedElementsByKey["rbAdd__"] = elm;
            var recipeId = $(elm).attr("data-recipeKey");

            VBB.app.getCustomCatsForRecipe(recipeId, elm);
            var useCats = VBB.util.objectCompliement(recipeCustomCats, $(elm).data("recipeCustomCats"), "Id");
            $(elm).data("useCats", useCats);

            if (useCats.length == 0) { // show dialog with no options
                VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
                    var temp = $("#tmpl-add-to-category-overlay2");
                    var dataObject = {
                        recipeTitle: ($(".recipeBoxContent").length) ? $(elm).parents("tr").find(".lgTooltipTrigger").text() : $(".hrecipe h2.fn").text(),
                        recipeId: $(VBB.app.queuedElementsByKey["rbAdd__"]).attr("data-recipeKey")
                    };
                    VBB.overlay.updateContent(temp.tmpl(dataObject));
                }
                }, $("#tmpl-add-to-category-overlay2"));
            } else { // show dialog with some options
                VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
                    var temp = $("#tmpl-add-to-category-overlay1");
                    var dataObject = {
                        recipeTitle: ($(".recipeBoxContent").length) ? $(elm).parents("tr").find(".lgTooltipTrigger").text() : $(".hrecipe h2.fn").text(),
                        recipeId: $(VBB.app.queuedElementsByKey["rbAdd__"]).attr("data-recipeKey")
                    };
                    VBB.overlay.updateContent(temp.tmpl(dataObject));
                    $("select#overlay_rb_oldcat").append(VBB.util.makeOptions($(VBB.app.queuedElementsByKey["rbAdd__"]).data("useCats"), "Id", "Name"));
                }
                }, $("#tmpl-add-to-category-overlay1"));
            }
            return false;
        },
		addToRecipeBox: function (elm) {
			// decide which request to send
			// build and send REST request
			var arCatOld = $("#overlay_rb_oldcat");
			var arCatNew = $("#overlay_rb_newcat");
			var arRecipeKey = $("#overlay_rb_recipeKey");

			var reqUrl = "/services/RecipeBox.svc/" + VBB.util.sanitize(arRecipeKey.val());
			$('.errorMsg').remove();

			if (arCatNew.length && arCatNew.val().length) { // Request is for new
				reqUrl = reqUrl + "/newCategory/" + VBB.util.sanitize(arCatNew.val());
			} else if (arCatOld.length && arCatOld.val().length) { // Request is for selected
				reqUrl = reqUrl + "/category/" + VBB.util.sanitize(arCatOld.val());
			} else { // Request is for no category
                reqUrl = reqUrl + "/category/";
                if ($('#addRecipeBox').length == 0) {
                    if ($('.errorMsg').length == 0) $('#overlay_rb_oldcat').parent().parent().append('<span class="errorMsg"><span>Required</span></span>');
                    return false;
                }
            }
            if (!VBB.actions.isAlphaNumeric(arCatNew.val().toString())) {
                if ($('.errorMsg').length == 0) $('#overlay_rb_newcat').after('<span class="errorMsg"><span>Invalid</span></span>');
                return false;
            }

			$.ajax({
				url: reqUrl,
				type: "post",
				dataType: "json",
				success: VBB.actions.handleRbAddSuccess,
				error: VBB.actions.handleRestError
			});
			return false;
		},
		handleRbAddSuccess: function (res) {
		    // reload if on recipebox page
		    if ($(".recipeBoxContent").length) {
		        window.location.reload();
		    } else {

		        var elm = $(VBB.app.queuedElementsByKey["rbAdd__"]);
		        if ($('#addRecipeBox').length > 0) {
		            $('ul.userActions > li:first > a').hide();
		            $('ul.userActions > li:first > div.recipeboxadded').show();
		            VBB.actions.showGenericMsg(VBB.util.getString("recipeBoxAddSuccessTitle"), VBB.util.getString("recipeBoxAddSuccessMsg"));
		        } else {
		            VBB.actions.showGenericMsg(VBB.util.getString("categoryAddSuccessTitle"), VBB.util.getString("categoryAddSuccessMsg"));
		        }
		        $('a.close').click(function () {
		            window.location.reload();
		        });
		    }
		},
		handleRbAddError: function (xhr) {
			if (xhr.responseText) {
				var output = $.parseJSON(xhr.responseText);
				VBB.actions.showGenericMsg("Error", output.Detail);
			}
		},
		rbRemove: function (elm, forceDelete) { // remove item from recipe box
		    var recipeKey = $(elm).attr("data-recipeKey");
		    var forceDelete = (!forceDelete) ? false : forceDelete;

		    debug("rbRemove");
		    VBB.app.queuedElementsByKey["rbRemove__"] = elm;

		    VBB.app.getCustomCatsForRecipe(recipeKey, elm);
		    var useCats = $(elm).data("recipeCustomCats");
		    $(elm).data("useCats", useCats);


		    var dAction = 'VBB.actions.rbRemoveConfirmed(this,"' + recipeKey + '")';


		    VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
		        var temp = $("#tmpl-delete-confirm-overlay");
		        var dataObject = {
		            title: VBB.util.getString("recipeboxDeleteConfirmTitle"),
		            msg: VBB.util.getString("recipeboxDeleteConfirmMsg"),
		            namefield: "overlay_field_name",
		            deleteaction: 'VBB.actions.rbRemoveConfirmed(this,"' + $(VBB.app.queuedElementsByKey["rbRemove__"]).attr("data-recipeKey") + '")',
		            recipeName: $(VBB.app.queuedElementsByKey["rbRemove__"]).attr("data-recipeTitle")
		        };
		        VBB.overlay.updateContent(temp.tmpl(dataObject));
		    }
		    }, $("#tmpl-delete-confirm-overlay"));
		    // if no categories throw up delete confirm dialog
		    /*

		    if ((useCats.length == 0) || forceDelete) {
		    var dAction = 'VBB.actions.rbRemoveConfirmed(this,"' + recipeKey + '")';


		    VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
		    var temp = $("#tmpl-delete-confirm-overlay");
		    var dataObject = {
		    title: VBB.util.getString("recipeboxDeleteConfirmTitle"),
		    msg: VBB.util.getString("recipeboxDeleteConfirmMsg"),
		    namefield: "overlay_field_name",
		    deleteaction: 'VBB.actions.rbRemoveConfirmed(this,"' + $(VBB.app.queuedElementsByKey["rbRemove__"]).attr("data-recipeKey") + '")',
		    recipeName: $(VBB.app.queuedElementsByKey["rbRemove__"]).attr("data-recipeTitle")
		    };
		    VBB.overlay.updateContent(temp.tmpl(dataObject));
		    }
		    }, $("#tmpl-delete-confirm-overlay"));
		    } else { // if some categories throw up options dialog
		    var recipeKey = $(elm).attr("data-recipeKey");
		    var dAction = 'VBB.actions.rbRemoveCategoryConfirmed(this,"' + recipeKey + '")';

		    VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
		    var temp = $("#tmpl-remove-category-overlay");
		    var dataObject = {
		    msg: "",
		    recipeId: $(VBB.app.queuedElementsByKey["rbRemove__"]).attr("data-recipeKey")
		    };
		    VBB.overlay.updateContent(temp.tmpl(dataObject));
		    $("#removeCategoryId").append(VBB.util.makeOptions(useCats, "Id", "Name"));
		    }
		    }, $("#tmpl-remove-category-overlay"));
		    }*/
		    return false;
		},
		rbRemoveConfirmed: function (elm, recipeKey) {
			debug("rbRemoveConfirmed");
			// submit post to rest service and then reload on success.
			var req = "/services/RecipeBox.svc/" + recipeKey;

			$.ajax({
				url: req,
				context: elm,
				type: "delete",
				dataType: 'json',
				success: function (res) {
					debug("rbRemoveConfirmed: Success");
					if ($('.addRecipeForm').length > 0) {
					    window.location = "/Profile/RecipeBox.aspx";
					}else{
                        window.location.reload();
				    }
                },
				error: VBB.actions.handleRestError
			});
		},
		rbRemoveCategoryConfirmed: function (elm) {
		    debug("rbRemoveCategoryConfirmed");
		    var recipeKey = ($(elm).attr("data-recipeKey"));
		    var categoryKey = ($(elm).attr("data-categoryKey"));
		    debug($("#removeCategoryId").val())
		    if ($("#removeCategoryId").val()) {
		        // submit post to rest service and then reload on success.
		        var req = "/services/RecipeBox.svc/" + recipeKey + "/category/" + $("#removeCategoryId").val();

		        $.ajax({
		            url: req,
		            context: elm,
		            type: "delete",
		            dataType: 'json',
		            success: function (res) {
		                debug("rbRemoveConfirmed: Success");
		                window.location.reload();
		            },
		            error: VBB.actions.handleRestError
		        });
		    } else if (categoryKey != null) {
		        // submit post to rest service and then reload on success.
		        var req = "/services/RecipeBox.svc/" + recipeKey + "/category/" + categoryKey;

		        $.ajax({
		            url: req,
		            context: elm,
		            type: "delete",
		            dataType: 'json',
		            success: function (res) {
		                debug("rbRemoveConfirmed: Success");
		                window.location.reload();
		            },
		            error: VBB.actions.handleRestError
		        });
		    }
		},
		/**
		* since we don't know if you've actually added this recipe to your shopping list, 
		* just click on whatever link .NET gives back and it'll handle what should happen
		*/
		slAddPicker: function () { $("#addShoppingList").click(); },
		slAdd: function (elm) { // shopping list add item
			var recipeId = $(elm).attr("data-recipeKey");
			//		VBB.app.queuedElementsByKey["slAdd__"+recipeId] = elm;
			$.ajax({
				url: "/services/ShoppingList.svc/" + recipeId,
				context: elm,
				type: "post",
				dataType: "json",
				success: VBB.actions.handleSlAddSuccess,
				error: VBB.actions.handleRestError
			});
			return false;
		},
		slAlreadyAdded: function (elm) {
			// toss up warning message
			VBB.actions.showGenericMsg(VBB.util.getString("shoppingListAlreadyAddedTitle"), VBB.util.getString("shoppingListAlreadyAddedMsg"), "#tmpl-slWarning-msg-overlay");
			return false;
		},
		handleSlAddSuccess: function (res) {
			if (!$(this).hasClass('addOnly')) {
				$(this)[0].onclick = null;
				$(this).unbind("click").bind("click", function (e) {
					e.preventDefault();
					VBB.actions.slRemove(this);
				});
	            //$(this).html(VBB.util.getString("RemoveFromShoppingListBtn"));
	            $(this).addClass('deleteShoppingList');
			} else {
				this.onclick = Void;
				$(this).unbind('click').click(VBB.actions.slAlreadyAdded);
			}
			VBB.actions.showGenericMsg(VBB.util.getString("shoppingListAddSuccessTitle"), VBB.util.getString("shoppingListAddSuccessMsg"), "#tmpl-slSuccess-msg-overlay");
		},
		slRemove: function (elm) { // shopping list remove item
			var recipeId = $(elm).attr("data-recipeKey");
			$.ajax({
				url: "/services/ShoppingList.svc/" + recipeId,
				context: elm,
				type: "delete",
				dataType: "json",
				success: VBB.actions.handleSlRemoveSuccess,
				error: VBB.actions.handleRestError
			});
			return false;
		},
		handleSlRemoveSuccess: function (res) {
			$(this)[0].onclick = null;
			$(this).unbind("click").bind("click", function (e) {
				e.preventDefault();
				VBB.actions.slAdd(this);
			});
			//$(this).html(VBB.util.getString("AddToShoppingListBtn"));
            $(this).removeClass('deleteShoppingList');
			VBB.actions.showGenericMsg(VBB.util.getString("shoppingListRemoveSuccessTitle"), VBB.util.getString("shoppingListRemoveSuccessMsg"));
		},
		followBaker: function (elm) {
			if (VBB.app.pluck) {
				// debug("followBaker");
				var widget = $(elm).parent();
				var req;
				var reqs = [];
				req = new PluckSDK.AddFriendActionRequest();
				req.FriendUserKey = new PluckSDK.UserKey();
				req.FriendUserKey.Key = widget.attr("data-userKey");
				VBB.app.queuedElementsByKey["follow__"] = widget; // singluar? we don't get keys back from pluck
				reqs.push(req);

				PluckSDK.SendRequests(reqs, function (results) {
					if (!VBB.pluck.resultHasErrors(results[0])) {
						$(VBB.app.queuedElementsByKey["follow__"]).find("a").toggleClass("hide");
					}
				});
			} else {
				debug("System Unavailable.");
			}
			return false;
		},
		unfollowBaker: function (elm) {
			if (VBB.app.pluck) {
				// debug("unfollowBaker");
				var widget = $(elm).parent();
				var req;
				var reqs = [];

				req = new PluckSDK.RemoveFriendActionRequest();
				req.FriendUserKey = new PluckSDK.UserKey();
				req.FriendUserKey.Key = widget.attr("data-userKey");
				VBB.app.queuedElementsByKey["unfollow__"] = widget; // singluar? we don't get keys back from pluck
				reqs.push(req);

				PluckSDK.SendRequests(reqs, function (results) {
					if (!VBB.pluck.resultHasErrors(results[0])) {
						$(VBB.app.queuedElementsByKey["unfollow__"]).find("a").toggleClass("hide");
					}
				});
			} else {
				debug("System Unavailable.");
			}
			return false;
		},
        isAlphaNumeric: function (strString) {
            if (strString.length == 0) return true;
            var RE = /^[0-9a-zA-Z\s]+$/;
            return (RE.test(strString));
        },
		addNewRecipeCategory: function (elm, resp) { // add new recipe category, via overlay
			// grab new field name
		    var newCatName = $("input#overlay_field_name").val();
		    if (newCatName == "") {
		        $('.errorMsg').show();
		        $('.errorMsg').html('Category Name is Required.<br/><br/>');
		        return false;
		    }
		    if (!VBB.actions.isAlphaNumeric(newCatName.toString())) {
		        $('.errorMsg').show();
		        $('.errorMsg').html('Invalid Category Name.<br/><br/>');
		        return false;
		    }
			// close overlay
			// send rest request
			var req = "/services/RecipeBox.svc/" + VBB.util.sanitize(newCatName);
			$.ajax({
				url: req,
				context: elm,
				type: "post",
				dataType: 'json',
				success: function (res) {
					debug("addNewRecipeCategory: Success");
					debug(res);
					var newCategoryId = res.Id;
					var newCategoryName = res.Name;

					// if success present confirm message and add new row
					VBB.actions.showGenericMsg(VBB.util.getString("newRecipeCategoryCreatedTitle"), VBB.util.getString("newRecipeCategoryCreatedMsg"));
					var dataObject = {
						rBCategoryURL: "/Profile/RecipeBox.aspx?cats=" + newCategoryId,
						categoryName: newCategoryName,
						categoryId: newCategoryId
					};
					$("#tmpl-category-item").tmpl(dataObject).appendTo($(".recipeCustomCategories ul"));
					if (recipeCustomCats) {
						recipeCustomCats.push({ Id: newCategoryId, Name: newCategoryName, UserId: null })
					} else {
						window.recipeCustomCats = [];
						recipeCustomCats.push({ Id: newCategoryId, Name: newCategoryName, UserId: null })
					}
				},
				error: VBB.actions.handleRestError
			});
			return false;
		},
		editRecipeCategory: function (elm) { // edit recipebox category, via overlay
			// grab new field name
		    var newCatName = $("input#overlay_field_name").val();
		    if (newCatName == "") {
		        $('.errorMsg').show();
		        $('.errorMsg').html('Category Name is Required.<br/><br/>');
		        return false;
		    }
		    if (!VBB.actions.isAlphaNumeric(newCatName.toString())) {
		        $('.errorMsg').show();
		        $('.errorMsg').html('Invalid Category Name.<br/><br/>');
		        return false;
		    }
			var catId = $(elm).attr("data-categoryId");
			debug(catId);
			debug(newCatName);
			$(VBB.app.queuedElementsByKey["editCategory__"]).data("name", newCatName);

			// close overlay
			// send rest request
			var req = "/services/RecipeBox.svc/" + catId + "/newCategoryName/" + VBB.util.sanitize(newCatName);

			$.ajax({
				url: req,
				context: elm,
				type: "put",
				dataType: 'json',
				success: function (res, a, b) {
					debug("addNewRecipeCategory: Success");

					// reload current page
					window.location.reload();
				},
				error: VBB.actions.handleRestError
			});
			return false;
		},
		deleteRecipeCategory: function (elm) { // delete recipebox category, via overlay
			debug("deleteRecipeCategory");
			VBB.app.queuedElementsByKey["deleteRecipeCategory__"] = elm;
			// toss up confirm dialog
			VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
			    var temp = $("#tmpl-delete-category-confirm-overlay");
				var dataObject = {
					title: VBB.util.getString("recipeCategoryDeleteConfirmTitle"),
					msg: VBB.util.getString("recipeCategoryDeleteConfirmMsg"),
					namefield: "overlay_field_name",
					deleteaction: 'VBB.actions.deleteRecipeCategoryConfirmed(this,"' + $(VBB.app.queuedElementsByKey["deleteRecipeCategory__"]).attr("data-categoryId") + '")',
					errorMsg: null
				};
				VBB.overlay.updateContent(temp.tmpl(dataObject));
			}
			}, $("#tmpl-delete-category-confirm-overlay"));
			return false;
		},
		deleteRecipeCategoryConfirmed: function (elm, catId) { // perform delete recipebox category, via conform overlay
			debug("deleteRecipeCategoryConfirmed");
			var req = "/services/RecipeBox.svc/category/" + catId;

			$.ajax({
				url: req,
				context: elm,
				type: "delete",
				dataType: 'json',
				success: function (res) {
					debug("deleteRecipeCategoryConfirmed: Success");
					debug(res);

					// reload current page
					window.location.reload();
				},
				error: VBB.actions.handleRestError
			});

			return false;
		},
        shareInstruction: function() {
            VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
                var temp = $("#tmpl-generic-msg-overlay");
                var dataObject = {
                    title: VBB.util.getString("recipeShareInstructionTitle"),
                    msg: VBB.util.getString("recipeShareInstructionMsg")
                };
                VBB.overlay.updateContent(temp.tmpl(dataObject));
            }
            }, $("#tmpl-generic-msg-overlay"));
        },
        cancelAddRecipe: function (elm) { // delete recipebox category, via overlay
            debug("cancelAddRecipe");
            // toss up confirm dialog
            VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
                var temp = $("#tmpl-cancel-confirm-overlay");
                var dataObject = {
                    title: VBB.util.getString("recipeAddCancelTitle"),
                    msg: VBB.util.getString("recipeAddCancelMsg")
                };
                VBB.overlay.updateContent(temp.tmpl(dataObject));
            } 
            }, $("#tmpl-cancel-confirm-overlay"));
            return false;
        },
        cancelUpdateRecipe: function (elm) { // delete recipebox category, via overlay
            debug("cancelUpdateRecipe");
            // toss up confirm dialog
            VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
                var temp = $("#tmpl-cancelupdate-confirm-overlay");
                var dataObject = {
                    title: VBB.util.getString("recipeCancelUpdateTitle"),
                    msg: VBB.util.getString("recipeCancelUpdateMsg")
                };
                VBB.overlay.updateContent(temp.tmpl(dataObject));
            }
            }, $("#tmpl-cancelupdate-confirm-overlay"));
            return false;
        },
		pwChange: function (elm, resp) {
			debug("pwChange");
			var msg = (!resp) ? "" : resp[0].msg;
			$("#tmpl-change-password-overlay").data("errorMsg", msg);

			VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
				var temp = $("#tmpl-change-password-overlay");
				var dataObject = {
					//title: msgTitle,
					errorMsg: temp.data("errorMsg")
				};
				VBB.overlay.updateContent(temp.tmpl(dataObject));

				// set field states
				//VBB.util.setFieldStates(temp.data("cache"));
				VBB.util.setFieldErrorStates(temp.data("errorOutput"));
				temp.data("errorOutput", null);
				temp.data("errorMsg", null);
			}
			}, $("#tmpl-change-password-overlay"));
			return false;
		},
		doPwChange: function (elm) {
			debug("doPwChange");
			var req = "/services/Users.svc/ChangePassword";
			var formData = $(".std_overlay *").serializeArray();
			$.ajax({
				url: req,
				context: elm,
				type: "put",
				contentType: "application/json",
				dataType: 'json',
				data: VBB.util.serializedArrayToReqJSON(formData),
				success: function (res) {
					debug("doPwChange: Success");
					// if success present confirm message and add new row
					VBB.actions.showGenericMsg(VBB.util.getString("profilePasswordChangeSuccessTitle"), VBB.util.getString("profilePasswordChangeSuccessMsg"));
				},
				error: function (xhr) {
					var output = $.parseJSON(xhr.responseText);
					if (xhr.status == 400) { // validation issue
						$("#tmpl-change-password-overlay").data("errorOutput", output);
						$("#tmpl-change-password-overlay").data("errorMsg", output[0].msg);
						$("#tmpl-change-password-overlay").overlay().close();
						VBB.actions.pwChange(null, output);
					} else if (xhr.status == 500) { // some server error
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), output.Detail);
					} else if (xhr.status == 401) { // unauthorized
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), VBB.util.getString("loginRequiredMsg"));
					} else {
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), "There was an unknown error (" + xhr.status + ")");
					}
				}
			});
			return false;
		},
		emailChange: function (elm, resp) {
			debug("emailChange");
			var msg = (!resp) ? "" : resp[0].msg;
			$("#tmpl-change-email-overlay").data("errorMsg", msg);

			VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
				var temp = $("#tmpl-change-email-overlay");
				var dataObject = {
					//title: msgTitle,
					errorMsg: temp.data("errorMsg")
				};
				VBB.overlay.updateContent(temp.tmpl(dataObject));

				// set field states
				VBB.util.setFieldStates(temp.data("cache"));
				VBB.util.setFieldErrorStates(temp.data("errorOutput"));
				temp.data("errorOutput", null);
				temp.data("errorMsg", null);
			}
			}, $("#tmpl-change-email-overlay"));

			// pull cached updated value if dialog is redisplayed before refresh
			if ($("#tmpl-change-email-overlay").data("currentEmail")) {
				$("#overlay .email-value").html($("#tmpl-change-email-overlay").data("currentEmail"));
			}

			return false;
		},
		doEmailChange: function (elm) {
			debug("doEmailChange");

			var req = "/services/Users.svc/UpdateEmail";
			var formData = $(".std_overlay *").serializeArray();
			$("#tmpl-change-email-overlay").data("cache", formData);

			$.ajax({
				url: req,
				context: elm,
				type: "put",
				contentType: "application/json",
				dataType: 'json',
				data: VBB.util.serializedArrayToReqJSON(formData),
				success: function (res) {
					debug("doEmailChange: Success");
					// if success present confirm message and add new row
					//VBB.actions.showGenericMsg(VBB.util.getString("profileEmailChangeSuccessTitle"), VBB.util.getString("profileEmailChangeSuccessMsg"));
					// cache new value
					//var lastFormEntry = $("#tmpl-change-email-overlay").data("cache")[0].value;
					//$("#tmpl-change-email-overlay").data("currentEmail", lastFormEntry);
					$(location).attr('href', '/login.aspx?returnUrl=%2fProfile.aspx');
				},
				error: function (xhr, a, b) {
					var output = $.parseJSON(xhr.responseText);
					if (xhr.status == 400) { // validation issue
						$("#tmpl-change-email-overlay").data("errorOutput", output);
						$("#tmpl-change-email-overlay").data("errorMsg", output[0].msg);
						$("#tmpl-change-email-overlay").overlay().close();
						VBB.actions.emailChange(null, output);
					} else if (xhr.status == 500) { // some server error
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), output.Detail);
					} else if (xhr.status == 401) { // unauthorized
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), VBB.util.getString("loginRequiredMsg"));
					} else {
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), "There was an unknown error (" + xhr.status + ")");
					}
				}
			});
			return false;
		},
		subscriptionChange: function (elm, resp) {
			debug("subscriptionChange");
			var msg = (!resp) ? "" : resp[0].msg;
			$("#tmpl-change-subscriptions-overlay").data("errorMsg", msg);

			VBB.overlay.open("msg_overlay subscription_overlay", { onBeforeLoad: function () {
				// parse the tempalte to the dialog
				var temp = $("#tmpl-change-subscriptions-overlay");
				var dataObject = {
					errorMsg: temp.data("errorMsg")
				};
				VBB.overlay.updateContent(temp.tmpl(dataObject));

				// set field states
				VBB.util.setFieldStates(temp.data("cache"));
				VBB.util.setFieldErrorStates(temp.data("errorOutput"));
				temp.data("errorOutput", null);
				temp.data("errorMsg", null);
			}
			}, $("#tmpl-change-subscriptions-overlay"));
			return false;
		},
		doSubscriptionChange: function (elm) {
			debug("doSubscriptionChange");
			var req = "/services/Users.svc/UpdateSubscriptions";
			var formData = $(".std_overlay *").serializeArray();
			$("#tmpl-change-subscriptions-overlay").data("cache", formData);

			$.ajax({
				url: req,
				context: elm,
				type: "put",
				contentType: "application/json",
				dataType: 'json',
				data: VBB.util.serializedArrayToReqJSON(formData),
				success: function (res) {
					debug("doSubscriptionChange: Success");
					// if success present confirm message and add new row
					VBB.actions.showGenericMsg(VBB.util.getString("profileSubscriptionChangeSuccessTitle"), VBB.util.getString("profileSubscriptionChangeSuccessMsg"));
				},
				error: function (xhr) {
					var output = $.parseJSON(xhr.responseText);
					if (xhr.status == 400) { // validation issue
						$("#tmpl-change-subscriptions-overlay").data("errorOutput", output);
						$("#tmpl-change-subscriptions-overlay").data("errorMsg", output[0].msg);
						$("#tmpl-change-subscriptions-overlay").overlay().close();
						VBB.actions.subscriptionChange(null, output);
					} else if (xhr.status == 500) { // some server error
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), output.Detail);
					} else if (xhr.status == 401) { // unauthorized
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), VBB.util.getString("loginRequiredMsg"));
					} else {
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), "There was an unknown error (" + xhr.status + ")");
					}
				}
			});
			return false;
		},
		privacyChange: function (elm, resp) {
			debug("privacyChange");
			var msg = (!resp) ? "" : resp[0].msg;
			$("#tmpl-change-privacy-overlay").data("errorMsg", msg);

			VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
				// parse the tempalte to the dialog
				var temp = $("#tmpl-change-privacy-overlay");
				var dataObject = {
					errorMsg: temp.data("errorMsg")
				};
				VBB.overlay.updateContent(temp.tmpl(dataObject));
				VBB.util.setFieldStates(temp.data("cache"));
			}
			}, $("#tmpl-change-privacy-overlay"));
			return false;
		},
		doPrivacyChange: function (elm) {
			debug("doPrivacyChange");
			/*
			// Pluck Request
			if (VBB.app.pluck) {
			var reqs = [];
			var req = new PluckSDK.UpdateUserProfileActionRequest();
			var selection = $(".std_overlay input[name=PrivacyState]:checked").val();
			if (selection == "Public") {
			req.PersonaPrivacyMode = PluckSDK.PersonaPrivacyModesEnum.Public;
			} else if (selection == "SharedWithFriends") {
			req.PersonaPrivacyMode = PluckSDK.PersonaPrivacyModesEnum.SharedWithFriends;
			} else if (selection == "Private") { 
			req.PersonaPrivacyMode = PluckSDK.PersonaPrivacyModesEnum.Private;
			} else {
			return false;
			}
			
			PluckSDK.SendRequests(reqs, VBB.actions.handlePrivacyChangeRequest);
			}
			*/
			var req = "/services/Users.svc/UpdatePrivacySettings";
			var formData = $(".std_overlay *").serializeArray();
			$("#tmpl-change-privacy-overlay").data("cache", formData);

			$.ajax({
				url: req,
				context: elm,
				type: "put",
				contentType: "application/json",
				dataType: 'json',
				data: VBB.util.serializedArrayToReqJSON(formData),
				success: function (res) {
					// if success present confirm message and add new row
					VBB.actions.showGenericMsg(VBB.util.getString("profilePrivacyChangeSuccessTitle"), VBB.util.getString("profilePrivacyChangeSuccessMsg"));
				},
				error: VBB.actions.handleRestError
			});

			return false;
		},
		/*
		// Pluck Version
		handlePrivacyChangeRequest: function(results) {
		debug("handlePrivacyChangeRequest");
		debug(results);
		if (VBB.pluck.resultHasErrors(results[0])) {
		VBB.actions.showGenericMsg(VBB.util.getString("profilePrivacyChangeSuccessTitle"), VBB.util.getString("profilePrivacyChangeSuccessMsg"));
		} else {
		VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), VBB.util.getString("profilePrivacyChangeErrorMsg"));
		}
		},
		*/
		addressChange: function (elm, resp) {
			debug("addressChange");
			var msg = (!resp) ? "" : resp[0].msg;
			$("#tmpl-change-address-overlay").data("errorMsg", msg);

			VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
				// parse the tempalte to the dialog
				var temp = $("#tmpl-change-address-overlay");
				var dataObject = {
					errorMsg: temp.data("errorMsg")
				};
				VBB.overlay.updateContent(temp.tmpl(dataObject));

				// set field states
				VBB.util.setFieldStates(temp.data("cache"));
				VBB.util.setFieldErrorStates(temp.data("errorOutput"));
				temp.data("errorOutput", null);
				temp.data("errorMsg", null);
			}
			}, $("#tmpl-change-address-overlay"));
			return false;
		},
		doAddressChange: function (elm) {
			debug("doAddressChange");
			var req = "/services/Users.svc/UpdateUser";
			var formData = $(".std_overlay *").serializeArray();
			$("#tmpl-change-address-overlay").data("cache", formData);
			$.ajax({
				url: req,
				context: elm,
				type: "put",
				contentType: "application/json",
				dataType: 'json',
				data: VBB.util.serializedArrayToReqJSON(formData),
				success: function (res) {
					debug("doAddressChange: Success");
					// if success present confirm message and add new row
					VBB.actions.showGenericMsg(VBB.util.getString("profileAddressChangeSuccessTitle"), VBB.util.getString("profileAddressChangeSuccessMsg"));
				},
				error: function (xhr) {
					var output = $.parseJSON(xhr.responseText);
					if (xhr.status == 400) { // validation issue
						$("#tmpl-change-address-overlay").data("errorOutput", output);
						$("#tmpl-change-address-overlay").data("errorMsg", output[0].msg);
						$("#tmpl-change-address-overlay").overlay().close();
						VBB.actions.addressChange(null, output);
					} else if (xhr.status == 500) { // some server error
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), output.Detail);
					} else if (xhr.status == 401) { // unauthorized
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), VBB.util.getString("loginRequiredMsg"));
					} else {
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), "There was an unknown error (" + xhr.status + ")");
					}
				}
			});
			return false;
		},
		userSubmittedPhotoUpload: function() {
			$(".userSubmittedPhotoUpload input.uploadPhoto").live('click', function() {
				return VBB.actions.photoUpload(this);
			});
		},
		userSubmittedPredefinedPhoto: function() {
			var $ele = $(".userSubmittedPhotoUpload .addphoto");
			if( $ele.length > 0 ) {
				var $carousel = $ele.find(".imageupload");
				var $overlay = $ele.find(".overlayImageUpload");
				$('.userSubmittedPhotoUpload .addphoto a.choose-predefined').live( 'click', function() {
					$overlay.removeClass('hide');
					return false;   
				});

				$('.userSubmittedPhotoUpload .addphoto .overlayImageUpload a.close').live('click', function() {
					$overlay.addClass('hide');
					return false;
				});

				$('.userSubmittedPhotoUpload .addphoto .overlayImageUpload input.button').live('click', function() {
					var currentItemIndex = $carousel.scrollable().getIndex();
					var currentEle = $carousel.scrollable().getItems()[ currentItemIndex ];

					$(".userSubmittedPhotoUpload input[id$='ImageId']").val( $(currentEle).attr('data-guid') );
					$(".userSubmittedPhotoUpload input[id$='ImageSourceType']").val( "predefined" );

					var $imgEle = $('.userSubmittedPhotoUpload img.user-custom-photo');
					if( $imgEle.length == 0 ) {
						$ele.prepend( $("<img class='user-custom-photo' />") );
						$imgEle = $ele.find('img.user-custom-photo');
					}

					$imgEle.attr( 'src',  $(currentEle).attr('data-thumb-url') );
					$overlay.addClass('hide');

					return false;
				});
			}
		},
		photoUpload: function (elm, resp) {
			if (VBB.app.pluck) {
				var msg = (!resp) ? "" : resp[0].msg;
				VBB.app.queuedElementsByKey["photoUpload__"] = elm;

				$("#tmpl-photo-upload-overlay").data("errorMsg", msg);

				VBB.overlay.open("msg_overlay upload_overlay", { onBeforeLoad: function () {
					// parse the tempalte to the dialog
					var temp = $("#tmpl-photo-upload-overlay");

					var dataObject = {
						errorMsg: temp.data("errorMsg")
					};

					VBB.overlay.updateContent(temp.tmpl(dataObject));

					// set field states
					VBB.util.setFieldStates(temp.data("cache"));
					VBB.util.setFieldErrorStates(temp.data("errorOutput"));
					temp.data("errorOutput", null);
					temp.data("errorMsg", null);

				}
				}, $("#tmpl-photo-upload-overlay"));
			}
			return false;
		},
		doPhotoUpload: function (elm, callback) { // onsubmit
			if (VBB.app.pluck) {
			    if (!$("#Filedata") || $("#Filedata").val() == "") {
			        return false;
			    }

			    var fileString = $("#Filedata").val();
			    var fileTypeExt = fileString.substr(fileString.lastIndexOf('.') + 1, fileString.length);

			    if (fileTypeExt !== 'jpg' && fileTypeExt !== 'png' && fileTypeExt !== 'gif' && fileTypeExt !== 'tif' && fileTypeExt !== 'bmp') {
			        if ($('.errorMsg').length == 0) {
			            $(elm).after('<div class="errorMsg" style="color:Red; margin-top:10px;">The file you choose to upload is not valid image file type. Please upload an image.</div>');
			        }
			        return false;
			    }

				new iframe(elm, {
					onComplete: function (response) {
						var responseText = response.responseText;
						callback(responseText);
					}
				}, new Date().valueOf());
			}
		},
		handlePhotoUploadResponseUserSubmittedPhoto: function( photoId ) {
			$(".userSubmittedPhotoUpload input[id$='ImageId']").val( photoId );
			$(".userSubmittedPhotoUpload input[id$='ImageSourceType']").val( "pluck" );
			var reqs = [];
			var req1 = new PluckSDK.PhotoRequest();
			req1.PhotoKey = new PluckSDK.PhotoKey();
			req1.PhotoKey.Key = photoId;
			reqs.push( req1 );

			PluckSDK.SendRequests(reqs, VBB.actions.handleUserSubmittedPhotoDisplay);
			//
		},
		handleUserSubmittedPhotoDisplay: function( response ) {
			
			var $ele = $(".userSubmittedPhotoUpload .addphoto");
			
			var $imgEle = $ele.find('img.user-custom-photo');

			if( $imgEle.length == 0 ) {
				$ele.prepend( $("<img class='user-custom-photo' />") );
				$imgEle = $ele.find('img.user-custom-photo');
			}

			$imgEle.attr('src', response[0].Photo.Image.Medium );

			VBB.overlay.close();
		},
		handlePhotoUploadResponseGeneric: function (photoId) { // handle iframe response
			var recipeId = $("#RecipeId").val();
			if (VBB.app.pluck) {
				if (photoId.toLowerCase().indexOf("error:") > -1) { // there was an error in the response
					var msg = photoId.split("rror: ")[1];
					VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), msg);
				} else { // upload was good 
					// var photoId = responseText; // test: 76e5ec4a-ef6f-4017-985d-e06477351094
					var photoTitle = $("#imageTitle").val(); // "This key can be anything. This was uploaded to recipe ID: " + $(VBB.app.queuedElementsByKey["photoUpload__"]).attr("data-recipeKey");
					var photoDescription = $(".hrecipe h2.fn").text();

					var req1, req2, req3;
					var reqs = [];

					// update photo metadata
					req1 = new PluckSDK.UpdatePhotoActionRequest();
					req1.PhotoKey = new PluckSDK.PhotoKey();
					req1.PhotoKey.Key = photoId;
					req1.Description = photoDescription;
					req1.Title = photoTitle;

					reqs.push(req1);

					// photoTitle is RecipeID

					// attach to custom collection of recipe+photo
					req2 = new PluckSDK.AddCustomCollectionActionRequest();
					req2.CustomCollectionKey = new PluckSDK.CustomCollectionKey();
					req2.CustomCollectionKey.Key = recipeId;
					req2.CustomCollectionName = "RecipeId";

					// push request
					reqs.push(req2);

					req3 = new PluckSDK.InsertIntoCollectionActionRequest();
					req3.CustomCollectionKey = new PluckSDK.CustomCollectionKey();
					req3.CustomCollectionKey.Key = recipeId;
					req3.TargetKey = new PluckSDK.PhotoKey();
					req3.TargetKey.Key = photoId;
					req3.Position = "0";

					// push request
					reqs.push(req3);

					// ship request off and use VBB.actions.photoUploadComplete as callback
					PluckSDK.SendRequests(reqs, VBB.actions.photoUploadComplete);
				}
			}
		},
		photoUploadComplete: function (results) { // handle pluckSDK response
			if (VBB.app.pluck) {
				// results[0] is the photo metadata request
				if (VBB.pluck.resultHasErrors(results[0])) {
					VBB.actions.showGenericMsg(VBB.util.getString("photoUploadTitle"), VBB.util.getString("photoUploadErrorMsg"));
				}
				// results[1] is to add a new custom collection request
				if (VBB.pluck.resultHasErrors(results[1])) {
					VBB.actions.showGenericMsg(VBB.util.getString("photoUploadTitle"), VBB.util.getString("photoUploadErrorMsg"));
				}

				// results[2] is the custom collection request
				if (VBB.pluck.resultHasErrors(results[2])) {
					VBB.actions.showGenericMsg(VBB.util.getString("photoUploadTitle"), VBB.util.getString("photoUploadErrorMsg"));
				}

				// show completion message
				VBB.actions.showGenericMsg(VBB.util.getString("photoUploadTitle"), VBB.util.getString("photoUploadSuccessMsg"));

				// now that we're done uploading the photo and setting meta data on the photo, we need to repopulate the uploads
				VBB.app.populatePhotoUploads();
			}
		},
		emailThis: function (elm, resp) {
			debug("emailThis");

			VBB.overlay.open("form_overlay", { onBeforeLoad: function () {
				// parse the tempalte to the dialog
				var temp = $("#tmpl-email-overlay");
				var dataObject = {
					errorMsg: temp.data("errorMsg")
				};
				VBB.overlay.updateContent(temp.tmpl(dataObject));

				// set field states
				VBB.util.setFieldStates(temp.data("cache"));
				VBB.util.setFieldErrorStates(temp.data("errorOutput"));
				temp.data("errorOutput", null);
				temp.data("errorMsg", null);
			}
			}, $("#tmpl-email-overlay"));

			return false;
		},
		doEmailThis: function (elm) {
			var req = "/services/email.svc/ShareEmail";
			var formData = $(".std_overlay *").serializeArray();
			$("#tmpl-email-overlay").data("cache", formData);

			$.ajax({
				url: req,
				context: elm,
				type: "post",
				contentType: "application/json",
				dataType: 'json',
				data: VBB.util.serializedArrayToReqJSON(formData),
				success: function (res) {
					debug("doEmailThis success");
					VBB.overlay.open("msg_overlay", { onBeforeLoad: function () {
						var temp = $("#tmpl-email-success-overlay");
						var dataObject = {};
						VBB.overlay.updateContent(temp.tmpl(dataObject));
						if ($("#trackIt-RecipeName-HolderValue").length > 0) {
						    window.tracker.track("Recipe Detail Email");
						} else if ($("#trackIt-ArticleTitle-HolderValue").length > 0) {
						    window.tracker.track("Article Detail Email");
						}
					}
					}, $("#tmpl-email-success-overlay"));
				},
				error: function (xhr) {
					if (xhr.status == 400) { // validation issue
						var output = $.parseJSON(xhr.responseText);
						$("#tmpl-email-overlay").data("errorOutput", output);
						$("#tmpl-email-overlay").data("errorMsg", output[0].msg);
						$("#tmpl-email-overlay").overlay().close();
						VBB.actions.emailThis(null, output);
					} else if (xhr.status == 500) { // some server error
						var output = $.parseJSON(xhr.responseText);
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), output.Detail);
					} else if (xhr.status == 401) { // unauthorized
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), VBB.util.getString("loginRequiredMsg"));
					} else {
						VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), "There was an unknown error (" + xhr.status + ")");
					}
				}
			});
			return false;
		},
		handleRestError: function (xhr) { // default messaging. no field redisplay
			if (xhr.responseText) {
				if (xhr.status == 400) { // validation issue
					VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), "There was an unexpected error (" + xhr.status + ")");
				} else if (xhr.status == 500) { // some server error
					var output = $.parseJSON(xhr.responseText);
					VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), output.Detail);
				} else if (xhr.status == 401) { // unauthorized
					VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), VBB.util.getString("loginRequiredMsg"));
				} else {
					VBB.actions.showGenericMsg(VBB.util.getString("genericErrorTitle"), "There was an unexpected error (" + xhr.status + ")");
				}
			}
		},
		showGenericMsg: function (msgTitle, msgText, template) {
			var genTemplate = (!template) ? "#tmpl-generic-msg-overlay" : template;
			var temp = $(genTemplate);
			temp.data("msgTitle", msgTitle);
			temp.data("msgText", msgText);

			VBB.overlay.open("msg_overlay", { onBeforeLoad: function () {
				// parse the tempalte to the dialog
				var temp = $(genTemplate);
				var dataObject = {
					title: temp.data("msgTitle"),
					msg: temp.data("msgText")
				};

				VBB.overlay.updateContent(temp.tmpl(dataObject));
			}
			}, genTemplate);
		}
	};

} (jQuery));

(function($) {
	//TODO: Create methods 
	$(function() {

    	// Test for Pluck
		VBB.app.pluck = VBB.pluck.havePluck();

        // setup page to handle overlays
		//VBB.app.addOverlayBlock();
		VBB.overlay.init();
		
        // ROUGH: set up placeholder text for forms
		/*
		$('input[placeholder]').placeholder({ placeholderCSS: {
			'font':'11px arial, sans-serif', 
			'color':'#bababa', 
			'position': 'absolute', 
			'left':'12px',
			'top':'0px', 
			'overflow-x': 'hidden'
	    }});
		*/

		/*products scipts*/
		if($('.productPage').length > 0){
			$('.productPage li .imgWrap img').each(function(){
				var quickopen= false;
				var quicktime = null;
				var self = this;
				function quickClose(){
					$(self).parent('.imgWrap').children('p.quickinfo').fadeOut();
				}
				$(this).mouseover(function(){
					$(this).parent('.imgWrap').children('p.quickinfo').fadeIn();
					quickopen = true;
					clearTimeout(quicktime);
				}).mouseout(function(){
					if(quickopen === true){
						quicktime = setTimeout(quickClose,500);
					}
					quickopen = false;
				});
				$(this).parent('.imgWrap').children('p.quickinfo').mouseover(function(){
					clearTimeout(quicktime);
				}).mouseout(function(){
					quicktime = setTimeout(quickClose,500);
				});
			});
			$('p.quickinfo').click(function(){
				var clicked = $(this);
				$('.productPopup').fadeOut();
				var myPopup = clicked.parents('.product').children('.productPopup');
				if (myPopup.length == 0) { // make ajax call to bring it in
					$.ajax({
						url: "/services/Products.svc/quickinfo/" + clicked.attr("data-productId"),
						context: $(this),
						type: "get",
						success: function(res) {
							var clicked = $(this);
							var productElm = clicked.parents(".product");
							// productElm.append(res);
                            // productElm.append( $(res) );
                            var myPopup = productElm.append( res ); // 
							var myPopup = productElm.children('.productPopup');
							if (productElm.is(":nth-child(3n)")) {
								myPopup.css("marginLeft","-240px");
							}
							myPopup.fadeIn();
						}
					});
				} else {
					var productElm = $(this).parents(".product");
					if (productElm.is(":nth-child(3n)")) {
						myPopup.css("marginLeft","-240px");
					}
					myPopup.fadeIn();
				}
			});
			$('.productPage a.closeBtn').live("click",function(e){
				e.preventDefault();
				$(this).parent('div.productPopup').hide();
			});
		}
		
		/*products*/
		
		// ROUGH: set up accordion blocks
        $(".search-field").watermark("Search");

        $(".myrecipeform-custom-category").watermark("Or type one here");

		$(".accordion").accordion();
		
        $(".accordionMod").accordion({ autoHeight: false, icons: { 'header': 'ui-icon-plus', 'headerSelected': 'ui-icon-minus' } });
 
		// ROUGH: set up custom scroll panes
		// NOTE: set scroll panes after accordion
		$('.scroll-pane').jScrollPane();


		// ROUGH: set up tooltips
		$("#content .compactRecipeList a").tooltip({
			"position": "bottom center",
			"offset": [-30,20]
		});

        // Footer Small Tooltips
		$("a.smTooltipTrigger").tooltip({
            "relative": true,
            "position": "bottom center",
			"offset": [-10,20]
		});
        /*
		$("#footer .compactRecipeList a").tooltip({
			"position": "bottom center",
			"offset": [-10,20]
		});*/
		
		// ROUGH: set up tabs
		$(".tabs").tabs();
		
		//ROUGH: New window links
		$("a[rel=new]").attr("target","_new");

		// ROUGH: Print Option Selector
		$(".printOptions, .utilOptions").parent().hover(function(e) {
				$(this).addClass("open");
			},
			function(e) {
				$(this).removeClass("open");
			}
		);
		
        $(".printOptions, .utilOptions").siblings("a").attr("href","javascript:void(0)");

		// ROUGH: module initilizations
		$(".topRatedRecipe").scrollable();
		$(".hero").scrollable();
		$(".scrollable").scrollable();
        $(".smallRecipeScroller, .mod-large-recipe-scroll .largeRecipeScroller").scrollable({circular: true});
		$(".mod-hero .hero-scrollable").scrollable({circular: true}).navigator().autoscroll({interval: 6000});
		$(".mod-top-ten-recipes .pagination").tabs();
		if ($(".articleScroller ul").length > 0) {
			$(".articleScroller").scrollable({circular: true});
		}
		$(".featuredthings").scrollable({
			circular: true, 
			onSeek:function() {
				$(".featuredthings").siblings(".buttonBox").find(".pagenum").html(this.getIndex()+1);
			}
		});
		
        // Recipe Box image upload scroller
        $(".imageupload").scrollable({
			circular: true, 
			onSeek:function() {
				$(".imageupload").siblings(".buttonBox").find(".pagenum").html(this.getIndex()+1);
			}
		});
		
		// ROUGH: Save to shopping list links 
		$('.saveToShoppingList').bind("click",function(e) {
			e.preventDefault();
			// TODO: check login state
			// Handle save attempt
			VBB.app.saveToShoppingList($(this));
		});
		
		// ROUGH: filter ar on recipe search pages
		$(".autoFilterBar input, .autoFilterBar select").bind("change",function(e) {
			if ($(this).val() && $(this).val().length) {
				window.location.href = $(this).val();
			}
		});
		
		// Recipe Box Large Tooltips
		$("a.lgTooltipTrigger").tooltip({
            "relative": true,
			"position": "center right",
			"offset": [0,20] 
		});
		
		//For where to buy alternate color table rows
		 $(".storeResults tr:even").css("background-color", "#faf4ef");
		 
		// Initialize the recipe finder
		if ($(".mod.recipeFinder").length) {
			VBB.app.recipeFinderInit();
		}
		
		// block enter key for certain form elements
		$("form").bind("keypress",function(e){
			if (e.keyCode == 13) {
				if ($(e.originalTarget).parents(".msg_overlay").length || $(e.originalTarget).parents(".mod.recipeFinder").length) {
					return false;
				}
			}
		});
		
		
		// Initialize Tree Widget
		$(".tree").each(function() {
			var tree = $(this);
			tree.find("li").each(function() {
				$(this).has("ul").addClass("toggle toggleClosed").each(function(){
					$('<a href="#" class="toggleWidget"></a>').prependTo(this).bind("click",VBB.app.treeToggle);
				});
			});

			// do this recursively if tree gets deeper
			var openLinks = tree.find('.active');
			openLinks.parents("li").children(".toggleWidget").click();

		});
		
		// ROUGH: little number widget with -/+ toggles
		$("input.number").each(function() {
			$('<a class="button oneChar inputNumberDown" href="#">-</a>').insertBefore(this);
			$('<a class="button oneChar inputNumberUp" href="#">+</a>').insertAfter(this);
			$(this).prev().bind("click",function(e){
				e.preventDefault();
				var field = $(this).next();
				if (VBB.util.isStringNumeric(field.val())) {
					field.val(parseFloat(field.val())-1);
				}
			});
			$(this).next().bind("click",function(e){
				e.preventDefault();
				var field = $(this).prev();
				if (VBB.util.isStringNumeric(field.val())) {
					field.val(parseFloat(field.val())+1);
				}
			});
		});
		
		
		// Edit Link functionality on Custom Categories
		$(".editRecipeboxCategory").live("click",function(e) { // set event handler for newly created items
			e.preventDefault();
			VBB.app.queuedElementsByKey["editCategory__"] = this;

			VBB.overlay.open("form_overlay",{onBeforeLoad: function(){
				// parse the tempalte to the dialog
				var temp = $("#tmpl-rename-category-overlay");
				var dataObject = {
					namefield: "overlay_field_name",
					categoryId: $(VBB.app.queuedElementsByKey["editCategory__"]).attr("data-categoryId"),
					errorMsg: null
				};
				VBB.overlay.updateContent(temp.tmpl(dataObject));
			}},$("#tmpl-rename-category-overlay"));
		});

		// Add Link functionality on Custom Categories
		$(".addRecipeboxCategory").bind("click",function(e) {
			e.preventDefault();
			
			VBB.overlay.open("form_overlay",{onBeforeLoad: function(){
				// parse the tempalte to the dialog
				var temp = $("#tmpl-add-category-overlay");
				var dataObject = {
					namefield: "overlay_field_name",
					errorMsg: null
				};
				VBB.overlay.updateContent(temp.tmpl(dataObject));
			}},$("#tmpl-add-category-overlay"));
		});
		
		// hacky little cleanup
		$(".forceCenter").each(function() {
			var left = ($(this).parent().width()-($(this).width() + 30))/2;
			$(this).css("left",left+"px");
		});

        // Add Recipe form scripts
        if($('.addRecipeForm').length > 0){
            // pre-check custom categories checkboxes
            var customCategories = $('#pagecolumnsplaceholder_0_columnplaceholder_0_hdnCustomCategories').val();
            var customCategoriesList = customCategories.split(','); 
            if(customCategoriesList.length > 0){
                for(i=0;i<customCategoriesList.length;i++){
                    $('input:checkbox[name="CustomCategoryCheckBox"]').each(function() {
                       if($(this).val() == customCategoriesList[i]){
                            $(this).attr('checked', true);
                       }
                     });
                }
            }

            //pre-check nestle categories checkboxes
            var nestleCategories = $('#pagecolumnsplaceholder_0_columnplaceholder_0_hdnCategories').val();
            var nestleCategoriesList = nestleCategories.split(','); 
            if(nestleCategoriesList.length > 0){
                for(i=0;i<nestleCategoriesList.length;i++){
                    $('input:checkbox[name="CategoryCheckBox"]').each(function() {
                       if($(this).val() == nestleCategoriesList[i]){
                            $(this).attr('checked', true);
                       }
                     });
                }
            }

            //preload pluck or sitecore images
            var imageId = $('#pagecolumnsplaceholder_0_columnplaceholder_0_ImageId').val();
            var imageType = $('#pagecolumnsplaceholder_0_columnplaceholder_0_ImageSourceType').val();            
            var imageUrl;

            if( imageType == 'pluck'){
                VBB.actions.handlePhotoUploadResponseUserSubmittedPhoto(imageId);
            }else if(imageType == 'predefined'){
                imageUrl = $("li[data-guid="+imageId+"]").attr('data-thumb-url');
                var $ele = $(".userSubmittedPhotoUpload .addphoto");
			
			    var $imgEle = $ele.find('img.user-custom-photo');

			    if( $imgEle.length == 0 ) {
				    $ele.prepend( $("<img class='user-custom-photo' />") );
				    $imgEle = $ele.find('img.user-custom-photo');
			    }

			    $imgEle.attr('src', imageUrl );
            }

            $('.overlayImageUpload').addClass('hide');
        }
		
        // Tool Overlays
        var toolOverlays = [
            { Selector: "a.calcs", OverlayClass: "calcs_overlay", DeepLink: "conversion-calculator" },
            { Selector: "a.yields", OverlayClass: "yields_overlay", DeepLink: "yields-and-equivalents" }   
        ];
        
        var hashValue = location.hash.substring(1);

        $.each( toolOverlays, function() { 
            $(this.Selector).click( function(e) { 
                var $trigger = $(this);

                var loadHTML = function() {
                    // grab wrapper element inside content
				    var wrap = this.getOverlay().find(".contentWrap");
				    // load the page specified in the trigger
				    wrap.load($trigger.attr("href"));
                };

                VBB.overlay.open(this.OverlayClass, { onBeforeLoad: loadHTML }, $("<div></div>") );

				e.preventDefault();
		    });

            if( hashValue == this.DeepLink ) {    
                $(this.Selector).find(":first").click();
            }
        });

        $("a.viewlinkupc").click( function() {
            var $trigger = $(this);

            var loadImage = function() {
				// grab wrapper element inside content
				var wrap = this.getOverlay().find(".contentWrap");
				// load the page specified in the trigger
				wrap.html("<img src="+$trigger.attr("href")+">");
			};

            VBB.overlay.open("img_overlay", { onBeforeLoad: loadImage }, $("<div></div>") );

            return false;
        });

        // Pluck vbb customized forum DOM
        if($('.Forums_MainContainer').length > 0){

            $('td.Discussion_PostTablePost').each(function () {
				var $ele = $(this);
                var $title = $ele.parent().parent().parent().prev();
                
                var $postdate = $title.children().children().children('.Discussion_PostTitleTableTitle').children('.Discussion_PostTitleTablePosted');
                var newTd = $('<td colspan="3"></td>').html($postdate);
                var newTr = $('<tr></tr>');
                newTr.append(newTd);
                $title.children().append(newTr);

                $ele.prepend($title);
            });

            $('.Discussion_PostOptions').find('br').remove();
        }

        VBB.app.interactionAdvisor = {
            init: function(){
                VBB.app.interactionAdvisor.hover();
		VBB.app.interactionAdvisor.emulateOpacity();
        VBB.app.interactionAdvisor.bodyClassAssignment();
            },
            hover: function(){

$('.interaction-advisor.row ul li img').hover(function(){
  $(this).fadeTo(5,'.4');
  $(this).parent().parent().children('.title-description').children('em').children('a').css('color','#ff9933');
}, function(){
  $(this).fadeTo(5,'1');
  $(this).parent().parent().children('.title-description').children('em').children('a').css('color','#3DA8BF');
});

$('.interaction-advisor.row ul li .title-description').hover(function(){
  $(this).prev().children('img').fadeTo(5,'.4');
  $(this).children('em').children('a').css('color','#ff9933');
},function(){
  $(this).prev().children('img').fadeTo(5,'1');
  $(this).children('em').children('a').css('color','#3DA8BF');
});




            },
	    emulateOpacity: function(){
		$('.interaction-advisor .title-description').css('opacity','0.8');
	    },
        truncateText: function(){
        var firstBit = $('.interaction-advisor h4 span').text().substr(0,250);$('.interaction-advisor h4 span').empty().text(firstBit + ' ...');
        },
		bodyClassAssignment: function(){
			if ($.browser.msie == true && $.browser.version == '7.0') {
				$('body').addClass('ie7');				
			}
			if ($.browser.msie == true && $.browser.version == '8.0') {
				$('body').addClass('ie8');				
				$('.interaction-advisor.tall').wrap('<div class=ia_wrap />');
			}

							 
		 }
        }
        
		// customize form elements
        $("select, input:checkbox, input:radio").uniform();
        $.uniform.restore("#logindialog-wrapper select, #logindialog-wrapper input:checkbox, #logindialog-wrapper input:radio"); // prevent duplicating fields for embedded dialogs

		// Trigger any onload javascript actions
		VBB.actions.triggerOnloadAction();
		
        // if the photogallery is on the page
        VBB.app.populatePhotoUploads();
		VBB.actions.userSubmittedPhotoUpload();
		VBB.actions.userSubmittedPredefinedPhoto();

        VBB.app.Tracking.Init();
        VBB.app.PostbackOverride.Init();

        VBB.app.interactionAdvisor.init();

	});    

})(jQuery);


