/// <reference path="jquery-1.3.2-vsdoc2.js" />

// CONTENTS ====================================================================
/*	
	1.0 Custom Functions
		1.1 Javascript Enabled CSS
		1.2 Image Loader
		
	2.0 FrontEnd Functions
		2.01 Page Tools
		2.02 Collapsing List
		2.03 Image Replace
		2.04 Search Text
		2.05 Ajax for recipes
		2.06 Listing Highlight
		2.07 External Links
		2.08 Set Form Button
		2.09 Set Recpie Submission Page
		2.10 Forms { general }
		2.11 KMS Post submissions
		2.12 Show Hide
	
	3.0 Plugins
*/

// ======================================================================

/***** 1.0 JAVSCRIPT ENABLED CSS ****************************************************/

(function() {
	var head = document.getElementsByTagName("head")[0];
	if (head) {
		var scriptStyles = document.createElement("link");
		scriptStyles.media = "screen,print";
		scriptStyles.href = "/css/javascript.css";
		scriptStyles.type = "text/css";
		scriptStyles.rel = "stylesheet";
		head.appendChild(scriptStyles);
	}
} ());

/***** 1.2 Image Loader *****/
$.fn.image = function(src, f) {
	return this.each(function() {
		var i = new Image();
		i.src = src;
		i.onload = f;
		this.appendChild(i);
	});
}

var BeforeAfterSupport = {
	init: function() {
		BeforeAfterSupport.setAfterSupport();
		BeforeAfterSupport.setBeforeSupport();
	},

	setBeforeSupport: function() {
		(!Modernizr.generatedcontent) && $('.before').prepend('<span class="pseudobefore"></span>');
	},

	setAfterSupport: function() {
		(!Modernizr.generatedcontent) && $('.after, .mod').append('<span class="pseudoafter"></span>');
	}
}

/***** 2.0 FRONTEND FUNCTIONS ****************************************************/

/***** 2.01 Page Tools *****/
var PageTools = {
	Init: function() {
		var printLink = '<a class="page-tool page-print" onclick="window.print();return false"  href="#">Print</a>';
		var sendLink = '<a id="send-email" class="page-tool page-email" href="#">Send to a friend</a>';
		var sendClose = '<a id="send-close" class="close" title="Close" href="#">Close</a>';

		if ($('div#send-form').length > 0) {
			$('div#send-form').prepend(sendClose);
			$(".pri .cont-tools").prepend(sendLink + printLink);
			Frontend.ShowHide.Init('a#send-email', 'div#send-form');
			Frontend.ShowHide.Trigger('a#send-close','a#send-email');
		} else {
		    $(".pri .cont-tools").prepend(sendLink + printLink);
		}
	}
}

