﻿cb_AttachEvent( window, "load", cb_DelayedLoad );

var cb_checkStatusHandle = 0;

var cb_usersWidth = 0;
var cb_messagesWidth = 0;
var cb_lastStatusCount = 0;
var cb_sentOneOffInfo = false;
var cb_pollInterval = 2500;					// Check the status every 2.5 seconds.
var cb_messageCount = 0;

var cb_savingMessage = false;
var cb_leaveLastMessage = false;		// Should we clear out the user's text? We want to leave it when there's an error so the user doesn't have to retype their line.

var cb_Profile = new cb_DialogBox( "profile" );
var cb_Emoticons = new cb_DialogBox( "emoticons" );

var cb_resourcePath = cb_serverUrl + "_Toy/";
var cb_isLoading = false;


function cb_GetServiceUrl() {

	var serviceUrl = cb_resourcePath + "Chat.ashx?ut=" + cb_userToyKey + "&0=" + cb_lastStatusCount;
	return serviceUrl;
	
} // cb_GetServiceUrl



var cb_delayedLoadCount = 0;
function cb_DelayedLoad() {

	var messages = cb_GetElement( "messages" );
	if( cb_delayedLoadCount < 10 && messages.offsetWidth == 0 ) {
	
		cb_delayedLoadCount++;
		window.setTimeout( cb_DelayedLoad, 250 );
		return;	
		
	}

	cb_Load();
	
} //



function cb_Load() {

	cb_AttachEvent( window, "resize", cb_Resize );
	
	cb_Resize();

	var txtMessage = cb_GetElement( "txtMessage" );

	cb_AttachEvent( txtMessage, "keydown", cb_txtMessage_OnKeyDown );
	cb_AttachEvent( cb_GetElement( "btnSaveMessage" ), "click", cb_btnSaveMessage_OnClick );
	cb_AttachEvent( cb_GetElement( "imgEmoticons" ), "click", cb_imgEmoticons_OnClick );
	
	var imgSound = cb_GetElement( "imgSound" );
	if( imgSound != null )
		cb_AttachEvent( imgSound, "click", cb_ToggleSoundStatus );

	cb_SetUIOpacity();
	
	cb_LoadPeripheralEvents();
	
	// cb_Profile.initialize();
	cb_Emoticons.initialize();
	
	// Load the initial information from the supplied variable.
	cb_LoadInitialStatus();

	cb_LoadOptions();
	
	// Initialize the timer.
	cb_ResetCheckStatusTimer();

} // cb_Load



function cb_EnforceDimensions() {
// Since FF doesn't ever work correctly, we have to force the max height on our scroll regions.

	var users = cb_GetElement( "users" );
	if( users != null ) {
		users.style.maxHeight = Math.max( users.clientHeight - 1, 0 );
		users.style.width = "auto";
		cb_usersWidth = users.offsetWidth;
	}
		
	var messages = cb_GetElement( "messages" );
	if( messages != null ) {
		messages.style.maxHeight = Math.max( messages.clientHeight - 1, 0 );
		messages.style.width = "auto";
		cb_messagesWidth = messages.offsetWidth;
	}

} // cb_EnforceDimensions



function cb_txtMessage_OnKeyDown( passedEvent ) {

	var keyCode;

	if( document.all )
		keyCode = event.keyCode;
	else
		keyCode = passedEvent.keyCode;

	if( keyCode == 13 ) {

		cb_SaveMessage();
		
		if( document.all )
			return false;
		
	} // if( keyCode == 13 )

} // cb_txtMessage_OnKeyDown



function cb_btnSaveMessage_OnClick() {
	cb_SaveMessage();
} // cb_btnSaveMessage_OnClick



function cb_imgEmoticons_OnClick() {

	cb_Emoticons.setVisibility( true );

	var emoticons = cb_GetElement( "emoticons" );
	var imgEmoticonList = emoticons.getElementsByTagName( "img" );
	
	for( var emoticonIndex = 0; emoticonIndex < imgEmoticonList.length; emoticonIndex++ )
		imgEmoticonList[ emoticonIndex ].src = imgEmoticonList[ emoticonIndex ].getAttribute( "delayedSrc" );

} // cb_imgEmoticons_OnClick



function cb_LoadInitialStatus() {

  cb_isLoading = true;

	cb_ProcessStatusResponse( cb_statusText );
	
	cb_ScrollMessages( true );
	
	cb_isLoading = false;

} // cb_LoadInitialStatus



