/**************************************************8*/
/* Manages Guest activity, and message updating		*/
/* TaPingYa - Javascript framework					*/
/* (c) 2008 - Barry Velasquez						*/
/****************************************************/

Array.prototype.compare = function(new_array) {
    if (this.length != new_array.length) return false;

	var final_array = [];
	
	// Now check each element.
    for (var i = 0; i < new_array.length; i++) {
        var a = new_array[i].id;
		var guest = new_array[i].guest;
		// Now go through old array and look for match.
		for (var j = 0; j < this.length; j++) {
			var b = this[j].id;
			var guest_b = this[j].guest;
			if (a != 0)
			{
				if (b === a) {
					final_array[i] = b
					break;
				}
			}
			else
			{
				if (guest_b === guest)
				{
					final_array[i] = guest_b
				}
			}
		}
    }
	if (final_array.length != new_array.length) {
		return false;
	}
    return true;
}

var Guests = Class.create({
	initialize: function(room_id, password, block, callbacks) {
		this.room_id = room_id;
		this.password = password;
		this.block = block;
		this.callbacks = callbacks;
		this.seconds_back = 20;
		this.interval = 30;
		this.last_json = null;
	},
	
	start: function() {
		this.updater = new PeriodicalExecuter(
			this.room_guests.bindAsEventListener(this), 
			this.interval
		);
	},
	
	stop: function() {
		this.updater = null;
	},
	
	room_guests_success: function(transport) {
		var json = transport.responseText.evalJSON();
		
		var needs_update = true;
		if (this.last_json != null)
		{
			if (this.last_json.guests.compare(json.guests) == true)
			{
				needs_update = false;
			}
		}
		this.last_json = json;
		
		if (needs_update == true)
		{
			var html = "<ul>";
		
			for (var i = 0; i < json.guests.length; i++)
			{
				var title = json.guests[i].guest
				if (json.guests[i].status.length > 0)
					title = title + ' - ' + json.guests[i].status
			
				html += '<li class="guest_row">';
				html += '<img src="/api/guest/image/get?handle_id=' + json.guests[i].id + '" width="40" height="40" title="' + title + '"></img>';
				html += '</li>';
			}
		
			html += '</ul>';
		
			this.block.innerHTML = html;
		}
	},
	
	room_guests: function() {
		new Ajax.Request('/api/room/guests', {
				method: 'get',
				parameters: { room_id: this.room_id, secondsback: this.seconds_back, password : this.password },
				onSuccess: this.room_guests_success.bindAsEventListener(this)
			}
		)
	},
	
	get_favorites_guests: function(block)
	{
		var seconds_back = 20;
		var count = 25;
		
		new Ajax.Request('/api/guests/recentfavorites', {
				method: 'get',
				parameters: { secondsback: seconds_back, count : count },
				onSuccess: function(transport) {
					var json = transport.responseText.evalJSON();
					
					if (json.guests.length > 0) {
						var html = "<ul>";
					
						for (var i = 0; i < json.guests.length; i++)
						{
							var title = json.guests[i].guest
							if (json.guests[i].status.length > 0)
								title = title + ' - ' + json.guests[i].status
								
							title = title + ' @ ' + json.guests[i].room
								
							html += '<li class="guest_row">';
							html += '<img src="/api/guest/image/get?handle_id=' + json.guests[i].id + '" width="40" height="40" title="' + title + '"></img>';
							html += '</li>';
						}
					
						html += '</ul>';
					}
					else {
						html = "<strong>Nobody is chatting in your favorite rooms.  Invite some friends!</strong>"
					}
					
					block.innerHTML = html;
					
				},
				onFailure: function(transport) {
					
				}
			}
		)
	},
	
	get_recent_guests: function(block)
	{
		var seconds_back = 20;
		var count = 25;
		
		new Ajax.Request('/api/guests/recent', {
				method: 'get',
				parameters: { secondsback: seconds_back, count : count },
				onSuccess: function(transport) {
					var json = transport.responseText.evalJSON();
					
					if (json.guests.length > 0) {
						var html = "<ul>";
					
						for (var i = 0; i < json.guests.length; i++)
						{
							var title = json.guests[i].guest
							if (json.guests[i].status.length > 0)
								title = title + ' - ' + json.guests[i].status
								
							title = title + ' @ ' + json.guests[i].room
								
							html += '<li class="guest_row">';
							html += '<img src="/api/guest/image/get?handle_id=' + json.guests[i].id + '" width="40" height="40" title="' + title + '"></img>';
							html += '</li>';
						}
					
						html += '</ul>';
					}
					else {
						html = "<strong>Join a Room, Invite Friends, and Start Chatting!</strong>"
					}
					
					block.innerHTML = html;
					
				},
				onFailure: function(transport) {
					
				}
			}
		)
	},
	
	kick_success: function(transport) {
		if (this.callbacks != null)
		{
			if (this.callbacks['kick_success_callback'] != null)
			{
				this.callbacks['kick_success_callback'](this.last_handle_id);
			}
		}
	},
	
	kick_failure: function(transport) {
		if (this.callbacks != null)
		{
			if (this.callbacks['kick_failure_callback'] != null)
			{
				this.callbacks['kick_failure_callback'](this.last_handle_id);
			}
		}
	},
	
	kick: function(id) {
		this.last_handle_id = id;
		new Ajax.Request('/api/guest/kick', {
				method: 'post',
				parameters: { room_id: this.room_id, password : this.password, handle_id: id },
				onSuccess: this.kick_success.bindAsEventListener(this),
				onFailure: this.kick_failure.bindAsEventListener(this)
			}
		)
	},
	
	// Handle guest invitations to a room.
	
	invite_success: function(transport) {
		if (this.callbacks != null)
		{
			if (transport.responseText == "0")
			{
				if (this.callbacks['invite_invalid_callback'] != null)
				{
					this.callbacks['invite_invalid_callback'](transport.responseText, this.last_handle_id);
				}
			}
			else if (transport.responseText == "1")
			{
				if (this.callbacks['invite_success_callback'] != null)
				{
					this.callbacks['invite_success_callback'](transport.responseText, this.last_handle_id);
				}
			}
			else if (transport.responseText == "2")
			{
				if (this.callbacks['invite_waiting_callback'] != null)
				{
					this.callbacks['invite_waiting_callback'](transport.responseText, this.last_handle_id);
				}
			}
		}
	},
	
	invite_failure: function(transport) {
		if (this.callbacks != null)
		{
			if (this.callbacks['invite_failure_callback'] != null)
			{
				this.callbacks['invite_failure_callback'](this.last_handle_id);
			}
		}
	},
	
	invite: function(id)
	{
		this.last_handle_id = id;
		new Ajax.Request('/api/room/invite', {
				method: 'post',
				parameters: { room_id: this.room_id, password : this.password, handle_id: id },
				onSuccess: this.invite_success.bindAsEventListener(this),
				onFailure: this.invite_failure.bindAsEventListener(this)
			}
		)
	},
	
	check_alias_success: function(transport) {
		var json = transport.responseText.evalJSON();
		if (json.status == "OK") {
			if (this.callbacks != null && this.callbacks['check_alias_callback'] != null)
			{
				this.callbacks['check_alias_callback'](true, json.alias);
			}
		}
		else {
			if (this.callbacks != null && this.callbacks['check_alias_callback'] != null)
			{
				this.callbacks['check_alias_callback'](false, '');
			}
		}
	},
	
	check_alias_failure: function(transport) {
		if (this.callbacks != null && this.callbacks['check_alias_error'] != null)
		{
			this.callbacks['check_alias_error']();
		}
	},
	
	check_alias: function(alias)
	{
		new Ajax.Request('/support/alias', {
				method: 'get',
				parameters: { alias: alias },
				onSuccess: this.check_alias_success.bindAsEventListener(this),
				onFailure: this.check_alias_failure.bindAsEventListener(this)
			}
		)
	}
})