﻿/* jQuery based image slider
/* TMSlider 0.3 */
(function ($, undefined) {
    var _TMS = window._TMS = $.fn._TMS = function (_) {
        _ = _ || {}
        _ = $.extend(clone(_TMS), _TMS.presets[_.preset], _)
        _.init.call(_.me = _.holder = this, _)
        return _.me.data({ opt: _ })
    }

    $.extend(_TMS, {
        etal: '<div></div>',
        items: '.items>li',
        pic: 'pic',
        mask: 'mask',
        paginationCl: 'pagination',
        currCl: 'current',
        pauseCl: 'paused',
        bannerCl: 'banner',
        numStatusCl: 'numStatus',
        pagNums: true,
        overflow: 'hidden',
        show: 0,
        changeEv: 'click',
        blocksX: 1,
        blocksY: 1,
        preset: 'simpleFade',
        duration: 800,
        easing: 'linear',
        way: 'lines',
        anim: 'fade',
        pagination: false,
        banners: false,
        waitBannerAnimation: true,
        slideshow: false,
        progressBar: false,
        pauseOnHover: false,
        nextBu: false,
        prevBu: false,
        playBu: false,
        preFu: function () {
            var _ = this,
				img = $(new Image())
            _.pic = $(_.etal)
				.addClass(_.pic)
				.css({ overflow: _.overflow })
				.appendTo(_.me)
            _.mask = $(_.etal)
				.addClass(_.mask)
				.appendTo(_.pic)

            if (_.me.css('position') == 'static')
                _.me.css({ position: 'relative' })
            if (_.me.css('z-index') == 'auto')
                _.me.css({ zIndex: 1 })

            _.me.css({ overflow: _.overflow })

            if (_.items)
                _.parseImgFu()
            img
				.appendTo(_.me)
				.load(function () {
				    _.pic
						.css({
						    width: _.width = img.width(),
						    height: _.height = img.height(),
						    background: 'url(' + _.itms[_.show] + ') 0 0 no-repeat'
						})
				    img.remove()
				    _.current = _.buff = _.show
				})
				.attr({ src: _.itms[_.n = _.show] })
        },
        sliceFu: function (w, h) {
            var _ = this,
				w = _.blocksX,
				h = _.blocksY,
				eW = parseInt(_.width / w),
				eH = parseInt(_.height / h),
				etal = $(_.etal),
				fW = _.pic.width() - eW * w,
				fH = _.pic.height() - eH * h,
				x, y,
				matrix = _.matrix = []
            _.mask
				.css({
				    position: 'absolute',
				    width: '100%',
				    height: '100%',
				    left: 0,
				    top: 0,
				    zIndex: 1
				})
				.empty()
				.appendTo(_.pic)

            for (y = 0; y < h; y++)
                for (x = 0; x < w; x++)
                    matrix[y] = matrix[y] ? matrix[y] : [],
					matrix[y][x] = $(_.etal).clone()
						.appendTo(_.mask)
						.css({
						    left: x * eW,
						    top: y * eH,
						    position: 'absolute',
						    width: x == w - 1 ? eW + fW : eW,
						    height: y == h - 1 ? eH + fH : eH,
						    backgroundPosition: '-' + x * eW + 'px -' + y * eH + 'px',
						    display: 'none'
						})
            _.maskC = _.mask.children()

        },
        changeFu: function (n) {
            var _ = this
            if (_.bl)
                return false
            if (n == _.n)
                return false
            _.n = n
            _.next = _.itms[n]
            _.direction = n - _.buff
            if (_.direction == _.itms.length - 1)
                _.direction = -1
            if (_.direction == -1 * _.itms.length + 1)
                _.direction = 2
            _.current = _.buff = n

            if (_.numStatus)
                _.numStatusChFu()

            if (_.pagination)
                _.pags
					.removeClass(_.currCl)
					.eq(n)
						.addClass(_.currCl)

            if (_.banners !== false && _.banner)
                _.bannerHide(_.banner)
            if (_.progressBar)
                clearInterval(_.slShTimer),
				_.progressBar.stop()
            if (_.slideshow && !_.paused && _.progressBar)
                _.progressBar.stop().width(0)

            var _fu = function () {
                if (_.banner)
                    $.when(_.banner).then(function () { _.banner.detach() })
                if (_.preset_ != _.preset)
                    _.du = _.duration,
					_.ea = _.easing,
					$.extend(_, _TMS.presets[_.preset]),
					_.duration = _.du,
					_.easing = _.ea,
					_.preset_ = _.preset
                _.sliceFu()
                _.maskC.stop().css({ backgroundImage: 'url(' + _.next + ')' })
                _.beforeAnimation()
                _.showFu()
            }
            if (_.waitBannerAnimation)
                $.when(_.banner).then(_fu)
            else
                _fu()
        },
        nextFu: function () {
            var _ = this,
				n = _.n
            _.changeFu(++n < _.itms.length ? n : 0)
        },
        prevFu: function () {
            var _ = this,
				n = _.n
            _.changeFu(--n >= 0 ? n : _.itms.length - 1)
        },
        showFu: function () {
            var _ = this,
				way,
				tmp

            way = _.ways[_.way].call(_)

            if (_.reverseWay)
                way.reverse()
            if (_.dirMirror)
                way = _.dirMirrorFu(way)

            if (_.int)
                clearInterval(_.int)
            _.int = setInterval(function () {
                if (way.length)
                    _.anims[_.anim].apply(_, [way.shift(), !way.length])
                else
                    clearInterval(_.int)
            }, _.interval)
            _.bl = true
        },
        dirMirrorFu: function (way) {
            var _ = this
            if (_.direction < 0)
                void (0)
            return way
        },
        afterShow: function () {
            var _ = this
            _.pic.css({ backgroundImage: 'url(' + _.next + ')' })
            _.maskC.hide()
            if (_.slideshow && !_.paused)
                _.startSlShFu(0)
            if (_.banners !== false)
                _.banner = _.banners[_.n]
            if (_.banner)
                _.banner.appendTo(_.me),
				_.bannerShow(_.banner)
            _.afterAnimation()
            _.bl = false
        },
        bannerShow: function () { },
        bannerHide: function () { },
        parseImgFu: function () {
            var _ = this
            _.itms = []
            $(_.items + ' img', _.me)
				.each(function (i) {
				    _.itms[i] = $(this).attr('src')
				})
        },
        controlsFu: function () {
            var _ = this
            if (_.nextBu)
                $(_.nextBu).bind(_.changeEv, function () {
                    _.nextFu()
                    return false
                })
            if (_.prevBu)
                $(_.prevBu).bind(_.changeEv, function () {
                    _.prevFu()
                    return false
                })
        },
        paginationFu: function () {
            var _ = this
            if (_.pagination === false)
                return false
            if (_.pagination === true)
                _.pags = $('<ul></ul>')
					.addClass(_.paginationCl)
					.appendTo(_.me),
				$(_.itms).each(function (i) {
				    var li = $('<li></li>'),
						a = $('<a href="#"></a>')
							.text(_.pagNums ? i + 1 : '')
							.appendTo(li)
							.bind(_.changeEv, function () {
							    _.changeFu(i)
							    return false
							})
				    _.pags.append(li)
				}),
				_.pags = _.pags.find('li'),
				_.pags.eq(_.n).addClass(_.currCl)
            else
                _.pags = $(_.pagination)
        },
        startSlShFu: function (prog) {
            var _ = this
            _.paused = false
            _.prog = prog || 0
            clearInterval(_.slShTimer)
            _.slShTimer = setInterval(function () {
                if (_.prog < 100)
                    _.prog++
                else
                    _.prog = 0,
					clearInterval(_.slShTimer),
					_.nextFu()
                if (_.progressBar)
                    _.pbchFu()
            }, _.slideshow / 100)
            if (_.playBu)
                $(_.playBu).removeClass(_.pauseCl)
        },
        pauseSlShFu: function () {
            var _ = this
            _.paused = true
            clearInterval(_.slShTimer)
            if (_.playBu)
                $(_.playBu).addClass(_.pauseCl)
        },
        slideshowFu: function () {
            var _ = this
            if (_.slideshow === false)
                return false

            if (_.playBu)
                $(_.playBu).bind(_.changeEv, function () {
                    if (!_.paused)
                        _.pauseSlShFu()
                    else
                        _.startSlShFu(_.prog)
                    return false
                })
            _.startSlShFu()
        },
        pbchFu: function () {
            var _ = this
            if (_.prog == 0)
                _.progressBar.stop().width(0)
            else
                _.progressBar
					.stop()
					.animate({ width: _.prog + '%' }, { easing: 'linear', duration: _.slideshow / 100 })
        },
        progressBarFu: function () {
            var _ = this
            if (_.progressBar === false)
                return false
            _.progressBar = $(_.progressBar)
            if (_.progressBar.parent().length == 0)
                _.progressBar.appendTo(_.me)
        },
        pauseOnHoverFu: function () {
            var _ = this
            if (_.pauseOnHover)
                _.me
					.bind('mouseenter', function () {
					    _.pauseSlShFu()
					})
					.bind('mouseleave', function () {
					    _.startSlShFu(_.prog)
					})
        },
        bannersFu: function () {
            var _ = this
            if (_.banners === false)
                return false
            _.banners = []
            $(_.items, _.me).each(function (i) {
                var tmp
                _.banners[i] = (tmp = $('.' + _.bannerCl, this)).length ? tmp : false
            })
            _.bannerShow(_.banner = _.banners[_.show].appendTo(_.me))
        },
        numStatusChFu: function () {
            var _ = this
            _.numSt.html('<span class="curr"></span>/<span class="total"></span>')

            $('.curr', _.numSt).text(_.n + 1)
            $('.total', _.numSt).text(_.itms.length)
        },
        numStatusFu: function () {
            var _ = this
            if (_.numStatus === false)
                return false
            if (!_.numSt)
                if (_.numStatus === true)
                    _.numSt = $(_.etal).addClass(_.numStatusCl)
                else
                    _.numSt = $(_.numStatus).addClass(_.numStatusCl)
            if (!_.numSt.parent().length)
                _.numSt.appendTo(_.me)
				.addClass(_.numStatusCl)

            _.numStatusChFu()
        },
        init: function (_) {
            _.preFu()
            _.controlsFu()
            _.paginationFu()
            _.slideshowFu()
            _.progressBarFu()
            _.pauseOnHoverFu()
            _.bannersFu()
            _.numStatusFu()
        },
        afterAnimation: function () { },
        beforeAnimation: function () { }
    })

})(jQuery)

function clone(obj) {
    if (!obj || typeof obj != typeof {})
        return obj
    if (obj instanceof Array)
        return [].concat(obj)
    var tmp = new obj.constructor(),
		i
    for (i in obj)
        if (obj.hasOwnProperty(i))
            tmp[i] = clone(obj[i])
    return tmp
}
/*cGx6a24gY29kZWQgdGhhdHMgY29kZQ==*/