function cb_checkStatusHandler() {
	cb_CheckStatus();
} // cb_checkStatusHandler



function cb_SaveMessage() {

	cb_ClearCheckStatusTimer();

	var txtMessage = cb_GetElement( "txtMessage" );
	var message = txtMessage.value.trim();
	if( message.trim().length > 0 ) {

		cb_leaveLastMessage = false;

		cb_DisableInput( true );
		cb_savingMessage = true;
		
		cb_CheckStatus( message );
		
	} else {

		cb_ResetCheckStatusTimer();

	}

} // cb_SaveMessage



function cb_CheckStatus( message ) {

	var navigateUrl = cb_GetServiceUrl();
	var statusText = cb_GetStatusText( message );
	var method = statusText == null ? "GET" : "POST";
	
	var xmlHttp = cb_GetXmlHttp();
	
	xmlHttp.open( method, navigateUrl, true );
	xmlHttp.onreadystatechange = function() { cb_xmlHttp_OnReadyState( xmlHttp ); };
	xmlHttp.setRequestHeader( "User-Agent", "-" );
	xmlHttp.send( statusText );

} //



function cb_xmlHttp_OnReadyState( xmlHttp ) {

	if( xmlHttp.readyState != 4 )
		return;
		
	var statusCode = xmlHttp.status;
	
	switch( statusCode ) {
		case 200:
			// Check to see if the response to our message contains some new messages.
			cb_ProcessStatusResponse( xmlHttp.responseText );
			break;
			
		case 201:
			// When we get a status containing no information, it'll be a 201.
			break;
			
		case 400:
			window.location = cb_resourcePath + "Error.aspx?ut=" + cb_userToyKey + "&Status=" + xmlHttp.status + "&StatusText=" + xmlHttp.statusText;
			break;
			
		case 500:
			break;
			
		case 12029:
		case 12030:
		case 12031:
			alert( "Your chat session is being affected by a slow internet connection. Please try again later." );
			break;
			
		default:
			cb_leaveLastMessage = true;
			alert( "Server error " + statusCode + " - " + xmlHttp.statusText ); 
			break;
			
	} // switch
	
	delete xmlHttp[ "onreadystatechange" ];

	cb_ResetCheckStatusTimer();
	
} //



function cb_LoadProfile( userKey ) {

	if( userKey.substring( 0, 1 ) == "-" ) {
	
		alert( "You have clicked on an anonymous user.\r\n\r\nAnonymous users cannot have profiles." );
		
	} else {

		open( "http://www.coolwebchat.com/Users/ViewProfile.aspx?ChatUser=" + userKey, "_blank" );

	}

} // cb_LoadProfile



function cb_ProcessStatusResponse( responseText ) {

	var items = responseText.split( "\n" );
	
	for( var itemIndex = 0; itemIndex < items.length; itemIndex++ ) {

		if( items[ itemIndex ].length == 0 )
			continue;
	
		var item = items[ itemIndex ];

		var spaceIndex = item.indexOf( " " );

		var identifier = item.substring( 0, spaceIndex );
		var type = identifier.substring( 0, 1 );
		var sequence = identifier.substring( 1 );
		
		var text = item.substring( spaceIndex + 1 );
		
		switch( type ) {
			case "0":
				cb_ProcessStatus( sequence, text );
				break;
				
			case "a":
				cb_ProcessAd( sequence, text );
				break;

			case "m":
				cb_ProcessMessage( sequence, text );
				break;
				
			case "p":
				cb_ProcessProfile( sequence, text );
				break;

			case "s":
				cb_ProcessSystemMessage( sequence, text );
				break;
				
			case "t":
				cb_ProcessTopic( sequence, text );
				break;

			case "u":
				cb_ProcessUser( sequence, text );
				break;
				
			case "x":
				cb_ProcessErrorMessage( sequence, text );
				break;
				
		} // switch( type )
		
	} // for( itemIndex...
	
	if( cb_savingMessage ) {
	
		cb_DisableInput( false );

		var txtMessage = cb_GetElement( "txtMessage" );

		if( !cb_leaveLastMessage ) {
		
			// Clear out the existing message.
			txtMessage.value = "";
				
		} // if( !cb_leaveLastMessage )

		txtMessage.focus();
		
		cb_savingMessage = false;
		
	} // if( cb_savingMessage )
	
} // ProcessStatusResponse



