',{'class': 'jvsl3-pnBtnPrev'}).append(btnPrev),
            index = -1,isAnimate = false
        ;
        //method
        selector.append(pnBtnPrev,pnBtnNext);
        
        items.css('perspective','600px');
        var
            effect = function (item, ops) {
                item.show();
                ops.mode == 'show' && item.css('visibility', 'hidden');
                var
                    dfPos = item.position(),
                    dfSize = {width: item.width(),height: item.height()},
                    box = item.clone().css({ 'position': 'absolute','visibility': 'hidden' }).css(dfPos).css(dfSize),
                    opAni = {
                        duration: ops.duration,
                        complete: function () {
                            if (ops.mode == 'show') item.css('visibility', 'visible');
                            else item.hide();
                            item.triggerHandler('complete');
                            box.remove();
                        },
                        'easing': 'easeOutBack'
                    },
                    atHide = $.extend({}, dfPos), atShow = $.extend({}, dfPos)
                ;
                
                
                if (ops.fade) {
                    atShow['opacity'] = 1;
                    atHide['opacity'] = 0;
                }
                if (ops.transfer) {
                    ops.transfer = $.extend({
                        top: 0.5,
                        left: 0.5
                    },ops.transfer);
                    if(Math.abs(ops.transfer.top) > 5){
                        atHide.top += ops.transfer.top;
                    }else{
                        var tToTop = ops.transfer.top.length ? $.random(ops.transfer.top[0] * 100, ops.transfer.top[1] * 100) / 100 : ops.transfer.top;
                        atHide.top += dfSize.height * tToTop - dfSize.height/2;
                    }
                    
                    if(Math.abs(ops.transfer.left) > 5){
                        atHide.left += ops.transfer.left;
                    }else{
                        var tToLeft = ops.transfer.left.length ? $.random(ops.transfer.left[0] * 100, ops.transfer.left[1] * 100) / 100 : ops.transfer.left;
                        atHide.left += dfSize.width * tToLeft - dfSize.width / 2;
                    }
                }
                
                ops.transformOrigin && box.css('transformOrigin',ops.transformOrigin);
                
                $.each({'rotateX':0,'rotateY':0,'rotateZ':0,'scale':1,'translateX':0,'translateY':0},function(index,val){
                    if(ops[index]){
                        atShow[index] = val;
                        atHide[index] = ops[index];
                    }
                });
                
                var
                    start = function () {
                        item.triggerHandler('start');
                        ops.mode == 'show' ? (function () {
                            box.show().css(atHide).animate(atShow, opAni);
                        })() : (function () {
                            box.css(atShow).animate(atHide, opAni);
                            item.css('visibility', 'hidden');
                        })();
                        box.css('visibility', 'visible');
                    },
                    imgs = box.is('img') ? box : box.find('img'),
                    countImg = 0;
                ;
                item.parent().prepend(box);
                imgs.length?imgs.each(function () {
                    this.onload = function () {
                        countImg++;
                        if (countImg >= imgs.length) {
                            start();
                        }
                    }
                }):start();
            },
            start = function (i, mode) {
                //return;
                var
                    curent = items.eq(i).show(),
                    img = curent.children('img'),
                    desc = curent.children('.jvsl3-details'),
                    descs = desc.children().show(),
                    count = 0,
                    handle = function(){
                        count ++;
                        if(count > descs.length){
                            curent.triggerHandler('complete',[i,mode]);
                            isAnimate = false;
                        }
                    }
                ;
                mode == 'show' && descs.css('visibility', 'hidden');
                isAnimate = true;
                descs.one('complete',handle);
                img.one('complete',handle).one('start',function(){
                    setTimeout(function () {
                        var
                            index = 0,
                            itv = setInterval(function () {
                                effect(descs.eq(index), $.extend(slide.effects.random(),{duration: 1000,mode: mode}));
                                index++;
                                if (index >= descs.length) clearInterval(itv);
                            }, 200)
                        ;
                    },200);
                });
                effect(img, $.extend(slide.effects.random(),{duration: 1000,mode: mode}));
            }
        ;
        options.auto && (function(){
            var isPause = false;
            selector.hover(function(){
                isPause = true;
            },function(){
                isPause = false;
            });
            
            var handle = function(){
                setTimeout(function(){
                    isPause || This.next();
                    handle();
                }, options.delay);
            }
            handle();
        })();
        options.drag && (function () {
            var bginPos, curent;
            items.draggable({
                distance: 10,
                start: function (e, ui) {
                    curent = $(this);
                    if(curent.is(':animated')){
                        curent.stop();
                        return;
                    } 
                    
                    bginPos = ui.position;
                },
                drag: function (e, ui) {
                    var axis = curent.draggable("option", "axis");
                    if( axis === 'x' || axis === 'y') return;
                    if (Math.abs(ui.position.top - bginPos.top) > Math.abs(ui.position.left - bginPos.left)) curent.draggable("option", "axis", "y").css('left', bginPos.left);
                    else curent.draggable("option", "axis", "x").css('top', bginPos.top);
                },
                stop: function (e, ui) {
                    if (curent.draggable("option", "axis") === 'y') {
                        var
                            len = ui.position.top - bginPos.top,
                            height = selector.height()
                        ;
                        if (Math.abs(len) > height / 3) {
                            if (len > 0) {
                                curent.animate({ top: height }, 300, function () {
                                    curent.hide().css(bginPos);
                                    This.next();
                                });
                            } else {
                                curent.animate({ top: -height }, 300, function () {
                                    curent.hide().css(bginPos);
                                    This.prev();
                                });
                            }
                            lastVisible = -1;
                        } else curent.animate(bginPos, 300);
                    } else {
                        var
                            len = ui.position.left - bginPos.left,
                            width = selector.width()
                        ;
                        if (Math.abs(len) > width / 3) {
                            if (len > 0) {
                                curent.animate({ left: width }, 300, function () {
                                    curent.hide().css(bginPos);
                                    This.next();
                                });
                            } else {
                                curent.animate({ left: -width }, 300, function () {
                                    curent.hide().css(bginPos);
                                    This.prev();
                                });
                            }
                            lastVisible = -1;
                        } else curent.animate(bginPos, 300);
                    }
                    curent.draggable("option", "axis", "xy");
                }
            });
        })();
        options.thumb != 'none' && (function () {
            var thumbs = $('
', { 'class': 'jvsl3-thumbs' }).appendTo(selector);
            items.each(function (index) {
                var 
                    thumb = $('
', { 'class': 'jvsl3-thumb', 'href': 'javascript:void(0)' }).appendTo(thumbs).click(function () {
                        This.to(index);
                    }),
                    number = options.thumb == 'number' ? $('', { 'class': 'jvsl3-thumb-num' }).append(index):undefined,
                    icon =  options.thumb == 'icon' ? $('', { 'class': 'jvsl3-thumb-icon' }).append(''):undefined,
                    img = options.thumb == 'image' ? $(this).find('img:first').clone() : undefined
                ;
                thumb.append(number, icon, img);
            });
            items.bind('complete', function (e, i, mode) {
                if (!mode || mode === 'hide') return;
                thumbs.children().removeClass('active').eq(i).addClass('active');
            });
        })();
        
        $.extend(this, {
            next: function () {
                return This.to(index + 1);
            },
            prev: function () {
                
                return This.to(index - 1);
            },
            to: function (to) {
                to = to % items.length;
                to = to < 0 ? items.length + to : to;
                if (to === lastVisible) return;
                if(lastVisible > -1){
                    items.eq(lastVisible).one('complete', function () {
                        items.eq(lastVisible).hide();
                        start(to,'show');
                        lastVisible = to;
                    });
                    start(lastVisible,'hide');
                }else{
                    start(to,'show');
                    lastVisible = to;
                } 
                index = to;
            },
            auto: function (auto) { }
        });
        This.to(options.startindex);
    }
    slide.effects = {
        random: function(){
            var arr = [];
            $.each(slide.effects,function(index){
                arr.push(index);
            });
            //var effectName = 'flipX';
            var effectName = arr[$.random(1,arr.length - 1)];
            return slide.effects[effectName]();
        },
        
        fade: function(){ return {fade: true}; },
        
        dropUp: function(){ return {fade: true, transfer:{ top: -0.5}}; },
        dropDown:function(){ return {fade: true, transfer:{ top: 1.5}}; },
        dropLeft:function(){ return {fade: true, transfer:{ left: -0.5}}; },
        dropRight:function(){ return {fade: true, transfer:{ left: 1.5}};},
        
        scaleIn: function(){return {fade: true, scale: 0};},
        scaleOut: function(){ return {fade: true, scale: 2};},
        scaleInRotate: function(){ return {fade: true, scale: 0.0001,  rotateZ:  Math.PI,transformOrigin: '50% 50%'};},
        scaleOutRotate: function(){ return {fade: true, scale:2, rotateZ: Math.PI,transformOrigin: '50% 50%'};},
        
        flipX : function(){ return {fade: true,rotateX: Math.PI/2,transformOrigin: '50% 50%'};},
        flipY : function(){ return {fade: true,rotateY: Math.PI/2,transformOrigin: '50% 50%'};},
        flipXY : function(){ return {fade: true,rotateX: Math.PI/2,rotateY: Math.PI/2, transformOrigin: '50% 50%'};},
        
        flipTop : function(){ return {fade: true,rotateX: -Math.PI/2, transformOrigin: '50% 0'};},
        flipBottom : function(){ return {fade: true,rotateX: -Math.PI/2, transformOrigin: '50% 100%'};},
        flipLeft : function(){ return {fade: true,rotateY: -Math.PI/2, transformOrigin: '0 50%'};},
        flipRight : function(){ return {fade: true,rotateY: Math.PI/2, transformOrigin: '100% 50%'};}
        
    }
    return slide;
})(jQuery);