/**
 *  Slider Kit v1.5.1 - Sliding contents with jQuery
 *  http://www.kyrielles.net/sliderkit
 *  
 *  Copyright (c) 2010-2011 Alan Frog
 *  Licensed under the GNU General Public License
 *  See <license.txt> or <http://www.gnu.org/licenses/>
 *  
 *  Requires: jQuery v1.3+ <http://jquery.com/>
 *
 *  ---------------------------------
 *  This file is part of Slider Kit jQuery plugin.
 *  
 *  Slider Kit is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *  
 *  Slider Kit is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *  ---------------------------------
 */
 /**
 * This file has been modified with specific changes for the Ateeco Website Project.
 *  Modified by: Weidenhammer Systems, MJB695
 *  Description: 
 *      Changes to the way the "nav clip" styling is generated, to allow the style to be 
 *      created to match the Alcone artworkk.
 */

(function ($) {

    /**
    *	SliderKit object 
    *	An object representing a slider in action.
    */
    var SliderKit = function () {

        var self = this;

        this._init = function (element, options) {

            // Passed in options and default options are mixed
            this.options = $.extend({}, this._settings, options);

            // Save the element reference
            this.domObj = $(element); // The main container DOM element

            this.panels = $("." + this.options.cssprefix + "-panel", this.domObj);
            this.nav = $("." + this.options.cssprefix + "-nav", this.domObj);
            this.navClip = $("." + this.options.cssprefix + "-nav-clip", this.nav);
            this.allItems = this.panels.size();

            // Check if there is any reason to go further
            this.arePanels = this.allItems > 0 ? 1 : 0;
            this.isNavClip = this.navClip.size() > 0 ? 1 : 0;
            if (!this.arePanels && !this.isNavClip) {
                this._errorReport("01", this.options.debug, 1);
            }

            // The function stops if there is no height value (unless 'freeheight' setting is true)
            else if (this.domObj.css("height") == "auto" && !this.options.freeheight) {
                this._errorReport("02", this.options.debug, 1);
            }

            // By default, the widget should be hidden via CSS. Then shown only if javascript is available :
            this.domObj.css("display", "block");

            // Variables that will be needed all over the script			
            this.currId = 0;
            this.prevId = 0;
            this.newId = 0;
            this.currPanel = null;
            this.prevPanel = 0;
            this.firstTime = 1;
            this.scrollit = 0;
            this.isPlaying = null;
            this.changeOngoing = false;

            // Variables for CSS
            this.cssClassNames = {
                cssSelected: this.options.cssprefix + "-selected",
                cssActive: this.options.cssprefix + "-panel-active",
                cssOld: this.options.cssprefix + "-panel-old",
                cssBtnDisable: this.options.cssprefix + "-btn-disable",
                cssPanelsWrapper: this.options.cssprefix + "-panels-wrapper",
                cssBtnPause: this.options.cssprefix + "-pause-btn",
                cssPosValue: "+"
            };

            if (this.isNavClip) {
                this._buildNav();
            }

            this._buildControls();

            if (this.arePanels) {
                this.panelsBag = $("." + this.options.cssprefix + "-panels", this.domObj);
                // Panels wrapper : this is only for internal code usage
                // It allows a nice sliding effect in the panels container
                if (this.options.panelfx == "sliding") {
                    this._wrapPanels();
                }
            }

            /*---------------------------------
            *  Navigation settings
            *---------------------------------*/

            // In carousel mode (no panels), mousewheel and autoscroll should move lines instead of thumbnails
            this.lineScrollDo = !this.arePanels ? 1 : 0;

            // Mousewheel navigation
            if (this.options.mousewheel) {
                this.domObj.mousewheel(function (event, delta) {
                    //delta>0 ? self._change(null, "+=", null, self.lineScrollDo, 1) : self._change(null, "-=", null, self.lineScrollDo, 1);
                    delta > 0 ? self.stepBackward() : self.stepForward();
                    return false;
                });
            }

            // Keyboard navigation (beta)
            if (this.options.keyboard) {
                this.domObj.keyup(function (event) {
                    // slide left
                    if (event.keyCode == 37) {
                        self.stepBackward();
                    }
                    // slide right
                    else if (event.keyCode == 39) {
                        self.stepForward();
                    }
                });
            }

            // One-click navigation
            if (this.options.panelclick && this.arePanels) {
                this.panelsBag.click(function () {
                    self.stepForward();
                    return false;
                });
            }

            // Slide for the first time
            this.changeWithId(this.options.start >= this.allItems ? this.allItems - 1 : this.options.start, null);

            // Auto-scrolling starter
            if (this.options.auto) {
                this.autoScrollStart();

                // Stops autoScrolling when mouse is over the slider content
                if (!this.isPlayBtn) {
                    this.domObj.hover(
						function () {
						    if (self.isPlaying != null) {
						        self.autoScrollStop();
						    }
						},
						function () {
						    self.autoScrollStart();
						}
					);
                }
            }

            // return this so we can chain/use the bridge with less code.
            return this;

        };

        this._settings = {
            cssprefix: "sliderkit",
            start: 0,
            auto: true,
            autospeed: 4000,
            mousewheel: false,
            keyboard: false,
            panelclick: false,
            circular: false,
            shownavitems: 5,
            navitemshover: false,
            navclipcenter: false,
            navcontinuous: false,
            navscrollatend: false,
            navfx: "sliding",
            scroll: null,
            scrollspeed: 600,
            scrolleasing: null,
            panelfx: "fading",
            panelfxspeed: 700,
            panelfxeasing: null,
            panelfxfirst: "none",
            panelfxbefore: function () { },
            panelfxafter: function () { },
            panelbtnshover: false,
            verticalnav: false,
            verticalslide: false,
            tabs: false,
            freeheight: false,
            fastchange: true,
            debug: false
        };

        this._errorReport = function (errorCode, debug, stop) {
            if (debug) {
                alert("Slider Kit error! Code #" + errorCode + " (see doc)");
            }
            if (stop) {
                return false;
            }
        };

        this._buildNav = function () {

            this.navUL = $("ul", this.navClip);

            var navLI = $("li", this.navUL);
            var navLINum = navLI.size();

            // Check if nav size is equal to panels size (only if there are panels)
            if (this.arePanels && (navLINum != this.allItems) && this.nav.size() == 1) {
                this._errorReport("03", this.options.debug, 1);
            }

            // If Slider Kit is used as a tabs menu, the nav scroll becomes useless
            if (this.options.tabs) {
                this.options.shownavitems = this.allItems;
            }

            // Else we start initializing the carousel
            else {
                // LI margins function: returns the <li> tag margins value in pixels
                function getLImargin(attr) {
                    attrVal = navLI.css(attr);
                    if (attrVal != "auto" && attr != "" && attr != "0px") {
                        return parseInt(attrVal);
                    }
                    else return 0;
                }

                // Nav elements size
                var navSize = this.options.verticalnav ? this.nav.height() : this.nav.width();
                var navLIWidth = navLI.outerWidth(true); // padding + margin + border
                var navLIHeight = navLI.outerHeight(true);
                var navLIextHMarg = getLImargin("margin-left") + getLImargin("margin-right");
                var navLIextVMarg = getLImargin("margin-top") + getLImargin("margin-bottom");

                //WSC-MB Need to grab the padding and border for the navClip to include in the final size. 
                var navClipPadAndBorder = this._elementValueNumpart(this.navClip, 'padding-left') + this._elementValueNumpart(this.navClip, 'padding-right') + this._elementValueNumpart(this.navClip, 'border-right-width') + this._elementValueNumpart(this.navClip, 'border-left-width');
                //WSC-MB Also need to adjust clip height to account for the clip padding.
                var navClipHeight = navLIHeight + this._elementValueNumpart(this.navClip, 'padding-top') + this._elementValueNumpart(this.navClip, 'padding-bottom') + this._elementValueNumpart(this.navClip, 'border-top-width') + this._elementValueNumpart(this.navClip, 'border-bottom-width');

                this.navLIsize = this.options.verticalnav ? navLIHeight : navLIWidth;
                this.navULSize = this.navLIsize * navLINum;
                this.navClipSize = (this.options.shownavitems * this.navLIsize) - (this.options.verticalnav ? navLIextVMarg : navLIextHMarg); // Removes the item side margins to center the nav clip
                //WSC-MB add in the pad and border value
                this.navClipSize += navClipPadAndBorder;

                // CSS attributes for position/height values
                this.cssPosAttr = this.options.verticalnav ? "top" : "left";
                var cssSizeAttr = this.options.verticalnav ? "height" : "width";
                var cssSizeAttrr = this.options.verticalnav ? "width" : "height";

                // Setting height and width values(px) to Clip, UL & LI tags
                navLI.css({ width: navLI.width(), height: navLI.height() });
                this.navUL.css(cssSizeAttr, this.navULSize + "px");
                this.navClip.css({ width: (this.options.verticalnav ? navLIWidth : this.navClipSize) + "px", height: (this.options.verticalnav ? this.navClipSize : navClipHeight) + "px" });

                // Center the navclip in the nav container
                if (this.options.navclipcenter) {
                    this.navClip.css(this.cssPosAttr, (navSize - this.navClipSize) / 2).css("margin", "0");
                }

                // Check if linescroll is necessary
                this.allItems = navLINum;

                // The nav scrolling is required only if the number of items is greater than the 'visible' param.
                if (this.allItems > this.options.shownavitems) {
                    this.scrollit = true;

                    // Correcting a potentially 'this.options.scroll' wrong value
                    if (this.options.scroll == null || this.options.scroll < 0 || this.options.scroll > this.allItems) {
                        this.options.scroll = this.options.shownavitems;
                    }

                    // Nav Buttons
                    this.navBtns = $("." + this.options.cssprefix + "-nav-btn", this.nav);
                    if (this.navBtns.size() > 0) {
                        this._buildNavButtons();
                    }
                }
            }

            // Nav <li> links mouse event
            if (this.options.navitemshover && this.arePanels) {
                navLI.mouseover(function () {
                    self.changeWithId(getIndex(this, "li"), $(this));
                });
            }
            else if (this.arePanels || this.options.navscrollatend) {
                navLI.click(function () {
                    self.changeWithId(getIndex(this, "li"), $(this));
                    return false;
                });
            }

            // Get an item index
            function getIndex(item, tag) {
                return $(tag, $(item).parent()).index(item);
            }



        };

        //WSC-MB function for obtaining the numeric value of an appropriate css setting for an element.
        this._elementValueNumpart = function (element, valuename) {
            var val = element.css(valuename);
            if (typeof val != undefined) {
                val = parseInt(val);
            }
            return val;
        }

        this._buildNavButtons = function () {

            this.scrollBtns = true;
            this.navBtnPrev = $("." + this.options.cssprefix + "-nav-prev", this.nav);
            this.navBtnNext = $("." + this.options.cssprefix + "-nav-next", this.nav);

            // Nav Buttons click event
            this.navBtnPrev.click(function () {
                self.navPrev();
                return false;
            });
            this.navBtnNext.click(function () {
                self.navNext();
                return false;
            });

            // Nav Buttons mousedown/up events
            if (this.options.navcontinuous) {
                this.navBtnPrev.mouseover(function () {
                    self.navPrev(true);
                });
                this.navBtnNext.mouseover(function () {
                    self.navNext(true);
                });
                this.navBtns.mouseout(function () {
                    self.navStopContinuous();
                });
            }

            // Disable first button if not circular
            if (!this.options.circular) {
                this.navBtnPrev.toggleClass(this.cssClassNames.cssBtnDisable);
            }

        };

        this._getNavPos = function () {
            this.navPos = this.options.verticalnav ? this.navUL.position().top : this.navUL.position().left;
            this.LIbefore = Math.ceil(Math.abs(this.navPos) / this.navLIsize);
            this.LIafter = Math.floor((this.navULSize - Math.abs(this.navPos) - this.navClipSize) / this.navLIsize);
            if (this.LIafter < 0) {
                this.LIafter = 0;
            }
        };

        this._buildControls = function () {

            this.playBtn = $("." + this.options.cssprefix + "-play-btn", this.domObj);
            this.gBtns = $("." + this.options.cssprefix + "-go-btn", this.domObj);

            this.isPlayBtn = this.playBtn.size() > 0 ? 1 : 0;
            this.goBtns = this.gBtns.size() > 0 ? 1 : 0;

            // Play button
            if (this.isPlayBtn) {

                // If autoscroll is active, the play button is set to 'pause' mode
                if (this.options.auto) {
                    this.playBtn.addClass(this.cssClassNames.cssBtnPause);
                }

                // Button mouse event
                this.playBtn.click(function () {
                    if (self.playBtn.hasClass(self.cssClassNames.cssBtnPause)) {
                        self.playBtnPause();
                    }
                    else {
                        self.playBtnStart();
                    }
                    return false;
                });
            }

            // Go buttons (prev/next)
            if (this.goBtns) {
                this.goBtnPrev = $("." + this.options.cssprefix + "-go-prev", this.domObj);
                this.goBtnNext = $("." + this.options.cssprefix + "-go-next", this.domObj);

                // Show/hide buttons on panel mouseover
                if (this.options.panelbtnshover) {
                    this.gBtns.hide();
                    $("." + this.options.cssprefix + "-panels", this.domObj).hover(
						function () {
						    self.gBtns.fadeIn();
						},
						function () {
						    self.gBtns.fadeOut();
						}
					);
                }

                // Button click binding
                this.goBtnPrev.click(function () {
                    self.stepBackward($(this));
                    return false;
                });
                this.goBtnNext.click(function () {
                    self.stepForward($(this));
                    return false;
                });
            }
        };

        this._wrapPanels = function () {
            //WSC-MB this is creating an extra panel wrapper which may be causing the sliding problem. 
            if (!$(this.cssClassNames.cssPanelsWrapper).length) {
                this.panels.wrapAll('<div class="' + this.cssClassNames.cssPanelsWrapper + '"></div>');
            }
            this.panelsWrapper = $("." + this.cssClassNames.cssPanelsWrapper, this.panelsBag);
            this.panelsWrapper.css({ "position": "relative" });
        };

        this._change = function (eventSrc, scrollWay, goToId, lineScrolling, stopAuto) {

            // If there is a play button + auto-scrolling running
            if (stopAuto && this.isPlaying != null && this.isPlayBtn) {
                this.playBtnPause();
            }

            // Don't go further if the side is reached and carousel isn't circular
            // The slide is stopped if the button is disable
            if (eventSrc) {
                if (eventSrc.hasClass(this.cssClassNames.cssBtnDisable)) {
                    return false;
                }
            }

            // By default, user action is blocked when nav is being animated. This to prevent the function calculation to go mad when the user is switching the items too quickly.
            // This security applies on panels too. However it can be removed using the 'fastchange' option.
            var stopGoing = 0;
            var running = $(":animated", this.options.fastchange ? this.nav : this.domObj).size() > 0 ? 1 : 0;

            if (!running) {
                this.prevId = this.currId;

                // Increment the current id, only if linescrolling isn't required
                if (goToId == null && !lineScrolling) {
                    this.currId = scrollWay == "-=" ? this.currId + 1 : this.currId - 1;
                }
                // Else if an id is given, we take it
                else if (goToId != null) {
                    goToId = parseInt(goToId); // make sure it's a number
                    this.currId = goToId < 0 ? 0 : goToId > this.allItems - 1 ? this.allItems - 1 : goToId; // make sure it's in the nav range
                    var checkIdRange = eventSrc ? eventSrc.parent().parent().hasClass(this.options.cssprefix + "-nav-clip") ? false : true : true;
                }

                // If panel buttons exist, we activate them
                if (this.goBtns) {
                    this.gBtns.removeClass(this.cssClassNames.cssBtnDisable);
                }

                // If the carousel isn't circular the controls must be hidden when sides are reached
                if (!this.options.circular) {
                    // Top/left side is reached
                    if (this.currId == -1) {
                        this.currId = 0;
                        stopGoing = 1;
                    }
                    if (this.currId == 0 && this.goBtns) {
                        this.goBtnPrev.addClass(this.cssClassNames.cssBtnDisable);
                    }

                    // Bottom/right side is reached
                    if (this.currId == this.allItems) {
                        this.currId = this.allItems - 1;
                        stopGoing = 1;
                    }

                    if (this.currId == this.allItems - 1) {
                        if (this.options.auto) {
                            this.autoScrollStop();
                        }
                        if (this.goBtns) {
                            this.goBtnNext.addClass(this.cssClassNames.cssBtnDisable);
                        }
                    }
                }
                // Otherwise if there is no scroll required, this.currId must be reset when sides are reached
                else if (!this.scrollit) {
                    if (this.currId == this.allItems) {
                        this.currId = 0;
                    }
                    if (this.currId == -1) {
                        this.currId = this.allItems - 1;
                    }
                }

                // If the slide function isn't triggered from a nav LI event, we must check if the line must be scrolled or not
                //if( (goToId == null || this.firstTime) && this.scrollit && !stopGoing ){
                if (this.scrollit && !stopGoing) {
                    this._setNavScroll(lineScrolling, scrollWay, checkIdRange);
                }

                // Highlight selected menu
                if (this.isNavClip) {
                    this.selectThumbnail(this.currId);
                }

                // Switch to the next panel
                if (this.arePanels) {
                    this._animPanel(this.currId, scrollWay);
                }

                // First time cancel
                if (this.firstTime) {
                    this.firstTime = 0;
                }

            } // else > be patient, the line scroll is running !
        };

        this._setNavScroll = function (lineScrolling, scrollWay, checkIdRange) {

            // Get the current nav position
            this._getNavPos();
            var jumpToId = 0;

            // No linescrolling required yet : we are going to check the current item position to determine if linescrolling is needed or not.
            if (!lineScrolling) {
                // Linescrolling will happen only if navclip sides are reached
                // Number of items from the clip sides:
                var idFromClipStart = Math.abs(this.currId + 1 - this.LIbefore);
                var idToClipEnd = this.options.shownavitems - idFromClipStart + 1;
                var currIdOnEdge = this.currId == 0 || this.currId == this.allItems - 1 ? 1 : 0;

                // If 'navscrollatend' option is activated, the line will scroll when navclip edges are reached (except if currId is the first or last item of the nav)
                if ((this.options.navscrollatend && (idToClipEnd == 1 || idFromClipStart == 1)) && !this.firstTime && !currIdOnEdge) {
                    jumpToId = this.options.scroll - 1;
                    lineScrolling = 1;
                }

                // Else the line will scroll when currId is out of the navclip range by -1 or +1
                if (idToClipEnd == 0 || idFromClipStart == 0) {
                    lineScrolling = 1;
                }

                // A target id is specified (using 'changeWithId' method). No direction ('scrollWay = ""').
                // We check here the difference between target and previous Ids
                if (checkIdRange) {
                    var idDiff = Math.abs(this.prevId - this.currId);

                    // The nav will scroll if the target id is different from the previous Id
                    // The scroll value will then be equal to the 'jumpToId' var, overwriting the 'scroll' option value.
                    if (idDiff > 0) {
                        jumpToId = idDiff;
                        lineScrolling = 1;
                    }
                }

                // Dertermine scroll direction
                if (scrollWay == "") {
                    if (this.prevId == this.currId && !currIdOnEdge) {
                        scrollWay = this.scrollWay == "-=" ? "+=" : "-=";
                    }
                    else {
                        scrollWay = this.prevId < this.currId ? "-=" : "+=";
                    }
                }
                this.scrollWay = scrollWay;
            }

            // If line scrolling is required
            if (lineScrolling) {

                // How many lines will scroll ? By default the answer is 'this.options.scroll' or 'jumpToId'. But we check if there are enough lines left.
                var scrollPower = jumpToId > 0 ? jumpToId : this.options.scroll;
                var LIremain = scrollWay == "-=" ? this.LIafter : this.LIbefore;
                var scrollto = LIremain < scrollPower ? LIremain : scrollPower;
                var scrollSize = scrollto * this.navLIsize;

                // Once the nav has scrolled, the <li> tag matching the currId value may not be visible in the nav clip. So we calculate here a new currId regarding to the nav position.
                this.newId = scrollWay == "-=" ? this.LIbefore + scrollto : this.LIbefore - scrollto + this.options.shownavitems - 1;
                if ((scrollWay == "-=" && this.newId > this.currId) || (scrollWay == "+=" && this.newId < this.currId)) {
                    this.currId = this.newId;
                }

                // Circular option is active
                if (this.options.circular) {
                    if (this.LIbefore <= 0 && scrollWay == "+=") {
                        scrollWay = "-=";
                        this.currId = this.allItems - 1;
                        scrollSize = (this.LIafter / this.options.scroll) * (this.navLIsize * this.options.scroll);
                    }
                    else if (this.LIafter == 0 && scrollWay == "-=") {
                        scrollWay = "+=";
                        this.currId = 0;
                        scrollSize = Math.abs(this.navPos);
                    }
                }

                // Finally, the scroll animation
                this._animNav(scrollWay, scrollSize);
            }
        };

        this._animPanel = function (currId, scrollWay) {

            // Current panel index
            this.currPanel = this.panels.eq(currId);

            // Slide panel (only if not already active)
            if (!this.currPanel.hasClass(this.cssClassNames.cssActive)) {

                // First panel display (no effect)
                if (this.firstTime) {
                    this.panelTransition = this.options.panelfxfirst;
                    var FirstTime = 1;
                }

                // Else we check for the transition effect
                else {
                    // No effect
                    var freeheightfx = this.options.freeheight && this.options.panelfx == "fading" ? "tabsfading" : "none";
                    this.panelTransition = this.options.freeheight ? freeheightfx : this.options.panelfx;
                }

                // Call the before function is it exists
                if (self.options.panelfxbefore) self.options.panelfxbefore();

                // Call the transition function
                this._panelTransitions[this.panelTransition](scrollWay, FirstTime);
            }
        };

        this._animNav = function (scrollWay, scrollSize) {
            var navComplete = function () {
                // If the nav isn't circular, buttons are disabled when start or end is reached
                if (!self.options.circular && self.scrollBtns) {
                    self.navBtns.removeClass(self.cssClassNames.cssBtnDisable);

                    // Get the nav position
                    self._getNavPos();

                    if (self.LIbefore <= 0) {
                        self.navBtnPrev.addClass(self.cssClassNames.cssBtnDisable);
                    }
                    else if (self.LIafter <= 0) {
                        self.navBtnNext.addClass(self.cssClassNames.cssBtnDisable);
                    }
                }
                // Reload the animation if scrollcontinue option is true
                if (self.scrollcontinue) {
                    setTimeout(function () { self.scrollcontinue == "-=" ? self.navPrev() : self.navNext() }, 0);
                }
            };

            this.navTransition = this.options.navfx;
            this._navTransitions[this.navTransition](scrollWay, scrollSize, navComplete);
        };

        this._panelTransitions = {

            none: function (scrollWay, FirstTime) {
                self.panels.removeClass(self.cssClassNames.cssActive).hide();
                self.currPanel.addClass(self.cssClassNames.cssActive).show();
                if (self.options.panelfxafter) { self.options.panelfxafter(); }
            },

            sliding: function (scrollWay, FirstTime) {

                // Slide direction
                if (scrollWay == "") {
                    scrollWay = self.prevPanel < self.currId ? "-=" : "+=";
                }
                self.prevPanel = self.currId;

                // Position/Size values for CSS
                var cssPosValue = scrollWay == "-=" ? "+" : "-";
                var cssSlidePosAttr = self.options.verticalslide ? "top" : "left";
                var domObjSize = self.options.verticalnav ? self.domObj.height() : self.domObj.width();
                var slideScrollValue = cssSlidePosAttr == "top" ? { top: scrollWay + domObjSize} : { left: scrollWay + domObjSize };

                // Panels selection
                self.oldPanel = $("." + self.cssClassNames.cssOld, self.domObj);
                self.activePanel = $("." + self.cssClassNames.cssActive, self.domObj);

                // Panels CSS properties
                self.panels.css(cssSlidePosAttr, "0");
                self.oldPanel.removeClass(self.cssClassNames.cssOld).hide();
                self.activePanel.removeClass(self.cssClassNames.cssActive).addClass(self.cssClassNames.cssOld);
                self.currPanel.addClass(self.cssClassNames.cssActive).css(cssSlidePosAttr, cssPosValue + domObjSize + "px").show();

                // Wrapper animation
                //                self.panelsWrapper.stop(true, true).css(cssSlidePosAttr, "0").animate(
                //					slideScrollValue,
                //					self.options.panelfxspeed,
                //					self.options.panelfxeasing,
                //					function () {
                //					    if (self.options.panelfxafter) self.options.panelfxafter();
                //					}
                //				);
                self.panelsWrapper.stop(true, true);
                self.panelsWrapper.css(cssSlidePosAttr, "0")
                self.panelsWrapper.animate(
                					slideScrollValue,
                					self.options.panelfxspeed,
                					self.options.panelfxeasing,
                					function () {
                					    if (self.options.panelfxafter) self.options.panelfxafter();
                					}
                				);
            },

            fading: function (scrollWay, FirstTime) {
                if (FirstTime) {
                    self.panels.hide();
                }
                else self.currPanel.css("display", "none");

                $("." + self.cssClassNames.cssOld, self.domObj).removeClass(self.cssClassNames.cssOld);
                $("." + self.cssClassNames.cssActive, self.domObj).stop(true, true).removeClass(self.cssClassNames.cssActive).addClass(self.cssClassNames.cssOld);

                self.currPanel.addClass(self.cssClassNames.cssActive)
				.animate(
					{ "opacity": "show" },
					self.options.panelfxspeed,
					self.options.panelfxeasing,
					function () {
					    if (self.options.panelfxafter) { self.options.panelfxafter(); }
					}
				);
            },

            tabsfading: function (scrollWay, FirstTime) {
                self.panels.removeClass(self.cssClassNames.cssActive).hide();
                self.currPanel.fadeIn(self.options.panelfxspeed, function () {
                    if (self.options.panelfxafter) { self.options.panelfxafter(); }
                });
            }

        };

        this._navTransitions = {

            none: function (scrollWay, scrollSize, navComplete) {
                var newScrollSize = scrollWay == "-=" ? self.navPos - scrollSize : self.navPos + scrollSize;
                self.navUL.css(self.cssPosAttr, newScrollSize + "px");
                navComplete();
            },

            sliding: function (scrollWay, scrollSize, navComplete) {
                self.navUL.animate(
					self.cssPosAttr == "left" ? { left: scrollWay + scrollSize} : { top: scrollWay + scrollSize }
					, self.options.scrollspeed, self.options.scrolleasing
					, function () {
					    navComplete();
					}
				);
            }
        };

        this.playBtnPause = function () {
            this.playBtn.removeClass(this.cssClassNames.cssBtnPause);
            this.autoScrollStop();
        };

        this.playBtnStart = function () {
            this.playBtn.addClass(self.cssClassNames.cssBtnPause);
            this.autoScrollStart();
        };

        this.autoScrollStart = function () {
            var self = this;
            this.isPlaying = setInterval(function () {
                self._change(null, "-=", null, self.lineScrollDo, null);
            }, self.options.autospeed);
        };

        this.autoScrollStop = function () {
            clearTimeout(this.isPlaying);
            this.isPlaying = null;
        };

        this.changeWithId = function (id, eventSrc) {
            this._change(eventSrc, "", id, 0, 1);
        };

        this.stepBackward = function (eventSrc) {
            this._change(eventSrc, "+=", null, self.lineScrollDo, 1);
        };

        this.stepForward = function (eventSrc) {
            this._change(eventSrc, "-=", null, self.lineScrollDo, 1);
        };

        this.navPrev = function (c) {
            if (c) { self.scrollcontinue = "-="; }
            this._change(this.navBtnPrev, "+=", null, 1, 1);
        };

        this.navNext = function (c) {
            if (c) { self.scrollcontinue = "+="; }
            this._change(this.navBtnNext, "-=", null, 1, 1);
        };

        this.navStopContinuous = function () {
            self.scrollcontinue = "";
        };

        this.selectThumbnail = function (currId) {
            $("ul li." + this.cssClassNames.cssSelected, this.nav).removeClass(this.cssClassNames.cssSelected);
            $("ul li:eq(" + currId + ")", this.nav).addClass(this.cssClassNames.cssSelected);
        };

        this.addTransition = function (name, fn) {
            _transitions[name] = fn;
        };
    };

    $.fn.sliderkit = function (options) {
        // Don't act on absent elements -via Paul Irish's advice
        if (this.length) {
            return this.each(function () {
                // Create a new sliderkit object
                var mySliderkit = new SliderKit();

                // Run the initialization function of the sliderkit
                mySliderkit._init(this, options); // `this` refers to the element

                // Save the instance of the sliderkit object in the element's data store
                $.data(this, "sliderkit", mySliderkit);
            });
        }
    };

})(jQuery);
