(function ( $ )	{

	jQuery.fn.chat = function (settings)	{


			var Containers = jQuery(this);

	 		settings = jQuery.extend({  
          url: "",  
          data:"",
          prefix: "chat" ,
          button: "&gt;",
          timeout: 1000,
          isOnlinePrefix: "",
					isOnlineClass: "online",
					isNewMessage: "matchnew"
       }, settings);		

			return Containers.each(function(){  
				
				
				var $elem = jQuery(this);
				var uid = ($elem.attr("id") ? ($elem.attr("id")==settings.isOnlinePrefix ? '' : $elem.attr("id")) : '');
				var lastID = '1';
				var msgForm 		= jQuery('<form></form>');
				var msgContainer = jQuery('<div class="' + settings.prefix + '_messages"></div>');
				var msgBox  		= jQuery('<textarea name="message" class="' + settings.prefix + '_textarea"></textarea>');
				var msgButton 	= jQuery('<button name="send" class="' + settings.prefix + '_button">' + settings.button + '</button>');
				var busy = false;
				var online = false;
				/*
				* Bind event on button;
				*/
				
				msgButton
									.click(function() { checkMessage(); return false;});
				
				msgBox.keypress(checkEnter);
				$elem.append(msgForm);
				msgForm.append(msgContainer);
				msgForm.append(msgBox);
				msgForm.append(msgButton);
				
				checkOnline();
				initMessages();
				setTimeout(function() { ping(); }, settings.timeout);

				



				/*
				* Get all messages from the server thru jQuery.ajax
				* I'm using a POST en expecting XML as response
				* Limiting the amount of show messages is handled on the server
				* offcors you can make a setting of it and POST it with the Ajaxcall
				*/
				function initMessages()	{
					//alert("initMessages=true" + "&uid=" + uid + "&time="  + Math.random());
					jQuery.ajax({
						type: "POST",
						url: settings.url,
						data: "initMessages=true" + "&uid=" + uid + "&time="  + Math.random(),
						success: showMessages,
						error: showError,
						dataType: "xml"

					});
				}


				function showMessages(responseXML)	{
					//alert(lastID);
					$('message', responseXML).each(function()	{	
							
							var messageDiv = jQuery('<div class="' + settings.prefix + '_message' + jQuery(this).attr("class") + '"></div>');
							msgContainer.append(messageDiv);
							if(jQuery(this).attr("new")=='1')
								messageDiv.addClass( settings.prefix + '_new');
												
							messageDiv.append(jQuery('<div class="' + settings.prefix + '_msgName' + jQuery(this).attr("class") + '">' + jQuery(this).attr("name") + '</div>'));
							messageDiv.append(jQuery('<div class="' + settings.prefix + '_msgDate' + jQuery(this).attr("class") + '">' + jQuery(this).attr("date") + '</div>'));
							messageDiv.append(jQuery('<div class="' + settings.prefix + '_msgData' + jQuery(this).attr("class") + '">' + jQuery(this).text() + '</div>'));
						
							lastID = jQuery(this).attr("lastid");
							//window.focus();
					})
					
					setOnline(responseXML);
					
					/*
					* All messages Loaded, now scroll to the end of the page
					*
					*/
				
					if($('message', responseXML).length > 0) { scroller(); }
				}

				function sendMessage(val)	{
					
					busy = true;
					
					msgButton.attr("disabled", "disabled");
					jQuery.ajax({
						type: "POST",
						url: settings.url,
						data: "sendMessage=" + escape(val) + "&uid=" + uid + "&time=" + + Math.random(),
						success: messageSuccess,
						error: showError,
						dataType: "xml"
					
					});
					
				
				}

				function messageSuccessx(responseXML){
					msgBox.val('');
					msgButton.removeAttr('disabled');
					}

				function messageSuccess(responseXML)	{
					$('message', responseXML).each(function()	{	
							msgContainer.find('.'+ settings.prefix + '_new').removeClass(settings.prefix + '_new');
							var messageDiv = jQuery('<div class="' + settings.prefix + '_message' + jQuery(this).attr("class") + '"></div>');
							msgContainer.append(messageDiv);
							
							messageDiv.append(jQuery('<div class="' + settings.prefix + '_msgName' + jQuery(this).attr("class") + '">' + jQuery(this).attr("name") + '</div>'));
							messageDiv.append(jQuery('<div class="' + settings.prefix + '_msgDate' + jQuery(this).attr("class") + '">' + jQuery(this).attr("date") + '</div>'));
							messageDiv.append(jQuery('<div class="' + settings.prefix + '_msgData' + jQuery(this).attr("class") + '">' + jQuery(this).text() + '</div>'));
						
						
							lastID = jQuery(this).attr("lastid");
							window.focus();
					})
					//msgContainer.remove();
					//alert(msgContainer.children().length);
					
					
					
					
					msgBox.val('');
					msgButton.removeAttr('disabled');
					scroller();
					busy = false;
				}

				function setOnline(responseXML)	{
					
					$('online', responseXML).each(function()	{	
					
						if(jQuery(this).attr("value") == "true")	{
							jQuery('#' + settings.isOnlinePrefix + uid).addClass(settings.isOnlineClass);
							online = true;
						}	else	{
							jQuery('#' + settings.isOnlinePrefix + uid).removeClass(settings.isOnlineClass);
							online = false;
						}
					})
				
				}


				function showError(responseHTML)	{
					//alert("Error" + responseHTML);
				}



				function scroller()	{ 
					jQuery(document).ready(function() {
						msgContainer.stop().scrollTo('div:last', {speed:1000});
					});
				}

				function checkMessage()	{
					
					if(msgBox.val() != '')	{
						msgBox.removeClass("error");
						sendMessage(msgBox.val());
					}	else	{
						msgBox.addClass("error");
					}
				}

				function checkEnter(e)	{
					
					//alert(e.which);
					if(e.which == 13)	{
						checkMessage();
						return false;
					}
				}


				function ping()	{
						if(busy == false && online == true)	{
							jQuery.ajax({
								type: "POST",
								url: settings.url,
								data: "checkMessages=" + Math.random() + "&uid=" + uid + "&lastid=" + lastID,
								success: showMessages,
								error: showError,
								dataType: "xml"
							
							});						
						}
						setTimeout(function() { ping(); }, settings.timeout);
				}		
				
				function checkOnline()	{
						
						
						if(busy == false && online == false)	{
							
							jQuery.ajax({
								type: "POST",
								url: settings.url,
								data: "checkOnline=" + Math.random() + "&uid=" + uid ,
								success: setOnline,
								error: showError,
								dataType: "xml"
							
							});						
						}
						setTimeout(function() { checkOnline(); }, 30000);
				}		


				
			});

			


	}


})(jQuery); 
