/*
 * .tabSwitch
 * Version: 1.0
 * http://www.hieu.co.uk/blog/index.php/tabswitch/
 *
 * Copyright (c) 2009 Hieu Pham - http://www.hieu.co.uk
 * COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
 * http://www.opensource.org/licenses/cddl1.php
 *
 * Date: 14/04/2009
 */
(function($) {
    $.fn.tabSwitch = function(command, Arguements, EndFunction) {
        var defaults = {
            type: "slide", cols: 2, toggle: "fade", ease: 40, easeType: "linear", loopback: 1, width: 400, height: 400, index: 0, speed: 500, interval: 5000, step: 1, wrapperClass: "", viewportClass: ""
        };
        var Args = $.extend(defaults, Arguements);
        var Obj = this;
        var jFirstObj = Obj.eq(1);
        var DOMFirstObj = Obj.eq(1).get(0);
        if (!$.isFunction(EndFunction)) {
            var Callback = function() {
                $.data(DOMFirstObj, "index", Args.index)
            }
        }
        else {
            var Callback = function() {
                $.data(DOMFirstObj, "index", Args.index);
                EndFunction()
            }
        }
        StoreToCache = function() {
            $.data(DOMFirstObj, "type", Args.type);
            $.data(DOMFirstObj, "toggle", Args.toggle);
            $.data(DOMFirstObj, "cols", Args.cols);
            $.data(DOMFirstObj, "ease", Args.ease);
            $.data(DOMFirstObj, "easeType", Args.easeType);
            $.data(DOMFirstObj, "index", Args.index);
            $.data(DOMFirstObj, "loopback", Args.loopback);
            if (jFirstObj.attr("style")) {
                $.data(DOMFirstObj, "orgAttr", jFirstObj.attr("style"))
            }
            else {
                $.data(DOMFirstObj, "orgAttr", "")
            }
        };
        backFromCache = function() {
            Obj.attr("style", $.data(DOMFirstObj, "orgAttr"));
            var ViewPortObj = $("#ViewPort" + $.data(DOMFirstObj));
            ViewPortObj.replaceWith(Obj);
            stopAuto();
            $.removeData(DOMFirstObj)
        };
        var createTab = function() {
            StoreToCache();
            if (Args.width) {
                Obj.width(Args.width)
            }
            if (Args.height) {
                Obj.height(Args.height)
            }
            var WraperSelector = "WideDiv" + $.data(DOMFirstObj);
            Obj.wrapAll("<div id='" + WraperSelector + "'></div>");
            var WraperObj = $("#" + WraperSelector);
            WraperObj.addClass(Args.wraperClass);
            WraperObj.css({ position: "relative" });
            WraperObj.wrap("<div id='" + WraperSelector.replace("WideDiv", "ViewPort") + "'></div>");
            var ViewPortObj = $("#" + WraperSelector.replace("WideDiv", "ViewPort"));
            ViewPortObj.width(Args.width);
            ViewPortObj.height(Args.height);
            ViewPortObj.css({ display: "block", overflow: "hidden", position: "relative" });
            ViewPortObj.addClass(Args.viewportClass);
            switch (Args.type) {
                case "slide":
                    Obj.css({ "float": "left" });
                    WraperObj.width((Args.width + 2) * Obj.length);
                    break;
                case "scroll":
                    WraperObj.width(Args.width);
                    WraperObj.height((Args.height + 2) * Obj.length);
                    break;
                case "toggle":
                    WraperObj.width(Args.width);
                    WraperObj.height(Args.height);
                    Obj.css({ position: "absolute", left: "-999px" });
                    Obj.eq(Args.index).css({ left: "0px", top: "0px" });
                    Obj.eq(Args.index).css("opacity", 1);
                    break;
                case "table":
                    WraperObj.width(Args.width * Args.cols);
                    Obj.css("float", "left")
            }
            moveTo()
        };
        var moveTo = function() {
            var ease = 0;
            if (!Args.easeType) {
                Args.easeType = (DOMFirstObj, "easeType")
            }
            if (Args.index > Obj.length - 1) {
                if ($.data(DOMFirstObj, "loopback") != 0) {
                    Args.index = 0;
                    ease = -$.data(DOMFirstObj, "ease")
                }
                else { return }
            }
            if (Args.index < 0) {
                if ($.data(DOMFirstObj, "loopback") != 0) {
                    Args.index = Obj.length - 1;
                    ease = $.data(DOMFirstObj, "ease")
                }
                else { return }
            }
            var WraperSelector = "WideDiv" + $.data(DOMFirstObj);
            var WraperObj = $("#" + WraperSelector);

            $('.tabSelect').removeClass('active');
            var id = document.getElementById(Args.index).rel;
            $('#'+Args.index).addClass('active');

            switch ($.data(DOMFirstObj, "type")) {
                case "slide":
                    if (ease != 0) {
                        var easeLevel = (parseInt(WraperObj.css("left").replace("px", "")) + ease);
                        WraperObj.animate({ left: easeLevel + "px" }, Args.speed, function() {
                            WraperObj.animate({ left: -(Obj.outerWidth(true) * Args.index) + "px" }, Args.speed, Args.easeType, Callback())
                        })
                    }
                    else {
                        WraperObj.animate({ left: -(Obj.outerWidth(true) * Args.index) + "px" }, Args.speed, Args.easeType, Callback())
                    }
                    break;
                case "scroll":
                    if (ease != 0) {
                        var easeLevel = (parseInt(WraperObj.css("top").replace("px", "")) + ease);
                        WraperObj.animate({ top: easeLevel + "px" }, Args.speed, function() {
                            WraperObj.animate({ top: -(Obj.outerHeight(true) * Args.index) + "px" }, Args.speed, Args.easeType, Callback())
                        })
                    }
                    else {
                        WraperObj.animate({ top: -(Obj.outerHeight(true) * Args.index) + "px" }, Args.speed, Args.easeType, Callback())
                    }
                    break;
                case "toggle":
                    Obj.eq(Args.index).css({ left: "0px", top: "0px" });
                    switch ($.data(DOMFirstObj, "toggle")) {
                        case "fade":
                            Obj.eq(Args.index).css({ opacity: 0 });
                            Obj.eq(Args.index).animate({ opacity: 1 }, Args.speed);
                            if ($.data(DOMFirstObj, "index") != Args.index) {
                                Obj.eq($.data(DOMFirstObj, "index")).animate({ opacity: 0 }, Args.speed, function() { $(this).css("left", -999); Callback() })
                            }
                            break;
                        case "toggle":
                            if ($.data(DOMFirstObj, "index") != Args.index) {
                                Obj.eq(Args.index).css({ display: "none" });
                                Obj.eq($.data(DOMFirstObj, "index")).slideUp(Args.speed, function() { Obj.eq(Args.index).slideDown(Args.speed, function() { Callback() }); $(this).css("left", -999) })
                            }
                            break;
                        case "show":
                            if ($.data(DOMFirstObj, "index") != Args.index) {
                                Obj.eq(Args.index).css({ display: "none" });
                                Obj.eq($.data(DOMFirstObj, "index")).hide(Args.speed, function() {
                                    Obj.eq(Args.index).show(Args.speed, function() { Callback() });
                                    $(this).css("left", -999)
                                })
                            }
                            break;
                        case "noeffect":
                            if ($.data(DOMFirstObj, "index") != Args.index) {
                                Obj.eq($.data(DOMFirstObj, "index")).css("left", -999); Callback()
                            }
                            break
                    }
                    break;
                case "table":
                    var cols = $.data(DOMFirstObj, "cols");
                    var nextX = -(Args.index % cols) * Obj.width();
                    var nextY = -Math.floor(Args.index / cols) * Obj.height();
                    WraperObj.animate({ left: nextX }, Args.speed, Args.easeType, function() {
                        WraperObj.animate({ top: nextY }, Args.speed, Args.easeType, Callback())
                    });
                    break;
                default:
                    $("html,body").animate({ scrollTop: Obj.eq(Args.index).offset().top }, Args.speed);
                    break
            }
        };
        moveStep = function() {
            var currentIdx = $.data(DOMFirstObj, "index");
            Args.index = parseInt(currentIdx) + parseInt(Args.step);
            moveTo()
        };
        startAuto = function() {
            $.data(DOMFirstObj, "AutoSwitch", setInterval(moveStep, Args.interval))
        };
        stopAuto = function() {
            clearInterval($.data(DOMFirstObj, "AutoSwitch"));
            $.removeData(DOMFirstObj, "AutoSwitch")
        };
        toggleAuto = function() {
            if (isAuto()) {
                stopAuto()
            }
            else {
                startAuto()
            }
        };
        isAuto = function() {
            if ($.data(DOMFirstObj, "AutoSwitch")) {
                return true
            }
            else { return false }
        };
        if (!command) { command = "" }
        switch (command.toLowerCase()) {
            case "index":
                if ($.data(DOMFirstObj, "index")) {
                    return $.data(DOMFirstObj, "index")
                }
                else { return 0 }
                break;
            case "moveto":
                moveTo();
                break;
            case "movestep":
                moveStep();
                break;
            case "destroy":
                backFromCache();
                break;
            case "create":
                createTab();
                break;
            case "isauto":
                return isAuto();
                break;
            case "toggleauto":
                toggleAuto();
                break;
            case "startauto":
                startAuto();
                break;
            case "stopauto":
                stopAuto();
                break
        }
    }
})(jQuery);