/***** 2.02 Collapsing List *****/
var Collapsing = {
	Init: function() {
		$(".collapse").each(function() {
			if ($(this).hasClass("winners")) {
				Frontend.Collapsing.WinnersList(this);
			} else if ($(this).parents(".mod-group-collapse").length > 0) {
				Frontend.Collapsing.ModGroupCollapse($(this));
			} else if ($(this).hasClass(".mod-listing")) {
				Frontend.Collapsing.ModCollapse($(this));
			}
		})
	},

	OpenList: function(elm) {
		$(elm).addClass("open");
	},

	CloseList: function(elm) {
		$(elm).removeClass("open");
	},

	ModCollapse: function(elm) {
		var linkText = $(elm).children("h2").text();
		var linkHtml = '<a href="#">' + linkText + '</a>';
		$(elm).addClass("mod-listing-collapse");
		$(elm).children("h2").siblings().addClass("content");
		$(elm).children("h2").empty().append(linkHtml);
		$(elm).find("h2 a").click(function() {
			if ($(this).hasClass("open")) {
				Frontend.Collapsing.CloseList($(this));
				Frontend.Collapsing.CloseList($(this).parent().next());
			} else {
				Frontend.Collapsing.OpenList($(this));
				Frontend.Collapsing.OpenList($(this).parent().next());
			}
			return false;
		});
	},

	ModGroupCollapse: function(elm) {
		$(elm).children("a").click(function() {
			if ($(this).hasClass("open")) {
				Frontend.Collapsing.CloseList($(this));
				Frontend.Collapsing.CloseList($(this).parent().next(".content"));
			} else {
				Frontend.Collapsing.OpenList($(this));
				Frontend.Collapsing.OpenList($(this).parent().next(".content"));
			}
			return false;
		});
	},

	WinnersList: function(elm) {
		var numOfWinners = $(elm).children("li").length;
		var textNumOfWinners = "<span>(" + numOfWinners + ")</span>";
		var linkTextSingle = "View winner";
		var linkTextClose = "Close list";
		var linkHtml = "";
		if (numOfWinners > 1) {
			var linkHtml = '<p><a class="cta" href="javascript();">' + linkTextSingle + 's</a> ' + textNumOfWinners + '</p>';
		} else {
			var linkHtml = '<p><a class="cta" href="javascript();">' + linkTextSingle + '</a></p>';
		}

		$(elm).after(linkHtml);
		$(elm).siblings("p").children("a.cta").click(function() {
			if ($(this).text() != linkTextClose) {
				Frontend.Collapsing.OpenList($(this).parent("p").siblings("ul.winners"));
				$(this).parent("p").addClass("open");
				$(this).data("linkText", $(this).text())
				$(this).text(linkTextClose);
			} else {
				Frontend.Collapsing.CloseList($(this).parent("p").siblings("ul.winners"));
				$(this).parent("p").removeClass("open");
				$(this).text($(this).data("linkText"));
			}
			return false;
		});
	}
}

/***** 2.03 Image Replace *****/
var ImageReplace = {
	Init: function() {
		$(".sizes li a").click(function() {
			var imageFile = $(this).attr("href");
			$(this).parent("li").siblings("li").children("a").removeClass("selected");
			$(this).addClass("selected");
			$(".hero-image").empty().addClass("hero-image-hide");
			$(".hero-image").image(imageFile, function() {
				$(".hero-image img").hide();
				$(".hero-image").removeClass("hero-image-hide")
				$(".hero-image img").fadeIn(250);
			});
			return false;
		});
	}
}

/***** 2.04 Search Text *****/
var SearchText = {
	Init: function(elm) {
		var defaultValue = 'Start Searching...';
		if ($(elm).val() == '') {
			$(elm).val(defaultValue);
		}
		$(elm).focus(function() {
			if ($(this).val() == defaultValue) {
				$(this).val('');
			}
		});
		$(elm).blur(function() {
			if ($(this).val() == '') {
				$(this).val(defaultValue);
			}
		});
	}
}

/***** 2.05 Ajax for recipes *****/
var AjaxRecipePage = {
	Init: function() {
		Frontend.Collapsing.Init();
		Frontend.AjaxRecipePage.AjaxPicker();
	},
	LoadMods: function(target) {
		var target = $(target);
		var source = '/Recipe%20Info';
		$.ajax({
			url: source,
			dataType: 'html',
			success: function(html) {
				target.hide().append(html).fadeIn();
				Frontend.AjaxRecipePage.Init();
				Frontend.AjaxRecipePage.TableRowShading();
			}
		});
	},
	InitIngredients: function() {
		$('body').append('<div class="mini-detail"></div><div class="underlay"></div>');
		$('.list-ingredients a').click(function() {
			var offset = $(this).offset();
			var target = $('.mini-detail');
			var underlay = $('.underlay');
			var source = $(this).attr('href') + '/MiniProductDetail.aspx';
			target.empty();
			$.ajax({
				url: source,
				dataType: 'html',
				success: function(html) {
					target.hide().append(html);
					target.css({ 'top': (offset.top - (target.height() + 40)) + 'px' });
					underlay.css({ 'top': (offset.top - (target.height() + 45)) + 'px', 'height': (target.height() + 29) + 'px' });
					underlay.css({ 'opacity': '0' }).show().fadeTo(350, .3);
					target.fadeIn(150);
					target.find('.close').click(function() { underlay.hide(); target.hide(); return false; });
				}
			});
			return false;
		});
	},
	AjaxPicker: function() {
		$('.ajax-picker').change(function() {
			$(this).parent().children('.ajax-content').hide();
			if ($(this).val() == 'default')
				$(this).parent().children('.ajax-content').eq(0).show();
			$($(this).val()).show();
		});
		$('.ajax-picker').trigger('change');
	}, TableRowShading: function() {
		$(".sec .ajax-content table tbody tr:odd").addClass("alt");
	}
}

