var messages = new Array();
var messageFlash = new Array();

var showMessageNumber = 2

function getMessages()
{
	urlAJAX = ajaxURL + '&template=messageCenter';
	getAJAX( urlAJAX, parseMSGServerData );
}

function removeMessage( msgId )
{
	urlAJAX = ajaxURL + '&template=messageCenter&msgAction=msgAck&msgId='+msgId.id;
	getAJAX( urlAJAX, parseMSGServerData );	
}

function parseMSGServerData( serverStrings )
{
	resetMessages();
	
	var messagesTemp = serverStrings.split('\n');
	var msgtemp;
	var msgtypeid = 0;
	var enterLoop = false;

	document.getElementById( messageCenter ).innerHTML = '';
	
	for( var i = 0; i < messagesTemp.length; i++ )
	{	
		if( messagesTemp[i] == '#WFMC#End' )
		{
			enterLoop = false;
		}
		
		if( enterLoop )
		{
			if( messagesTemp[i].slice(0, 5) == '#MCT#' )
			{
				msgtypeid = addMessageType( messagesTemp[i].split('#')[2] );
			}
			else if( messagesTemp[i].slice(0, 5) == '#MCM#' )
			{
				msgtemp = messagesTemp[i].split('|')[3].split('~-~');
				addMessage( msgtypeid, msgtemp[1], msgtemp[0], msgtemp[2], msgtemp[3], msgtemp[4], messagesTemp[i].split('|')[2], messagesTemp[i].split('|')[1] );
			}
		}
		
		if( messagesTemp[i] == '#WFMC#Start' )
		{
			enterLoop = true;
		}
	}
	
	showMessage( null );
}

function resetMessages()
{
	messages = new Array();
	messageFlash = new Array();
	
	document.getElementById( messageCenter ).innerHTML = '';
}

function addMessage( msgTypeId, msgTitle, msgText, msgFile, msgLine, msgSQL, msgControl, msgId )
{
	if( msgTypeId != null && messages[msgTypeId] )
	{
		messages[msgTypeId].newMessage( msgTitle, msgText, msgFile, msgLine, msgSQL, msgControl, msgId );
	}
}

function showMessage( msgTypeId )
{
	if( msgTypeId != null && messages[msgTypeId] )
	{
		messages[msgTypeId].showMessages( messageCenter );
	}
	else
	{
		for( var i = 0; i < messages.length; i++ )
		{
			messages[i].showMessages( messageCenter );
		}
	}
}

function addMessageType( msgTypeName )
{
	var msgTypeId = getMessageType( msgTypeName );

	if( msgTypeId == null )
	{
		msgTypeId = messages.length;
		messages.push( new messageTypeObject( msgTypeId, msgTypeName ) );
		msgTypeId = messages.length - 1;
	}
	return msgTypeId;
}

function getMessageType( msgTypeName )
{
	var msgTypeId = null;

	for( var i = 0; i < messages.length; i++ )
	{
		if( messages[i].name == msgTypeName )
		{
			msgTypeId = i;
			break;
		}
	}

	return msgTypeId;
}

function addFlashTrigger( messageId )
{
	if( document.getElementById( messageId ) )
	{
		messageFlash.push(  messageId );
	}
}

function triggerFlash()
{
	for( var i = 0; i < messageFlash.length; i++ )
	{
		if( document.getElementById( messageFlash[i] ).className == 'message' )
		{
			document.getElementById( messageFlash[i] ).className = 'message messageFlash';
		}
		else
		{
			document.getElementById( messageFlash[i] ).className = 'message';
		}
	}
}

function msgAcknowledged( messageId )
{
	for( var i = 0; i < messageFlash.length; i++ )
	{
		if( messageFlash[i] == messageId )
		{
			document.getElementById( messageFlash[i] ).removeAttribute('onclick');
			document.getElementById( messageFlash[i] ).className = 'message';
			messageFlash.splice( i, 1 );
		}
	}
}

