(function ($) {
	
	$.tumblr = function (options) {
		return $.tumblr.impl.init(options);
	};
	
	$.fn.tumblr = function (options) {
		return $.tumblr.impl.init(this, options);
	};
	
	/*
	 * default options
	 */
	$.tumblr.defaults = {
	    viewing:        0,
	    lastLoaded:     0, 
	    count:          1,
	    postsPerPage:   10,
	    threshold:      0,
	    getURL:         'http://thorstenkonrad.tumblr.com/api/read/json/'
	};
	
	$.tumblr.impl = {
		
		/*
		 * options
		 */
		opts:   null,
		
		/*
		 * helper
		 */
		helper:     {},
		
		/*
		 * is loading
		 */
		isLoading:    false,
		
		/*
		 * Initialize the template
		 */
		init: function (options) {
            
            var self = this;
            
            self.opts = $.extend({}, $.tumblr.defaults, options);
            
            // helpers
            self.helper.pages = $('ul.page-set');
            self.helper.posts = $('ul.post-set');
            
            // selectors
            self.selectors();
            
            // bind the events
            self.events();
            
			return self;
		},
		
		/*
		 * Selectors
		 */
		selectors: function () {
		    
		    var self = this;
		    
		    if (self.helper.posts.children().length == 1)
		        return;
		    
		    self.helper.selectors = $('<ul class="selector-set"></ul>').appendTo('body');
		    
		    for (var i = 0; i < self.opts.count; i++)
		    {
		        var $selector = $('<li class="selector"><a href="#page-' + i + '">' + (self.opts.count - i) + '</a></li>');
		        
		        if (i == 0)
		        {
		            $selector
		                .addClass('selector-enabled')
		                .addClass('selector-active')
		                ;
		        }
		        
		        $selector
		            .appendTo(self.helper.selectors)
		            ;
		    }
		    
		    return;
		},
		
		/*
		 * Binds the events
		 */
		events: function () {
		    
		    var self = this;
		    
		    // post hover
		    self.helper.posts.children().hover(
		        function(){
		            $(this)
		                .addClass('post-hover')
		                ;
		        },
		        function(){
		            $(this)
		                .removeClass('post-hover')
		                ;
		        }
		    );
		    
		    // scroll
		    $(window).scroll(function(){
		        
		        var winH = $(window).height();
		        var end = $(document).height() - winH - $(window).scrollTop();
                
                self.viewing();
                
                if (!self.isLoading && end <= (self.opts.threshold*winH) && (self.opts.lastLoaded + 1) < self.opts.count)
                {
                    self.isLoading = true;
                    self.page();
                }
		    });
		    
		    // selector click
		    self.helper.selectors.find('.selector-enabled a').click(function(e){
		        e.preventDefault();
		        
		        var pageId = $(this).attr('href').split('#')[1];
		        
		        $(window).scrollTo(self.helper.pages.children(pageId), {
	                duration:   1000, 
	            });
		        
		    });
		    
		    // selector click
		    self.helper.selectors.find('.selector a').click(function(e){
		        e.preventDefault();
		    });
		    
		    return;
		},
		
		/*
		 * Determines the page currently within view
		 */
		viewing: function () {
		    
		    var self = this;
		    var fold = $(window).height() + $(window).scrollTop();
		    
		    self.helper.pages.children().each(function(i, item){
		        
		        var offset = $(item).offset().top;
		        var height = $(item).outerHeight();
		        
		        if (fold >= offset && fold <= (offset + height))
		        {
		            if (self.opts.viewing != i)
		            {
		                self.opts.viewing = i;
		                
		                $(self.helper.selectors.children()[self.opts.viewing])
            		        .addClass('selector-active')
            		        .siblings()
            		        .removeClass('selector-active')
            		        ;
		            }
		            		            
		            return false;
		        }
		        
		    });
		    
		    return;
		},
		
		/*
		 * Loads the page
		 */
		page: function () {
		    
		    var self = this;
		    var pageId = 'page-' + (self.opts.lastLoaded + 1);
		    var $page = $('<li class="page" id="' + pageId + '"></li>');
		    var $selector = $(self.helper.selectors.children()[self.opts.lastLoaded + 1]);
		    
		    $selector
		        .addClass('selector-loading')
		        ;
		    
		    $.ajax({
        		url: 			self.opts.getURL,  	
    			dataType: 		'jsonp',
    			jsonp_callback: 'jsonp_callback',
    		  	data: {
    				start: 		(self.opts.lastLoaded + 1)*self.opts.postsPerPage,
    				num: 		self.opts.postsPerPage
    			},
    		  	success: function (data) {
    		  		
    		  		var $posts = $('<ul class="post-set"></ul>');
    		  		
    		  		$.each(data.posts, function(i, post){
    		  		    
    		  		    var $post = $('<li class="post"></li>')
    		  		    
    		  		    if (post.type == 'video')
    		  		    {
    		  		        $post
        		  		        .append('<div class="media" style="width:500px;text-align:center;background-color:#000000">' + post['video-player'] + '</div>')
        		  		        .append('<div class="copy">' + post['video-caption'] + '</div>')
        		  		        ;
    		  		    }
						
    		  		    else if (post.type == 'quote')
    		  		    {
    		  		        $post
                        		.append('<div class="quotebg">&#8220;</div>')
	                			.append('<div class="quote">' + post['quote-text'] + '</div>')
                       			.append('<div class="quoteed">&#8221;</div>')
                        		.append('<div class="quote-source">&#8212;' + post['quote-source'] + '</div>')
	                			.append('</div>')
        		  		        ;
    		  		    }
						
    		  		    else if (post.type == 'photo')
    		  		    {
    		  		        $post
        		  		        .append('<div class="media"><a href="' + post['photo-link-url'] + '"><img src="' + post['photo-url-500'] + '" /></a></div>')
        		  		        .append('<div class="copy">' + post['photo-caption'] + '</div>')
        		  		        ;
    		  		    }
    		  		    else if (post.type == 'link')
    		  		    {
    		  		        $post
        		  		        .append('<div class="link"><a href="' + post['link-url'] + '" >' + post['link-text'] + ' &raquo;</a></div>')
								.append('<div class="copy"><div class="copy_link">' + post['link-description'] + '</div></div>')
        		  		        ;
    		  		    }
    		  		    else if (post.type == 'regular')
    		  		    {
    		  		        $post
        		  		        .append('<div class="copy">' + post['regular-body'] + '</div>')
        		  		        ;
    		  		    }
						else if (post.type == 'conversation')
    		  		    {
    		  		        $post
        		  		       	.append('<div class="title">' + post['conversation-title'] +'</div>')
	                			.append('<div class="chat">' + post['conversation-text'] +'<div class="lines">')
	                			.append('<div class="line"><strong>' + post['label'] +'</strong>{Line}</div>')
	                			.append('</div></div>')
	                			.append('<div class="clear"></div>')
	                			.append('<div style="height: 20px"></div>')
        		  		        ;
    		  		    }
    		  		
		  		        $post
    		  		        .append('<div class="meta"><a href="' + post['url'] + '" title="Permalink" style="margin-right:15px;font-size:11px;">Permalink</a> <span class="date">' + Date.parse(post['date-gmt']).toString('MMMM d, yyyy') + '</span></div>')
    		  		        .appendTo($posts)
    		  		        ;
		  		    
		  		        // post hover
            		    $posts.children().hover(
            		        function(){
            		            $(this)
            		                .addClass('post-hover')
            		                ;
            		        },
            		        function(){
            		            $(this)
            		                .removeClass('post-hover')
            		                ;
            		        }
            		    );
    		  		});
    		  		
    		  		$page
    		  		    .append($posts)
    		  		    .appendTo(self.helper.pages)
    		  		    ;
    		  		
    		  		$selector
        		        .removeClass('selector-loading')
        		        .addClass('selector-enabled')
        		        .find('a').click(function(e){
        		            e.preventDefault();
        		            
        		            $(window).scrollTo($page, {
        		                duration:   1000, 
        		            });
        		            
        		        })
        		        ;
    		  		
    		  		self.opts.lastLoaded++;
    		  		self.isLoading = false;
    		  	}
        	});
		    
		    return;
		}
		
	};
})(jQuery);