/***** 2.06 Listing Highlight *****/
var ListingHighlight = {
	Init: function() {
		$(".pri .cont-listing .list-view li").hover(function() {
			$(this).css("background", "#ece9e3")
		}, function() {
			$(this).removeAttr("style");
		});
	}
}

/***** 2.07 External Links *****/
var SetExternalLinks ={ 
	Init: function() {
		$('a[rel*=external]').click(function() { window.open(this.href); return false; });
	}
}

/***** 2.08 Set Form Button *****/
var FieldsetSubmit = {
    Init: function() {
        $('#content,#search,#account').bind('keypress', function(e) {
            var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
            var target = e.target.tagName.toLowerCase();

            if (key === 13 && target === 'input') {

                var isSearchField = $(e.target).parents("fieldset").find("input.btn-search").length;
                var isLoginField = $(e.target).parents("fieldset").find("input.btn-login").length;

                if (isSearchField > 0 || isLoginField > 0) {
                    $(e.target).parents("fieldset").find("input:submit").trigger('click');
                    return false;
                } else if ($(e.target).attr("type") == 'submit') {
                    $(e.target).trigger('click');
                } else {
                    return false;
                }
            }
        });
    }
}

/***** 2.09 Set Recpie Submission Page *****/
var RecipeSubmission = {
	Init: function() {
		$('#promo-select input').click(function() {
			if ($(this).attr('checked') == true) {
				$('#address-details').slideDown('fast');
			} else {
				$('#address-details').slideUp('fast');
			}
		});
	}
}

/***** 2.10 Form Default *****/
var Forms = {
	Init: function() {
		if ($('span.error:visible').length > 0) {
			try {
				var errorOffset = $('span.error:visible').eq(0).offset();
				$('body').scrollTo(errorOffset.top - 80);
			} catch (err) { }
		}
	},
	SelectAll: function(trigger, targetList) {
		$(trigger).toggle(
			  function() {
				$(targetList + " input[type='checkbox']:not([disabled='disabled'])").attr('checked', true);
			  	$(trigger).text('Unselect all');
			  },
			  function() {
				$(targetList + " input[type='checkbox']:not([disabled='disabled'])").attr('checked', false);
			  	$(trigger).text('Select all');
			  }
		);
	}
}

/***** 2.11 KMS Post submissions *****/

/***** 2.12 Show Hide *****/
var ShowHide = {
	Init: function(trigger, target) {
		$(trigger).click(
			function() {
				if ($(trigger).hasClass('open')) {
					ShowHide.Hide(trigger, target);
				} else {
					ShowHide.Show(trigger, target);
				}
				return false;
			}
		);
	},
	Hide: function(trigger, target) {
		$(trigger).removeClass('open');
		if (jQuery.browser.msie) {
			$(target).hide();
		} else {
			$(target).fadeOut(150, function() {$(this).hide()});
		}
	},
	Show: function(trigger, target) {
		$(trigger).addClass('open');
		if (jQuery.browser.msie) {
			$(target).show();
		} else {
			$(target).fadeIn(150);
		}
	},
	Trigger: function(fakeTrigger, trigger) {
		$(fakeTrigger).click(
			function() {
				$(trigger).trigger('click');
				return false;
			}
		);
	}
}


