/**
* Specific Javascript
*
* @author 		Paul Campbell
* @copyright 	Copyright (c) 2009. All rights reserved.
*/

// Public namespace
var delicious = window.delicious = function ($) {

    var CLASS_ACTIVE = "active",
			CLASS_HOVER = "hover",
			CLASS_FOCUS = "focus",
			CLASS_HIDDEN = "hidden",
			CLASS_BUTTON = "button",
			CLASS_TITLE = "title",
			CLASS_CONTENT = "content",
			CLASS_CLOSE = "close",
			CLASS_STARS = "star-rating",
			CONTROL_DIALOG = "dialog",
			URL_AJAX = "ajax.aspx";

    var state_variables = new Object(),
			msie_href = Array();


    function emailAJAXControl() {
        var ID_EMAIL = "email-friend",
				dialog = $("#" + ID_EMAIL),
				link = dialog.find("." + CLASS_BUTTON);

        msie_href.push(link);

        function addErrorMessage(msgString) {
            dialog.find(".error").remove();
            dialog.find("fieldset").prepend('<p class="error">' + msgString + '</p>');
        }

        link.click(function () {

            var email = dialog.find("input#email-address").val();
            var name = dialog.find("input#name").val();
            var note = dialog.find("textarea#note").val();
            var reg = /(^[a-z]([a-z_\.]*)@([a-z_\.]*)([.][a-z]{3})$)|(^[a-z]([a-z_\.]*)@([a-z_\.]*)(\.[a-z]{3})(\.[a-z]{2})*$)/i;
            //This regex doesnt allow .co.uk email addresses... removed the test for now
            //if(reg.test( email ) == false || name.length < 1) {

            if (name.length < 1) {
                addErrorMessage("Please ensure you've entered the recipients name and email address correctly.");
            } else {
                $.post(URL_AJAX, {
                    "type": 4,
                    "emailAddress": email,
                    "note": note,
                    "name": name,
                    "articleId": getVariable(delicious.ARTICLE_ID),
                    "recipeId": getVariable(delicious.RECIPE_ID)
                });
                dialog.fadeOut("slow");
            }
            return (false);
        });
    }

    /*
    Star Rating method control
    */
    function starRatingAJAXControl() {
        var CLASS_USER_RATING = "user-rating-",
				CLASS_SX_STAR = "sx-star-rating-",
				controls = $("." + CLASS_STARS);

        controls.each(function () {

            var links = $(this).find("a");
            var hasSubmitted = false;
            msie_href.push(links);

            links.click(function () {
                if (!hasSubmitted) {
                    var el = $(this),
							rating = el.attr("class").split(CLASS_USER_RATING)[1],
							average = el.parent().attr("class").split(CLASS_SX_STAR)[1];

                    // Update rating on curent state
                    el.parent().removeClass(CLASS_SX_STAR + average).addClass(CLASS_SX_STAR + rating);
                    hasSubmitted = true;

                    $.post(URL_AJAX, {
                        "type": 3,
                        "rating": rating,
                        "recipeId": getVariable(delicious.RECIPE_ID),
                        "articleId": getVariable(delicious.ARTICLE_ID)
                    });
                }
                return (false);
            })
        });
    }

    /*
    Apply AJAX method to cookbook control
    */
    function cookbookAJAXControl() {
        var ID_COOKBOOK_CONTROL = "cookbook-control";
        var el = $("#" + ID_COOKBOOK_CONTROL);

        msie_href.push(el);
        el.click(function () {
            var type = el.text().toLowerCase().indexOf("add") > -1 ? 1 : 2;

            $.post(URL_AJAX, {
                "type": type,
                "recipeId": getVariable(delicious.RECIPE_ID)
            });

            if (type == 1) {
                el.text("Remove from Cookbook");
            } else {
                el.text("Add to my Cookbook");
            }

            return (false);
        });
    }

    /*
    Quick print hack (should review Google Maps)
    */
    function quickPrint() {
        var ID_PRINT = "print-control";
        msie_href.push(
			$("#" + ID_PRINT).click(function () {
			    window.print();
			    return (false);
			})
		);
    }

    /*
    Expanding folder controls
    */
    function archiveFoldingControl() {
        var ID_ARCHIVE = "archive";

        var archive = $("#" + ID_ARCHIVE);
        archive.find("a:not(:only-child)").each(function () {
            var link = $(this),
					sub = link.parent().children("ol, ul");

            sub.hide();

            msie_href.push(link);

            link.click(function () {
                if (sub.is(":hidden")) {
                    sub.show();
                    link.addClass(CLASS_ACTIVE);
                } else {
                    sub.hide();
                    link.removeClass(CLASS_ACTIVE);
                }
                return (false);
            });
        });
    }

    /*
    Self-submitting form elements
    */
    function applySelfSubmittingEvents() {
        var CLASS_SUBMIT = "self-submit";
        $("." + CLASS_SUBMIT).each(function () {

            var el = $(this),
					form = el.parents("form:first"),
					submit = form.find("input.submit");

            submit.hide();

            el.change(function () {
                form.submit();
            })
        });
    }


    /*
    Star rating
    */
    function addStarRating() {
        $("." + CLASS_STARS + " a").hover(function () {
            $(this).prevAll("a").addClass(CLASS_HOVER);
        }, function () {
            $(this).prevAll("a").removeClass(CLASS_HOVER);
        });
    }

    /*
    Carousel plugin application
    */
    function addCarousel() {
        var ID_CAROUSEL = "recipe-carousel",
				ID_NEXT = "carousel-next",
				ID_PREVIOUS = "carousel-previous",
				CLASS_CONTROL = "carousel-controls",
				CLASS_ITEM = "jcarousel-item",
				CLASS_GROUPS = "group-buttons";

        var recipes = $("#" + ID_CAROUSEL);

        function applyCarouselControls(carousel) {
            var control = recipes.append(
				'<div class="' + CLASS_CONTROL + ' clearfix">'
				+ '<a href="" id="' + ID_PREVIOUS + '"><span>Previous</span></a>'
				+ '<span class="' + CLASS_GROUPS + '"></span>'
				+ '<a href="" id="' + ID_NEXT + '"><span>Next</span></a>'
				+ '</div>'
			).find("." + CLASS_CONTROL);

            var previous = recipes.find("#" + ID_PREVIOUS),
					next = recipes.find("#" + ID_NEXT),
					groups = recipes.find("." + CLASS_GROUPS);

            msie_href.push(previous, next);

            // Create group clicks 
            var num_groups = carousel.options.size;
            for (var i = 1; i <= num_groups; i++) {
                var group = carousel.clip.find("." + CLASS_ITEM + ":eq(" + i + ")");
                var button = groups.append('<a href="" title="' + group.find("h3").text() + '"><span class="hidden">' + i + '</span></a>').find("a:last");

                msie_href.push(button);

                button.click(function () {
                    carousel.scroll(jQuery.jcarousel.intval($(this).text()));
                    return (false);
                })
            }

            var inner_width = 0;
            control.children().each(function () {
                inner_width += $(this).outerWidth();
            });
            control.css("paddingLeft", (control.innerWidth() - inner_width) / 2);

            previous.click(function () {
                carousel.prev();
                return (false);
            });

            next.click(function () {
                carousel.next();
                return (false);
            });

        }

        // Init
        recipes.jcarousel({
            scroll: 1,
            initCallback: applyCarouselControls,
            buttonNextHTML: null,
            buttonPrevHTML: null
        });

    }

    /*
    Carousel plugin application
    */
    function setGalleryActiveItem() {

        $('.gallery li a').click(function () {
            var $this = $(this);
            var $html = $this.closest('li').find('.content').html();
            var $gallery = $('#GalleryActiveItem');
            $gallery.fadeOut('fast', function () { $gallery.html($html) }).fadeIn('slow');
            _gaq.push(['_trackPageview', location.pathname + '/#' + $this.data('type') + '-' + $this.data('id')])

            rebuildAds();

            return false;
        });

    }

    function rebuildAds() {

        var $ord = (typeof (ord) != 'undefined') ? ord : Math.random() * 10000000000000000;
        
        $('#leaderboard-replace').writeCapture().html('<scr' + 'ipt src="http://ad.uk.doubleclick.net/adj/delicious/blog;sz=468x60,728x90;dcopt=ist;tile=1;ord="' + $ord + '"?" type="text/javascript"> </scr' + 'ipt>');
        $('#mpu-replace').writeCapture().html('<scr' + 'ipt src="http://ad.uk.doubleclick.net/adj/delicious/blog;sz=300x250;tile=2;ord="' + $ord + '"?" type="text/javascript">  </scr' + 'ipt>');
        $('#skyscraper-replace').writeCapture().html('<scr' + 'ipt src="http://ad.uk.doubleclick.net/adj/delicious/blo;gsz=120x600,160x600;;tile=3;ord="' + $ord + '"?" type="text/javascript">  </scr' + 'ipt>');
    }

    /*
    Specific dynamic tab generation
    */
    function applyRightComponentsTab() {
        renderTabContent($("#components .tabbed"), $("#components #login"));
    }

    /*
    Tab content rendering
    */
    function renderTabContent(elements, target) {

        var CLASS_TAB = "tabbed",
				CLASS_TAB_OL = "tab-nav",
				CLASS_TAB_TITLE = "tab-title";

        var ol = target.before('<ol class="' + CLASS_TAB_OL + ' clearfix"></ol>').parent().find("." + CLASS_TAB_OL);

        function closeTabs() {
            ol.find("." + CLASS_ACTIVE).removeClass(CLASS_ACTIVE);
            elements.hide();
        }

        elements.each(function () {
            var content = $(this),
					title = content.find("." + CLASS_TAB_TITLE),
					active = content.hasClass(CLASS_ACTIVE) ? CLASS_ACTIVE : "";
            trigger = ol.append('<li class="' + active + '" id="tabbed-' + content.attr("id") + '"><a>' + title.text() + '</a></li>').find("a:last");

            title.remove();
            msie_href.push(trigger);
            trigger.click(function (e) {
                closeTabs();
                $(this).parent().addClass(CLASS_ACTIVE);
                content.show();
                return (false);
            });
        });

        // Check for override of default active state
        var overide = ol.find("." + CLASS_ACTIVE + " a");
        if (overide.length) {
            overide.click();
        } else {
            // Open the first element
            ol.find("a:first").click();
        }
    }

    /*
    Search form hide and show
    */
    function applySearchRefinementControls() {
        var ID_NORMAL = "search-normal",
			ID_REFINE = "search-refinements";

        var normal = $("#" + ID_NORMAL),
				refine = $("#" + ID_REFINE),
				trigger = normal.append('<a id="refine-search" href="#' + ID_REFINE + '">Refine Search</a>').children(":last"),
				recipes = normal.find("input[type='radio']:eq(1)");

        refine.hide();
        msie_href.push(trigger);

        trigger.click(function () {
            if (refine.is(":hidden")) {
                refine.slideDown();
                trigger.addClass(CLASS_ACTIVE);
            } else {
                refine.slideUp();
                trigger.removeClass(CLASS_ACTIVE);
            }
            return (false);
        });

        // Check if should be active by default
        if (refine.hasClass(CLASS_ACTIVE)) {
            trigger.click();
        }

        // Trigger if recipes is clicked
        normal.find("input[type='radio']").click(function () {
            if ((recipes.attr("checked") && refine.is(":hidden")) || !recipes.attr("checked") && !refine.is(":hidden")) {
                trigger.click();
            }
        });

    }

    /*
    Dialog method application
    */
    function applyDialogControls() {
        var triggers = $("a[rel=" + CONTROL_DIALOG + "]");

        triggers.each(function () {
            var trigger = $(this);

            // Check if parent is specifid in declaration
            var target = String(trigger.attr("rel")).match(/(?:[\[{1}])([\w\-]*)(?:[\]{1}])$/),
					parent = null;

            if (target && target.length) {
                parent = trigger.parents("#" + target[1]);
            } else {
                parent = trigger.parent();
            }

            var href = trigger.attr("href"),
					dialog = $(href),
					close = dialog.find("." + CLASS_CLOSE);

            // Set parent to relative position
            // to allow element relative absolute positioning
            parent.append(dialog);
            parent.css("position", "relative");
            dialog.addClass(CLASS_ACTIVE).hide();

            msie_href.push(trigger, close);

            close.click(function () {
                dialog.fadeOut("slow");
                return (false);
            });

            trigger.click(function () {
                if (dialog.is(":hidden")) {
                    dialog.fadeIn("slow");
                    // Force an anchor redirection
                    //window.location.href = href;
                } else {
                    dialog.fadeOut("slow");
                }
                return (false);
            });
        });

    }

    /*
    Style specific modifications
    */
    function formatSubscriptionNotice() {
        var text = $("#subscription-board span").html();
        $("#subscription-board span").html(text.replace(/ /gi, "&#160;&#32;"));
    }

    /*
    Fix the bloody stupid IE href window bug
    */
    function fixMsieHrefBug() {
        if ($.browser.msie && $.browser.version < 8) {
            for (var i = 0; i < msie_href.length; i++) {
                var el = msie_href[i];
                el.removeAttr("href");
            }
        }
    }

    function setVariable(key, value) {
        if (!state_variables[key]) {
            state_variables[key] = value;
        }
    }


    function getVariable(key) {
        var val = null;
        if (state_variables[key]) {
            val = state_variables[key];
        }
        return (val);
    }

    return {

        // Return public methods 	
        "initialize": function () {

            addCarousel();
            setGalleryActiveItem();
            applyDialogControls();
            emailAJAXControl();
            applyRightComponentsTab();
            applySearchRefinementControls();
            archiveFoldingControl();
            //formatSubscriptionNotice();			
            applySelfSubmittingEvents();
            addStarRating();
            starRatingAJAXControl();
            quickPrint();
            cookbookAJAXControl();

            fixMsieHrefBug();

            handleExternalLinks();

        },

        // Global classes
        "classes": {
            "active": CLASS_ACTIVE,
            "hover": CLASS_HOVER,
            "focus": CLASS_FOCUS,
            "hidden": CLASS_HIDDEN
        },

        // Variable methods
        "setVariable": setVariable,

        // Variable keys
        "RECIPE_ID": "recipeId",
        "ARTICLE_ID": "articleId",
        "USER_ID": "userId"
    }

} (jQuery);



