
var vsc = {

	loaded: 0,

	openMenu: '',
	sessionId: '',
	menuTimout: '',
	
	userStatus: 'offline',

	activeChats: new Array(),
	
	browser: {
	    IE:     !!(window.attachEvent && !window.opera),
	    Opera:  !!window.opera,
	    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
	    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
	    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
	},
	
	elementPos: function( element ) 
	{
		element = this.$( element );
		var curleft = curtop = 0;
	
		if (element.offsetParent) 
		{
			do 
			{
				curleft += element.offsetLeft;
				curtop += element.offsetTop;
			} 
			while (element = element.offsetParent);
		}
	
		return [curleft,curtop];
	},

	elementSize: function( element ) 
	{
		element = this.$( element );
		return [element.offsetWidth,element.offsetHeight];
	},
	
	windowSize: function()
	{	
		return [ ( this.browser.WebKit && !document.evaluate) ? self['innerWidth'] : 
					(this.browser.Opera) ? document.body['clientWidth'] : document.documentElement['clientWidth'],

				(this.browser.WebKit && !document.evaluate) ? self['innerHeight'] : 
					(this.browser.Opera) ? document.body['clientHeight'] : document.documentElement['clientHeight'] ];
	},
	
	$: function( element )
	{
		if( typeof element == 'string' )
			element = document.getElementById( element );
		return element;
	},
	
	insertTop: function( element, text )
	{
		element = this.$( element );
		element.innerHTML = text + element.innerHTML;
	},

	insertBottom: function( element, text )
	{
		element = this.$( element );
		element.innerHTML = element.innerHTML + text;
	},
	
	update: function( element, text )
	{
		element = this.$( element );
		element.innerHTML = text;
	},

	addOnloadEvent: function( func )
	{
		var oldonload = window.onload;
	
		if ( typeof window.onload != 'function' )
	    	window.onload = func;
	  	else
	  	{
	    	window.onload = function()
			{
	      		if ( oldonload )
	        		oldonload();
	
	      		func();
	    	};
	  	}
	},

	/**
	* Emulate PHPs in_array function
	*/
	in_array: function( needle, haystack )
	{
		if ( ! haystack.length )
			return false;
		
	    for ( var i = 0 ; i < haystack.length ; i++)
		{
	        if ( haystack[i] === needle )
			{
	            return true;
	        }
	    }
	
	    return false;
	},

	removeElement: function( element ) {
		element = this.$( element );
		element.parentNode.removeChild( element );
	},

	changeStatus: function()
	{
		this.userStatus = (this.userStatus == 'online' ? 'offline' : 'online');

		vscStatus = new ajax_request();	
		vscStatus.process( './vschat/vschat.php?act=status&newStatus=' + this.userStatus );

		this.updateStatus( this.userStatus );
	},

	updateStatus: function( newStatus )
	{
			if(  newStatus == 'offline' )
			{
				vsc.$('vscMenuUsersHeader').style.display = 'none';
				vsc.$('vscMenuUsers').style.display = 'none';
			}
			else
			{
				vsc.$('vscMenuUsersHeader').style.display = '';
				vsc.$('vscMenuUsers').style.display = '';
			}

			for( var i = 0 ; i < this.activeChats.length ; i++ )
			{
				if( newStatus == 'online' )
				{
					this.$( 'vscMemberOnline_' + this.activeChats[ i ] ).style.display = '';
					this.$( 'vscMemberOffline_' + this.activeChats[ i ] ).style.display = 'none';
				}
				else
				{
					this.$( 'vscMemberOnline_' + this.activeChats[ i ] ).style.display = 'none';
					this.$( 'vscMemberOffline_' + this.activeChats[ i ] ).style.display = '';
				}
			}

			var viewNewStatus = (newStatus == 'online' ? 'Online' : 'Offline');
			var changeStatus = (newStatus == 'online' ? 'offline' : 'online');
			var viewChangeStatus = (changeStatus == 'online' ? 'Online' : 'Offline');

			this.update('vscMenuCurrent', viewNewStatus + " <img src='./vschat/status_" + newStatus + ".png' alt='" + viewNewStatus + "'>");
			this.update('vscMenuSet', "<img src='./vschat/status_" + changeStatus + ".png' alt='" + viewChangeStatus + "'> Set " + viewChangeStatus + "");

			this.update('vscMenuIcon', "<img src='./vschat/status_" + newStatus + ".png' alt='" + viewNewStatus + "'>");

	},

	createChat: function( userId, userName )
	{
		userId = parseInt( userId );
		if ( this.in_array( userId, this.activeChats ) )
		{
			this.showUser( userId );
			return;
		}
		
		this.activeChats[ this.activeChats.length ] = userId;

		var html = this.$('vscMember_userId').innerHTML;
		html = html.replace(/userId/g, userId);
		html = html.replace(/userName/g, userName);
		this.insertTop( this.$('vscParent'), "<div id='vscMember_"+userId+"'>"+html+"</div>" );

		this.showUser( userId );
	},

	newMessage: function( userId, userName, time, message )
	{
		convo = this.$( 'vscMemberConvo_' + userId );

		this.insertBottom(convo, "<div><strong>"+ userName + "</strong> (<em>"+ time + "</em>)<br />" + message + "</div>");

		if( this.openMenu != userId ) 
		{
			msgCount = parseInt( this.$( 'vscUserMsgCount_' + userId ).innerHTML );
			this.update( 'vscUserMsgCount_' + userId, msgCount + 1 );
		}

		convo.scrollTop = convo.scrollHeight - convo.clientHeight;
	},

	ajaxMenuUpdate: function()
	{
		do_request_function = function()
		{
			if ( ! vscUpdate.readystate_ready_and_ok() )
				return;

			var newSession = eval('(' + vscUpdate.xmlhandler.responseText + ')');

			vsc.sessionId = newSession.id;

			vsc.userStatus = newSession.status;
			vsc.updateStatus( vsc.userStatus );

			if ( vsc.userStatus == 'offline' )
			{
				vsc.menuTimeout = setTimeout("vsc.ajaxMenuUpdate()",6000);
			}
			else
			{
				for( var i = 0 ; i < newSession.activeUsers.length ; i++ )
				{
					if ( !vsc.in_array( parseInt( newSession.activeUsers[ i ][0] ), vsc.activeChats) )
					{
						vsc.createChat( newSession.activeUsers[ i ][0], newSession.activeUsers[ i ][1] );
						for( var x = 0 ; x < newSession.activeUsers[ i ][2].length ; x++ )
							vsc.newMessage( newSession.activeUsers[ i ][0], newSession.activeUsers[ i ][2][ x ][0], newSession.activeUsers[ i ][2][ x ][1], newSession.activeUsers[ i ][2][ x ][2] );
					}
					else
					{
						for( var x = 0 ; x < newSession.activeUsers[ i ][2].length ; x++ )
							vsc.newMessage( newSession.activeUsers[ i ][0], newSession.activeUsers[ i ][2][ x ][0], newSession.activeUsers[ i ][2][ x ][1], newSession.activeUsers[ i ][2][ x ][2] );
					}
				}
	
				var menuUserList = ''; 
				for( var i = 0 ; i < newSession.onlineUsers.length ; i++ )
					menuUserList += "<li onclick=\"vsc.createChat("+ newSession.onlineUsers[ i ][0] +",'"+ newSession.onlineUsers[ i ][1] +"')\">"+ newSession.onlineUsers[ i ][1] +"</li>";
	
				for( var i = 0 ; i < vsc.activeChats.length ; i++ )
				{
					online = false;

					for( var x = 0 ; x < newSession.onlineUsers.length ; x++ )
					{
						if( parseInt( newSession.onlineUsers[ i ] ) == parseInt( vsc.activeChats[ i ] ) )
						{
							online = true;
							break;
						}
					}

					if( online )
					{
						vsc.$('vscMemberStatusOne_' + vsc.activeChats[ i ] ).src = './vschat/status_online.png';
						vsc.$('vscMemberStatusTwo_' + vsc.activeChats[ i ] ).src = './vschat/status_online.png';
					}
					else
					{
						vsc.$('vscMemberStatusOne_' + vsc.activeChats[ i ] ).src = './vschat/status_offline.png';
						vsc.$('vscMemberStatusTwo_' + vsc.activeChats[ i ] ).src = './vschat/status_offline.png';
					}

				}
				
				vsc.update('vscMenuUsers', menuUserList);
				
				vsc.menuTimeout = setTimeout("vsc.ajaxMenuUpdate()",3000);
			}
		};

		if( this.menuTimeout )
			clearTimeout( this.menuTimeout );

		vscUpdate = new ajax_request();
		vscUpdate.onreadystatechange( do_request_function );

		vscUpdate.process( './vschat/vschat.php?act=update&sessionid=' + this.sessionId );
	},

	init: function()
	{
		if( use_enhanced_js )
		{
			vsc.ajaxMenuUpdate();
			vsc.copyright();
		}
		else
			this.update( 'vscParent', "<div id='vscCopyright'><a href='http://www.voltairestudios.com/' target='_blank'>VS Chat</a> requires a newer web browser.</div>" );
	},

	copyright: function()
	{
		this.update( 'vscCopyright', '<a href=\'http://www.voltairestudios.com/\' target=\'_blank\'>Otherworld Messenger - Powered by VS Chat</a>');
		setTimeout("vsc.adunit()",12000);
	},

	adunit: function()
	{
		this.update( 'vscCopyright', '<a href="http://www.xbox360gamingworld.com/forum/" target="_blank">Xbox 360 Gaming World - Uniting the World One Gamer at a Time</a><img src="http://www.lduhtrp.net/image-2531405-10494811" width="1" height="1" border="0"/>');
		setTimeout("vsc.copyright()",12000);
	},

	showMenu: function()
	{
		if( !this.loaded )
		{
			var vscMenu = this.$( 'vscMenu' );
			var vscMenuIcon = this.$( 'vscMenuIcon' );
			
			if( vscMenu.style.display != 'none' )
				vscMenu.style.display = 'none';
			else
			{
				vscMenu.style.position = 'absolute';
				vscMenu.style.left = ( this.elementPos(vscMenuIcon)[0] ) + 'px';
				vscMenu.style.top = ( this.elementPos(vscMenuIcon)[1] + this.elementSize(vscMenuIcon)[1] ) + 'px';
			
				vscMenu.style.display = '';
			}
		}
	},
	
	showUser: function( userId )
	{
		var vscMenuIcon = this.$( 'vscMemberIcon_' + userId );
		var vscMenu = this.$( 'vscMemberChat_' + userId );

		if( this.openMenu != userId )
		{	
			if( this.openMenu )
				this.$( 'vscMemberChat_' + this.openMenu).style.display='none';

			vscMenu.style.position = 'absolute';
			vscMenu.style.right = ( this.windowSize()[0] - this.elementPos(vscMenuIcon)[0] - this.elementSize(vscMenuIcon)[0] ) + 'px';
			vscMenu.style.top = ( this.elementPos(vscMenuIcon)[1] + this.elementSize(vscMenuIcon)[1] ) + 'px';
		
			vscMenu.style.display = '';

			this.update( 'vscUserMsgCount_' + userId, 0 );

			convo = this.$( 'vscMemberConvo_' + userId );
			convo.scrollTop = convo.scrollHeight - convo.clientHeight;	

			this.$( 'vscMemberInput_' + userId ).focus();
	
			this.openMenu = userId;
		}
		else if( this.openMenu )
		{
			this.$( 'vscMemberChat_' + this.openMenu).style.display='none';
			this.openMenu = '';
		}
	},
	
	closeChat: function( userId )
	{
		vscClose = new ajax_request();	
		vscClose.process( './vschat/vschat.php?act=close&id=' + userId);

		if( this.openMenu == userId )
		{
			this.$( 'vscMemberChat_' + this.openMenu).style.display='none';
			this.openMenu = '';
		}

		temp = this.activeChats;
		this.activeChats = new Array();
		for ( var i = 0 ; i < temp.length ; i++ )
		{
			if ( userId != temp[ i ] )
				this.activeChats[ this.activeChats.length ] = temp[ i ];
		}

		this.removeElement( 'vscMember_' + userId );
	},

	sendMessage: function( userId )
	{
		vscSend = new ajax_request();	
		vscSend.process( './vschat/vschat.php?act=send&to='+ userId +'&input=' + this.$( 'vscMemberInput_' + userId ).value );
	
		this.$( 'vscMemberInput_' + userId ).value='';
	}
};

vsc.addOnloadEvent( function() { vsc.init(); } );