var LoginPopup = {
    Init: function(trigger, target) {
        $(trigger).click(
			function() {
			    if ($(trigger).hasClass('open')) {
			        LoginPopup.Hide(trigger, target);
			    } else {
			        LoginPopup.Show(trigger, target);
			    }
			    return false;
			}
		);
    },
    Hide: function(trigger, target) {
        $(trigger).removeClass('open');
        if (jQuery.browser.msie) {
            $(target).hide();
        } else {
            $(target).fadeOut(150, function() { $(this).hide() });
        }
    },
    Show: function(trigger, target) {
        $(trigger).addClass('open');
        if (jQuery.browser.msie) {
            $(target).show();
            $(target).find("input[tabindex=1]").focus();
        } else {
            $(target).fadeIn(150, function() { $(target).find("input[tabindex=1]").focus() });
        }
    },
    Trigger: function(fakeTrigger, trigger) {
        $(fakeTrigger).click(
			function() {
			    $(trigger).trigger('click');
			    return false;
			}
		);
    }
}

/***** 2.12 Switch Views *****/
var SwitchViews = {
	Init: function(elmOne, elmTwo) {
		if (jQuery.browser.msie && jQuery.browser.version < 7) {
			// do nothing
		} else {
			if (elmTwo == window.location.hash) {
				$(elmOne).hide();
			} else {
				$(elmTwo).hide();
			}

			$(elmOne + " a, " + elmTwo + " a").click(
				function() {
					if ($(this).attr("href") == elmOne) {
						SwitchViews.ShowHide(elmOne, elmTwo);
						return false;
					}

					if ($(this).attr("href") == elmTwo) {
						SwitchViews.ShowHide(elmTwo, elmOne);
						return false;
					}
				}
			);
		}
	},
	ShowHide: function(elmShow, elmHide) {
		$(elmHide).hide();
		$(elmShow).fadeIn(250);
	}
}

/***** 2.13 List Actions *****/
var List = {
	// target - elm / the target element of the list i.e. "ol" or "ul"
	// limit - num / the number of items to show on init i.e. 3
	// desc - string / brief description of the list i.e. "comments"

	ShowHide: function(target, limit, desc) {
		List.Limit(target, limit);
		List.Trigger(target, limit, desc);
	},
	Trigger: function(target, limit, desc) {
		text = List.TriggerText(target, limit, desc);
		if (!$(target).next('a').hasClass('view-all') && $(target).children().length > limit) {
			$(target).after('<a class="view view-all" href="#">' + text + '</a>');
		}
		$(target).next('a.view-all').click(
			function() {
				List.ItemsShowHide(target, limit);
				$(this).text(List.TriggerText(target, limit, desc));
				return false;
			}
		);
	},
	TriggerText: function(target, limit, desc) {
		var text = "";
		var textShow = "View all ";
		var texthide = "Show only ";
		if ($(target).hasClass("open"))
			return texthide + limit + " " + desc;
		return textShow + desc;
	},
	ItemsShowHide: function(target, limit) {
	if ($(target).hasClass("open")) {
			$(target).removeClass("open");
			List.Limit(target, limit);
		} else {
			$(target).addClass("open");
			$(target + " > li").show();
		}
	},
	Limit: function(target, limit) {
		$(target + " li:gt(" + (limit - 1) + ")").hide();
	}
}

/***** 2.14 Character Display Count *****/
var CharacterCount = {
	Init: function(target, display, limit) {
		var text = " characters remaining";
		CharacterCount.Limit(target, limit);
		$(display).prepend('<em>' + String(limit - $(target).val().length) + text + '</em>');
		$(target).keyup(
			function() {
				if ($(target).val().length > limit)
					CharacterCount.Limit(target, limit);
				num = limit - $(target).val().length;
				$(display + " > em").text(num + text);
			}
		);
	},
	Limit: function(target, limit) {
		$(target).val($(target).val().substring(0, limit));
	}
}

