
function global_onload()
{
	if (arguments.callee.done) return;
	arguments.callee.done = true;
	
	if ($('logout'))
	{
		form_token = $('logout').href.match(/tkn=([0-9a-f]+)/)[1];
		form_token_time = $('logout').href.match(/tkn_t=([0-9]+)/)[1];
		logged_in_username = $('logged_in_username').firstChild.data;
	}
	
	$A(document.getElementsByTagName("a")).each(
		function(s)
		{
			if (s.href.indexOf('#rate') != -1)
			{
				s.observe('click', rate_image, true);
			}
			else if (s.href.indexOf('#comment') != -1)
			{
				if (s.href.indexOf('vote') != -1)
				{
					s.observe('click', rate_comment, true);
				}
				else if (s.href.indexOf('quote') != -1)
				{
					s.observe('click', quote_comment, true);
				}
			}
			else if (s.href.indexOf('#tag') != -1)
			{
				s.observe('click', prompt_tag, true);
			}
		}
	);
	
	$A(document.getElementsByTagName("form")).each(
		function(s)
		{
			if (s.action.indexOf('comment') != -1)
			{
				s.observe('submit', submit_comment, true);
			}
		}
	);
	
	$('register').observe('click', validate_registration, true);
}

function validate_registration(event)
{
	if ($('username').value == '')
	{
		$('username').focus();
		event.stop();
		alert('Anna haluamasi käyttäjätunnus.');
	}
	else if ($('password').value == '')
	{
		$('password').focus();
		event.stop();
		alert('Anna haluamasi salasana.');
	}
}

function prompt_tag(event)
{
	var a = event.element();
	
	if (a.tagName.toUpperCase() == 'IMG')
	{
		a = a.parentNode;
	}
	
	var image_id = a.href.match(/add=([0-9]+)/)[1];
	event.stop();
	
	if (!$('tag_prompt_container'))
	{
		var cancel = Builder.node('a', {'class': 'close', 'href': '#'}, 'Peruuta');
		cancel.observe('click', function(event) { $('tag_prompt_container').hide(); event.stop(); }, true);
		
		var taglist = Builder.node('ul', {'class': 'tags'});
		
		$$('body')[0].appendChild(
			Builder.node('form', {id:'tag_prompt_container'}, [
				cancel,
				Builder.node('p', {}, 'Kirjoita uusi tagi tai valitse se listalta.'),
				Builder.node('p', {}, [
					'Tagi: ',
					Builder.node('input', {'type': 'text', 'maxlength': 20, 'name': 'custom_tag'}),
					Builder.node('input', {'type': 'hidden', 'name': 'image_id', 'value': image_id}),
					Builder.node('input', {'type': 'submit', 'value': 'Tallenna'})
				]),
				taglist
			])
		);
		
		new Ajax.Request('/tag.php?top_tags',
		{
			method: 'get',
			onSuccess: function(r)
			{
				var tags = r.responseJSON;
				
				for (var i = 0; i < tags.length; i++)
				{
					var link = Builder.node('a', {'href': '#tag?image_id=' + image_id}, tags[i]);
					link.observe('click', submit_tag, true);
					taglist.appendChild(Builder.node('li', {}, link));
				}
			},
			onFailure: function(r)
			{
				alert(r.responseText);
			}
		});
		
		$('tag_prompt_container').observe('submit', submit_tag, true);
	}
	else
	{
		$('tag_prompt_container').show();
	}
	
}

function get_image_tags(image_id)
{
	if (!$('image_' + image_id + '_tags'))
	{
		return [];
	}
	
	var tags = [];
	
	$A($('image_' + image_id + '_tags').getElementsByTagName("a")).each(
		function(s)
		{
			tags.push(s.firstChild.data);
		}
	);
	
	return tags;
}