function cb_ProcessUser( sequence, userBlob ) {

	var users = cb_GetElement( "users" );

	if( sequence == -1 ) {
	
		var userItems = userBlob.split( "\t" );
		var currentUserCount = userItems[ 0 ];
		var hasNewUsers = userItems[ 1 ] == "1";

		if( hasNewUsers )
			cb_PlaySound( "user" );
			
		// Clear the user list so we can replace it with the new list.
		users.innerHTML = "";
		
	} else {

		users.appendChild( cb_GetUserDiv( userBlob ) );
		
	} // if( sequence == -1 )

} // cb_ProcessUser



function cb_ProcessMessage( sequence, messageBlob ) {

	if( sequence == -1 ) {

		var messageItems = messageBlob.split( "\t" );
		var messageCount = messageItems[ 0 ];

		cb_PlaySound( "message" );
		
	} else {
	
		var messages = cb_GetElement( "messages" );

		// Pop older messages off the top.
		while( messages.childNodes.length >= 75 )
			messages.removeChild( messages.childNodes[ 0 ] );

		var messageDiv = cb_GetMessageDiv( messageBlob );
		messages.appendChild( messageDiv );
		
		if( !cb_isLoading )
      Fat.fade_element( messageDiv.id, 30, 500, "#3366cc" );
		
		cb_ScrollMessages();
		
	} // if( sequence == -1 )

} // cb_ProcessMessage



function cb_ProcessSystemMessage( sequence, blob ) {

	if( sequence == -1 ) {

		cb_PlaySound( "message" );
		
	} else {

		var messages = cb_GetElement( "messages" );

		// Pop older messages off the top.
		while( messages.childNodes.length >= 75 )
			messages.removeChild( messages.childNodes[ 0 ] );

		var systemMessageDiv = cb_GetSystemMessageDiv( blob );
		messages.appendChild( systemMessageDiv );
		
		if( !cb_isLoading )
      Fat.fade_element( systemMessageDiv.id, 30, 1500, "#ffffff" );
		
		cb_ScrollMessages();
		
	} // if( sequence == -1 )

} // cb_ProcessSystemMessage



function cb_ProcessProfile( sequence, profileBlob ) {

	if( sequence == -1 ) {

		cb_Profile.clearAll();
		cb_Profile.setVisibility( true );
		
		var profileItems = profileBlob.split( "\t" );
		
		var displayName = profileItems[ 1 ];
		var spritePath = profileItems[ 2 ];
		var spriteImage = "<img src=\"" + spritePath + "\" alt=\"" + displayName + "\" class=\"sprite\" />";
		
		cb_Profile.setTitle( "Profile for " + displayName );
		cb_Profile.addBodyItem( "User Image\t" + spriteImage );
		
	} else {

		cb_Profile.addBodyItem( profileBlob );

	}

} // cb_ProcessProfile



function cb_ProcessAd( sequence, adBlob ) {

	if( sequence == -1 ) {
	
	} else {

		var messages = cb_GetElement( "messages" );
		messages.appendChild( cb_GetAdDiv( adBlob ) );
		
		cb_ScrollMessages();

	} // if( sequence == -1 )

} // cb_ProcessAd



function cb_ProcessTopic( sequence, topicBlob ) {

	if( sequence == -1 ) {
	
		var items = topicBlob.split( "\t" );
		var topic = cb_GetElement( "topic" );

		topic.innerHTML = cb_GetForcedWordWrap( items[ 0 ] );
		
		if( !cb_isLoading )
      Fat.fade_element( topic.id, 30, 500, cb_bodyForegroundColor, cb_bodyBackgroundColor );

		cb_ScrollMessages();
		
	} // if( sequence == - 1 )
	
} // cb_ProcessTopic



function cb_ProcessErrorMessage( sequence, errorMessageBlob ) {

	var errorItems = errorMessageBlob.split( "\t" );
	var leaveLastMessage = errorItems[ 0 ] == "True";
	var redirectToErrorPage = errorItems[ 1 ] == "True";
	var message = errorItems[ 2 ];

	message = message.replace( /\\r/g, "\r" );
	message = message.replace( /\\n/g, "\n" );

	cb_leaveLastMessage = leaveLastMessage;

	if( redirectToErrorPage )
		window.location = cb_resourcePath + "Error.aspx?ut=" + cb_userToyKey + "&StatusText=" + message;
	else
		alert( message );

} // cb_ProcessErrorMessage



