// prtcl.tumblr.com November 2011 
// Cory O'Brien particle-liberation.org

(function($, window){
	
	var PrtclTumblr = function(options){

		var self = this,
			timer;

	    var settings = {
	        api_url: 'http://api.tumblr.com/v2/blog/prtcl.tumblr.com/',
	        api_key: 'iBJN5l0vm4ROIk1x7qhlGtg0wObd90LhzsYpmw16jiYRvpJxbw',
	        posts_limit: 30,
	        posts_container: $('#posts'),
	        post_class: 'post',
	        error_container: $('#error_container'),
	        loading_container: $('#loading'),
	        load_event: 'showpost',
	        debug: false 
	    };

	    settings = $.extend(settings, options);

	    self.posts = [];
	    self.view = {};
	    self.visible = 0;
	    self.totalPosts = 1;
	    self.loading = false;

	    self.init = function(){
	        $(window).on('resize', resize).trigger('resize');
	        $(window).on('scroll', scroll).trigger('scroll');
	        return self;
	    }

	    var resize = function(){
	        self.view.top = $(window).scrollTop();
	        self.view.height = $(window).height();
	        self.view.limit = self.view.top + self.view.height + (self.view.height / 4);
	        debug(self.view);
	    }

	    var scroll = function(){
	        if (timer){
	            clearTimeout(timer);
	        }
	        timer = setTimeout(function(){
	            for (var i=0; i<self.posts.length; i++){
	                var post = self.posts[i];
	                if (!post.loaded){
	                    resize();
	                    if (post.container.offset().top <= self.view.limit){
	                        post.container.trigger(settings.load_event);
	                    }
	                }
	            }
	            if (!self.loading &&
	                (self.posts.length - self.visible) <= (settings.posts_limit / 3) &&
	                self.posts.length < self.totalPosts){
	                getPosts();
	            }
	        }, 30);
	    }

	    var getPosts = function(){
	        var p = {
		            api_key: settings.api_key,
		            format: 'raw',
		            offset: self.posts.length,
		            limit: settings.posts_limit
		        },
				url = settings.api_url + 'posts/?' + $.param(p);
				
	        self.loading = true;
	        settings.loading_container.fadeIn(100);
	
	        debug(url);
	
	        $.ajax({
	            url: url,
	            dataType: 'jsonp',
	            jsonp: 'jsonp'
	        }).done(function(data){
	            var posts = data.response.posts;
	            self.totalPosts = data.response.total_posts;
	            for (var i=0; i<posts.length; i++){
	                self.posts.push(formatPost(posts[i]));
	            }
	            self.loading = false;
	            settings.loading_container.fadeOut(500);
	            debug('posts:');
	            debug(posts);
	        }).fail(function(){
	            settings.error_container.fadeIn('fast');
	            setTimeout(function(){
	                getPosts();
	                settings.error_container.fadeOut('fast');
	            }, 2000);
	        });
	    }

	    var formatPost = function(post){
		
	        var p = {
	            loaded: false,
	            id: post['id'],
	            type: post['type'],
	            date: parseDate(post['timestamp']),
	            url: post['url'] || post['post_url'] || '',
	            permalink: post['post_url'],
	            title: post['title'] || '',
	            source_url: post['source_url'] || '',
	            source_title: post['source_title'] || '',
	            body: post['body'] || post['description'] || post['caption'] || ''
	        };
	
	        if (p.type == 'text'){
	            // p.body = prettyPrintOne(p.body);
	        } else if (p.type == 'photo'){
	            var sizes = post['photos'][0]['alt_sizes'];
	            p.photo = sizes[0];
	            for (var i=0; i<sizes.length; i++){
	                if (sizes[i]['width'] <= 550 && sizes[i]['width'] >= 450){
	                    p.photo = sizes[i];
	                }
	            }
	        } else if (p.type == 'audio'){
	            p.player = post['player'].replace(/audio\_player/g, 'audio_player_black') || '';
	        } else if (p.type == 'video'){
	            p.player = post['player'][(post['player'].length - 1)]['embed_code'].replace(/autoplay\=1/g, 'autoplay=0');
	        }
	
	        p.container = $('<article>').attr('id', p.id).addClass(settings.post_class);
	        settings.posts_container.append(p.container);
	
	        p.container.on(settings.load_event, function(){
	            p.container.hide().html(template(p)).show();
	            p.loaded = true;
	            self.visible += 1;
	
	            $('pre code', p.container).each(function(){
	                $(this).html(prettyPrintOne($(this).html()))
	            });
	
	            debug(p);
	        });
	
	        resize();
	
	        if (p.container.offset().top <= self.view.limit && !p.loaded){
	            p.container.trigger(settings.load_event);
	        }
	
	        return p;
	    }

	    var template = function(post){
			var context = post,
				partials = {
					date: "<div class=\"post_date left\"><p>{{date}}</p><p><a href=\"{{permalink}}\">&raquo; Permalink</a></p></div>",
					open_div: "<div class=\"post_copy right\">",
					close_div: "</div>"
				},
				templates = {
					text: "{{>date}}{{>open_div}}<h2><a href=\"{{url}}\">{{title}}</a></h2><div class=\"post_body\">{{{body}}}</div>{{>close_div}}",
					link: "{{>date}}{{>open_div}}<h2 class=\"link\"><a href=\"{{url}}\">&raquo; {{title}}</a></h2><div class=\"post_body\">{{{body}}}</div>{{>close_div}}",
					photo: "{{>date}}{{>open_div}}<a href=\"{{url}}\"><img src=\"{{photo.url}}\" alt=\"{{title}}\" class=\"photo\"></a><div class=\"post_body\">{{{body}}}</div>{{>close_div}}",
					video: "{{>date}}{{>open_div}}<div class=\"post_media_player\">{{{player}}}</div><div class=\"post_body\">{{{body}}}</div>{{>close_div}}",
					audio: "{{>date}}{{>open_div}}<div class=\"post_media_player\">{{{player}}}</div><div class=\"post_body\">{{{body}}}</div>{{>close_div}}",
					chat: ""
				},
				template = templates[post.type];

	        return Mustache.to_html(template, context, partials);
	    }

	    var parseDate = function(timestamp){
	        var date = new Date(timestamp * 1000),
	            months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
	        return months[date.getMonth()] + ' ' + date.getDate() + ', ' + date.getFullYear();
	    }

	    var debug = function(msg){
	        if (settings.debug){
				console.log(msg);
			}
	    }

	    return this.init();

	}
	
	$(function(){
		if (window.location.pathname === '/'){
			var p = new PrtclTumblr();
		} else {
			prettyPrint();
		}
	});
	
})(jQuery, window);
