﻿/*
* jQuery.BiggerLink v2.0.1
* http://www.ollicle.com/eg/jquery/biggerlink/
*
* Copyright (c) 2009 Oliver Boermans
* http://creativecommons.org/licenses/MIT/
*
* 2009-11-22 (22 Nov 2009)
*/
(function ($) {
    $.fn.biggerlink = function (options) {

        // Default settings
        var settings = {
            biggerclass: 'bl-bigger', 	// class added to the first contained link and others that trigger it
            hoverclass: 'bl-hover', 		// class added to parent element on hover/focus
            hoverclass2: 'bl-hover2', 	// class added to parent element on hover/focus of other links
            clickableclass: 'bl-hot', 	// class added to parent element with behaviour
            otherstriggermaster: true, // will all links in containing biggerlink element trigger the first link
            follow: 'auto'				// follow master link on click? : 'auto',true,false
        };
        if (options) {
            $.extend(settings, options);
        }
        $(this).filter(function () {
            return $('a', this).length > 0;

        }).addClass(settings.clickableclass).css('cursor', 'pointer').each(function (i) {

            // store element references
            var big = $(this).data('biggerlink', { hovered: false, focused: false, hovered2: false, focused2: false });
            var links = {
                all: $('a', this),
                big: $(this),
                master: $('a:first', this).data('biggerlink', { status: 'master' }).addClass(settings.biggerclass),
                other: $('a', this).not($('a:first', this)).data('biggerlink', { status: 'other' })
            };


            $('a', this).andSelf().each(function () {
                var newdata = $.extend($(this).data('biggerlink'), links);
                $(this).data('biggerlink', newdata);
            });



            // Add title of first link with title to parent if not already set
            var thistitle = big.attr('title');
            var newtitle = big.data('biggerlink').master.attr('title');
            if (newtitle && !thistitle) {
                big.attr('title', newtitle);
            }



            // events on biggerlink element

            big
			.mouseover(function (event) {
			    window.status = $(this).data('biggerlink').master.get(0).href;
			    $(this).addClass(settings.hoverclass);
			    $(this).data('biggerlink').hovered = true;
			})
			.mouseout(function (event) {
			    window.status = '';
			    if (!$(this).data('biggerlink').focused) {
			        $(this).removeClass(settings.hoverclass);
			    }
			    $(this).data('biggerlink').hovered = false;
			})
			.bind('click', function (event) {

			    // if clicked direct or non-link
			    if (!$(event.target).closest('a').length) {
			        $(this).data('biggerlink').master.trigger({ type: 'click', source: 'biggerlink' });
			        event.stopPropagation();
			    }
			});



            // focus/blur

            links.all
			.bind('focus', function () {
			    $(this).data('biggerlink').big.addClass(settings.hoverclass);
			    $(this).data('biggerlink').big.data('biggerlink').focused = true;
			}).bind('blur', function () {
			    if (!$(this).data('biggerlink').big.data('biggerlink').hovered) {
			        $(this).data('biggerlink').big.removeClass(settings.hoverclass);
			    }
			    $(this).data('biggerlink').big.data('biggerlink').focused = false;
			});



            // click/focus/blur event on master (first) link within biggerlink

            links.master
			.bind('click', function (event) {
			    if (event.source == 'biggerlink') {
			        if (settings.follow === true || settings.follow == 'auto' && event.result !== false) {
			            window.location = $(this).attr('href');
			        }
			        else {
			            event.stopPropagation();
			        }
			    }
			});


            // links other than the first (master) link also within biggerlink

            // other links are independent
            if (settings.otherstriggermaster) {
                links.other.addClass(settings.biggerclass)
				.bind('click', function (event) {
				    // trigger click events on master link instead
				    $(this).data('biggerlink').master.trigger({ type: 'click', source: 'biggerlink' });

				    // stop this link being followed
				    event.preventDefault();

				    // prevent events on parent elements being triggered
				    event.stopPropagation();
				});
            }

            // other links are slaves of master link 
            else {
                links.other
				.bind('focus', function () {
				    $(this).data('biggerlink').big.addClass(settings.hoverclass2);
				    $(this).data('biggerlink').big.data('biggerlink').focused2 = true;
				})
				.bind('blur', function () {
				    if (!$(this).data('biggerlink').big.data('biggerlink').hovered2) {
				        $(this).data('biggerlink').big.removeClass(settings.hoverclass2);
				    }
				    $(this).data('biggerlink').big.data('biggerlink').focused2 = false;

				})
				.bind('mouseover', function (event) {
				    $(this).data('biggerlink').big.addClass(settings.hoverclass2);
				    $(this).data('biggerlink').big.data('biggerlink').hovered2 = true;
				    event.stopPropagation();
				})
				.bind('mouseout', function (event) {
				    if (!$(this).data('biggerlink').big.data('biggerlink').focused2) {
				        $(this).data('biggerlink').big.removeClass(settings.hoverclass2);
				    }
				    $(this).data('biggerlink').big.data('biggerlink').hovered2 = false;
				    event.stopPropagation();
				});

                if (!links.other.attr('title')) {
                    links.other.attr('title', '');
                }
            }
        });
        return this;
    };
})(jQuery);