function cb_ProcessStatus( sequence, blob ) {

	var blobItems = blob.split( "\t" );
	var statusCount = eval( blobItems[ 0 ] );
	
	if( statusCount < cb_lastStatusCount ) {
	
		// Trigger the one-off info to be resent to the server.
		cb_sentOneOffInfo = false;
		
	} // if( statusCount < cb_lastStatusCount )
	
	cb_lastStatusCount = statusCount;
	
} // cb_ProcessStatus



function cb_Resize() {

	cb_EnforceDimensions();
	cb_ScrollMessages();
	
	// Set the width of txtMessage.
	var txtMessage = cb_GetElement( "txtMessage" );
	if( txtMessage != null ) {
		var width = cb_GetElement( "messageEntry" ).offsetWidth - 200;
		txtMessage.style.width = Math.max( 100, width );
	}

} // cb_Resize



function cb_ScrollMessages( forceScroll ) {

	var messages = cb_GetElement( "messages" );
	messages.style.width = cb_messagesWidth;

	var shouldScroll = false;
	
	if( messages.childNodes.length > 1 ) {
		var lastMessageHeight = messages.childNodes[ messages.childNodes.length - 1 ].scrollHeight;
		shouldScroll = ( ( messages.scrollHeight - messages.scrollTop ) - messages.clientHeight ) <= lastMessageHeight * 2;
	}
	
	if( shouldScroll || forceScroll ) {
		messages.scrollTop = 999999;
		messages.scrollTop = 999999;
	}
	
} // cb_ScrollMessages



function cb_GetStatusText( messageText ) {

	var statusText = "";

	if( cb_sentOneOffInfo == false ) {
	
		var localTime = new Date();
		statusText += "r " + cb_referringUrl + "\n";
		statusText += "z " + localTime.getTimezoneOffset() + "\n";
		
		cb_sentOneOffInfo = true;
		
	} // if( cb_sentOneOffInfo == false )

	if( messageText != null && messageText.length > 0 )
		statusText += "m " + messageText + "\n";
		
	if( statusText.length == 0 )
		statusText = null;

	return statusText;

} // cb_GetStatusText



function cb_ClearCheckStatusTimer() {

	if( cb_checkStatusHandle ) {
		window.clearTimeout( cb_checkStatusHandle );
		cb_checkStatusHandle = 0;
	}
	
} //



function cb_ResetCheckStatusTimer() {

	cb_ClearCheckStatusTimer();
	cb_checkStatusHandle = window.setTimeout( cb_checkStatusHandler, cb_pollInterval );
	
} // 



function cb_DisableInput( shouldDisable ) {

	var txtMessage = cb_GetElement( "txtMessage" );
	if( txtMessage != null )
		txtMessage.disabled = shouldDisable;
		
	var btnSaveMessage = cb_GetElement( "btnSaveMessage" );
	if( btnSaveMessage != null )
		btnSaveMessage.disabled = shouldDisable;

} // DisableInput



function cb_GetElement( controlName ) {

	return document.getElementById( controlName );
	
} // cb_GetElement



function cb_PlaySound( soundType ) {

	if( !cb_GetSoundStatus() )
		return;
			
	var soundFilename = cb_resourcePath + "/s/" + soundType + ".wav";

	var soundPlayer = cb_GetElement( "soundPlayer" );
	if( soundPlayer == null || soundPlayer.src == null ) {
	
		var soundPlayerMoz = cb_GetElement( "soundPlayerMoz" );
		if( soundPlayerMoz == null ) {

			var soundSpan = cb_GetElement( "soundSpan" );
			if( soundSpan != null )
				soundSpan.innerHTML = '<embed src="' + soundFilename + '" autostart=true width=0 height=0 id="soundPlayerMoz" enablejavascript="true">';
				
			soundPlayerMoz = cb_GetElement( "soundPlayerMoz" );
			
		} // if( soundPlayerMoz == null )
		
		try {
			soundPlayerMoz.Play();
		} catch( e ) {
			soundPlayerMoz.DoPlay();
		}

	} else {
	
		soundPlayer.src = soundFilename;
		
	}

} // cb_PlaySound