function showHideMSG( msgTypeId )
{
	if( msgTypeId != null && messages[msgTypeId] )
	{
		messages[msgTypeId].changeShowing();
	}
}

// Message Object Class
function messageObject( msgTitle, msgText, msgFile, msgLine, msgSQL, msgControl, msgId )
{
	this.id = msgId;
	this.title = msgTitle;
	this.text = msgText;
	this.file = msgFile;
	this.line = msgLine;
	this.sql = msgSQL;

	this.removable = true;
	this.important = false;
	this.acknoledged = false;
	
	this.showMessage = displayMessage;
	this.accessId = getHTMLId;
	this.checkMessage = compareMessage;

	var controlString = msgControl.split(',');

	for( var i = 0; i < controlString.length; i++ )
	{
		switch( controlString[i] )
		{
			case 'x':
				this.removable = true;
				break;
			case 's':
				this.removable = false;
				break;
			case 'b':
				this.important = true;
				break;
			case 'a':
				this.important = false;
				break;
		}
	}
}

function compareMessage( msgTitle, msgText, msgFile, msgLine, msgSQL )
{
	if( this.title == msgTitle && this.text == msgText && this.file == msgFile && this.line == msgLine && this.sql == msgSQL )
	{
		return true;
	}
	return false;
}

function displayMessage( messageLocation, msgTypeId )
{
	if( document.getElementById( messageTemplate ) )
	{
		var template = document.getElementById( messageTemplate ).cloneNode(true);

		template.className =  'message';
		template.id = this.accessId( msgTypeId );

		if( document.getElementById( template.id ) )
		{
			document.getElementById( messageLocation ).removeChild( document.getElementById( template.id ) );
		}
		
		document.getElementById( messageLocation ).appendChild( template );

		template = document.getElementById( this.accessId( msgTypeId ) );
		template.setAttribute('onClick', "msgAcknowledged( this.id )");
				
		if( typeof( template.getElementsByClassName ) != 'function' )
		{
			template.getElementsByClassName = getElementsByClassName;
		}
		
		if( this.title != '' )
		{
			template.getElementsByClassName( 'msgTitle' )[0].innerHTML = this.title;
		}
		else
		{
			template.getElementsByClassName( 'msgTitle' )[0].parentNode.removeChild( template.getElementsByClassName('msgTitle')[0] );
		}

		if( this.text != '' )
		{
			template.getElementsByClassName( 'msgText' )[0].appendChild( document.createTextNode( this.text ) );
		}
		else
		{
			template.getElementsByClassName( 'msgText' )[0].parentNode.removeChild( template.getElementsByClassName('msgText')[0] );
		}

		if( this.file != '' )
		{
			template.getElementsByClassName( 'msgFile' )[0].appendChild( document.createTextNode( this.file ) );
		}
		else
		{
			template.getElementsByClassName( 'msgFile' )[0].parentNode.removeChild( template.getElementsByClassName('msgFile')[0] );
		}

		if( this.line != '' )
		{
			template.getElementsByClassName( 'msgLine' )[0].appendChild( document.createTextNode( ' :: ' + this.line ) );
		}
		else
		{
			template.getElementsByClassName( 'msgLine' )[0].parentNode.removeChild( template.getElementsByClassName('msgLine')[0] );
		}

		if( this.sql != '' )
		{
			template.getElementsByClassName( 'msgSQL' )[0].appendChild( document.createTextNode( 'SQL: ' + this.sql ) );
		}
		else
		{
			template.getElementsByClassName( 'msgSQL' )[0].parentNode.removeChild( template.getElementsByClassName('msgSQL')[0] );
		}
		
		if( this.removable )
		{
			template.getElementsByClassName( 'msgControl' )[0].innerHTML = '<a href="javascript:removeMessage(' + this.id + ')">X</a>';
		}
		else
		{
			template.getElementsByClassName( 'msgControl' )[0].innerHTML = '&nbsp;';
		}
	}
}

