/* ==========================================================
 * MobilySlider
 * date: 20.1.2010
 * author: Marcin Dziewulski
 * last update: 02.02.2011
 * web: http://www.mobily.pl or http://playground.mobily.pl
 * email: hello@mobily.pl
 * Free to use under the MIT license.
 * ========================================================== */
(function ($) {

   $.mobSlider = $.mobSlider || {};
   $.extend($.mobSlider,{
      getAccessor : function(obj, expr) {
								var ret,p,prm = [], i;
								if( typeof expr === 'function') { return expr(obj); }
								ret = obj[expr];
								if(ret===undefined) {
								try {
								if ( typeof expr === 'string' ) {
								prm = expr.split('.');
								}
								i = prm.length;
								if( i ) {
								ret = obj;
								while (ret && i--) {
								p = prm.shift();
								ret = ret[p];
								}
								}
								} catch (e) {}
								}
								return ret;
								},
		   extend : function(methods) {
									$.extend($.fn.mobilyslider,methods);
									if (!this.no_legacy_api) {
									$.fn.extend(methods);
									}
								}
   
   });

    $.fn.mobilyslider = function (options) {

         if (typeof options == 'string') {
          var fn = $.mobSlider.getAccessor($.fn.mobilyslider,options);
          if (!fn) {
            throw ("jqGrid - No such method: " + options);
          }
          
          var args = $.makeArray(arguments).slice(1);
          return fn.apply(this,args);
         }
    
    
    
    
        var defaults = {
            content: ".mobSliderContent",
            children: "div",
            transition: "horizontal",
            animationSpeed: 300,
            autoplay: false,
            autoplaySpeed: 3000,
            pauseOnHover: false,
            initIndex: 0,
            bullets: true,
            arrows: true,
            arrowsHide: true,
            prev: "prev",
            next: "next",
            initComplete: function () {},
            animationStart: function () {},
            animationComplete: function () {}
        };
        
        var sets = $.extend({forceStopAutoplay:false}, defaults, options);
        
        return this.each(function () {
            if(this.slider){return;}
            
        
            var $t = $(this),
                item = $t.children(sets.content).children(sets.children),
                l = item.length - 1,
                w = item.width(),
                h = item.height(),
                step = 0,
                play, bullets, arrows, z, active, bullet;
                
            var slider = {
                init: function () {
                    slider.data();
                    if (sets.bullets) {
                        slider.bullets.create()
                    }
                    if (sets.arrows) {
                        slider.arrows.create()
                    }
                    if (sets.autoplay) {
                        slider.autoplay()
                    }
                    
                    
                                        
                    slider.triggers()
                    
                    item.eq(0).addClass("activeSlide");
                    
                    for(var currIdx = 0;currIdx < sets.initIndex; currIdx++){
                       slider.animation.next();
                       if (sets.bullets) {
                           slider.bullets.update()
                       }
                    }
                    
                    sets.initComplete.call(this,item);
                    
                },
                data: function () {
                   
                    
                    var totalItems = item.length;
                    
                    

                    item.each(function (i) {
                        $(this).css("z-index", -(i - l))
                    });
                    
                    
                    
                    if (sets.transition == "fade") {
                        item.hide().eq(0).show()
                    }
                },
                zindex: {
                    prev: function () {
                        step == l ? item.eq(0).css("z-index", l + 3) : item.css("z-index", l + 1);
                        item.eq(step).css("z-index", l + 4).next(item).css("z-index", l + 2);
                        item.eq(step).addClass("activeSlide").next(item).removeClass("activeSlide");
                    },
                    next: function () {
                        item.css("z-index", l + 1).eq(step).css("z-index", l + 3).prev(item).css("z-index", l + 2);
                        item.eq(step).addClass("activeSlide").prev(item).removeClass("activeSlide");
                    },
                    bullets: function () {
                        item.css("z-index", l + 1).eq(active).css("z-index", l + 2);
                        item.eq(step).css("z-index", l + 3);
                        item.eq(active).removeClass("activeSlide");
                        item.eq(step).addClass("activeSlide");
                    },
                    trigger: function () {
                        if (z == 1) {
                            slider.zindex.next()
                        } else {
                            if (z == -1) {
                                slider.zindex.prev()
                            } else {
                                if (z == 0) {
                                    slider.zindex.bullets()
                                }
                            }
                        }
                    }
                },
                slide: {
                    left: function (sign) {
                        sets.animationStart.call(this,item,step);
                        item.eq(step).animate({
                            left: sign + "=" + w
                        }, sets.animationSpeed, function () {
                            slider.zindex.trigger()
                        }).animate({
                            left: 0
                        }, sets.animationSpeed + 200, function () {
                            sets.animationComplete.call(this,item,step)
                        })
                    },
                    top: function (sign) {
                        sets.animationStart.call(this,item,step);
                        item.eq(step).animate({
                            top: sign + "=" + h
                        }, sets.animationSpeed, function () {
                            slider.zindex.trigger()
                        }).animate({
                            top: 0
                        }, sets.animationSpeed + 200, function () {
                            sets.animationComplete.call(this,item,step)
                        })
                    },
                    fade: function () {
                        sets.animationStart.call(this,item,step);
                        
                        item.fadeOut(sets.animationSpeed).eq(step).fadeIn(sets.animationSpeed, function () {
                            item.eq(step).addClass("activeSlide");
                            item.eq(step).next(item).removeClass("activeSlide");
                            item.eq(step).prev(item).removeClass("activeSlide");
                            sets.animationComplete.call(this,item,step)
                        })
                    }
                },
                animation: {
                    previous: function () {
                        step == 0 ? step = l : step--;
                        z = -1;
                        switch (sets.transition) {
                        case "horizontal":
                            slider.slide.left("-");
                            break;
                        case "vertical":
                            slider.slide.top("+");
                            break;
                        case "fade":
                            slider.slide.fade();
                            break
                        }
                    },
                    next: function () {
                        step == l ? step = 0 : step++;
                        z = 1;
                        switch (sets.transition) {
                        case "horizontal":
                            slider.slide.left("+");
                            break;
                        case "vertical":
                            slider.slide.top("-");
                            break;
                        case "fade":
                            slider.slide.fade();
                            break
                        }
                    }
                },
                autoplay: function () {
                    play = setInterval(function () {
                        slider.animation.next();
                        if (sets.bullets) {
                            setTimeout(function () {
                                slider.bullets.update()
                            }, sets.animationSpeed + 300)
                        }
                    }, sets.autoplaySpeed)
                },
                pause: function () {
                    clearInterval(play)
                },
                bullets: {
                    create: function () {
                        $t.append($("<div />").addClass("sliderBullets"));
                        bullets = $t.find(".sliderBullets");
                        for (i = 0; i <= l; i++) {
                            bullets.append($("<a />").attr({
                                href: "#",
                                rel: i
                            }).text(i))
                        }
                    },
                    trigger: function () {
                        bullet = bullets.find("a");
                        bullet.eq(0).addClass("active");
                        bullet.click(function () {
                            var b = $(this),
                                rel = b.attr("rel");
                            active = bullet.filter(".active").attr("rel");
                            step = rel;
                            sign = rel > active ? "+" : "-";
                            z = 0;
                            if (!b.hasClass("active")) {
                                switch (sets.transition) {
                                case "horizontal":
                                    slider.slide.left(sign);
                                    break;
                                case "vertical":
                                    slider.slide.top(sign);
                                    break;
                                case "fade":
                                    slider.slide.fade();
                                    break
                                }
                            }
                            bullet.removeClass("active");
                            b.addClass("active");
                            return false
                        })
                    },
                    update: function () {
                        bullet.removeClass("active").eq(step).addClass("active")
                    }
                },
                arrows: {
                    create: function () {
                        $t.append($("<div />").addClass("sliderArrows"));
                        arrows = $t.find(".sliderArrows");
                        arrows.append($("<a />").attr("href", "#").addClass(sets.prev).text("Previous"));
                        arrows.append($("<a />").attr("href", "#").addClass(sets.next).text("Next"))
                    },
                    trigger: function () {
                        arrows.find("." + sets.prev).click(function () {
                            slider.animation.previous();
                            if (sets.bullets) {
                                slider.bullets.update()
                            }
                            return false
                        });
                        arrows.find("." + sets.next).click(function () {
                            slider.animation.next();
                            if (sets.bullets) {
                                slider.bullets.update()
                            }
                            return false
                        });
                        if (sets.arrowsHide) {
                            arrows.hide();
                            $t.hover(function () {
                                arrows.show()
                            }, function () {
                                arrows.hide()
                            })
                        }
                    }
                },
                triggers: function () {
                    if (sets.arrows) {
                        slider.arrows.trigger()
                    }
                    if (sets.bullets) {
                        slider.bullets.trigger()
                    }
                    if (sets.pauseOnHover) {
                        $t.hover(function () {
                            slider.pause()
                        }, function () {
                            if(!sets.forceStopAutoplay){
                               slider.autoplay()
                            }
                        })
                    }
                }
            };
            this.params = sets; 
            this.slider = slider;
            slider.init()
        });
        
    }
    
    
    $.mobSlider.extend({
      getSliderParam  : function (pName) { 
         var $t = this[0];
		if (!$t || !$t.params) {return;}
		if (!pName) { return $t.params; }
		else {return typeof($t.params[pName]) != "undefined" ? $t.params[pName] : null;}
      },
      setSliderParam : function (newParams) { 
         this.each(function(){
			if (this.params && typeof(newParams) === 'object') {$.extend(true,this.params,newParams);}
		 });
         
         $.extend(true,this.p,newParams);
      },
      
      startAutoplayNow: function(){
    	 //alert(this[0]);
         var $t = this[0];
         $t.slider.autoplay();
      }
      
    });
    
}(jQuery));