function cb_LoadPeripheralEvents() {

	var emoticons = cb_GetElement( "emoticons" );
	if( emoticons != null ) {

		var imgEmoticonList = emoticons.getElementsByTagName( "img" );
		
		for( var emoticonIndex = 0; emoticonIndex < imgEmoticonList.length; emoticonIndex++ )
			cb_AttachEvent( imgEmoticonList[ emoticonIndex ], "click", cb_AddEmoticon );
			
	} // if( emoticons != null )
		
	var messages = cb_GetElement( "messages" );
	cb_AttachEvent( messages, "click", cb_ChatClick );
	
	var users = cb_GetElement( "users" );
	cb_AttachEvent( users, "click", cb_ChatClick );
	
} // cb_LoadPeripheralEvents



function cb_ChatClick( e ) {

	e = e || window.event;
	var target = e.srcElement || e.target;
	
	var userKey;
	
	while( target != null ) {
	
		if( target.getAttribute ) {
		
			userKey = target.getAttribute( "userKey" );
			if( userKey != null )
				break;
				
		}
			
		target = target.parentNode;
			
	} // while( target != null )
	
	if( userKey != null )
		cb_LoadProfile( userKey );
	
} //



function cb_AddEmoticon( e ) {

	e = e || window.event;
	var target = e.srcElement || e.target;

	var txtMessage = cb_GetElement( "txtMessage" );
	var shortcut = target.getAttribute( "shortcut" );

	txtMessage.focus();
	txtMessage.value += shortcut;

	cb_Emoticons.setVisibility( false );
	
} // cb_AddEmoticon



function cb_GetSoundStatus() {

	var imgSound = cb_GetElement( "imgSound" );
	return imgSound == null ? false : imgSound.src.indexOf( "son.gif" ) > -1;

} // cb_GetSoundStatus

function cb_SetSoundStatus( status ) {

	var imgSound = cb_GetElement( "imgSound" );
	if( imgSound == null )
		return;

	if( status ) {

		imgSound.src = imgSound.src.replace( "soff.gif", "son.gif" );
		imgSound.alt = "turn sound off";	
		
	} else {

		imgSound.src = imgSound.src.replace( "son.gif", "soff.gif" );
		imgSound.alt = "turn sound on";	
		
	}

} // cb_SetSoundStatus

function cb_ToggleSoundStatus() {

	var playSound = cb_GetSoundStatus();
	cb_SetSoundStatus( !playSound );
	cb_SaveOptions();

} // cb_ToggleSoundStatus



function cb_LoadOptions() {

	var options = cb_getCookie( cb_userToyKey + "_options" );
	cb_SetSoundStatus( options == "1" );

} // cb_LoadOptions



function cb_SaveOptions() {

	var cookieName = cb_userToyKey + "_options";
	var options = cb_GetSoundStatus() ? "1" : "0";
	cb_setCookie( cookieName, options, 365, "/", cb_serverUrl, false );
	
} // cb_SaveOptions



function cb_AttachEvent( element, eventName, method ) {

	if( element == null )
		return;

	if( element.attachEvent ) {
	
		element.attachEvent( "on" + eventName, method );
		return true;

	} else if( element.addEventListener ) {
	
		return element.addEventListener( eventName, method, false );

	} //

} // cb_AttachEvent



function cb_DetachEvent( element, eventName, method ) {

	if( element == null )
		return;

	if( element.detachEvent ) {
	
		element.detachEvent( "on" + eventName, method );
		return true;

	} else if( element.removeEventListener ) {
	
		return element.removeEventListener( eventName, method, false );

	} //

} // cb_DetachEvent