function submit_tag(event)
{
	var element = event.element();
	event.stop();
	
	var tag_text;
	var image_id;
	
	if (element['custom_tag'])
	{
		tag_text = element['custom_tag'].value;
		element['custom_tag'].value = '';
		image_id = element['image_id'].value;
	}
	else
	{
		tag_text = element.firstChild.data;
		image_id = element.href.match(/image_id=([0-9]+)/)[1];
	}
	
	var existing_tags = get_image_tags(image_id);
	
	if (existing_tags.indexOf(tag_text) != -1)
	{
		alert('Kuvalla on jo valittu tagi.');
		return;
	}
	
	new Ajax.Request('/tag.php',
	{
		method: 'post',
		parameters: {action: '/tag.php', tag_text: tag_text, image_id: image_id, ajax: 1, tkn: form_token, tkn_t: form_token_time},
		onSuccess: function(r)
		{
			add_tag(image_id, tag_text);
		},
		onFailure: function(r)
		{
			alert(r.responseText);
		}
	});
	
	$('tag_prompt_container').hide();
}

function add_tag(image_id, tag_text)
{
	var ul_id = 'image_' + image_id + '_tags';
	var ul = $(ul_id);
	
	if (!ul)
	{
		ul = Builder.node('ul', {'id': ul_id});
		var container = $('image_' + image_id + '_tags_container');
		container.insertBefore(ul, container.firstChild);
	}
	
	var a = Builder.node('a', {'href': '/t/' + encodeURIComponent(tag_text) + '/'}, tag_text);
	ul.appendChild(Builder.node('li', {},
		a
	));
	
	flash(a);
}

function submit_comment(event)
{
	var form = event.element();
	var params = $(form).serialize(true);
	params['ajax'] = 1;
	
	new Ajax.Request('/comment.php',
	{
		method: 'post',
		parameters: params,
		onSuccess: function(r)
		{
			add_comment(r.responseJSON.image_id, r.responseJSON.comment_id, r.responseJSON.text, logged_in_username);
			$('comment_text').value = '';
		},
		onFailure: function(r)
		{
			alert(r.responseText);
		}
	});
	
	event.stop();
}

function add_comment(image_id, comment_id, text, username)
{
	var parentNode = $('image_' + image_id + '_comments');
	if (!parentNode)
	{
		return;
	}
	
	var form = parentNode.getElementsByTagName('form');
	if (form)
	{
		form = form[0];
	}
	else
	{
		form = parentNode.lastChild;
	}
	
	var info = new Element('div', {'class': 'info'});
	info.appendChild(new Element('span', {'class': 'poster'}).update(username));
	info.appendChild(new Element('span', {'class': 'date'}).update('0 sekuntia sitten'));
	info.appendChild(new Element('span', {'id': 'comment_' + comment_id + '_rating', 'class': 'rating'}).update('0'));
	
	var voteUp = new Element('a', {'class': 'vote', 'href': '#comment?upvote=' + comment_id}).update('[+]');
	voteUp.observe('click', rate_comment, true);
	
	var voteDown = new Element('a', {'class': 'vote', 'href': '#comment?downvote=' + comment_id}).update('[-]');
	voteDown.observe('click', rate_comment, true);
	
	info.appendChild(voteUp);
	info.appendChild(voteDown);
	
	var quote = new Element('a', {'class': 'quote', 'href': '#comment?quote=' + comment_id}).update('Lainaa');
	quote.observe('click', quote_comment, true);
	info.appendChild(quote);
	
	parentNode.insertBefore(info, form);
	
	var textNode = new Element('div', {'class': 'text', 'id': 'comment_' + comment_id + '_text'});
	textNode.innerHTML = text;
	parentNode.insertBefore(textNode, form);
	
	flash([info, textNode]);
}

function get_text(node, skipNodesWithClasses)
{
	if (node.data)
	{
		return node.data.strip();
	}
	
	if (!node.childNodes)
	{
		return '';
	}
	
	if (!skipNodesWithClasses)
	{
		skipNodesWithClasses = [];
	}
	
	var text = '';
	
	for (var i = 0; i < node.childNodes.length; i++)
	{
		var pass = true;
		if ($(node.childNodes[i]).hasClassName)
		{
			for (var j = 0; j < skipNodesWithClasses.length; j++)
			{
				if ($(node.childNodes[i]).hasClassName(skipNodesWithClasses[j]))
				{
					pass = false;
					break;
				}
			}
		}
		
		if (pass)
		{
			var tmp = get_text(node.childNodes[i], skipNodesWithClasses);
			
			if (tmp != '')
			{
				text += tmp.strip() + "\n";
			}
		}
	}
	
	return text;
}

