/*
 * scrollingCarousel 2.0 - jQuery plugin
 * Written by Adam Lafene
 *
 * Copyright (c) 2011 Adam Lafene - www.convergent-evolution.co.uk
 *
 * Licensed under the terms of the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 *	This plugin utilises Corey Dutson's jQuery Plugin template
 *	Check it out here:
 *		http://wallofscribbles.com/2011/my-jquery-plugin-is-open-season
 */
(function (a) {
    a.fn.scrollingCarousel = function (d, e) {
        if (this.length > 1) {
            var c = new Array();
            this.each(function (h) {
                c.push(a(this).scrollingCarousel(d, h))
            });
            return c
        }
        var f = a.extend({}, a().scrollingCarousel.defaults, d);
        var b;
        var g;
        this.Destroy = function (h) {
            var i = this;
            var h = (h != undefined) ? h : false;
            a(i).removeData("scrollingCarousel");
            i.children(":eq(1)").remove();
            if (a(this).find("> div").length > 0) {
                i[0].innerHTML = a(this).find("> div")[0].innerHTML;
                i.children().each(function () {
                    a(this, i)[0].style.cssText = ""
                })
            } else {
                i.find("li").each(function () {
                    a(this, i)[0].style.cssText = ""
                })
            }
            i.children()[0].style.cssText = "";
            i[0].style.cssText = "";
            i.unbind()
        };
        this.Update = function (h) {
            f = null;
            f = a.extend({}, a().scrollingCarousel.defaults, h);
            this.Destroy(true);
            return this.Create()
        };
        this.Create = function (h, j) {
            if (!a(this).html()) {
                return false
            }
            var r = this;
            var l = r.html();
            if (a(r).data("scrollingCarousel") == true && j != "pause") {
                return this
            }
            if (f.beforeCreateFunction != null && a.isFunction(f.beforeCreateFunction)) {
                f.beforeCreateFunction(r, f)
            }
            var p;
            var i = 0;
            var n;
            var m;
            var s;
            var o;
            var q;
            var x;
            var t = new Object();
            var w = r[0];
            w.style.paddingLeft = "0";
            w.style.paddingRight = "0";
            var C = w.offsetWidth;
            var u = r.children()[0].nodeName.toLowerCase();
            switch (u) {
            case "div":
                if (!j) {
                    w.innerHTML = "<div>" + r[0].innerHTML + "</div>";
                    w.innerHTML += w.innerHTML
                }
                p = r.find("> div");
                s = r.find("> div:first > div");
                break;
            case "ul":
                if (!j) {
                    w.innerHTML += w.innerHTML
                }
                p = r.find("ul");
                s = r.find("ul:first > li");
                break;
            case "ol":
                if (!j) {
                    w.innerHTML += w.innerHTML
                }
                p = r.find("ol");
                s = r.find("ol:first > li");
                break;
            default:
                console.log("unable to initialise scroller - please ensure contents are either in a UL, an OL or in DIVs");
                return
            }
            switch (f.scrollSpeed.toLowerCase()) {
            case "slow":
                m = 1;
                break;
            case "fast":
                m = 4;
                break;
            case "medium":
            default:
                m = 2
            }
            var k = 0;
            var A = 0;
            var B = 0;
            var z;
            var v;
            switch (f.scrollerAlignment.toLowerCase()) {
            case "vertical":
                a(s).each(function (D) {
                    k += a(this, r)[0].offsetHeight + parseInt(a(this, r).css("marginTop")) + parseInt(a(this, r).css("marginBottom"));
                    if (a(this, r)[0].offsetWidth > B) {
                        B = a(this, r)[0].offsetWidth
                    }
                });
                break;
            case "horizontal":
            default:
                a(s).each(function (D) {
                    k += a(this, r)[0].offsetWidth + parseInt(a(this, r).css("marginLeft")) + parseInt(a(this, r).css("marginRight"));
                    if (a(this, r)[0].offsetHeight > A) {
                        A = a(this, r)[0].offsetHeight
                    }
                });
                break
            }
            if (!j) {
                if (f.scrollerAlignment.toLowerCase() != "vertical") {
                    w.style.height = A + "px"
                } else {
                    w.style.width = B + "px";
                    w.style.height = (a(w).height() > 0) ? a(w).height() + "px" : a(w).parent().height() + "px";
                    C = w.offsetHeight
                }
                if (k > C) {
                    var y = Math.round((k / 100) * f.scrollerOffset);
                    o = y - (Math.round(C / 2));
                    if (o > (k - C)) {
                        o = k - C
                    }
                } else {
                    return false
                }
                w.style.overflow = "hidden";
                w.style.position = "relative";
                var z;
                p.each(function () {
                    a(this, r)[0].style.position = "absolute";
                    if (f.scrollerAlignment.toLowerCase() != "vertical") {
                        a(this, r)[0].style.top = "0";
                        a(this, r)[0].style.width = k + "px"
                    } else {
                        a(this, r)[0].style.left = "0";
                        a(this, r)[0].style.height = k + "px";
                        a(this, r)[0].style.width = B + "px"
                    }
                    a(this).children().each(function (D) {
                        if (f.scrollerAlignment.toLowerCase() != "vertical") {
                            // alteo
							//a(this, r)[0].style.cssFloat = "left"
                        }
                        // alteo
						//a(this, r)[0].style.position = "static"
                    })
                });
                if (f.scrollerAlignment.toLowerCase() != "vertical") {
                    p[0].style.left = (o > 0) ? "-" + o + "px" : "0";
                    if (f.looped == true) {
                        p[1].style.left = p[0].offsetLeft - k + "px"
                    } else {
                        p[1].style.display = "none";
                        p[1].style.top = "-1000px"
                    }
                } else {
                    p[0].style.top = (o > 0) ? "-" + o + "px" : "0";
                    if (f.looped == true) {
                        p[1].style.top = p[0].offsetTop - k + "px"
                    } else {
                        p[1].style.display = "none";
                        p[1].style.left = "-1000px"
                    }
                }
                r.mouseenter(function () {
                    t.startCarousel()
                });
                r.mouseleave(function () {
                    t.stopCarousel(true);
                    if (f.autoScroll == true) {
                        t.autoScroll()
                    }
                });
                r.mousemove(function (E) {
                    var F = {
                        x: 0,
                        y: 0
                    };
                    if (E.pageX || E.pageY) {
                        F.x = E.pageX;
                        F.y = E.pageY
                    } else {
                        var G = document.documentElement;
                        var D = document.body;
                        F.x = E.clientX + ((G.scrollLeft || D.scrollLeft) - (G.clientLeft || 0));
                        F.y = E.clientY + ((G.scrollTop || D.scrollTop) - (G.clientTop || 0))
                    }
                    cursorPosition = F
                })
            }
            t.autoScroll = function () {
                var D = 40;
                if (f.looped == false) {
                    return
                }
                if (g) {
                    clearInterval(g);
                    g = 0
                }
                n = n ? n : ((f.scrollerAlignment.toLowerCase() != "vertical") ? parseInt(p[0].style.left) : parseInt(p[0].style.top));
                f.autoScrollSpeed = (f.autoScrollSpeed < 1000) ? 1000 : f.autoScrollSpeed;
                if ((f.autoScrollSpeed / D) < C) {
                    q = Math.round(C / (f.autoScrollSpeed / D))
                } else {
                    q = 1;
                    D = Math.round(f.autoScrollSpeed / C)
                }
                g = setInterval(function () {
                    switch (f.autoScrollDirection.toLowerCase()) {
                    case "right":
                    case "down":
                        if ((n + q) > k) {
                            n = 0;
                            i = (i == 0) ? 1 : 0
                        } else {
                            n = n + q
                        }
                        break;
                    case "left":
                    case "up":
                    default:
                        if ((n - q) < (0 - (k - C))) {
                            n = C;
                            i = (i == 0) ? 1 : 0
                        } else {
                            n = n - q
                        }
                    }
                    if (f.scrollerAlignment.toLowerCase() != "vertical") {
                        p[i].style.left = n + "px";
                        p[(i == 0) ? 1 : 0].style.left = n - k + "px"
                    } else {
                        p[i].style.top = n + "px";
                        p[(i == 0) ? 1 : 0].style.top = n - k + "px"
                    }
                }, D)
            };
            t.startCarousel = function () {
                if (g) {
                    clearInterval(g);
                    g = 0
                }
                x = (f.scrollerAlignment.toLowerCase() != "vertical") ? Math.round(a(w).offset().left + (w.offsetWidth / 2)) : Math.round(a(w).offset().top + (w.offsetHeight / 2));
                n = n ? n : ((f.scrollerAlignment.toLowerCase() != "vertical") ? parseInt(p[0].style.left) : parseInt(p[0].style.top));
                b = setInterval(function () {
                    var F;
                    var E = (f.scrollerAlignment.toLowerCase() != "vertical") ? cursorPosition.x : cursorPosition.y;
                    var D = C / 2;
                    F = (E < x) ? x - E : E - x;
                    q = (F < (Math.ceil((D / 100) * 30))) ? 1 : ((F < (Math.ceil((D / 100) * 50))) ? 2 * m : ((F < (Math.ceil((D / 100) * 70))) ? 3 * m : ((F < (Math.ceil((D / 100) * 90))) ? 4 * m : 6 * m)));
                    if (E < x) {
                        if ((n + q) > 0 && f.looped == false) {
                            n = 0
                        } else {
                            if ((n + q) > k) {
                                n = 0;
                                i = (i == 0) ? 1 : 0
                            } else {
                                n = n + q
                            }
                        }
                    } else {
                        if (E > x) {
                            if ((n - q) < (0 - (k - C))) {
                                if (f.looped == false) {
                                    n = (0 - (k - C))
                                } else {
                                    n = C;
                                    i = (i == 0) ? 1 : 0
                                }
                            } else {
                                n = n - q
                            }
                        }
                    }
                    if (f.scrollerAlignment.toLowerCase() != "vertical") {
                        p[i].style.left = n + "px";
                        p[(i == 0) ? 1 : 0].style.left = n - k + "px"
                    } else {
                        p[i].style.top = n + "px";
                        p[(i == 0) ? 1 : 0].style.top = n - k + "px"
                    }
                }, 40)
            };
            t.stopCarousel = function (H) {
                if (!b) {
                    return
                }
                clearInterval(b);
                b = 0;
                if (!H || f.looped == false || f.autoScroll == true) {
                    return
                }
                if (q > 1) {
                    var E;
                    var G = 0;
                    for (E = q; E > 1; E--) {
                        G += E
                    }
                    var F = (f.scrollerAlignment.toLowerCase() != "vertical") ? cursorPosition.x : cursorPosition.y;
                    if (F < x) {
                        if ((n + G) > k) {
                            n = n - k;
                            i = (i == 0) ? 1 : 0
                        }
                    } else {
                        if ((n - G) < (0 - (k - C))) {
                            n = n + k;
                            i = (i == 0) ? 1 : 0
                        }
                    }
                    var D = setInterval(function () {
                        if (q > 1) {
                            if (F < x) {
                                n += q
                            } else {
                                n -= q
                            }
                            if (f.scrollerAlignment.toLowerCase() != "vertical") {
                                p[i].style.left = n + "px";
                                p[(i == 0) ? 1 : 0].style.left = n - k + "px"
                            } else {
                                p[i].style.top = n + "px";
                                p[(i == 0) ? 1 : 0].style.top = n - k + "px"
                            }
                            q--
                        } else {
                            clearInterval(D)
                        }
                    }, 50)
                }
            };
            if (j != "pause") {
                if (f.autoScroll == true) {
                    t.autoScroll()
                }
            }
            switch (j) {
            case "pause":
                t.stopCarousel();
                r.unbind("mouseenter");
                r.unbind("mouseleave");
                a(r).data("scrollingCarousel", false);
                return;
                break;
            case "play":
                a("html").mousemove(function (E) {
                    var F = {
                        x: 0,
                        y: 0
                    };
                    if (E.pageX || E.pageY) {
                        F.x = E.pageX;
                        F.y = E.pageY
                    } else {
                        var G = document.documentElement;
                        var D = document.body;
                        F.x = E.clientX + (G.scrollLeft || D.scrollLeft) - (G.clientLeft || 0);
                        F.y = E.clientY + (G.scrollTop || D.scrollTop) - (G.clientTop || 0)
                    }
                    cursorPosition = F;
                    if (cursorPosition.x >= r.offset().left && cursorPosition.x <= (r.offset().left + r[0].offsetWidth) && cursorPosition.y >= r.offset().top && cursorPosition.y <= (r.offset().top + r[0].offsetHeight)) {
                        t.startCarousel()
                    }
                    r.mouseenter(function () {
                        t.startCarousel()
                    });
                    r.mouseleave(function () {
                        t.stopCarousel(true);
                        if (f.autoScroll == true) {
                            t.autoScroll()
                        }
                    });
                    a(this).unbind("mousemove")
                });
                break
            }
            a(r).data("scrollingCarousel", true);
            if (f.afterCreateFunction != null && a.isFunction(f.afterCreateFunction)) {
                f.afterCreateFunction(r, f)
            }
            return this
        };
        this.Pause = function () {
            this.Create(e, "pause")
        };
        this.Play = function () {
            this.Create(e, "play")
        };
        return this.Create(e)
    };
    jQuery.fn.scrollingCarousel.defaults = {
        autoScroll: false,
        autoScrollDirection: "left",
        autoScrollSpeed: 10000,
        looped: true,
        scrollerAlignment: "horizontal",
        scrollerOffset: 0,
        scrollSpeed: "medium",
        beforeCreateFunction: null,
        afterCreateFunction: null
    }
})(jQuery);