/***** 2.14 Avatar Editor Modal *****/
var AvatarEditorModal = {
    Init: function(trigger, target, close, cancel, rawelement, maxboxwidth, maxboxheight, previewsize) {

        var api;

        //wire up modal close button
        AvatarEditorModal.CloseTrigger(close, trigger);
        AvatarEditorModal.CloseTrigger(cancel, trigger);

        //bind jcrop to image
        setCrop();

        $(trigger).click(
			    function() {

			        if ($(trigger).hasClass('open')) {
			            AvatarEditorModal.Hide(trigger, target);
			        } else {

			            //remove any existing jcrop functionality from the image (to handle showing the modal mutiple times)
			            api.destroy();

			            AvatarEditorModal.Show(trigger, target, rawelement, maxboxwidth, maxboxheight, previewsize);

			            //bind jcrop to image
			            setCrop();

			        }
			        return false;
			    }
		    );

        //
        function setCrop() {
            var ele = $(rawelement);
            api = $.Jcrop(ele, {
                onChange: function(coords) { AvatarEditorModal.ShowPreview(coords, ele, previewsize) },
                onSelect: function(coords) { AvatarEditorModal.ShowPreview(coords, ele, previewsize) },

                aspectRatio: 1,
                boxWidth: maxboxwidth,
                boxHeight: maxboxheight
            });
        }

    },
    Hide: function(trigger, target) {
        $(trigger).removeClass('open');
        if (jQuery.browser.msie) {
            $(target).hide();
        } else {
            $(target).fadeOut(150);
        }
    },
    Show: function(trigger, target, rawelement, maxboxwidth, maxboxheight, previewsize) {
        $(trigger).addClass('open');
        if (jQuery.browser.msie) {
            $(target).show();
        } else {
            $(target).fadeIn(150);
        }

    },
    CloseTrigger: function(fakeTrigger, trigger) {
        $(fakeTrigger).click(
			    function() {
			        $(trigger).trigger('click');
			        return false;
			    }
		    );
    },
    ShowPreview: function(coords, img, previewsize) {
        var rx = previewsize / coords.w;
        var ry = previewsize / coords.h;

        var dimensions =
				        "sw=" + coords.w +
				        ",sh=" + coords.h +
				        ",x=" + coords.x +
				        ",y=" + coords.y;

        $('.CropDimensions').attr("value", dimensions);

        $('.CropPreview').css({
            width: Math.round(rx * img.width()) + 'px',
            height: Math.round(ry * img.height()) + 'px',
            marginLeft: '-' + Math.round(rx * coords.x) + 'px',
            marginTop: '-' + Math.round(ry * coords.y) + 'px'
        });
    }
}

/***** 2.15 Add Hover Class *****/
var AddHoverClass = {
    Init: function(trigger, target) {
        $(trigger).hover(function() {
            $(target).addClass('hover');
        },
        function() {
            $(target).removeClass('hover');
        });
    }
}

/***** 2.16 Freestyle senses rollover *****/
var FreestyleSenses = {
	Init: function () {
		var list = $('#senses').find('li');
		var holder = $('#sensesText');
		var heading = holder.find('h3');
		var desc = holder.find('p');
		holder.data('heading', heading.text());
		holder.data('desc', desc.text());
		list.each(function () {
			$(this).hover(function () {
				var item = $(this);
				var newHeading = item.find('h4').text();
				var newDesc = item.find('p').text();
				heading.text(newHeading);
				desc.text(newDesc);
			},
			function () {
				heading.text(holder.data("heading"));
				desc.text(holder.data("desc"));
			});
		});
	}
}

/***** 2.17 Freestyle Scrolling *****/
var FreestyleScrolling = {
	Init: function () {
		var navItems = $('#freestyle-nav').find('a');
		navItems.each(function () {
			$(this).click(function () {
				var item = $(this);
				var section = item.attr('href');
				var position = $(section).offset().top;
				$('html, body').stop().animate({ scrollTop: position }, 1000, 'easeOutCubic');
				return false;
			});
		});
		$('a.top').click(function () {
			$('html, body').stop().animate({ scrollTop: 0 }, 1000, 'easeOutCubic');
			return false;
		});
	}
}

