dojo.require("dicole.event_source.ServerConnection");

var get_comments_url = null;
var subscription_queue = [];
var event_server_connection = new dicole.event_source.ServerConnection(dicole.get_global_variable("event_server_url"));
var session = null;
var polling = false;

dojo.addOnLoad( function() { process_comments_containers() } );
dojo.addOnLoad( function() { process_comments_messages() } );

dojo.addOnLoad( function() { 
	var instant_authorization_key_url = dicole.get_global_variable("instant_authorization_key_url");
	var domain_host = dicole.get_global_variable("domain_host");
	var comments_container = dojo.query(".comments_container")[0];
	get_comments_url = dojo.attr(comments_container, "title");
	dojo.removeAttr(comments_container, "title");
	dojo.xhrPost({
		"url": instant_authorization_key_url,
		"handleAs": "json",
		"handle": function(response) {
			event_server_connection.open(domain_host, {"token": response.result}, function(response) {
				session = response.result.session;
				dojo.forEach(subscription_queue, function(subscription) {
					subscription["session"] = session;
					event_server_connection.subscribe(subscription);
				});
			});
			
			setTimeout(function() {
				poll_event_server();
				setTimeout(arguments.callee, 5000);
			}, 5000);
		}
	}); 
});

dojo.addOnWindowUnload( function() { try { event_server_connection.close(); } catch(error) {} } );

function poll_event_server() {
	if(polling) return;
	polling = true;
	event_server_connection.poll(1, function(response) {
		for(var name in response.result) {
			if(response.result[name]['new'].length) {
				dojo.xhrPost({
					"url": get_comments_url,
					"handleAs": "json",
					"content": {"thread_id": name},
					"handle": function(response) {
						if ( response.messages_html ) {
							var messages_container = dojo.byId( 'comments_messages_container_' + name );
							if ( ! messages_container ) return;
							messages_container.innerHTML = response.messages_html;
							process_comments_messages();
						}
					}
				});
			}
		}
		polling = false;
	});
}

var dicole_comments_comment_is_on_the_way = 0;

function process_comments_containers() {
	dojo.query('.comments_container').forEach( function ( comments ) {
		if ( dojo.hasClass( comments, 'comments_container_processed' ) ) return;
		dojo.addClass( comments, 'comments_container_processed' );
		var parts = comments.id.match(/^comments_container_(\d+)$/);
		if ( ! parts || ! parts[1] ) return;
		
		var thread_id = parts[1];
		var content_submit = dojo.byId( 'comments_submit_' + thread_id );
		
		if ( ! content_submit ) return;
		
		subscription_queue.push({
			"name": thread_id,
			"limit_topics": [["comment_thread:" + thread_id]] 
		});
		
		connect_submit( content_submit, thread_id );
	} );
}

function connect_submit( content_submit, thread_id ) {
	dojo.connect( content_submit, 'onclick', function( evt ) {
		evt.preventDefault();

		if ( dicole_comments_comment_is_on_the_way == 1 ) return;

		var content = tinyMCE.get('comments_content_' + thread_id ).getContent();
		if ( ! content || content == '<p></p>' ) return;
		var f_anon_name = dojo.byId('comments_anon_name_' + thread_id );
		var f_anon_email = dojo.byId('comments_anon_email_' + thread_id );
		var f_anon_url = dojo.byId('comments_anon_url_' + thread_id );

		dicole_comments_comment_is_on_the_way = 1;

		dojo.xhrPost({
			url: content_submit.href,
			handleAs: "json",
			content : {
				anon_name : f_anon_name ? f_anon_name.value : '',
				anon_email : f_anon_email ? f_anon_email.value : '',
				anon_url : f_anon_url ? f_anon_url.value : '',
				content : content,
				thread_id : thread_id
			},
			load: function(data) {
				dicole_comments_comment_is_on_the_way = 0;
				if ( data.messages_html ) {
					tinyMCE.get('comments_content_' + thread_id ).setContent('<p></p>');
					var messages_container = dojo.byId( 'comments_messages_container_' + thread_id );
					if ( ! messages_container ) return;
					messages_container.innerHTML = data.messages_html;
					process_comments_messages();
				}
				else if ( data.error_string ) {
					alert( data.error_string );
				}
				else if ( data.error ) {
					if ( data.error.indexOf( 'security error' ) > -1 ) {
						alert( 'A security error occured while sending the message. This might be due to a lost session. Please copy your comment text to a safe location and try again after refreshing the page.' );
					}
					else {
						alert( 'Unprepared error occured while sending comment. Please copy your comment text to a safe location and try again after refreshing the page' );
					}
				}
			},
			error: function(error) {
				dicole_comments_comment_is_on_the_way = 0;
				alert('Unknown error while sending comment. Please try again.');
			}
		});
	} );
}

function process_comments_messages() {	
	dojo.query('.comments_message').forEach(function(comment) {
		if ( dojo.hasClass( comment, 'comments_message_processed' ) ) return;
		dojo.addClass( comment, 'comments_message_processed' );
		var parts = dojo.attr(comment, 'id').match(/^comments_message_(\d+)_(\d+)$/);
		if ( ! parts || ! parts[1] || ! parts[2] ) return;
		
		var thread_id = parts[1];
		var post_id = parts[2];
		
		var comment_message_truncated = dojo.byId('comment_message_truncated_' + post_id);
		if(comment_message_truncated) {
			var comment_message = dojo.byId('comment_message_' + post_id);
			var show_more_button = dojo.byId('comment_message_show_more_' + post_id);
			var hide_more_button = dojo.byId('comment_message_hide_more_' + post_id);
			
			dojo.style(comment_message, 'display', 'none');
			
			dojo.connect(show_more_button, 'onclick', function(event) {
				dojo.stopEvent(event);
				dojo.style(comment_message, 'display', 'block');
				dojo.style(comment_message_truncated, 'display', 'none');
			});
			
			dojo.connect(hide_more_button, 'onclick', function(event) {
				dojo.stopEvent(event);
				dojo.style(comment_message, 'display', 'none');
				dojo.style(comment_message_truncated, 'display', 'block');	
			});
		}
		
		var delete_button = dojo.byId( 'comments_delete_' + post_id );
		if ( ! delete_button ) return;
		connect_delete( delete_button, thread_id, post_id );
	});
}

function connect_delete( delete_button, thread_id, post_id ) {
	dojo.connect( delete_button, 'onclick', function( evt ) {
		evt.preventDefault();
		
		var confirm_container = dojo.byId('comment_confirm_container_' + post_id);
		dojo.attr(delete_button, 'style', {display: 'none'});
		dojo.attr(confirm_container, 'style', {display: 'block'});
		
		dojo.connect(dojo.byId('comment_confirm_delete_' + post_id), 'onclick', function(evt) {
			evt.preventDefault();
			dojo.xhrPost({
				url: delete_button.href,
				handleAs: "json",
				content : {
					post_id : post_id,
					thread_id : thread_id
				},
				load: function(data, evt) {
					var messages_container = dojo.byId( 'comments_messages_container_' + thread_id );
					if ( ! messages_container ) return;
					messages_container.innerHTML = data.messages_html;
					process_comments_messages();
				},
				error: function(type, error) {
					alert('Error deleting comment. Please try again.');
				}
			});
		});
		
		dojo.connect(dojo.byId('comment_confirm_cancel_' + post_id), 'onclick', function(evt) {
			evt.preventDefault();
			dojo.attr(delete_button, 'style', {display: 'inline'});
			dojo.attr(confirm_container, 'style', {display: 'none'});
		});
	} );
}

