(function ($) {
    $.fn.lavaLamp = function (o) {
        o = $.extend({
            fx: "linear",
            speed: 500,
            click: function () {}
        },
        o || {});
        return this.each(function () {
            var me = $(this),
            noop = function () {},
            $back = $('<li class="back"><div class="left"></div></li>').appendTo(me),
            $li = $("li", this),
            //curr = $("li.current", this)[0] || $($li[0]).addClass("current")[0];
			//	TODO: Work around as current class is not being added by joomla. Need to find and fix original problem
			curr = $("#active_menu", this)[0];
			
			if(curr && curr.parentNode.parentNode.nodeName == "UL") {
				curr = $(curr.parentNode);
			} else {
				curr = $($li[0]);
			}
			
			curr = curr.addClass("current")[0];

            $li.not(".back").hover(function () {
                move(this)
            },
            noop);
            $(this).hover(noop, function () {
                move(curr)
            });
            $li.click(function (e) {
                setCurr(this);
                return o.click.apply(this, [e, this])
            });
            setCurr(curr);
            function setCurr(el) {
                $back.css({
                    "left": el.offsetLeft + "px",
                    "width": el.offsetWidth + "px"
                });
                curr = el;
				$(el).addClass("current");
            };
            function move(el) {
                $back.each(function () {
                    $(this).dequeue()
                }).animate({
                    width: el.offsetWidth,
                    left: el.offsetLeft
                },
                o.speed, o.fx)
            }
        })
    }
})(jQuery);
jQuery.easing = {
    easein: function (x, t, b, c, d) {
        return c * (t /= d) * t + b
    },
    easeinout: function (x, t, b, c, d) {
        if (t < d / 2) return 2 * c * t * t / (d * d) + b;
        var ts = t - d / 2;
        return -2 * c * ts * ts / (d * d) + 2 * c * ts / d + c / 2 + b
    },
    easeout: function (x, t, b, c, d) {
        return -c * t * t / (d * d) + 2 * c * t / d + b
    },
    expoin: function (x, t, b, c, d) {
        var flip = 1;
        if (c < 0) {
            flip *= -1;
            c *= -1
        }
        return flip * (Math.exp(Math.log(c) / d * t)) + b
    },
    expoout: function (x, t, b, c, d) {
        var flip = 1;
        if (c < 0) {
            flip *= -1;
            c *= -1
        }
        return flip * (-Math.exp(-Math.log(c) / d * (t - d)) + c + 1) + b
    },
    expoinout: function (x, t, b, c, d) {
        var flip = 1;
        if (c < 0) {
            flip *= -1;
            c *= -1
        }
        if (t < d / 2) return flip * (Math.exp(Math.log(c / 2) / (d / 2) * t)) + b;
        return flip * (-Math.exp(-2 * Math.log(c / 2) / d * (t - d)) + c + 1) + b
    },
    bouncein: function (x, t, b, c, d) {
        return c - jQuery.easing['bounceout'](x, d - t, 0, c, d) + b
    },
    bounceout: function (x, t, b, c, d) {
        if ((t /= d) < (1 / 2.75)) {
            return c * (7.5625 * t * t) + b
        } else if (t < (2 / 2.75)) {
            return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b
        } else if (t < (2.5 / 2.75)) {
            return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b
        } else {
            return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b
        }
    },
    bounceinout: function (x, t, b, c, d) {
        if (t < d / 2) return jQuery.easing['bouncein'](x, t * 2, 0, c, d) * .5 + b;
        return jQuery.easing['bounceout'](x, t * 2 - d, 0, c, d) * .5 + c * .5 + b
    },
    elasin: function (x, t, b, c, d) {
        var s = 1.70158;
        var p = 0;
        var a = c;
        if (t == 0) return b;
        if ((t /= d) == 1) return b + c;
        if (!p) p = d * .3;
        if (a < Math.abs(c)) {
            a = c;
            var s = p / 4
        } else var s = p / (2 * Math.PI) * Math.asin(c / a);
        return - (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b
    },
    elasout: function (x, t, b, c, d) {
        var s = 1.70158;
        var p = 0;
        var a = c;
        if (t == 0) return b;
        if ((t /= d) == 1) return b + c;
        if (!p) p = d * .3;
        if (a < Math.abs(c)) {
            a = c;
            var s = p / 4
        } else var s = p / (2 * Math.PI) * Math.asin(c / a);
        return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b
    },
    elasinout: function (x, t, b, c, d) {
        var s = 1.70158;
        var p = 0;
        var a = c;
        if (t == 0) return b;
        if ((t /= d / 2) == 2) return b + c;
        if (!p) p = d * (.3 * 1.5);
        if (a < Math.abs(c)) {
            a = c;
            var s = p / 4
        } else var s = p / (2 * Math.PI) * Math.asin(c / a);
        if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
        return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b
    },
    backin: function (x, t, b, c, d) {
        var s = 1.70158;
        return c * (t /= d) * t * ((s + 1) * t - s) + b
    },
    backout: function (x, t, b, c, d) {
        var s = 1.70158;
        return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b
    },
    backinout: function (x, t, b, c, d) {
        var s = 1.70158;
        if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;
        return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b
    },
    linear: function (x, t, b, c, d) {
        return c * t / d + b
    }
};
$(document).ready(function () {
    $("#switcher-trigger").click(function () {
        if ($("div#links").is(":hidden")) $("div#links").slideDown("fast");
        else $("div#links").slideUp("fast");
    });
    $("div#links").hover(function () {},
    function () {
        $("div#links").slideUp("fast");
    });
    $("tr").hover(
    function () {
        $(this).addClass("hover");
    },
    function () {
        $(this).removeClass("hover");
    });

    $("#localize_head_trigger").click(function () {
        if ($("div#localize").is(":hidden")) $("div#localize").slideDown("fast");
        else $("div#localize").slideUp("fast");
    });
    $("div#localize").hover(function () {},
    function () {
        $("div#localize").slideUp("fast");
    });
    $("tr").hover(
    function () {
        $(this).addClass("hover");
    },
    function () {
        $(this).removeClass("hover");
    });

});

//If the browser is W3 DOM compliant, execute setImageSwaps function
if (document.getElementsByTagName && document.getElementById) {
    if (window.addEventListener) window.addEventListener('load', setImageSwaps, false);
    else if (window.attachEvent) window.attachEvent('onload', setImageSwaps);
}

//When document loads, apply the prepareImageSwap function to various images with our desired settings
function setImageSwaps() {
    //Mousedown, restore - for images in container with ID=example2
    prepareImageSwap('example2', true, true, true, true);
    //Hover, mousedown, no restore - for images in container with ID=example3
    prepareImageSwap('example3', true, false, true, false);
    //Hover with restore, most basic usage - for any image in document.body that are not yet processed (function accepts elements,too)
    prepareImageSwap(document.body);
    //Note that once an image is processed, it won't be processed again, so you should set more specific images first, e.g. document.body, as it is the grand
    //container, has to be processed last.
}

//The following is the function that do the actual job
function prepareImageSwap(elem, mouseOver, mouseOutRestore, mouseDown, mouseUpRestore, mouseOut, mouseUp) {
    //Do not delete these comments.
    //Non-Obtrusive Image Swap Script by Hesido.com
    //V1.1
    //Attribution required on all accounts
    if (typeof(elem) == 'string') elem = document.getElementById(elem);
    if (elem == null) return;
    var regg = /(.*)(_nm\.)([^\.]{3,4})$/
    var prel = new Array(),
    img,
    imgList,
    imgsrc,
    mtchd;
    imgList = elem.getElementsByTagName('img');

    for (var i = 0; img = imgList[i]; i++) {

        if (!img.rolloverSet && img.src.match(regg)) {
            mtchd = img.src.match(regg);
            img.hoverSRC = mtchd[1] + '_hv.' + mtchd[3];
            img.outSRC = img.src;
            if (typeof(mouseOver) != 'undefined') {
                img.hoverSRC = (mouseOver) ? mtchd[1] + '_hv.' + mtchd[3] : false;
                img.outSRC = (mouseOut) ? mtchd[1] + '_ou.' + mtchd[3] : (mouseOver && mouseOutRestore) ? img.src : false;
                img.mdownSRC = (mouseDown) ? mtchd[1] + '_md.' + mtchd[3] : false;
                img.mupSRC = (mouseUp) ? mtchd[1] + '_mu.' + mtchd[3] : (mouseOver && mouseDown && mouseUpRestore) ? img.hoverSRC : (mouseDown && mouseUpRestore) ? img.src : false;
            }
            if (img.hoverSRC) {
                preLoadImg(img.hoverSRC);
                img.onmouseover = imgHoverSwap;
            }
            if (img.outSRC) {
                preLoadImg(img.outSRC);
                img.onmouseout = imgOutSwap;
            }
            if (img.mdownSRC) {
                preLoadImg(img.mdownSRC);
                img.onmousedown = imgMouseDownSwap;
            }
            if (img.mupSRC) {
                preLoadImg(img.mupSRC);
                img.onmouseup = imgMouseUpSwap;
            }
            img.rolloverSet = true;
        }
    }

    function preLoadImg(imgSrc) {
        prel[prel.length] = new Image();
        prel[prel.length - 1].src = imgSrc;
    }

}

function imgHoverSwap() {
    this.src = this.hoverSRC;
}
function imgOutSwap() {
    this.src = this.outSRC;
}
function imgMouseDownSwap() {
    this.src = this.mdownSRC;
}
function imgMouseUpSwap() {
    this.src = this.mupSRC;
}