function quote_comment(event)
{
	var a = event.element();
	var comment_id = a.href.match(/quote=([0-9]+)/)[1];
	var comment = $('comment_' + comment_id + '_text');
	var comment_text = get_text(comment, ['quote']);
	
	if (comment_text != '')
	{
		var textarea = $('comment_text');
		textarea.value += '\n[quote]' + comment_text.strip() + '[/quote]\n';
		textarea.value = textarea.value.strip() + '\n';
		textarea.focus();
	}
	
	event.stop();
}

function rate_comment(event)
{
	var a = event.element();
	var direction = '';
	var comment_id = 0;
	var matches = a.href.match(/(up|down)vote=([0-9]+)/);
	
	if (matches)
	{
		direction = matches[1];
		comment_id = matches[2];
	}
	
	new Ajax.Request('/comment.php',
	{
		method: 'post',
		parameters: {action: 'rate', comment_id: comment_id, direction: direction, ajax: 1, tkn: form_token, tkn_t: form_token_time},
		onSuccess: function(r)
		{
			var rating = r.responseJSON.rating;
			var cls = r.responseJSON.cls;
			var element = $('comment_' + comment_id + '_rating');
			var to_flash = [];
			
			if (element && element.firstChild)
			{
				rating = (rating > 0) ? '+' + rating : rating;
				element.firstChild.data = rating;
				to_flash = [element];
			}
			else
			{
				to_flash = [a];
			}
			
			element = $('comment_' + comment_id + '_text');
			
			if ((element.hasClassName('faded') && cls == 'highlighted') || (element.hasClassName('highlighted') && cls == 'faded'))
			{
				element.removeClassName('highlighted');
				element.removeClassName('faded');
				element.addClassName(cls);
				to_flash.push(element);
			}
			else if (cls != '' && !element.hasClassName(cls))
			{
				to_flash.push(element);
				element.addClassName(cls);
			}
			
			flash(to_flash);
			
			a.blur();
		},
		onFailure: function(r)
		{
			alert(r.responseText);
		}
	});

	
	event.stop();
}

function flash(elements)
{
	if (!elements)
	{
		return;
	}
	
	if (!elements.length)
	{
		elements = [elements];
	}
	
	for (var i = 0; i < elements.length; i++)
	{
		if ($(elements[i]))
		{
			$(elements[i]).fade({duration: '1.0', from: '0.0', to: '1.0'});
		}
	}
}

function rate_image(event)
{
	var a = event.element();
	var rating = a.firstChild.data;
	var image_id = a.href.match(/id=([0-9]+)/)[1];
	
	new Ajax.Request('/rate.php',
	{
		method: 'post',
		parameters: {image_id: image_id, rating: rating, ajax: 1, tkn: form_token, tkn_t: form_token_time},
		onSuccess: function(r)
		{
			var element = $('image_' + image_id + '_rating');
			var to_flash = [];
			
			if (element && element.firstChild)
			{
				element.firstChild.data = r.responseJSON.rating;
				element = $('image_' + image_id + '_rating_count');
				
				if (element && element.firstChild)
				{
					element.firstChild.data = r.responseJSON.count;
				}
				
				to_flash = ['image_' + image_id + '_rating', 'image_' + image_id + '_rating_count'];
			}
			else
			{
				to_flash = [a];
			}
			
			flash(to_flash);
			a.blur();
			
		},
		onFailure: function(r)
		{
			alert(r.responseText);
		}
	});

	
	event.stop();
}

if (document.addEventListener) 
{
   document.addEventListener("DOMContentLoaded", global_onload, false);
}

var form_token = '';
var form_token_time = '';
var logged_in_username = '';

/*@cc_on @*/
/*@if (@_win32)
   document.write("<script defer src='http://s.hassut.com/hassut/ie_onload.js'><"+"/script>");
/*@end @*/

window.onload = global_onload;