function getHTMLId()
{
	if( this.id != 'undefined' )
	{
		return this.id;
	}
}

// Message Type Object Class
function messageTypeObject( typeId, typeName )
{
	this.id = typeId;
	this.name = typeName;
	this.typeMsgs = new Array();
	this.totalView = showMessageNumber;

	this.newMessage = addMsg;
	this.showMessages = displayMessages;
	this.changeShowing = changeView;
}

function addMsg( msgTitle, msgText, msgFile, msgLine, msgSQL, msgControl, msgId )
{
	var isDouble = false;
	for( var i = 0; i < this.typeMsgs.length; i++ )
	{
		if( this.typeMsgs[i].checkMessage( msgTitle, msgText, msgFile, msgLine, msgSQL ) )
		{
			isDouble = true;
			break;
		}
	}

	if( !isDouble )
	{
		this.typeMsgs.push( new messageObject( msgTitle, msgText, msgFile, msgLine, msgSQL, msgControl, msgId ) );
	}
}

function displayMessages( messageLocation )
{
	if( this.typeMsgs.length > 0 && document.getElementById( messageTypeTemplate ) && document.getElementById( messageLocation ))
	{
		if( !document.getElementById( 'messageType'+this.id ) )
		{
			var template = document.getElementById( messageTypeTemplate ).cloneNode(true);
			
			template.id = 'messageType'+this.id;
			template.className = 'messageType';

			document.getElementById( messageLocation ).appendChild( template );

			if( typeof( document.getElementById( 'messageType'+this.id ).getElementsByClassName ) != 'function' )
			{
				document.getElementById( 'messageType'+this.id ).getElementsByClassName = getElementsByClassName;
			}
			
			document.getElementById( 'messageType'+this.id ).getElementsByClassName( 'typeName' )[0].appendChild( document.createTextNode( this.name ) );
		}
		
		document.getElementById( 'messageType'+this.id ).getElementsByClassName( 'nowViewing' )[0].appendChild( document.createTextNode( ' ( ' + this.totalView + ' / ' + this.typeMsgs.length + ' ) ' ) );

		if( this.typeMsgs.length > showMessageNumber )
		{
			document.getElementById( 'messageType'+this.id ).getElementsByClassName( 'typeName' )[0].parentNode.setAttribute('onclick', 'showHideMSG('+this.id+')');
		}
		
		for( var i = 0; i < this.typeMsgs.length; i++ )
		{
			this.typeMsgs[i].showMessage( 'messageType'+this.id, this.id );
			
			if( this.typeMsgs[i].important )
			{
				addFlashTrigger( this.typeMsgs[i].accessId( this.id ) );
			}
		}

		this.totalView = this.typeMsgs.length;

		this.changeShowing();
	}
}

function changeView()
{
	for( var i = showMessageNumber; i < this.typeMsgs.length; i++ )
	{
		if( this.totalView > showMessageNumber )
		{
			document.getElementById( this.typeMsgs[i].accessId( this.id ) ).style.display = 'none';
		}
		else
		{
			document.getElementById( this.typeMsgs[i].accessId( this.id ) ).style.display = 'normal';
		}
	}

	if( this.totalView > showMessageNumber )
	{
		this.totalView = showMessageNumber;
	}
	else
	{
		this.totalView = this.typeMsgs.length;
	}
	
	if( typeof( document.getElementById( 'messageType'+this.id ).getElementsByClassName ) != 'function' )
	{
		document.getElementById( 'messageType'+this.id ).getElementsByClassName = getElementsByClassName;
	}

	document.getElementById( 'messageType'+this.id ).getElementsByClassName( 'nowViewing' )[0].innerHTML = '';
	document.getElementById( 'messageType'+this.id ).getElementsByClassName( 'nowViewing' )[0].appendChild( document.createTextNode( ' ( ' + this.totalView + ' / ' + this.typeMsgs.length + ' ) ' ) );
}
