/*
 * 	Easy Slider 1.7 - jQuery plugin
 *	written by Alen Grakalic	
 *	http://cssglobe.com/post/4004/easy-slider-15-the-easiest-jquery-plugin-for-sliding
 *
 *	Copyright (c) 2009 Alen Grakalic (http://cssglobe.com)
 *	Dual licensed under the MIT (MIT-LICENSE.txt)
 *	and GPL (GPL-LICENSE.txt) licenses.
 *
 *	Built for jQuery library
 *	http://jquery.com
 *
 */
 
/*
 *	markup example for $("#slider").easySlider();
 *	
 * 	<div id="slider">
 *		<ul>
 *			<li><img src="images/01.jpg" alt="" /></li>
 *			<li><img src="images/02.jpg" alt="" /></li>
 *			<li><img src="images/03.jpg" alt="" /></li>
 *			<li><img src="images/04.jpg" alt="" /></li>
 *			<li><img src="images/05.jpg" alt="" /></li>
 *		</ul>
 *	</div>
 *
 */

(function ($) {

    $.fn.easySlider = function (options) {

        // default configuration properties
        var defaults = {
            prevId: 'prevBtn',
            prevText: 'Previous',
            nextId: 'nextBtn',
            nextText: 'Next',
            controlsShow: true,
            controlsFade: true,
            firstId: 'firstBtn',
            firstText: 'First',
            firstShow: false,
            lastId: 'lastBtn',
            lastText: 'Last',
            lastShow: false,
            vertical: false,
            speed: 800,
            auto: false,
            pause: 8000,
            continuous: false,
            numericShow: false,
            numericId: 'controls',
            slideInfos: [],  // Star Republic fix. /Andreas
            numSlidesToShow: 1,  // Star Republic fix. /Andreas
            outerDivId: '',
            ulSliderId: ''
        };

        var options = $.extend(defaults, options);

        this.each(function () {
            var obj = $(this);

            var ul = $('#' + options.ulSliderId).remove();
            $(obj).append(ul);

            $(ul).css("display", "block");

            var s = $("li", obj).length;
            var w = $("li", obj).width();
            var h = $("li", obj).height();
            var clickable = true;

            if (s < options.numSlidesToShow) {
                options.numSlidesToShow = s;
            }

            if (w == null || w == undefined) {
                // no slides.
                w = 0;
            }
            if (h == null || h == undefined) {
                // no slides.
                h = 0;
            }

            if (!options.vertical) {
                obj.width(w * options.numSlidesToShow);
            }
            else {
                obj.width(w);
            }

            var timeout;

            if (options.slideInfos.length > 0) {
                $("li", obj).each(function (i, el) {

                    if (options.slideInfos[i].navigationUrl != '') {
                        $(el).css("cursor", "pointer");
                        $(el).css("cursor", "hand");
                        $(el).click(function (e) {
                            clearTimeout(timeout);
                            if ($(e.target).is("a")) {
                                e.stopPropagation();
                            }
                            else {
                                if (options.slideInfos[i].useNewWindowForNavigation) {
                                    window.open(options.slideInfos[i].navigationUrl);
                                }
                                else {
                                    window.location = options.slideInfos[i].navigationUrl;
                                }
                            }
                        });
                    }
                });
            }

            //============================

            obj.css("overflow", "hidden");
            var ts = s - 1;
            var t = 0;
            $("ul", obj).css('width', s * w);
            var showingAllSlides = (ts <= options.numSlidesToShow - 1) ? true : false;

            if (options.continuous) {

                var prev = new Array(options.numSlidesToShow);
                var next = new Array(options.numSlidesToShow);

                for (var i = 0; i < options.numSlidesToShow; i++) {
                    prev[i] = $("ul li:eq(" + (ts - i) + ")", obj).clone().css("margin-left", "-" + (w * (i + 1)) + "px");
                    next[i] = $("ul li:eq(" + (i) + ")", obj).clone(); //.css("margin-left", (w * i) +"px");
                }
                for (var i = 0; i < options.numSlidesToShow; i++) {
                    $("ul", obj).prepend(prev[i]);
                }
                for (var i = 0; i < options.numSlidesToShow; i++) {
                    $("ul", obj).append(next[i]);
                }
                $("ul", obj).css('width', (s + options.numSlidesToShow) * w);

            };

            if (!options.vertical) $("li", obj).css('float', 'left');

            if (options.controlsShow) {
                if (options.firstShow) {
                    $('#' + options.firstId).append('<a href=\"javascript:void(0);\">' + options.firstText + '</a>');
                }
                $('#' + options.prevId).append('<a href=\"javascript:void(0);\">' + options.prevText + '</a>');
                $('#' + options.nextId).append('<a href=\"javascript:void(0);\">' + options.nextText + '</a>');
                if (options.lastShow) {
                    $('#' + options.lastId).append('<a href=\"javascript:void(0);\">' + options.lastText + '</a>');
                }

            };

            if (options.numericShow) {
                var ol = $('#' + options.numericId);
                var li = {};
                for (var i = 0; i < s; i++) {
                    if (!options.continuous) {

                        li = $(document.createElement("li"))
					            .attr('id', options.numericId + i)
					            .html('<a rel=' + i + ' href=\"javascript:void(0);\">&nbsp;&nbsp;</a>');

                        $(li).click(function (e) {
                            if (!showingAllSlides) {
                                animate($("a", $(this)).attr('rel'), true);
                            }
                        });
                        $(ol).append(li);
                    }
                    else {
                        if (!showingAllSlides) {
                            li = $(document.createElement("li"))
						            .attr('id', options.numericId + i)
						            .html('<a rel=' + i + ' href=\"javascript:void(0);\">&nbsp;&nbsp;</a>');
                            $(li).click(function (e) {
                                animate($("a", $(this)).attr('rel'), true);
                            });
                            $(ol).append(li);
                        }
                        else {
                            li = $(document.createElement("li"))
						            .attr('id', options.numericId + i)
						            .html('<a rel=' + i + ' href=\"javascript:void(0);\">&nbsp;&nbsp;</a>');
                            $(li).click(function (e) {
                                e.preventDefault();
                            });
                            $(ol).append(li);
                        }
                    }
                };
            }
            {
                $('#' + options.nextId).children().each(function () {
                    $(this).click(function (e) {
                        if (showingAllSlides) {
                            e.preventDefault();
                        }
                        else {
                            animate("next", true);
                        }
                    });
                });

                $('#' + options.prevId).children().each(function () {
                    $(this).click(function (e) {
                        if (showingAllSlides) {
                            e.preventDefault();
                        }
                        else {
                            animate("prev", true);
                        }
                    });
                });

                $("a", "#" + options.firstId).click(function (e) {
                    if (showingAllSlides) {
                        e.preventDefault();
                    }
                    else {
                        animate("first", true);
                    }
                });
                $("a", "#" + options.lastId).click(function (e) {
                    if (showingAllSlides) {
                        e.preventDefault();
                    }
                    else {
                        animate("last", true);
                    }
                });
            };

            function setCurrent(i) {
                // Star Republic fix. /Andreas
                i = parseInt(i);

                $('li', "#" + options.numericId).each(function () {
                    $(this).removeClass("current");
                });

                if (i < 0) {
                    i = options.numSlidesToShow;
                }
                for (var j = 0; j < options.numSlidesToShow; j++) {
                    if (i + j > ts && !options.continuous) {
                        // don't light up numerics if not continuous and we are showing blank slides.
                        break;
                    }
                    var k = (i + j) % (ts + 1);
                    $("#" + options.numericId + k, "#" + options.numericId).addClass("current");
                }
                //===============================
            };

            function adjust() {
                if (t > ts) t = 0;
                if (t < -options.numSlidesToShow) t = ts - options.numSlidesToShow;
                if (!options.vertical) {
                    $("ul", obj).css("margin-left", (t * w * -1));
                } else {
                    $("ul", obj).css("margin-left", (t * h * -1));
                }
                clickable = true;
                if (options.numericShow) setCurrent(t);
            };

            // Star Republic fix. /Andreas
            var stopAnimation = false;
            //============================

            function animate(dir, clicked) {
                // Star Republic fix. /Andreas
                if (clicked) {
                    stopAnimation = true;
                }
                //===========================

                if (clickable) {
                    var ot = t;
                    switch (dir) {
                        case "next":
                            if (options.continuous) {
                                // move numSlidesToShow and wrap around.
                                t = t + options.numSlidesToShow;
                                if (t > ts + 1) {
                                    var mask = ts + 1;
                                    t = t % mask;
                                }
                            }
                            else {
                                // move numSlidesToShow
                                t = t + options.numSlidesToShow;
                                
                                if (ts % options.numSlidesToShow != 0) {
                                    if (t >= ts - (ts % options.numSlidesToShow)) {
                                        // have empty slides on last page, so clamp to last page start slide.
                                        t = ts - (ts % options.numSlidesToShow);
                                    }
                                }
                                else {
                                    if (t >= ts) {
                                        // clamp to last slide.
                                        t = ts;
                                    }
                                }
                            }

                            break;
                        case "prev":
                            t = t - options.numSlidesToShow;
                            if (!options.continuous && t < 0) {
                                t = 0;
                            }
                            if (t < 0) {
                                t += ts + 1;
                            }

                            break;
                        case "first":
                            t = 0;
                            break;
                        case "last":
                            t = ts;
                            break;
                        default:
                            t = parseInt(dir);
                            
                            if (!options.continuous) {
                                if (t >= ts - (ts % options.numSlidesToShow)) {
                                    // have empty slides on last page, so clamp to last page start slide.
                                    t = ts - (ts % options.numSlidesToShow);
                                }
                            }
                            break;
                    };


                    var diff = Math.abs(ot - t);
                    var speed = clicked == true ? 0 : diff * options.speed;
                    if (!options.vertical) {
                        p = (t * w * -1);
                        $("ul", obj).animate(
							{ marginLeft: p },
							{ queue: false, duration: speed, complete: adjust }
						);
                    } else {
                        p = (t * h * -1);
                        $("ul", obj).animate(
							{ marginTop: p },
							{ queue: false, duration: speed, complete: adjust }
						);
                    };

                    if (!options.continuous && options.controlsFade) {
                        // FIXME:    change this to t == ts - 1 if in use?
                        if (t == ts - options.numSlidesToShow + 1) {
                            $("a", "#" + options.nextId).hide();
                            $("a", "#" + options.lastId).hide();
                        } else {
                            $("a", "#" + options.nextId).show();
                            $("a", "#" + options.lastId).show();
                        };
                        if (t == 0) {
                            $("a", "#" + options.prevId).hide();
                            $("a", "#" + options.firstId).hide();
                        } else {
                            $("a", "#" + options.prevId).show();
                            $("a", "#" + options.firstId).show();
                        };
                    }

                    if (!options.continuous) {
                        if (t == ts - (ts % options.numSlidesToShow)) {
                            $("#" + options.nextId).addClass('navigation-disabled');
                        }
                        else {
                            $("#" + options.nextId).removeClass('navigation-disabled');
                        }

                        if (t == 0) {
                            $("#" + options.prevId).addClass('navigation-disabled');
                        }
                        else {
                            $("#" + options.prevId).removeClass('navigation-disabled');
                        }
                    }

                    if (clicked) clearTimeout(timeout);
                    if (options.auto && dir == "next" && !clicked) {
                        {
                            var nextTime = diff * options.speed + options.pause;
                            if (options.slideInfos.length > 0) {
                                if (options.slideInfos[(t > ts) ? 0 : t].time > 0) {
                                    nextTime = diff * options.speed + options.slideInfos[(t > ts) ? 0 : t].time;
                                }
                            }
                            timeout = setTimeout(function () {
                                animate("next", false);
                            }, nextTime);
                        }
                        //============================
                    };

                };

            };
            // init

            if (!options.continuous) {
                $("#" + options.prevId).addClass('navigation-disabled');
                if (showingAllSlides) {
                    $("#" + options.nextId).addClass('navigation-disabled');
                }
            }
            else if (showingAllSlides) {
                $("#" + options.prevId).addClass('navigation-disabled');
                $("#" + options.nextId).addClass('navigation-disabled');
            }

            if (options.auto && !showingAllSlides) {
                ;
                // Star Republic fix. /Andreas
                $(this).mouseenter(function (e) {
                    clearTimeout(timeout);
                });
                $(this).mouseleave(function (e) {
                    if (stopAnimation == false) {
                        var nt = (t >= ts) ? (options.continuous ? t + 1 : ts) : t + 1;
                        var diff = Math.abs(t - nt);
                        var nextTime = diff * options.speed + options.pause;
                        if (options.slideInfos.length > 0) {
                            if (options.slideInfos[(nt > ts) ? 0 : nt].time > 0) {
                                nextTime = diff * options.speed + options.slideInfos[(nt > ts) ? 0 : nt].time;
                            }
                        }
                        timeout = setTimeout(function () {
                            animate("next", false);
                        }, nextTime);
                    }
                });

                var nextTime = options.pause;
                if (options.slideInfos.length > 0 && options.slideInfos[0].time > 0) {
                    nextTime = options.slideInfos[0].time;
                }
                timeout = setTimeout(function () {
                    animate("next", false);
                    //},options.pause);
                }, nextTime);
                //============================
            };

            if (options.numericShow) setCurrent(0);

            if (!options.continuous && options.controlsFade) {
                $("a", "#" + options.prevId).hide();
                $("a", "#" + options.firstId).hide();
            };

        });

    };

})(jQuery);