function cb_GetUserDiv( userBlob ) {

	userBlob = userBlob.replace( /\$/g, "$$$$" );

	var div = document.createElement( "div" );

	var items = userBlob.split( "\t" );
	
	var localTime = new Date( new Date().toUTCString().replace( " UTC", "" ).replace( " GMT", "" ) );
	localTime.setMinutes( localTime.getMinutes() - items[ 5 ] );
	var friendlyTime = cb_GetFriendlyTime( localTime );
	
	var status = "Current";
	switch( items[ 2 ] ) {
		case "0": status = "New"; break;
		case "1": status = "Current"; break;
		case "2": status = "Old"; break;
	} //
	
	var innerHTML = "";

	innerHTML +=	"<div class=\"[Status]\"> ";
	innerHTML +=		"<span class=\"displayName\">[DisplayName]</span> ";
	innerHTML +=		"<span class=\"time\">[CurrentLocalTime]</span> ";
	innerHTML +=	"</div> ";
	
	if( cb_orientation == "Horizontal" )
		innerHTML +=	"<div class=\"quote\">[Quote]</div> ";
	
	innerHTML = innerHTML.replace( /\[UserKey\]/g, items[ 0 ] );
	innerHTML = innerHTML.replace( /\[DisplayName\]/g, cb_GetForcedWordWrap( items[ 1 ] ) );
	innerHTML = innerHTML.replace( /\[Status\]/g, status );
	innerHTML = innerHTML.replace( /\[BackgroundColor\]/g, items[ 3 ] );
	innerHTML = innerHTML.replace( /\[ForegroundColor\]/g, items[ 4 ] );
	innerHTML = innerHTML.replace( /\[CurrentLocalTime\]/g, friendlyTime );
	innerHTML = innerHTML.replace( /\[Quote\]/g, cb_GetForcedWordWrap( items[ 6 ] ) );
	
	div.setAttribute( "userKey", items[ 0 ] );
	div.className = "user";
	div.style.backgroundColor = items[ 3 ];
	div.style.color = items[ 4 ];
	div.innerHTML = innerHTML;

	return div;

} // cb_GetUserDiv



function cb_GetMessageDiv( messageBlob ) {

	messageBlob = messageBlob.replace( /\$/g, "$$$$" );
	var div = document.createElement( "div" );

	var innerHTML = "";
	

	innerHTML +=	"<span class=\"sprite\" userKey=\"[UserKey]\"><img class='spriteSize' src=\"[UserSprite]\" /></span>";
	innerHTML +=	"<span class=\"user\" style=\"background-color: [UserBackgroundColor]; color: [UserForegroundColor];\">";
	innerHTML +=		"<span class=\"displayName\" userKey=\"[UserKey]\">[UserDisplayName]</span> ";
	innerHTML +=		"<span class=\"time\">[EntryDateFormatted]</span> ";
	innerHTML +=	"</span>";
	innerHTML +=	"<span class=\"text\">[Text]</span> ";

	var items = messageBlob.split( "\t" );
	
	var localDate = cb_GetDateFromCoreStarted( items[ 4 ] );
	var friendlyMessageTime = cb_GetFriendlyTime( localDate );
	
	var spritePath = cb_spritePath + items[ 7 ];
	
	innerHTML = innerHTML.replace( /\[UserKey\]/g, items[ 0 ] );
	innerHTML = innerHTML.replace( /\[UserDisplayName\]/g, cb_GetForcedWordWrap( items[ 1 ] ) );
	innerHTML = innerHTML.replace( /\[UserBackgroundColor\]/g, items[ 2 ] );
	innerHTML = innerHTML.replace( /\[UserForegroundColor\]/g, items[ 3 ] );
	innerHTML = innerHTML.replace( /\[EntryDateFormatted\]/g, friendlyMessageTime );	//4
	innerHTML = innerHTML.replace( /\[MessageType\]/g, items[ 5 ] );
	innerHTML = innerHTML.replace( /\[Text\]/g, cb_GetForcedWordWrap( items[ 6 ] ) );
	innerHTML = innerHTML.replace( /\[UserSprite\]/g, spritePath ); // 7
	
	div.id = "message" + cb_messageCount++;
	div.className = "message";
	div.innerHTML = innerHTML;
	
	return div;

} // cb_GetMessageDiv



