/**
 * class	SparkleChat
 * author	Paul Kruijt
 */
var SparkleChat = new Class({
	
	/**
	 * initialize
	 * @param	string	content_url
	 * @param	integer	width
	 * @param	integer	height
	 * @return	void
	 */
	initialize: function(content_url, width, height)
	{
		// nodes
		this.document_node		= document.getElement('body');
		this.overlay_node		= $('overlay');
		this.popup_loader_node	= $('popup_loader');
		this.popup_filter_node	= $('popup_filter_alt');
		this.popup_other_node	= $('popup');
		this.popup_node			= $('popup_alt');
		this.content_node		= $('popup_content_alt');
		
		// classes
		this.class_close		= 'close';
		this.class_error		= 'error';
		
		// settings
		this.content_url		= content_url;
		this.width				= width;
		this.height				= height;
		
		// vars
		this.timer_check	= null;
		this.interval_check	= 2000;
		
		// init chat
		this.start();
	},
	
	/**
	 * start
	 * @return	void
	 */
	start: function()
	{
		// check for new chats
		this.checkTimer();
	},
	
	/**
	 * check timer
	 * @return	void
	 */
	checkTimer: function(chat_id, member_id)
	{
		var _this = this;
		
		this.timer_check = setTimeout(
			function ()
			{
				_this.checkRequest(chat_id, member_id);
			}
			, this.interval_check
		);
	},
	
	/**
	 * check request
	 * @return	void
	 */
	checkRequest: function(chat_id, member_id)
	{
		// set vars
		var _this		= this;
		var url_params	= '';
		
		if (chat_id && !member_id)
		{
			url_params = '?chat_id='+chat_id;
		}
		else if (!chat_id && member_id)
		{
			url_params = '?member_id='+member_id;
		}
		else if (chat_id && member_id)
		{
			url_params = '?chat_id='+chat_id+'&member_id='+member_id;
		}
		
		// make request
		var http_request = new Request({
			url			: this.content_url + url_params,
			onRequest	: function()
			{
				
			},
			onSuccess	: function(responseText, responseXML)
			{
				// decode JSON string and Hash it (nerd) :-P
				var json_data = new Hash(JSON.decode(responseText));
				
				// start chat session
				if (json_data.has('start_html') && json_data.has('content_html') && json_data.has('end_html'))
				{
					// check if popup exists
					if (_this.overlay_node && _this.popup_node && _this.popup_other_node)
					{
						// check if other popup is active (don't show chat if it is)
						var display_popup_other	= _this.popup_other_node.getStyle('display');
						
						if (display_popup_other != 'block')
						{
							var display_popup		= _this.popup_node.getStyle('display');
							var start_html			= json_data.get('start_html');
							var content_html		= json_data.get('content_html');
							var end_html			= json_data.get('end_html');
							var popup_html			= display_popup == 'block' ? content_html : start_html + content_html + end_html;
							
							// set dimensions
							_this.dimensions();
							
							// show
							_this.overlay_node.setStyle('display', 'block');
							
							// load content
							if (display_popup == 'block')
							{
								var messages_node = $('chat_messages');
								
								if (messages_node)
								{
									messages_node.innerHTML = popup_html;
									
									var messages_size			= messages_node.getSize();
									var messages_scroll_size	= messages_node.getScrollSize();
									var messages_scrolled		= messages_node.getScroll();
									var last_item_size			= 0;
									
									// get last item wrapper height
									var item_nodes			= messages_node.getElements('.item');
									var total_item_nodes	= item_nodes.length;
									
									if (total_item_nodes > 0)
									{
										var last_item_node = item_nodes.getLast();
										
										if (last_item_node)
										{
											var last_item_margin	= last_item_node.getStyle('margin-bottom').toInt();
											var last_item_size		= last_item_node.getSize();
											var last_item_size		= last_item_size.y.toInt() + last_item_margin;
										}
									}
									
									//alert('('+messages_scroll_size.y+' - '+messages_size.y+') == ('+messages_scrolled.y+' + '+last_item_size+')');
									
									// scroll to bottom
									if ((messages_scroll_size.y - messages_size.y) == (messages_scrolled.y + last_item_size))
									{
										var scroll_effect = new Fx.Scroll(messages_node).toBottom();
									}
								}
							}
							else
							{
								_this.content_node.innerHTML = popup_html;
							}
							
							// show popup
							_this.popup_node.setStyle('display', 'block');
							
							// set events
							_this.setEvents();
							
							// set form events
							_this.setFormEvents();
						}
					}
				}
				
				// session closed
				else if (json_data.has('chat_ended'))
				{
					// hide popup
					_this.hide();
					
					clearTimeout(_this.timer_check);
					
					var chat_ended_feedback = json_data.get('chat_ended');
					form_alert.show(chat_ended_feedback);
				}
				
				// request new timer
				if (!json_data.has('chat_ended'))
				{
					if (json_data.has('chat_id'))	var chat_id		= json_data.get('chat_id');
					if (json_data.has('member_id'))	var member_id	= json_data.get('member_id');
					
					_this.checkTimer(chat_id, member_id);
				}
			}
		});
		
		http_request.get();
	},
	
	/**
	 * set events
	 * @return	void
	 */
	setEvents: function()
	{
		var _this				= this;
		var button_close_node	= this.popup_node.getElement('.'+this.class_close);
		
		this.overlay_node.removeEvents();
		
		if (button_close_node)
		{
			button_close_node.removeEvents();
			button_close_node.addEvents(
			{
				'click' : function()
				{
					if (confirm('Weet je zeker dat je deze chatsessie wilt sluiten?'))
					{
						var http_request = new Request({
							url			: '../http/chat_close.php',
							onRequest	: function()
							{
								// create loader
								_this.popup_loader_node.setStyle('display', 'block');
								
								clearTimeout(_this.timer_check);
							},
							onSuccess	: function(responseText, responseXML)
							{
								// remove loader
								_this.popup_loader_node.setStyle('display', 'none');
								
								// decode JSON string and Hash it (nerd) :-P
								var json_data = new Hash(JSON.decode(responseText));
								
								// session closed
								if (json_data.has('chat_ended'))
								{
									// hide popup
									_this.hide();
									
									var chat_ended_feedback = json_data.get('chat_ended');
									form_alert.show(chat_ended_feedback);
								}
							}
						});
						
						http_request.get();
					}
					
					return false;
				}	
			});
		}
		else
		{
			this.overlay_node.addEvents(
			{
				'click' : function()
				{
					_this.hide();
					
					return false;
				}	
			});
		}
		
		var message_input_node = $('chat_message_input');
		
		if (message_input_node)
		{
			var message_textarea_node = message_input_node.getElement('textarea');
			
			if (message_textarea_node)
			{
				message_textarea_node.removeEvents();
				message_textarea_node.addEvents(
				{
					'focus' : function()
					{
						this.setStyle('background', '#fff');
					},
					
					'keydown' : function(event)
					{
						if (!event.shift && event.key == 'enter')
						{
							if (this.value != '')
							{
								// check for form data
								var form_node = _this.content_node.getElement('form');
								
								if (form_node)
								{
									// send form (ajax)
									form_node.set('send',
									{
										onRequest: function()
										{
											// show loader
											_this.popup_loader_node.setStyle('display', 'block');
											
											// show filter
											_this.popup_filter_node.setStyle('display', 'block');
										},
										onSuccess: function(data)
										{
											// hide loader
											_this.popup_loader_node.setStyle('display', 'none');
											
											// hide filter
											_this.popup_filter_node.setStyle('display', 'none');
											
											// scroll to bottom
											var messages_node = $('chat_messages');
											if (messages_node) var scroll_effect = new Fx.Scroll(messages_node).toBottom();
										}
									});
									
									form_node.send();
								}
							}
							else
							{
								return false;
							}
							
							this.value = '';
						}
					},
					
					'keyup' : function(event)
					{
						if (!event.shift && event.key == 'enter')
						{
							this.value = '';
						}
					}
				});
			}
		}
	},
	
	/**
	 * dimensions
	 * @return	void
	 */
	dimensions: function()
	{
		if (this.width && this.height)
		{
			if (this.width) this.popup_node.setStyle('width', this.width + 'px');
			if (this.height) this.popup_node.setStyle('height', this.height + 'px');
			
			// set position
			this.position();
		}
	},
	
	/**
	 * position
	 * @return	void
	 */
	position: function()
	{
		var margin_left	= Math.floor(this.width / 2).toInt();
		var margin_top	= Math.floor(this.height / 2).toInt();
		
		this.popup_node.setStyle('margin-left', '-'+margin_left+'px');
		this.popup_node.setStyle('margin-top', '-'+margin_top+'px');
	},
	
	/**
	 * load content with an Ajax request
	 * @param	string	str_params_url
	 * @return	void
	 */
	loadContent: function(str_params_url)
	{
		var _this = this;
		
		var content_url = str_params_url ? this.content_url + str_params_url : this.content_url;
		
		// make request
		var http_request = new Request({
			url			: content_url,
			onRequest	: function()
			{
			_this.popup_loader_node.setStyle('display', 'block');
			},
			onSuccess	: function(responseText, responseXML)
			{
				// decode JSON string and Hash it (nerd) :-P
				var json_data = new Hash(JSON.decode(responseText));
				
				// start chat session
				if (json_data.has('start_html') && json_data.has('content_html') && json_data.has('end_html'))
				{
					var start_html		= json_data.get('start_html');
					var content_html	= json_data.get('content_html');
					var end_html		= json_data.get('end_html');
					var popup_html		= start_html + content_html + end_html;
					
					// remove loader
					_this.popup_loader_node.setStyle('display', 'none');
					
					// show popup
					_this.popup_node.setStyle('display', 'block');
					
					_this.content_node.innerHTML = popup_html;
					
					// set form events
					_this.setFormEvents();
				}
			}
		});
		
		http_request.get();
	},
	
	/**
	 * show
	 * @param	string	str_params_url
	 * @return	void
	 */
	show: function(str_params_url)
	{
		if (this.overlay_node && this.popup_node)
		{
			// set events
			this.setEvents();
			
			// set dimensions
			this.dimensions();
			
			// show
			this.overlay_node.setStyle('display', 'block');
			
			// load content
			this.loadContent(str_params_url);
		}
	},
	
	/**
	 * hide
	 * @return	void
	 */
	hide: function()
	{
		// hide
		if (this.overlay_node)		this.overlay_node.setStyle('display', 'none');
		if (this.popup_node)		this.popup_node.setStyle('display', 'none');
		if (this.popup_filter_node) this.popup_filter_node.setStyle('display', 'none');
		if (this.popup_loader_node) this.popup_loader_node.setStyle('display', 'none');
	},
	
	/**
	 * set form events
	 * @return	void
	 */
	setFormEvents: function()
	{
		// set vars
		var _this = this;
		
		// check for form data
		var form_node = this.content_node.getElement('form');
		
		if (form_node)
		{
			// get submit anchor
			var submit_node = form_node.getElement('.submit');
			
			if (submit_node)
			{
				submit_node.removeEvents();
				submit_node.addEvents(
				{
					'click' : function()
					{
						// send form (ajax)
						form_node.set('send',
						{
							onRequest: function()
							{
								// show loader
								_this.popup_loader_node.setStyle('display', 'block');
								
								// show filter
								_this.popup_filter_node.setStyle('display', 'block');
							},
							onSuccess: function(data)
							{
								// hide loader
								_this.popup_loader_node.setStyle('display', 'none');
								
								// hide filter
								_this.popup_filter_node.setStyle('display', 'none');
								
								var message_input_node = $('chat_message_input');
								
								if (message_input_node)
								{
									var message_textarea_node = message_input_node.getElement('textarea');
									
									if (message_textarea_node) message_textarea_node.value = '';
								}
							}
						});
						
						form_node.send();
						
						return false;
					}
				});
			}
		}
	}
});
