/* hash
 * --------------------------------------------------------------------- */
$(function() {
	$(window).bind('hashchangedone', function(e, url) {
		$('#nav a').removeClass('active');
		var href = (url.replace(/^\//, '').split('/'))[0];
		$('#nav a[href="#/'+href+'"]').addClass('active');
	});
});

$(function() {
	var target = $('#page');

	var loading = $('<div id="loading"></div>')
		.addClass('d-position-fixed')
		.addClass('d-win-width')
		.addClass('d-win-height')
		.prependTo($('body')).hide();
	$.dWinResize();

	$('#logo a').click(function() {
		if (location.hash == $(this).attr('href')) {
			$('#bg').dfullbgPlay();
			return false;
		}

		return true;
	});

	$(window).hashchange(function() {
		var hash = location.hash;
		if (!hash.match(/^#\//)) {
			return;
		}

		var url = hash.replace(/^#/, '');
		if (url == '/') {
			/* main page */
			target.empty();
			$('#nav a').removeClass('active');
			$('#bg').dfullbgPlay();
			return;
		}

		loading.dfadeIn('.5');
		$.dWinResize();
		if (!$.isSingleView())
			$('#bg').dfullbgPlay();

		$.get(url, function(data) {
		//	loading.fadeOut();
			$(window).trigger('hashchangedone', url);
			target.empty().html(data);
			$.dofirst();
		}, 'text');
	}).hashchange();
});

/* init background
 * --------------------------------------------------------------------- */
$(function() {
	var bg = $('#bg').dfullbg({
		autoplay: false,
		loading: $('#loading'),
		birdscreen: false
	});

	$.get('/tumblr/posts/photo', {
		'tag': 'bg',
		'limit': 30,
		'offset': 0
	}, function(data) {
		if (data.meta.msg != 'OK')
			return;

		var images = [];

		$(data.response.posts).each(function() {
			var post = this;
			$(post.photos).each(function() {
			//	images.push(this.original_size.url);
				images.push(this.alt_sizes[0].url);
			});
		});

		var opt = bg.data('dfullbgOpt');
		if (opt) {
			opt.images = images;
			if (!$.isSingleView() &&
				!bg.hasClass('dfullbg-paused')) {
				bg.dfullbgPlay();
			}
		}
	}, 'json');
});

/* disqus
 * --------------------------------------------------------------------- */
$.disqus = function(opt) {
	opt = $.extend(true, {
		'post': null,
		'click': function(e) { return; },
		'extra': null
	}, opt);

	return $('<div class="disqus"></div>')
		.append(
			$('<a href="#" class="launcher">+</a>')
			.click(function(e) {
				var launcher = $(this);
				var target = launcher.parent()
					.children('.target');
				var thread = $('<div id="disqus_thread"></div>');

				if (launcher.hasClass('active')) {
					$('html').click();
					return false;
				}

				if (typeof opt.click == 'function') {
					opt.click(e, thread);
				}

				$('#disqus_thread').remove();
				$('.disqus > .target').clickOutside();
				$('.disqus > a.launcher').removeClass('active');
				launcher.addClass('active');
				target.append(thread).fadeIn(function() {
					target.children('#disqus_thread')
					.clickOutside(function() {
						if ($('#loading:visible').length > 0)
							return;
						launcher.removeClass('active');
						target.fadeOut(function() {
							$(this).empty();
							$('.dsq-tooltip-outer').remove();
							$('iframe[id^="easyXDM_DISQUS_net_default"]')
								.remove();
						});
					});
				});

				disqus_shortname = 'noaidi';
				disqus_identifier = opt.post.id;
				if (opt.extra) {
					disqus_identifier += opt.extra;
				}
				var controller = location.hash.split('/');
				if (controller.length > 1) {
					disqus_url = (location.href.split('#'))[0] +
						'#/' + controller[1] + '/' + opt.post.id;
				} else {
					disqus_url = opt.post.post_url;
				}

				/* * * DON'T EDIT BELOW THIS LINE * * */
				(function() {
					var dsq = document.createElement('script');
					dsq.type = 'text/javascript';
					dsq.async = true;
					dsq.src = 'http://' + disqus_shortname +
						'.disqus.com/embed.js';
					target.append(dsq);
				})();

				return false;
			}).focus(function() {
				$(this).blur();
			})
		)
		.append(
			$('<div class="target"></div>').hide()
		);
};

/* draw
 * --------------------------------------------------------------------- */
$.convertDate = function(post) {
	var d = post.date.replace(' GMT', '');
	var t;
	d = d.split(' ');
	t = d[1].split(':');
	d = d[0].split('-');
	d = new Date(d[0], parseInt(d[1]) - 1, d[2],
		t[0], t[1], t[2]);
	d = new Date(d.getTime() - (d.getTimezoneOffset() * 60000));
	return d.toString().replace(/\ GMT.*/, '');
};

$.fn.drawPostText = function(data, opt) {
	var target = $(this);

	if (data.meta.msg != 'OK')
		return;

	$(data.response.posts).each(function() {
		var post = this;

		target.append($('<article class="entry"></article>')
			.append($('<div class="date d-page"></div>')
				.html($.convertDate(post)))
			.append('<div class="hr" />')
			.append(post.title ?
				$('<div class="title d-page"></div>')
					.html(post.title) : '')
			.append(post.body ?
				$('<div class="body d-page redohtml"></div>')
					.html(post.body) : '')
			.append($.disqus({
				'post': post
			}))
		);

		if (opt.id) {
			target.find('a.launcher').click();
		}
	});

	$('#loading').fadeOut()
	return this;
};

$.fn.drawPostQuote = function(data, opt) {
	var target = $(this);

	if (data.meta.msg != 'OK')
		return;

	$(data.response.posts).each(function() {
		var post = this;

		target.append($('<article class="entry"></article>')
			.append($('<div class="date d-page"></div>')
				.html($.convertDate(post)))
			.append('<div class="hr" />')
			.append(post.source ?
				$('<div class="title d-page"></div>')
					.html(post.source) : '')
			.append(post.text ?
				$('<div class="body d-page redohtml"></div>')
					.append($('<p></p>').html(post.text)) : '')
			.append($.disqus({
				'post': post
			}))
		);

		if (opt.id) {
			target.find('a.launcher').click();
		}
	});

	$('#loading').fadeOut()
	return this;
};

$.fn.drawPostPhoto = function(data, opt) {
	var target = $(this);

	if (data.meta.msg != 'OK')
		return;

	var caption = target.children('.caption');
	
	if (caption.length == 0) {
		caption = $('<div class="caption"></div>').appendTo(target);
	}

	$(data.response.posts).each(function() {
		var post = this;
		$(post.photos).each(function() {
			var src = this.alt_sizes[this.alt_sizes.length - 1].url
		//	var href = this.original_size.url;
			var href = this.alt_sizes[0].url;
			var parsedUrl = location.hash.split('/');
			var controller = '';
			var id = '';

			if (parsedUrl.length > 1) {
				controller = parsedUrl[1];
			}

			if (parsedUrl.length > 2) {
				id = parsedUrl[2];
			}

			target.append(
				$('<article></article>').append(
					$('<a class="entry"></a>').append(
						$('<span class="screen"></span>')
					).append(
						$('<img src="'+src+'" alt="" />')
					).append(
						$('<img src="'+href+'" alt="" />')
					).attr('href', href)
					.click(function(e) {
						var href = $(this).attr('href');
						$('#bg').dfullbgPlay(href, true);
						target.find('a.entry').not(
							$(this).addClass('current')
								.addClass('view')
						).removeClass('current');
						if ($.isSingleView()) {
							$(this).parent()
								.find('.disqus a.launcher').click();
						}
						caption.empty().append(
							$('<span class="date"></span>')
								.append($.convertDate(post))
						).append(
							$('<span class="text"></span>')
								.append(post.caption)
						);
						return false;
					})
				).append(
					$.disqus({
						'post': post,
						'extra': src,
						'click': function(e, thread) {
							var buttons =
								$('<div class="buttons"></div>')
									.appendTo(thread);
							var url = (location.href.split('#'))[0] +
								'#/' + controller + '/' + post.id;

							if (id == '') {
								buttons.append(
									$('<a href="#/'+controller+'/'+
										post.id+'" class="view">Single view</a>')
								);
							} else {
								buttons.append(
									$('<a href="#/'+controller+
										'" class="view">List view</a>')
								);
							}

							buttons.append(
								$('<div class="sns"></div>').append(
									'<iframe allowtransparency="true" frameborder="0" scrolling="no" src="//platform.twitter.com/widgets/tweet_button.html#count=horizontal&amp;url='+encodeURIComponent(url)+'" style="width:100px; height:20px;"></iframe>'
								).append(
									'<iframe src="//www.facebook.com/plugins/like.php?href='+encodeURIComponent(url)+'&amp;send=false&amp;layout=button_count&amp;width=100&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font&amp;height=20&amp;appId=116679035030325" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:20px;" allowTransparency="true"></iframe>'
								)
							).append('<div class="clear"></div>');
						}
					})
				)
			);

			if (opt.id) {
				target.find('a.entry').click();
			}
		});
	});

	$('#loading').fadeOut();
	return this;
};

/* load
 * --------------------------------------------------------------------- */
$.fn.loadSomething = function(opt) {
	var me = $(this);
	var target = $('<div class="target"></div>').appendTo(me);
	var more = $('<a href="#" class="entry more">+</a>')
		.appendTo(me).hide();

	opt = $.extend(true, {
		'type': 'text',
		'url': '/tumblr/posts/text',
		'id': '',
		'tag': '',
		'limit': 20,
		'offset': 0
	}, opt);

	var loading = false;

	more.click(function() {
		if (more.hasClass('loading'))
			return false;
		more.trigger('loading');
		$.get(opt.url, {
			'tag': opt.tag,
			'limit': opt.limit,
			'id': opt.id,
			'offset': opt.offset
		}, function(data) {
			more.show().trigger('loaded');
			opt.offset += opt.limit;
			switch (opt.type) {
			case 'text':
				target.drawPostText(data, opt);
				break;
			case 'photo':
				target.drawPostPhoto(data, opt);
				break;
			case 'quote':
				target.drawPostQuote(data, opt);
				break;
			}
			if ((data && data.response && data.response.posts) &&
				data.response.posts.length == 0)
				more.hide().unbind('click');
		}, 'json');
		return false;
	}).bind('loading', function() {
		more.addClass('loading').dblink();
	}).bind('loaded', function() {
		$(this).removeClass('loading').dblinkStop();
	}).click();

	$(window).scroll(function() {
		if ($(window).height() + $(window).scrollTop() ==
			$('body').height()) {
			more.click();
		}
	});

	if (opt.id) {
		more.remove();
	}

	return this;
};

$.fn.loadText = function(opt) {
	opt = $.extend(true, {
		'type': 'text',
		'url': '/tumblr/posts/text',
		'limit': 5
	}, opt);
	$(this).loadSomething(opt);
	return this;
};

$.fn.loadQuote = function(opt) {
	opt = $.extend(true, {
		'type': 'quote',
		'url': '/tumblr/posts/quote',
		'limit': 5
	}, opt);
	$(this).loadSomething(opt);
	return this;
};

$.fn.loadPhoto = function(opt) {
	opt = $.extend(true, {
		'type': 'photo',
		'url': '/tumblr/posts/photo'
	}, opt);
	$(this).loadSomething(opt);
	return this;
};

$.isSingleView = function() {
	return !!location.hash.match(/\/[0-9]+$/);
};