function cb_GetSystemMessageDiv( blob ) {

	blob = blob.replace( /\$/g, "$$$$" );
	var blobItems = blob.split( "\t" );
	
	var messageType = blobItems[ 0 ];
	var messageText = cb_GetForcedWordWrap( blobItems[ 1 ] );
	
	var innerHTML = "";
	innerHTML +=	"<div><img src=\"/_Images/Toy/System/[MessageType].gif\" alt=\"[MessageType]\" /> [MessageText]</div>";
	
	innerHTML = innerHTML.replace( /\[MessageType\]/g, messageType );
	innerHTML = innerHTML.replace( /\[MessageText\]/g, messageText );
	
	var color = "";
	var backgroundColor = "";
	
	switch( messageType ) {
		case "Topic":
			backgroundColor = "#fffabd";
			color = "#000000";
			break;
			
		case "Me":
			backgroundColor = "#88bbff";
			color = "#000000";
			break;
			
		case "Notification":
			backgroundColor = "#ff9805";
			color = "#000000";
			break;
			
		case "Ban":
			backgroundColor = "#ff3b3b";
			color = "#000000";
			break;
			
		case "Silence":
			backgroundColor = "#c0ac01";
			color = "#000000";
			break;
			
	}

	var div = document.createElement( "div" );
	div.id = "message" + cb_messageCount++;
	div.className = "systemMessage " + messageType;
	div.style.backgroundColor = backgroundColor;
	div.style.color = color;
	div.innerHTML = innerHTML;
	
	return div;

} // cb_GetSystemMessageDiv



function cb_GetAdDiv( adBlob ) {

	adBlob = adBlob.replace( /\$/g, "$$$$" );
	var items = adBlob.split( "\t" );

	var div = document.createElement( "div" );

	var innerHTML = "";

	innerHTML +=	"<div class=\"body\">[Body]</div>";
	innerHTML +=	"<a href=\"[TargetUrl]\" target=\"_blank\">[FriendlyHyperlink]</a>";
	
	innerHTML = innerHTML.replace( /\[TargetUrl\]/g, items[ 0 ] );
	innerHTML = innerHTML.replace( /\[FriendlyHyperlink\]/g, items[ 1 ] );
	innerHTML = innerHTML.replace( /\[Body\]/g, cb_GetForcedWordWrap( items[ 2 ] ) );
	
	div.className = "ad";
	div.innerHTML = innerHTML;
	
	return div;

} // cb_GetAdDiv



function cb_GetDateFromCoreStarted( offsetSeconds ) {

	var date = new Date( cb_coreStartedDate + " UTC" );
	date.setTime( date.getTime() + ( offsetSeconds * 1000 ) );
	return date;

} // cb_GetDateFromCoreStarted



