(function($){
    if(!$.PP){ $.PP = new Object(); };

    $.PP.SlideContent = function(el, options){

        var base = this;
        var ajaxData = null;

        // Access to jQuery and DOM versions of element
        base.$el = $(el);
        base.el = el;

        // Add a reverse reference to the DOM object
        base.$el.data("PP.SlideContent", base);

        base.init = function(){
            base.options = $.extend({},$.PP.SlideContent.defaultOptions, options);

            // INIT
            var selector = 'a';
            if (base.options.only != null) {
                var onlyArray = base.options.only;
                selector = '';
                for(j=0;j<onlyArray.length;j++) {
                    if (j == 0) {
                        selector += onlyArray[j];
                    } else {
                        selector += "," + onlyArray[j];
                    }
                }
            }

            $(selector).live("click",function(e) {

                var executeSlide = false;
                var domainURL = window.location.hostname;
                var linkURL = $(this).attr('href');
                var domainLinkURL;

                if (linkURL.substring(0,4) == "http") {
                    domainLinkURL = linkURL.split('http://');
                    domainLinkURL = domainLinkURL[1].split('/');
                    domainLinkURL = domainLinkURL[0];

                    if (domainURL == domainLinkURL) executeSlide = true;
                } else {
                    executeSlide = true;
                }

                if (base.options.exclude != null) {
                    var excludeArray = base.options.exclude;
                    for(j=0;j<excludeArray.length;j++) {

                        if (excludeArray[j].substring(0,1) == '.') {
                            if ($(this).hasClass(excludeArray[j].substring(1))) {
                                executeSlide = false;
                            }
                        }

                        if (excludeArray[j].substring(0,1) == '#') {
                            if ($(this).attr('id') == excludeArray[j].substring(1)) {
                                executeSlide = false;
                            }
                        }
                    }
                }

                if (executeSlide) {
                    e.preventDefault();
                    $.get($(this).attr('href'), function(data) {
                        base.ajaxData = data;
                        base.slideContent();
                        if (base.options.more.length > 0) {
                            base.more(base.options.more);
                        }
                    });
                }
            });
        };

        base.slideContent = function(){
            var elementID = base.$el.attr('id');
            var currentContent = base.$el;
            var loadingContent = $("#"+elementID,base.ajaxData);

            var contentWidth = currentContent.width();
            var contentHeight = currentContent.innerHeight()+"px";

            currentContent.wrapInner('<div class="ppOverflow"></div>');
            $('.ppOverflow').css({
                'position'      : 'relative',
                'overflow'    : 'hidden',
                'height'        : contentHeight,
                'width'         : contentWidth+"px"
            });

            $('.ppOverflow').wrapInner('<div class="ppCurrent"></div>');
            $('.ppCurrent').css({
                'position'      : 'absolute',
                'left'          : '0px',
                'top'           : '0px',
                'width'         : contentWidth+"px"
            });

            $('.ppOverflow').append('<div class="ppLoading"></div>');
            $('.ppLoading').css({
                'position'      : 'absolute',
                'left'          : (contentWidth+base.options.padding)+"px",
                'top'           : '0px',
                'width'         : contentWidth+"px"
            });
            $('.ppLoading').html(loadingContent.html());

            $('.ppCurrent').animate({
                left : "-"+(contentWidth+base.options.padding)+"px"
            },base.options.duration,function() {
                $('.ppCurrent').remove();
            });

            $('.ppLoading').animate({
                left: "0px"
            },base.options.duration,function() {
                currentContent.html($('.ppLoading').html());
            });

            $('.ppOverflow').animate({
                height: $('.ppLoading').innerHeight()+"px"
            },base.options.duration);
        };

        base.more = function(elements){
            for(i=0; i < elements.length; i++) {

                if (elements[i].substring(0,1) == '.') {
                    var oldHTML;
                    var newHTML;
                    var c = 0;
                    $(elements[i]).each(function() {
                        oldHTML = $(elements[i]);
                        newHTML = $(elements[i],base.ajaxData);
                        $(oldHTML[c]).html($(newHTML[c]).html());
                        c++;
                    });
                } else {
                    $(elements[i]).html(
                        $(elements[i],base.ajaxData).html()
                    );
                }
            }
        };

        // Run INIT
        base.init();
    };

    $.PP.SlideContent.defaultOptions = {
        duration    : 500,
        more        : null, // Array of additionnal replace content (with ajax)
        only        : null, // Array of Class or ID of link who want only slide the content
        exclude     : null, // Array of Class or ID of link who dont slide the content
        padding     : 0     // Space between the old content and the new content
    };

    $.fn.slideContent = function(options){
        return this.each(function(){
            (new $.PP.SlideContent(this, options));
        });
    };

})(jQuery);