function initOverLabels() {
    if (!document.getElementById) return;

    var labels, id, field;

    // Set focus and blur handlers to hide and show 
    // LABELs with 'overlabel' class names.
    labels = document.getElementsByTagName('label');

    //console.log(labels);

    for (var i = 0; i < labels.length; i++) {

        if (labels[i].className == 'overlabel') {

            // Skip labels that do not have a named association
            // with another field.
            id = labels[i].htmlFor || labels[i].getAttribute('for');
            if (!id || !(field = document.getElementById(id))) {
                continue;
            }

            // Change the applied class to hover the label 
            // over the form field.
            labels[i].className = 'overlabel-apply';

            // Hide any fields having an initial value.
            if (field.value !== '') {
                hideLabel(field.getAttribute('id'), true);
            }

            // Set handlers to show and hide labels.
            field.onfocus = function () {
                hideLabel(this.getAttribute('id'), true);
            };
            field.onblur = function () {
                if (this.value === '') {
                    hideLabel(this.getAttribute('id'), false);
                }
            };

            // Handle clicks to LABEL elements (for Safari).
            labels[i].onclick = function () {
                var id, field;
                id = this.getAttribute('for');
                if (id && (field = document.getElementById(id))) {
                    field.focus();
                }
            };

        }
    }
};

function hideLabel(field_id, hide) {
    var field_for;
    var labels = document.getElementsByTagName('label');

    //console.log(labels, field_id);

    for (var i = 0; i < labels.length; i++) {
        field_for = labels[i].htmlFor || labels[i].getAttribute('for');
        if (field_for == field_id) {
            labels[i].style.display = (hide) ? 'none' : 'block';
            return true;
        }
    }
}

$(document).ready(function () {
    initOverLabels();
});
