if (door == undefined) {
    var door = {};
}

door.slider = {};

door.slider.manager = function(options) {
    var defaultOptions = {
        elemId:          '',
        prevId:          'prevBtn',
        prevText:        'Previous',
        nextId:          'nextBtn',
        nextText:        'Next',
        inactivateBtn:   false,
        inactiveBtn:     'inactive',
        controlsShow:    true,
        controlsFade:    true,
        firstText:       'First',
        firstShow:       false,
        lastId:          'lastBtn',
        lastText:        'Last',
        lastShow:        false,
        vertical:        false,
        speed:           800,
        auto:            false,
        pause:           2000,
        continuous:      false,
        showPointer:     false,
        hasPointer:      false,
        pointerId:       'pointer',
        pointerSelected: 'selected'
    }
    this.initialize(jQuery.extend(defaultOptions, options));
};

door.slider.manager.prototype = {

    initialize: function(options) {
        this.options         = options;
        this.element         = jQuery('#' + this.options['elemId'])[0];
        this.pageNum         = jQuery(this.element).find('li').length;
        this.currentPosition = 0;
        this.buttons         = new door.slider.buttons(this);
        this.hideBtn();
        if (this.pageNum < 2) {
            return;
        }
        this.pageWidth  = jQuery(this.element).find('li').width();
        this.pageHeight = jQuery(this.element).find('li').height();
        this.container  = jQuery(this.element).find('ul')[0];
        this.pointers   = null;
        if (this.options.showPointer) {
            this.pointers    = new door.slider.pointers(this, this.pageNum);
        }
        this.resetStyle();
    },

    slideTo: function(dstPosition) {
        if (dstPosition != this.currentPosition) {
            this.slideWithDiff(dstPosition - this.currentPosition);
        }
    },

    slideWithDiff: function(diff) {
        if (this.currentPosition + diff >= 0 && this.currentPosition + diff < this.pageNum) {
            this.currentPosition += diff;
            this.doSlide(diff);
        }
    },

    doSlide: function(diff) {
        if (this.options.showPointer) {
            this.pointers.slideTo(this.currentPosition);
        }
        if (this.options.vertical) {
            var marginDiff = diff * this.pageHeight;
            this.slideAnimate({marginTop: ('-=' + marginDiff) + 'px'});
        } else {
            var marginDiff = diff * this.pageWidth;
            this.slideAnimate({marginLeft: ('-=' + marginDiff) + 'px'});
        }
    },

    slideAnimate: function(parameters) {
        var _manager = this;
        jQuery(this.container).animate(parameters, {
                duration: this.options.speed,
                complete: function() {
                    _manager.hideBtn();
                }
        });
    },

    resetStyle: function() {
        jQuery(this.element).width(this.pageWidth);
        jQuery(this.element).height(this.pageHeight);
        jQuery(this.element).css({'overflow': 'hidden'});
        jQuery(this.container).css({'width': (this.pageNum * this.pageWidth) + 'px'});
        if (!this.options.vertical) {
            jQuery(this.element).find('li').css({'float': 'left'});
        }
    },

    hideBtn: function() {
        this.buttons.showPrevBtn();
        if (this.currentPosition == 0) {
            this.buttons.hidePrevBtn();
        }
        this.buttons.showNextBtn();
        if (this.pageNum == 0 || this.currentPosition == (this.pageNum - 1)) {
            this.buttons.hideNextBtn();
        }
    },

    getOptions: function() {
        return this.options;
    }
};

door.slider.buttons = function(manager) {
    this.manager = manager;
    this.initialize();
}

door.slider.buttons.prototype = {

    initialize: function() {
        if (this.manager.getOptions().controlsShow) {
            this.createBtns();
        }
        this.prevBtn = jQuery('#' + this.manager.getOptions().prevId + ' a');
        this.nextBtn = jQuery('#' + this.manager.getOptions().nextId + ' a');

        var _manager = this.manager;
        this.prevBtn.click(function() {
            _manager.slideWithDiff(-1);
        })
        this.nextBtn.click(function() {
            _manager.slideWithDiff(1);
        })
    },

    createBtns: function() {
        jQuery(this.manager.element).after(this.generatePrevBtn());
        jQuery(this.manager.element).after(this.generateNextBtn());
    },

    generatePrevBtn: function() {
        return this.generateBtn(this.manager.getOptions().prevId, this.manager.getOptions().prevText);
    },

    generateNextBtn: function() {
        return this.generateBtn(this.manager.getOptions().nextId, this.manager.getOptions().nextText);
    },

    generateBtn: function(id, text) {
        var btn = document.createElement('span');
        btn.id = id;
        btn.className = id;
        btn.innerHTML = '<a href="javascript:void(0);">' + text + '</a>';
        return btn;
    },

    hidePrevBtn: function() {
        this.hideBtn(this.prevBtn);
    },

    hideNextBtn: function() {
        this.hideBtn(this.nextBtn);
    },

    hideBtn: function(button) {
        if (this.manager.getOptions().inactivateBtn) {
            var _manager = this.manager;
            jQuery(button).fadeOut(200, function() {
                jQuery(this).addClass(_manager.getOptions().inactiveBtn).css({cursor: 'default'}).fadeIn(200);
            });
        } else {
            jQuery(button).fadeOut(200);
        }
    },

    showPrevBtn: function() {
        this.showBtn(this.prevBtn);
    },

    showNextBtn: function() {
        this.showBtn(this.nextBtn);
    },

    showBtn: function(button) {
        var _manager = this.manager;
        if (jQuery(button).is(':visible') && (!_manager.getOptions().inactivateBtn || !jQuery(button).hasClass(_manager.getOptions().inactiveBtn))) {
            return;
        }
        if (this.manager.getOptions().inactivateBtn) {
            jQuery(button).fadeOut(200, function() {
                jQuery(this).removeClass(_manager.getOptions().inactiveBtn).css({cursor: 'pointer'}).fadeIn(200)
            });
        } else {
            jQuery(button).fadeIn(200);
        }
    }
}

door.slider.pointers = function(manager, pageNum) {
    this.manager   = manager;
    this.pageNum   = pageNum;
    this.container = jQuery(jQuery('#' + this.manager.getOptions().pointerId)[0]);
    this.elements  = null;
    this.initialize();
}

door.slider.pointers.prototype = {
    initialize: function() {
        if (!this.manager.getOptions().hasPointer) {
            this.addPointerElements();
        }
        this.elements = this.container.find('li a');
        this.monitor();
    },

    monitor: function() {
        var _container = this;
        this.elements.click(function() {
            _container.manager.slideTo(parseInt(this.parentNode.className));
        });
    },

    addPointerElements: function() {
        var ul = document.createElement('ul');
        for (var i = 0; i < this.manager.pageNum; i++) {
            var li = document.createElement('li');
            jQuery(li).addClass(i.toString());
            li.innerHTML = (i == 0) ? this.generatePointerInnerHTML((i + 1), this.manager.getOptions().pointerSelected) : this.generatePointerInnerHTML((i + 1), '');
            ul.appendChild(li);
        }
        jQuery(this.container).append(ul).css({height: '10px'});
    },

    slideTo: function(dstPosition) {
        this.elements.removeClass(this.manager.getOptions().pointerSelected);
        jQuery(this.elements.eq(dstPosition)).addClass(this.manager.getOptions().pointerSelected);
    },

    generatePointerInnerHTML: function(innerText, className) {
        return '<a href="javascript:void(0);" class="' + className + '">' + innerText + '</a>';
    }
}