/***** 2.18 Video Thumbnails Rotator *****/
var ThumbnailRotator = {
	Init: function (list) {
		var $thisGalleryItem = $(list);
		var items = $(list).find('li');
		var count = items.length;
		items.each(function () {
			$(this).removeClass('clear');
			$(this).removeClass('margin-right-none');
		});
		$thisGalleryItem.jcarousel({
			buttonPrevHTML: '<div class="skip ir bg" title="Previous">Prev</div>',
			buttonNextHTML: '<div class="skip ir bg" title="Next">Next</div>',
			wrap: 'none',
			scroll: 3,
			itemFirstInCallback:
				function (carousel, item, idx, state) {
					if (idx == 1 && count > 3) {
						$(carousel.buttonPrev).addClass('prev-off').removeClass('prev-on');
						$(carousel.buttonNext).removeClass('next-off').addClass('next-on');
					}
				},
			itemLastInCallback:
				function (carousel, item, idx, state) {
					if (idx == count && count > 3) {
						$(carousel.buttonNext).addClass('next-off').removeClass('next-on');
						$(carousel.buttonPrev).removeClass('prev-off').addClass('prev-on');
					}
				}
		});
	}
}

/***** 2.19 YouTube Player *****/

function onYouTubePlayerReady(playerId) {
	var freestyle = $('#freestyleTV').length > 0 ? true : false;

	var videoLinks;
	var player;
	var placeholder;
	var playerTop;

	if (freestyle) {
		videoLinks = $('#videoList').find('a');
		player = document.getElementById(playerId);
		placeholder = $('#freestyleTV').find('.placeholder');
		playerTop = $('#freestyleTV').offset().top;
	} else {
		videoLinks = $('.television .items a');
		player = document.getElementById(playerId);
		placeholder = $('.television .placeholder');
		playerTop = $('#coffee-tv').offset().top;
	}

	placeholder.click(function () {
		$('html, body').stop().animate({ scrollTop: playerTop }, 1000, 'easeOutCubic', function () {
			player.playVideo();
			placeholder.fadeOut(500);
		});
		return false;
	});

	videoLinks.each(function () {
		$(this).click(function () {
			var item = $(this);
			var videoId = item.attr('id');
			var siblings = item.parent('li').siblings('li');
			var overlay = "<div class='overlay'/>";
			$('#videoList').find('div.overlay').remove();
			siblings.each(function () {
				$(this).find('a').prepend(overlay);
			});
			$('html, body').stop().animate({ scrollTop: playerTop }, 1000, 'easeOutCubic', function () {
				player.loadVideoById(videoId);
				placeholder.fadeOut(500);
			});
			return false;
		});
		player.addEventListener("onStateChange", "stateChange");
	});
}

function stateChange(newState) {
	if (newState === 0) {
		$('#freestyleTV').find('a.placeholder').fadeIn(500);
		$('#videoList').find('div.overlay').fadeOut(300, function () {
			$(this).remove();
		});
	}
	if (newState === 1) {
		$('#freestyleTV').find('a.placeholder').fadeOut(500);
	}
}

// Initialise methods onto Frontend Object ================================================================================
var Frontend = {
	PageTools: PageTools,
	Collapsing: Collapsing,
	ImageReplace: ImageReplace,
	SearchText: SearchText,
	AjaxRecipePage: AjaxRecipePage,
	ListingHighlight: ListingHighlight,
	SetExternalLinks: SetExternalLinks,
	FieldsetSubmit: FieldsetSubmit,
	RecipeSubmission: RecipeSubmission,
	Forms: Forms,
	ShowHide: ShowHide,
	LoginPopup: LoginPopup,
	SwitchViews: SwitchViews,
	List: List,
	CharacterCount: CharacterCount,
	AddHoverClass: AddHoverClass,
	FreestyleSenses: FreestyleSenses,
	FreestyleScrolling: FreestyleScrolling,
	ThumbnailRotator: ThumbnailRotator
};