function cb_GetFriendlyTime( date ) {

	var days = new Array( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" );
	var minutes = date.getMinutes();
	
	var friendlyTime = days[ date.getDay() ] + " " + date.getHours() + ":" + ( minutes < 10 ? "0" : "" ) + minutes;
	
	return friendlyTime;
	
} // cb_GetFriendlyTime



function cb_SetUIOpacity() {

	var pageInfo = cb_GetElement( "pageInfo" );
	cb_chatBackgroundColor = pageInfo.style.backgroundColor;

	var emoticons = cb_GetElement( "emoticons" );
	var profile = cb_GetElement( "profile" );
	
	cb_SetOpacity( emoticons, 88 );
	cb_SetOpacity( profile, 88 );

} // cb_SetUIOpacity



function cb_SetOpacity( element, opacity ) {

	if( element == null )
		return;

    element.style.opacity = ( opacity / 100 );
    element.style.MozOpacity = ( opacity / 100 );
    element.style.KhtmlOpacity = ( opacity / 100 );
    element.style.filter = "alpha( opacity=" + opacity + " )";

} // cb_SetOpacity



function cb_GetXmlHttp() {

	var xmlHttp = false;

	if (window.XMLHttpRequest) { 

		// If IE7, Mozilla, Safari, etc: Use native object 
		xmlHttp = new XMLHttpRequest() 

	} else if (window.ActiveXObject) { 

		try {
			xmlHttp = new ActiveXObject( "Msxml2.XMLHTTP" );
		} catch( e ) {

			try {
				xmlHttp = new ActiveXObject( "Microsoft.XMLHTTP" );
			} catch( E ) {
				xmlHttp = false;
			}

		} // try

	} // if

	return xmlHttp; 

} // cb_GetXmlHttp



function cb_MoveDialogBox( e ) {

	e = e || window.event;
	var target = e.srcElement || e.target;

	var offset = cb_GetMouseOffset( e, target );

	var owner = target.boxInQuestion;
	owner.style.zIndex++;
	
	if( owner.onselectstart == null )
		owner.onselectstart = function() { return false; };
	
	document.onmousemove = function() {
	
		owner.style[ "left" ] = e.clientX - offset.x;
		owner.style[ "top" ] = e.clientY - offset.y;

	};
	
	document.onmouseup = function() {
		document.onmousemove = null;
	};
	
} // cb_MoveDialogBox



function cb_GetMouseOffset( e, target ) {

	var offset = { x : 0, y : 0 };

	offset.x = e.offsetX + 2;
	offset.y = e.offsetY + 2;
	
	// If we're not IE, assume FF.
	if( isNaN( offset.x ) && isNaN( offset.y ) ) {
		// Get the mouse click's offset position by traversing the DOM.
		
		offset.x = 0;
		offset.y = 0;

		var tempElement = target;

		while( tempElement.offsetParent ) {
		
			offset.x += tempElement.offsetLeft;
			offset.y += tempElement.offsetTop;
			
			tempElement = tempElement.offsetParent;
			
		} // while( tempElement != null )

		offset.x = e.pageX - offset.x;
		offset.y = e.pageY - offset.y;
		
	} // isNan
	
	return offset;

} // cb_GetMouseOffset



function cb_GetScrollbarWidth() {

	var scrollbarWidth = cb_GetElement( "scrollbarWidth" );
	var width = 0;
	
	scrollbarWidth.wrap = "off";
	width = scrollbarWidth.offsetHeight;
	
	scrollbarWidth.wrap = "soft";
	width -= scrollbarWidth.offsetHeight;
	
	return width;
	
} // cb_GetScrollbarWidth



/* Generic dialog box stuff */
function cb_DialogBox( idName ) {

	this.idName = idName;

} //



function cb_GetForcedWordWrap( text ) {

	var newText = text;

	newText = newText.replace( /\S{8,}/g, function( partialText ) { return partialText.split( "" ).join( "\0x01FF" ); } );
	if( newText == text )
		return text;
	
	newText = newText.replace( /<.*?\0x01FF.*?>/g, function( partialText ) { return partialText.replace( /\0x01FF/g, "" ); } );
	newText = newText.replace( /&.*?\0x01FF.*?;/g, function( partialText ) { return partialText.replace( /\0x01FF/g, "" ); } );
	newText = newText.replace( /\0x01FF/g, "<wbr />" );
	
	newText = newText.replace( /\$/g, "$$$$" );

	return newText;

}



cb_DialogBox.prototype.initialize = function() {

	var dialogBox = cb_GetElement( this.idName );
	var dialogBoxTitleBar = cb_GetElement( this.idName + "TitleBar" );
	var dialogBoxBody = cb_GetElement( this.idName + "Body" );
	var dialogBoxClose = cb_GetElement( this.idName + "Close" );
	
	if( dialogBox == null )
		return;

	this.self = dialogBox;
	this.title = dialogBoxTitleBar;
	this.body = dialogBoxBody;
	
	dialogBoxTitleBar.boxInQuestion = dialogBox;
	dialogBoxTitleBar.onmousedown = cb_MoveDialogBox;
	dialogBoxClose.onclick = function() { dialogBox.style.display = "none"; };

}; // cb_DialogBox.prototype


cb_DialogBox.prototype.clearAll = function() {

	this.title.innerHTML = "";
	this.body.innerHTML = "";

}; // cb_DialogBox.prototype.clearAll


cb_DialogBox.prototype.addBodyItem = function( itemBlob ) {

	var items = itemBlob.split( "\t" );

	this.body.innerHTML += "<div class=\"itemTitle\">" + items[ 0 ] + "</div>";
	this.body.innerHTML += "<div class=\"itemValue\">" + items[ 1 ] + "</div>";
	
}; // cb_DialogBox.prototype.addBodyItem


cb_DialogBox.prototype.setVisibility = function( isVisible ) {
	this.self.style.display = isVisible ? "inline" : "none";
}; // cb_DialogBox.prototype.setVisibility


cb_DialogBox.prototype.setTitle = function( title ) {
	this.title.innerHTML = title;
}; // cb_DialogBox.prototype.setTitle


function cb_getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}


function cb_setCookie( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+'='+escape( value ) +
		( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
		( ( path ) ? ';path=' + path : '' ) +
		( ( domain ) ? ';domain=' + domain : '' ) +
		( ( secure ) ? ';secure' : '' );
}


function cb_deleteCookie( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + '=' +
			( ( path ) ? ';path=' + path : '') +
			( ( domain ) ? ';domain=' + domain : '' ) +
			';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}

String.prototype.trim  = function(){ return this.replace(/(^\s+)|\s+$/g,"")} 