var messageDefaultIM = "Inserisci qui il tuo testo";    
var do_debug = false;
var conversationsAddress;
var baseConverationBlockStyle = "";
var contactsByAddress;
var textaresIdForContactAddress;
var textareaNow;
var elementsToClear;
var filterContactDefaultValue = "Cerca un contatto";
var ignoreConversationChanges;
var emoticonAdded = false;
var addContactModeActive = false;
var addingContactFirstValue = "Inserisci la mail del contatto da aggiungere";
var filterContactFirstValue = filterContactDefaultValue;
var maxConversationAllowed = 4;
var noMoreConversationAlert = "Non è possibile aprire più di " + maxConversationAllowed + " conversazioni contemporaneamente.";
var noTextInsertedSendWillBlocked = "Prima di premere il pulsante Invia inserisci un testo da inviare.";
var modifyingContactMode;
var groupsClosed;
var wasOnContact;
var groupNames;
var contactsShowed;
var contactListShown;
var lastSearch;
var bingHideInterval;
var applicationType;
var strToSearchSaved;
var delayContactVisibility;
var contactsDeleted;
var savedDisplayNames;
var createContactsPageInterval;
var signInControl_backColor="#FFFFFF";
var signInControl_linkColor;
var signInControl_buttonBackColor;
var signInControl_buttonForeColor;
var signInControl_foreColor;
var PersonalMessageInputBackground="#FFFFFF";
var customizationFolderPath="/images/webmessenger/classic/";
var sharedMessage;
var sharedUrl;
var changeStatusContainerTop="97px";
var changeStatusContainerLeft="161px";
var boxEmoticonTop="403px";
var boxEmoticonLeft="183px";


	
/**
	LOGIN MANAGEMENT -----------------------------------
*/	
	
/* This is the main function of the script. It is called when the page loads. */
function scriptMain( type )
{	
	applicationType = type;
	
	if( type == "customer" )
	{
		resizeWindow('big');
		startResizeInterval();
	}

	if( !detectClientInfo() )
	{
		manageElementsVisibility( "snifferBadDetect" );
		return;
	}
	
	
	manageElementsVisibility( "onInit" );

	// if( !filterContactDefaultValue ) 	filterContactDefaultValue = document.getElementById( "filterContact" ).value;
	//	if( !addingContactFirstValue ) 		addingContactFirstValue = document.getElementById( "addingContact" ).value;
	//	if( !filterContactFirstValue ) 		filterContactFirstValue = document.getElementById( "filterContact" ).value;


    var hostUrl = window.location.href;
    var index = hostUrl.lastIndexOf("/");
    hostUrl = hostUrl.substring(0, index);

    var privUrl = hostUrl + "/Privacy.htm";
    var chanUrl = hostUrl + "/Channel.htm";
	var market = "it-IT";

    _signin = new Microsoft.Live.Messenger.UI.SignInControl("signinframe", privUrl, chanUrl, market);
    _signin.add_authenticationCompleted(authenticationCompleted);
	_signin.get_style().set_backColor( signInControl_backColor );
	
	if(signInControl_linkColor){_signin.get_style().set_linkColor( signInControl_linkColor );}
	if(signInControl_buttonBackColor){_signin.get_style().set_buttonBackColor( signInControl_buttonBackColor );}
	if(signInControl_buttonForeColor){_signin.get_style().set_buttonForeColor( signInControl_buttonForeColor );}
	if(signInControl_foreColor){_signin.get_style().set_foreColor( signInControl_foreColor );}

	try
	{
		/* text link */
		//test_js_xml( "http://rad.msn.com/ADSAdClient31.dll?GetAd=&PG=IMITX1&LANG=IT" );	
	}
	catch( e )
	{
		//console.warn( "ATENTION! An error occured reading the xml, below the error message" );
		//console.warn( e.message );		
	}	
}



function deleteWhiteLine ()
{
	/*
		in page there is somthing like this iframe that the signin class append to the page...
		this iframe create a white line... here I hide it...
	*/
	/*
	<div style="POSITION: absolute; WIDTH: 1pt; HEIGHT: 1pt; TOP: -100px" id="msgr48985">
	     <iframe style="WIDTH: 100%; HEIGHT: 100%" src="http://settings.messenger.live.com/api/3.00.4601.0000/Messenger.html?domain=localhost&amp;signInServer=&amp;scriptPath=http%3A%2F%2Fwww.wlmessenger.net%2Fapi%2F3.00.4601.0000%2F&amp;signInState=&amp;ui=true&amp;localStorageDisabled=false&amp;owner=2"	frameborder="0"></iframe>
	   </div>
	*/
		
		
	var divs = document.getElementsByTagName("div");
	for (var i=0; i < divs.length; i++) 
	{
		var div = divs[i];
		
		try
		{	
			if( div.parentNode != document.body )
				continue;
				
				
			var divId = div.id;
			if( divId.indexOf( "msgr" ) == -1 )	
				continue;
				
			var divIdNumber = divId.replace( "msgr", "" );
			var num = Number( divIdNumber );
			
			if( isNaN( num ) )
				continue;
			
			var iframes = div.getElementsByTagName("iframe");
			var iframe = iframes[0];
			iframe.style.width = "0px";
			iframe.style.height = "0px";
			
			break;
		}
		catch(e){}
	};
}



function manageElementsVisibility ( state )
{
	////console.warn(state);

	var elToDisplayNone = [];
	var elToDisplayBlock = [];
	var i;
	
	switch( state )
	{
		case "snifferBadDetect":
			elToDisplayNone = [ "addContactBox", "changeStatusContainer", "boxEmoticon", "msgrmessage", "header", "profilecontainer", "separator", "actionList", "searchBox", "contactlist", "msgrtabcontainer", "msgrtabsid" ];
			elToDisplayBlock = [ "notsupportedmessage" ];
		break;
		case "onInit":
			elToDisplayNone = [ "notsupportedmessage", "addContactBox", "changeStatusContainer", "boxEmoticon", "msgrmessage", "header", "profilecontainer", "separator", "actionList", "searchBox", "contactlist", "msgrtabcontainer", "msgrtabsid" ];
			elToDisplayBlock = [];
		break;
		case "onLoggingIn":
			elToDisplayNone = [ "notsupportedmessage", "addContactBox", "changeStatusContainer", "boxEmoticon", "header", "profilecontainer", "separator", "actionList", "searchBox", "contactlist", "msgrconnect", "msgrtabcontainer", "msgrtabsid" ];
			elToDisplayBlock = [ "msgrmessage" ];
		break;
		case "onLogged":
			elToDisplayNone = [ "notsupportedmessage", "addContactBox", "changeStatusContainer", "boxEmoticon", "signinframe", "msgrmessage", "msgrconnect" ];
			elToDisplayBlock = [ "header", "profilecontainer", "actionList", "separator", "searchBox", "contactlist", "msgrtabcontainer", "msgrtabsid" ];
		
			fillEmoticonPanel();
			fillPresencePanel();
		break;
		case "onLogout":
			elToDisplayNone = [ "notsupportedmessage", "addContactBox", "changeStatusContainer", "boxEmoticon", "msgrmessage", "header", "profilecontainer", "separator", "actionList", "searchBox", "contactlist", "msgrtabcontainer", "msgrtabsid" ];
			elToDisplayBlock = [ "signinframe", "msgrconnect" ];		
		break;
	}
	
	for( i = 0; i < elToDisplayNone.length; i++) 	document.getElementById( elToDisplayNone[ i ] ).style.display = "none";
	for( i = 0; i < elToDisplayBlock.length; i++) 	document.getElementById( elToDisplayBlock[ i ] ).style.display = "block";
}




/* Called by the Windows Live Messenger Library when the user authentication process is complete. */
function authenticationCompleted(sender, e)
{
	init();
    ////console.log( "authenticationCompleted" );
    _user = new Microsoft.Live.Messenger.User(e.get_identity());
    _user.add_signInCompleted(signInCompleted);
    _user.signIn(null);
	
	deleteWhiteLine();
	
	manageElementsVisibility( "onLoggingIn" );
}



function fillPresencePanel ()
{
	var element = document.getElementById( "changeStatusContainer" );
	var presence;
	var presences = [ "1", "3", "5", "6", "7", "2" ];
	var innerStr = "";
	
	for (var i = 0; i < presences.length; i++) 
	{
		presence = presences[i];
		innerStr += '<div class="imageStatus"><img src="/images/webmessenger/presence/' + imagePresenceString( presence )  + '.png" /></div>';
		innerStr += '<div class="stringStatus"><span><a href="javascript:changePresenceStatus(' + presence + ');" title="Cambia stato">' + localizatedPresenceString( presence ) + '</a></span></div>';
		if( i < presences.length - 1 )
			innerStr += '<div class="clear"><!-- --></div>';			
	}
	
	element.innerHTML = innerStr;
}



function addContactMode ( add, showSearchBoxIfNeeded )
{
	var addMode = add == "true";
	var innerStr;
	
	if( addMode && addContactModeActive )
		addMode = false;
	
	modifyingContactMode = addMode;
	
	addContactModeActive = addMode;

	showSearchBoxIfNeeded = true;
	document.getElementById( "searchBox" ).style.display = addMode ? "none" : ( showSearchBoxIfNeeded ? "block" : "none" );
	document.getElementById( "addContactBox" ).style.display = addMode ? "block" : "none";
	
	var address;
	for( address in contactsByAddress )
	{
		var element = document.getElementById( "deleteTheContact_" + address );
		if( !element )
			continue;
	
		/* seems that applying class and style with setAttribute does not run... */
		//element.setAttribute("class", "ContactItem_inner" + ( addMode ? "" : " hide" ) );
		//element.setAttribute( "style", "padding-top:5px; height:15px; display:" + ( addMode ? "block" : "none" ) + ";" );
		
		innerStr = '<div class="ContactItem_inner' + ( addMode ? '' : ' hide' ) + '" onclick="javascript:removeContact(\'noOne\',\'' + address + '\');" style="padding-top:5px; height:15px;"><img src="'+customizationFolderPath+'eraser.jpg" title="Cancella contatto"/></div>';
		element.innerHTML = innerStr;
	}
	
	if( !addMode )
	{
		document.getElementById( "contactEditingButton" ).innerHTML = '<a href="javascript:addContactMode(\'true\');" title="Disconnetti">Aggiungi Contatto</a>';
		document.getElementById( "addingContact" ).value = addingContactFirstValue;	
	}
	else
	{
		filterContacts( "" );		
		showContactList();
		document.getElementById( "contactEditingButton" ).innerHTML = '<a href="javascript:addContactMode(\'true\');" style="font-weight:bold;" title="Disconnetti">Aggiungi Contatto</a>';
		document.getElementById( "filterContact" ).value = filterContactFirstValue;
	}
}



function emptySearchBox ()
{
	document.getElementById( "filterContact" ).value = "";
	filterContacts( "" );	
	showContactList();
}



function emptyAddingContact ()
{
	showContactList();
	document.getElementById( "addingContact" ).value = "";
}



function disconnectUser ()
{
	_user.signOut( Microsoft.Live.Messenger.SignOutLocations.local );
}


/* resetting all variables */
function init ()
{
	var contactlist = document.getElementById("contactlist");
	contactlist.innerHTML = "";
	
	conversationsAddress = new Array();
	contactsByAddress = new Object();
	textaresIdForContactAddress = new Object();
	textareaNow = null;
	modifyingContactMode = false;
	wasOnContact = true;
	groupNames = new Array();
	contactsDeleted = new Array();
	contactsShowed = new Object();
	contactListShown = new Array();
	lastSearch = filterContactDefaultValue;
	strToSearchSaved = "";
	savedDisplayNames = new Object();

	
	if( elementsToClear != null && elementsToClear != undefined )
	{
		for (var i = 0; i < elementsToClear.length; i++) 
		{
			var element = elementsToClear[i];
			if( element && element.parentNode )
			{
				element.parentNode.removeChild( element );
				element.id = "";
			}
		}	
	}
	
	elementsToClear = new Array();
	ignoreConversationChanges = true;
	
	groupsClosed = new Object();
}


/**
	END LOGIN MANAGEMENT -------------------------------
*/


function getContactAddress ( contact )
{
	try
	{
		return contact.get_currentAddress().get_address();	
	}
	catch( e )
	{
		return "";
	}	
}



function htmlIdFromContact( item, type )
{
	var str;
	switch( type )
	{
		case "contactDiv":
			str = "contact_" + getContactAddress( item );
		break;
		case "conversationDiv":
			str = "conversation_" + getContactAddress( item );
		break;
		case "groupDiv":
			str = "group_" + item.get_name();
		break;
	}
	return str;
}



/**
	CONTACT MANAGEMENT ---------------------------------
*/

/* Called by the Windows Live Messenger Library when sign-in is complete. */
function signInCompleted(sender, e)
{
	var enumerator;
	var contact;
	
	if (e.get_resultCode() === Microsoft.Live.Messenger.SignInResultCode.success)
	{
		_user.get_presence().add_propertyChanged(user_Presence_PropertyChanged);
		displayUserInfo();

		_contactCollection = _user.get_contacts();
		enumerator = _contactCollection.getEnumerator();
		sortContacts( enumerator );
		
		while (enumerator.moveNext() ) 
		{
			contact = enumerator.get_current();
			contactListShown.push( contact );
		}

		createContactsPageInterval = setInterval( createContactsPage, 2000 );
	}
}



function createContactsPage ()
{
	var i;
	var group;
	var contact;
	var contactListString = "";
	var contactString;
	
	clearInterval( createContactsPageInterval );
	contactsIsShowed = true;
	
	for( i = 0; i < map.length; i++ )
	{
		group = map[i];
		
		contactString = "";
		for( j = 0; j < group.contacts.length; j++ )
		{
			contact = group.contacts[j];			
			contactString += createContactDivString( contact );
		}
		
		contactListString += createGroupDivString( group, contactString );
	}
	
	document.getElementById( "contactlist" ).innerHTML = contactListString;
	showGroupNames();
	
	contactsPageCreated();
}

function contactsPageCreated ()
{
	_user.get_conversations().add_propertyChanged(conversations_PropertyChanged);
	_user.get_conversations().add_collectionChanged(conversations_PropertyChanged);

	_user.get_onlineContacts().add_collectionChanged(onOnlineContactsChanged);
	_user.get_offlineContacts().add_collectionChanged(onOfflineContactsChanged);

	manageElementsVisibility( "onLogged" );
	ignoreConversationChanges = false;
}

function createContactDivString ( contact )
{
	var address = getContactAddress( contact );
	var status = contact.get_presence().get_status();
	var personalMessage = contact.get_presence().get_personalMessage();
	var innerStr = "";
	var displayName = contact.get_displayName();
	var hidden = status == 0;

	savedDisplayNames[ address ] = displayName;
	
	if( !personalMessage || personalMessage == undefined || personalMessage == null )
		personalMessage = "";
	else
		personalMessage = " - " + personalMessage;
	
	innerStr += '<div id="contact_' + address + '" class="ContactItem" ' + ( hidden ? 'style="display:none;"' : '' ) + '>';
   innerStr += 	'<div class="ContactItem_inner" id="status_' + address + '" alt="' + address + '" style="padding-top: 2px; height: 18px;"><img src="/images/webmessenger/presence/' + imagePresenceString( status ) + '.png" alt="' + localizatedPresenceString( status ) + '"></div>';
   innerStr += 	'<span id="deleteTheContact_' + address + '">';
   innerStr += 		'<div class="ContactItem_inner hide" onclick="javascript:removeContact(\'noOne\',\'' + address + '\');" style="padding-top: 5px; height: 15px;"><img src="'+customizationFolderPath+'eraser.jpg" title="Cancella contatto"></div>';
   innerStr += 	'</span>';
   innerStr += 	'<div class="ContactItem_inner" id="displayName_' + address + '">';
   innerStr += 		'<p><a target="_self" href="javascript:createOnContactClick(\'noOne\',\'' + address + '\');">' + displayName + '</a><i>' + personalMessage + '</i></p>';
   innerStr += 	'</div>';
   innerStr += '</div>';
   innerStr += '<div id="clearItem_contact_' + address + '" style="display: ' + ( hidden ? 'none"' : 'block' ) + ';" class="clear">';
   innerStr += 	'<!-- -->';
   innerStr += '</div>';

	return innerStr;
}

function createGroupDivString ( group, contactsString )
{
	var divId = group.id;
	var contactList;
	var innerStr = "";
	var groupItem;
	
	
	innerStr += '<div id="' + divId + '" class="contactlist_group">';
	innerStr += 	'<div style="display: block;" id="' + divId + '_name">';
   innerStr +=    	'<h1><span id="' + divId + '_name_more">-&nbsp;</span><a href="javascript:closeThisGroup(\'list_' + divId + '\')">' + group.displayName + '</a></h1>';
   innerStr +=    '</div>';
   innerStr +=    '<div id="list_' + divId + '">';
	innerStr +=    	contactsString;
   innerStr +=    '</div>';
   innerStr += '</div>';

	return innerStr;	
}



// Responsible for updating the onlineContacts array to match
// the User.OnlineContacts collection.
function onOnlineContactsChanged(sender, e) 
{
	var enumerator;
	
	switch (e.get_action())
	{
		case Microsoft.Live.Core.NotifyCollectionChangedAction.add:
			enumerator = e.get_newItems().getEnumerator();
			while ( enumerator.moveNext() )
				checkIfThisContactAlreadyExist( enumerator.get_current() );
		break;
		case Microsoft.Live.Core.NotifyCollectionChangedAction.remove:
			enumerator = e.get_oldItems().getEnumerator();
			while (enumerator.moveNext())
				checkIfThisContactAlreadyExist( enumerator.get_current() );
		break;
		case Microsoft.Live.Core.NotifyCollectionChangedAction.reset:		
		break;            
    }
} 

// Responsible for updating the offlineContacts array to match
// the User.OfflineContacts collection.
function onOfflineContactsChanged(sender, e) 
{
	var enumerator;
	
	switch (e.get_action())
	{
		case Microsoft.Live.Core.NotifyCollectionChangedAction.add:
			enumerator = e.get_newItems().getEnumerator();
			while (enumerator.moveNext())
				checkIfThisContactAlreadyExist( enumerator.get_current() );
		break;
		case Microsoft.Live.Core.NotifyCollectionChangedAction.remove:
			enumerator = e.get_oldItems().getEnumerator();
			while (enumerator.moveNext())
				checkIfThisContactAlreadyExist( enumerator.get_current() );
		break;
		case Microsoft.Live.Core.NotifyCollectionChangedAction.reset:			
		break;
	}
}



function closeThisGroup ( groupDivId )
{
	var hideMode = groupsClosed[ groupDivId ] == true ? false : true;		
	var gropuNameMore = document.getElementById( groupDivId.replace( "list_", "" ) + "_name_more" );
	var element;
	
	gropuNameMore.innerHTML = hideMode ? '+&nbsp;' : '-&nbsp;';
	
	element = document.getElementById( groupDivId );
	element.style.display = hideMode ? "none" : "block";
	
	groupsClosed[ groupDivId ] = hideMode;
}





/**
	END CONTACT MANAGEMENT ----------------------------
*/



function removeContact ( contact, contactAddress )
{
	//console.log( "want deleting " + contactAddress );
	
	if( contact == "noOne" )
		contact = contactsByAddress[ contactAddress ];
		
	var answer = confirm( "Sei sicuro di voler eliminare " + getContactAddress( contact ) + "?" )
	if (!answer)
		return;
	
	try
	{
		_user.get_contacts().remove( contact );
		hideContactDiv( null, htmlIdFromContact( contact, "contactDiv" ) );
		contactsDeleted.push( contactAddress );		
		hideContactGroupIfNecessary( getContactAddress( contact ) );
	}
	catch( e ) {}	
}



function getNameHrefForContact ( contact )
{
	return "javascript:createOnContactClick('noOne','" + getContactAddress( contact ) + "');";
}



function displayStatus(status, contact)
{	
	var element = document.getElementById( "status_"+getContactAddress( contact ) );
	var _statusImg = imagePresenceString( status );
	
	if( element )
		element.innerHTML = '<img alt="' + localizatedPresenceString( contact.get_presence().get_status() ) + '" src="/images/webmessenger/presence/' + _statusImg + '.png" alt="" />';
	
	try
	{
		var element2 = document.getElementById( "offlinemsgusr_" + getContactAddress( contact ) );
		element2.style.display = status.toString() == "0" ? "block" : "none";			
	}
	catch( e ) {}	
}



function displayDisplayName(content, contact, more)
{
	if( !more || more == undefined || more == null )
		more = "";
	else
		more = " - " + more;
	
	var element = document.getElementById( "displayName_" + getContactAddress( contact ) );	

	if (element )
		element.innerHTML = '<p><a target="_self" href="' + getNameHrefForContact( contact ) + '">' + content + '</a>' + more + '</p>';
}




function createOnContactClick(contact, contactAddress)
{
	if( contact == "noOne" )
		contact = contactsByAddress[ contactAddress ];
	
	if( getConversationNumbers() >= maxConversationAllowed )
	{
		
		var element = document.getElementById( "conversationBlock_" + getContactAddress( contact ) );
		if( !element )
		{
			alert( noMoreConversationAlert );
			return;
		}
	}
	
	
	ignoreConversationChanges = false;
	
   //console.log("createOnContactClick(contact)");
    
    var address = contact.get_currentAddress();
	
      if (contact.get_isOnline())
      {
			var c = _user.get_conversations().create(address);
			showConversation(contact);
      }
      else{}
}



function showConversation( contact, contactAddress )
{
	var _myaddress;
	var contactFinding;
	var contactFound;
	var c;
	
	for (var i = 0; i < _user.get_conversations().get_count(); i++)
	{
		c = _user.get_conversations().get_item(i);

		if (c.get_closed())
			continue;
			
		_myaddress = c.get_id().split(':')[0];
		contactFinding = _contactCollection.find(_myaddress, Microsoft.Live.Messenger.IMAddressType.windowsLive);
		
		if( contactFinding == null )
			continue;

		if( !existConversationFor( contactFinding ) )			
		{
			contactFound = contactFinding;
			addConversationFor( contactFound, i );
		}
		addConversationBlock(c, i);
	}
	
	if( contact == undefined || contact == null )
		contact = contactFound;
	showOnlyConversationBlockFor( contact, contactAddress );
}



function addConversationBlock(conversation, index)
{
	var _myaddress = conversation.get_id().split(':')[0];
	var contact = _contactCollection.find(_myaddress, Microsoft.Live.Messenger.IMAddressType.windowsLive);
	var existAnotherConversationWithThisContact;	

	existAnotherConversationWithThisContact = document.getElementById( "conversationBlock_" + getContactAddress( contact ) ) == null || document.getElementById( "conversationBlock_" + getContactAddress( contact ) ) == undefined;
	existAnotherConversationWithThisContact = !existAnotherConversationWithThisContact;
	
	
	if ( !existAnotherConversationWithThisContact ) 
	{
		var address = contact.get_currentAddress();
		
		if (address.get_isOnline())
		{
			_convSink = Delegate.create(null, newMessageReceived);
			var c = _user.get_conversations().create(address);
			c.add_messageReceived(_convSink);
		}
		
		createConversationBlock(contact, index);
		document.getElementById('conv' + contact.get_id()).value = messageDefaultIM;
		
	}

	var innerStr = '<input type="image" onclick="javascript:showEmoticonPanel();" src="'+customizationFolderPath+'conversation_emoticon.jpg" > ';
	innerStr += '<input src="'+customizationFolderPath+'conversation_send.jpg" type="image" value="Invia" onclick="sendMessage(\'' + index + '\',\'' + contact.get_id() + '\')" />';
	document.getElementById('send' + contact.get_id()).innerHTML = innerStr;	
	document.getElementById('conv' + contact.get_id()).defaultValue = document.getElementById('conv' + contact.get_id()).value;
	
	var historyBox = document.getElementById('history' + contact.get_id());
	historyBox.innerHTML = "";
	
	var hist = conversation.get_history();
	
	for (var i = 0; i < hist.get_count(); i++)
	{
	    displayMsgNew(hist.get_item(i), historyBox);
	    historyBox.scrollTop = historyBox.scrollHeight;
	}
	historyBox.scrollTop = historyBox.scrollHeight;
	showConversationBox(0);
}


function showEmoticonPanel ()
{
	var emoticonPanel = document.getElementById( "boxEmoticon" );
	
	if( applicationType != "customer" && !isIE )
	{
		boxEmoticon.style.left = boxEmoticonLeft;
		boxEmoticon.style.top = boxEmoticonTop;
	}

	if( emoticonPanel.style.display == "block" )
		emoticonPanel.style.display = "none";
	else
		emoticonPanel.style.display = "block";
}


function closeEmoticonPanel ()
{
	document.getElementById( "boxEmoticon" ).style.display = "none";	
}


function fillEmoticonPanel ()
{
	if( emoticonAdded )
		return;
		
	emoticonAdded = true;
	
	var emoticonPanel = document.getElementById( "boxEmoticon" );
	var innerStr = emoticonPanel.innerHTML;	
	var emoticons = [ ":)", ":D", ";)", ":-O", ":P", "(H)", ":@", ":S", ":$", ":(", ":'(", ":|", "(A)", "8o|", "8-|", "+o(", "<:o)", "|-)", "*-)", ":-#", ":-*", "^o)", "8-)", "(L)", "(U)", "(M)", "(@)", "(&)", "(sn)", "(bah)", "(S)", "(*)", "(#)", "(R)", "({)", "(})", "(K)", "(F)", "(W)", "(O)" ];
	var emoticonToAdd;
	var emoticonEncoded;
	
	for( var i = 0; i < emoticons.length; i++ )
	{
		emoticonToAdd = emoticons[ i ];
		emoticonEncoded = Microsoft.Live.Messenger.MessengerUtility.emoticonEncode( emoticonToAdd ).innerHTML;
		innerStr += '<a href="javascript:appendEmoticon(\'' + emoticonToAdd + '\')" title="provaEmoticon">' + emoticonEncoded + '</a>';
	}

	emoticonPanel.innerHTML = innerStr;
}


function addContactByAddress( address, contact )
{
	contactsByAddress[ address ] = contact;	
}


function addConversationFor( contact, index )
{
	var address = getContactAddress( contact );

	for( var i = 0; i < conversationsAddress.length; i++ )
		if( conversationsAddress[i] == address )
			break;
	if( i == conversationsAddress.length )
	{
		conversationsAddress.push( address );
		createTabButton( index, conversationsAddress.length - 1, true, contact );
	}
}


function removeConversationFor( contact, contactAddress )
{
	/* 
		it is important that the position of the addresses never change in the array, so all of the elements in the page 
		can use the index assuming that it is always the same
	*/

	var address = contactAddress == null || contactAddress == undefined ? getContactAddress( contact ) : contactAddress;
	deleteTabButton( getConversationIndexFor( undefined, address ) );
	for( var i = 0; i < conversationsAddress.length; i++ )
		if( conversationsAddress[i] == address )
			conversationsAddress[i] = "";
}


function existConversationFor( contact, contactAddress )
{
	var address = contactAddress == null || contactAddress == undefined ? getContactAddress( contact ) : contactAddress;
	for( var i = 0; i < conversationsAddress.length; i++ )
		if( conversationsAddress[i] == address )
			return true;
	return false;
}


function getConversationIndexFor( contact, contactAddress )
{
	var address = contactAddress == null || contactAddress == undefined ? getContactAddress( contact ) : contactAddress;
	for( var i = 0; i < conversationsAddress.length; i++ )
		if( conversationsAddress[i] == address )
			return i;
	return -1;
}


function closingConversationGetAnother( contact, contactAddress )
{
	var address = contactAddress == null || contactAddress == undefined ? getContactAddress( contact ) : contactAddress;
	var conversationIndex = getConversationIndexFor( undefined, contactAddress );
	var lastConversation;
	
	for( var i = conversationIndex + 1; i < conversationsAddress.length; i++ )
		if( conversationsAddress[i] != "" )
			return conversationsAddress[i];

	for( var i = conversationIndex - 1; i >= 0; i-- )
		if( conversationsAddress[i] != "" )
			return conversationsAddress[i];
			
	return null;
}


function getConversationNumbers ()
{
	var n = 0;
	for( var i = 0; i < conversationsAddress.length; i++ )
		if( conversationsAddress[i] != "" )
			n++;
	return n;
}


function getConversationBlockBy ( contact, onlyIdNotEntireElement, contactAddress, iWantToKnowOfAnotherConversationWithThisContactExist )
{
	if( conversationsAddress.length == 0 )
		return undefined;
	
	var address = contactAddress == null || contactAddress == undefined ? getContactAddress( contact ) : contactAddress;
	for( var i = 0; i < conversationsAddress.length; i++ )
		if( conversationsAddress[i] == address )
			break;
	
	if( i == conversationsAddress.length )
	{
		return undefined;
		//console.warn( "ATTENTION! fot this contact there is no an open conversation" );
	}
	
	var id = "conversationBlock_" + address;
	
	if( iWantToKnowOfAnotherConversationWithThisContactExist == true )
	{
		try
		{		
			return document.getElementById( id ).id;
		}
		catch( e )
		{
			return undefined;
		}
		
	}	
	
	if( onlyIdNotEntireElement )
		return id;
		
	return document.getElementById( id );
}


function showOnlyConversationBlockFor ( contact, contactAddress, showContacts )
{
	if( conversationsAddress.length == 0 )
		return;
	
	closeEmoticonPanel();
	
	var element;
	var address = ( contactAddress == null || contactAddress == undefined ) && !showContacts ? getContactAddress( contact ) : contactAddress;
	/*//console.warn( "address to show, " + address );*/

	for( var i = 0; i < conversationsAddress.length; i++ )
	{
		element = document.getElementById( "conversationBlock_" + conversationsAddress[i] );

		if( element == null )
			continue;

		if( conversationsAddress[i] == address && !showContacts )
		{
			element.style.display = "block";			
			showOnlyThisTabButtonsClicked( i );			
			textareaNow = textaresIdForContactAddress[ address ];
			
			if(sharedMessage)
			{
				var messageToShare=sharedMessage;
				if(sharedUrl){messageToShare+=' - '+sharedUrl;}
				document.getElementById('conv' + contact.get_id()).value = messageToShare;
				eraseSharedContent();
			}
			
			addContactMode( "false", false );	
			hideContactList();			
		}
		else
		{
			element.style.display = "none";			
		}		
	}
	
	if( showContacts )
		showTabButtonsUnclicked();
}


function hideContactList ()
{
	document.getElementById( "contactlist" ).style.display = "none";
	document.getElementById( "msgrconvWrapper" ).style.display = "block";
}


function showContactList ()
{
	document.getElementById('friendstab').className = "contatti contattiselected";
	
	wasOnContact = true;
	closeEmoticonPanel();
	document.getElementById( "contactlist" ).style.display = "block";
	document.getElementById( "msgrconvWrapper" ).style.display = "none";	
	
	tabButtonClicked( -1 );
}


function emptyTextareaInput ()
{
	closeEmoticonPanel();
	
	if( textareaNow == null )
		return;
		
	var element = document.getElementById( textareaNow );
	if( element.value == messageDefaultIM )
		element.value = "";
}


function appendEmoticon ( emoticonStr )
{
	closeEmoticonPanel();
	emptyTextareaInput();
	
	if( textareaNow == null )
		return;

	document.getElementById( textareaNow ).value += emoticonStr;	
	document.getElementById( textareaNow ).focus();
}



function filterContacts ( strToSearch )
{
	var element;
	var address;
	var contact;
	var visible; /* 0 hide, 1 do not change, 2 show*/
	var i;
	
	if( strToSearch.indexOf( filterContactDefaultValue ) != -1 )
	{
		strToSearch = strToSearch.replace( filterContactDefaultValue, "" );
		document.getElementById( "filterContact" ).value = strToSearch;
	}
	
	if( strToSearch != "" )
	{
		document.getElementById( "searchBoxSubmit" ).style.display = "none";
		document.getElementById( "searchBoxBing" ).style.display = "block";
		document.getElementById( "searchBoxCancel" ).style.display = "block";
		hideGroupNames();	
	}
	else
	{
		document.getElementById( "searchBoxSubmit" ).style.display = "block";
		document.getElementById( "searchBoxCancel" ).style.display = "none";
		clearInterval( bingHideInterval );
		bingHideInterval = setInterval( hideBingSearch, 250 );
	}
	
	strToSearch = strToSearch.toLowerCase();
	
	/* so the onBlur effect on the searchBox will not cancel the click on the contact */
	strToSearchSaved = strToSearch;
	clearInterval( delayContactVisibility );
	delayContactVisibility = setInterval( manageContactsVisibilityBasedOnSearch, 250 );
}


function manageContactsVisibilityBasedOnSearch ()
{
	var element;
	var address;
	var contact;
	var visible; /* 0 hide, 1 do not change, 2 show*/
	var i;
	var strToSearch = strToSearchSaved;
	
	clearInterval( delayContactVisibility );
	
	for( address in contactsByAddress )
	{
		visible = 1;

		contact = contactsByAddress[ address ];		
		element = document.getElementById( htmlIdFromContact( contact, "contactDiv" ) );
		
		if( !element )
			continue;
		
		if( strToSearch == "" || address.toLowerCase().indexOf( strToSearch ) != -1 || contact.get_displayName().toLowerCase().indexOf( strToSearch ) != -1 )
			visible = 2;
		else
			visible = 0;

		switch( visible )
		{
			case 0:
				hideContactDiv( element );
			break;	
			case 2:
				if( contact.get_isOnline() )
					showContactDiv( element );
			break;
		} 
	}
}


function hideBingSearch ()
{
	document.getElementById( "searchBoxBing" ).style.display = "none";
	clearInterval( bingHideInterval );
	showGroupNames();
}


function bingSearch ()
{
	var value = lastSearch;// || document.getElementById( "filterContact" ).value;
	if( value == filterContactDefaultValue )
		return;
	var url = 'http://www.bing.com/search?q=' + value;	
	window.open( url, '_blank');	
	lastSearch = filterContactDefaultValue;
}


function hideGroupNames ( onlyThisName )
{
	var groupNameElement;

	for( var i = 0; i < groupNames.length; i++ )
	{		
		if( onlyThisName != null && onlyThisName != undefined )
			if( groupNames[ i ] != "group_" + onlyThisName + "_name" )
				continue;
				
		groupNameElement = document.getElementById( groupNames[ i ] );
		groupNameElement.style.display = "none";
	}
}


function showGroupNames ()
{
	var groupNameElement;
	var groupId;
	
	for( var i = 0; i < groupNames.length; i++ )
	{
		groupId =groupNames[i].replace( "_name", "" );

		if( numberOfContactsForGroup( groupId ) == 0 )
		{
			hideGroupNames( groupId.replace( "group_", "" ) );
			continue;
		}

		groupNameElement = document.getElementById( groupNames[ i ] );
		groupNameElement.style.display = "block";
	}
}



function showContactDiv( contactDiv, contactDivId )
{
	if( !contactDiv )
		contactDiv = document.getElementById( contactDivId );
	
	try
	{
		var contactAddress = contactDiv.id.replace( "contact_", "" );
		
		if( contactsDeleted.indexOf( contactAddress ) != -1 )
			return;
			
		contactsShowed[ contactAddress ] = true;
		contactDiv.setAttribute( "style", "display:block;" );
		contactDiv.className = "ContactItem";
		var clearItem = document.getElementById( "clearItem_" + contactDiv.id );
		clearItem.setAttribute( "style", "display:block;" );
		clearItem.style.display = "block";
	}
	catch( e ){}	
}




function hideContactDiv( contactDiv, contactDivId )
{
	if( !contactDiv )
		contactDiv = document.getElementById( contactDivId );
		
	try
	{
		var contactAddress = contactDiv.id.replace( "contact_", "" );
		contactsShowed[ contactAddress ] = false;
		contactDiv.setAttribute( "style", "display:none;" );		
		contactDiv.className = "hide";
		var clearItem = document.getElementById( "clearItem_" + contactDiv.id );
		clearItem.setAttribute( "style", "display:none;" );
		clearItem.style.display = "none";
	}
	catch( e ){}	
}



function hideContactGroupIfNecessary ( address )
{
	var i;	
	var group;
	var groupName = groupsForContacts[ address ];
	
	for( i = 0; i < map.length; i++ )
	{
		group = map[i];
		
		if( group.displayName == groupName )
		{
			if( numberOfContactsForGroup( group.id ) == 0 )
				hideGroupNames( group.displayName );
			break;
		}			
	}
}



function showContactGroupIfNecessary ( address )
{
	var i;	
	var group;
	var groupName = groupsForContacts[ address ];
	
	for( i = 0; i < map.length; i++ )
	{
		group = map[i];
		
		if( group.displayName == groupName || i == map.length -1 )
		{
			showGroupNames();
			break;
		}			
	}
}



/**
	CONVERSATION TABS MANAGEMENT -----------------------------
*/	


function createTabButton ( fullSixIndex, index, clickedMode, contact )
{
	var element = document.createElement("li");
	var classStr = clickedMode ? "last selected" : "last hide"; 
	var innerStr;
	
	var displayName = savedDisplayNames[ conversationsAddress[ index ] ];//contactsByAddress[ conversationsAddress[ index ] ].get_displayName();
	var closeHref = getCloseTabConversationHref( fullSixIndex, contact );
	
	element.id = "conversationstab" + index;
	element.setAttribute( "class", classStr );
	innerStr = '<a href="javascript:tabButtonClicked(' + index + ')" class="change_conv"><span title="' + displayName + '">' + displayName + '</span></a><a href="' + closeHref + '" class="close_conv"><img src="/images/webmessenger/spacer.gif" width="10" height="10" /></a>';
	element.innerHTML = innerStr;
	
		
	elementsToClear.push( element );
	
	document.getElementById( "msgrtabsid" ).appendChild( element );
}



function getCloseTabConversationHref ( index, contact )
{
	return "javascript:closeConv('" + index + "','" + contact.get_id() + "','" + getContactAddress( contact ) + "')";
}



function deleteTabButton ( index )
{
	var element = document.getElementById( "conversationstab" + index );
	var father = document.getElementById( "msgrtabsid" );
	father.removeChild( element );
	element.id = "";
}



function showTabButton ( index )
{
	var element;
	element = document.getElementById( "conversationstab" + index );
	element.className = "last selected";
}



function tabButtonClicked ( index )
{
	if( index != -1 )
	{
		document.getElementById('friendstab').className = "contatti";
		if( wasOnContact )
		{
			wasOnContact = false;
			createOnContactClick('noOne',conversationsAddress[index]);
			return;
		}			
	}
	else
		document.getElementById('friendstab').className = "contatti contattiselected";

	showOnlyConversationBlockFor( undefined, conversationsAddress[ parseInt( index ) ], index == -1 );	
	showConversationBox( index );
}



function showTabButtonsClicked ( index )
{
	var element;
	element = document.getElementById( "conversationstab" + index );
	
	/* change done only for IE7 on Ste's Fusion */
	/*element.setAttribute( "class", "first selected" );*/
	element.className = "first selected";
}



function showOnlyThisTabButtonsClicked ( index )
{
	showTabButtonsUnclicked( index );	
	showTabButtonsClicked( index );
}



function showTabButtonsUnclicked ( excludedIndex )
{
	var elements = getTabButtons( excludedIndex );

	for( var i = 0; i < elements.length; i++ )
		elements[ i ].className = "first";
}
	


function hideTabButtons ( excludedIndex )
{
	var elements = getTabButtons( excludedIndex );

	for( var i = 0; i < elements.length; i++ )
		elements[ i ].className = "last hide";
}



function getTabButtons ( excludedIndex )
{
	var element;
	var elements = new Array();
	excludedIndex = excludedIndex == undefined || excludedIndex == null ? -1 : excludedIndex;	
	
	for( var i = 0; i < conversationsAddress.length; i++ )
	{
		if( conversationsAddress[i] == "" )
			continue;		
		element = document.getElementById( "conversationstab" + i );
		if( element == null )
			continue;
			
		if( excludedIndex == i )
			continue;

		elements.push( element );
	}
	
	return elements;
}



/**
	END CONVERSATION TABS MANAGEMENT -------------------------
*/	



function createConversationBlock(contact,index)
{
	addConversationFor( contact, index );
	var textareaId = "conv" + contact.get_id();
	
	
	var tmpItem = new Object;	
	tmpItem.innerHTML = '<div class="conversationItem" id="' + getConversationBlockBy( contact, true ) + '" style="' + baseConverationBlockStyle + '">';
	tmpItem.innerHTML += '<div class="conversationItemWrapper" style="display:block;" id="block' + contact.get_id() + '">';
	tmpItem.innerHTML += ' <div id="offlinemsgusr_' + getContactAddress( contact ) + '" class="offlinemsg" style="display:none;">Utente offline</div>';
	tmpItem.innerHTML += ' <div class="conversationhistory" id="history' + contact.get_id() + '"></div>';
	tmpItem.innerHTML += '<div><img src="/images/webmessenger/spacer.gif" height="10" width="10"/></div>';
	tmpItem.innerHTML += ' <textarea onKeyUp="javascript:keyupped(event, \'' + textareaId + '\');" onKeyPress="javascript:keypressed(event, \'' + textareaId + '\', \'' + index +  '\', \'' + contact.get_id() +  '\');" onclick="javascript:emptyTextareaInput(\'' + textareaId + '\');" class="conversationarea" id="' + textareaId + '"></textarea>';
	tmpItem.innerHTML += '<div><img src="/images/webmessenger/spacer.gif" height="10" width="10"/></div>';
	tmpItem.innerHTML += ' <div class="conversationInput" id="send' + contact.get_id() + '"></div>';
	tmpItem.innerHTML += '	</div>';
	tmpItem.innerHTML += '</div>';
	document.getElementById('conversations').innerHTML = tmpItem.innerHTML + document.getElementById('conversations').innerHTML;	
	
	textaresIdForContactAddress[ getContactAddress( contact ) ] = textareaId;
	
	var textareaElement = document.getElementById( textareaId );
	
	textareaElement.onchange= function( e )
	{
		/* we thought to replace text with emoticon but in the textarea you can not insert span or div tags */
	};
}



function keypressed ( event, textAreaId, index, contactId )
{
	var keycode;
	if (isIE) 
		keycode = window.event.keyCode;
	else
		keycode = event.keyCode;
	if( keycode == "13" )
		sendMessage( index, contactId );
}



function keyupped ( event, textAreaId )
{
	var keycode;
	if (isIE) 
		keycode = window.event.keyCode;
	else
		keycode = event.keyCode;
	if( keycode == "13" )
	{
		try
		{
			document.getElementById( textAreaId ).value = "";
		}
		catch( e ){}
	}
}

 	

function showConversationBox( id )
{
	var numberOfCoversation = _user.get_conversations().get_count();
	
	if (numberOfCoversation != 0 && id != -1) 
	{
		document.getElementById('friendstab').className = "contatti";	
	}
	
	document.getElementById('contactlist').className = "hide";
	document.getElementById('conversations').className = "";
}



function showFriendBox()
{
	textareaNow = null;
	var numberOfConversation = _user.get_conversations().get_count();

	closeEmoticonPanel();
	showTabButtonsUnclicked();	
	
	document.getElementById('friendstab').className = "contatti contattiselected";	
	document.getElementById('contactlist').className = "";
	document.getElementById('conversations').className = "hide";
}



function resetMessengerLogout()
{
	manageElementsVisibility( "onLogout" );
		
	document.getElementById('contactlist').innerHTML = "";
	document.getElementById('conversations').innerHTML = "";
	document.getElementById('profilecontainer').innerHTML = "";
}



/* Called by the Windows Live Messenger Library on remote sign-out (i.e. user has signed out, or//console.logged into Messenger on another computer). */
function onSignedOutRemotely(sender, e)
{
    alert("You have been signed out remotely.");
}


/* Called by the Windows Live Messenger Library when the list of conversations changes. */
function conversations_PropertyChanged(sender, e)
{
	//console.log("conversations_PropertyChanged(sender, e)");
	
	if( ignoreConversationChanges )
		return;

   showConversation();
}


/* Called by the Windows Live Messenger Library when status changes of the user occur. */
function user_Presence_PropertyChanged(sender, e)
{
    displayUserInfo();

    if (sender.get_status() == Microsoft.Live.Messenger.PresenceStatus.offline)
    {
      resetMessengerLogout();
    }
}


/* Populate the user information string. */
function displayUserInfo()
{
    removeChildrenFromNode('profilecontainer');
    var profilecontainer = document.getElementById('profilecontainer');
    
    var userAddress = _user.get_address().get_address();
    var userDisplayName = _user.get_presence().get_displayName();
    var userPersonalMessage = _user.get_presence().get_personalMessage();
    var userStatus = Enum.toString(Microsoft.Live.Messenger.PresenceStatus, _user.get_presence().get_status());

	var picUrl = _user.get_presence().get_displayPictureUrl();
		
	var path;


    var image = new Image();
    image.src = path;
    image.onerror = function() {
        path = "/images/webmessenger/personalImageGeneric.jpg";
    };

    path = picUrl;
    
	if( !userDisplayName )
		userDisplayName = "<Nome Utente>";
		

	var strInner;
	var status = _user.get_presence().get_status();
	
	savedDisplayNames[ _user.get_address().get_address() ] = userDisplayName;
		
	strInner = '<div id="profileimgcontainer" style="background:url(/images/webmessenger/presence/' + imagePresenceString( status ) + 'Big.png) top center no-repeat;">';
	strInner += '	<img onAbort="javascript:addDefaultProfileImage();" onError="javascript:addDefaultProfileImage();" src="' + path + '" />';
	strInner += '</div>';
	strInner += '<div id="profilewrapper">';
	strInner += '	<div id="displayname"><span>' + userDisplayName  + '</span></div>';
	strInner += '	<div id="personalmessage">';
	strInner += '	<form onSubmit="javascript: return changeMyPersonalMessage();">';
	strInner += '		<input id="personalmessageinput" onfocus="javascript:changePersonalMessageInputBackground();" maxlength="40" onblur="javascript:resetPersonalMessageInputBackground();" type="text" value="' + userPersonalMessage + '" />';
	strInner += '	</form>';
	strInner += '	</div>';
	strInner += '	<div id="personalstatus">';
	strInner += '		<div id="personalstatus0"><span><a href="javascript:disconnectUser();" title="Disconnetti">Disconnetti</a>&nbsp;&nbsp;|</span></div>';
	strInner += '		<div id="personalstatus1"><img src="/images/webmessenger/presence/' + imagePresenceString( status ) + '.png" /></div>';
	strInner += '		<div id="personalstatus2"><span><a href="javascript:showPresenceStatus();" title="Cambia stato">' + localizatedPresenceString( status ) + '</a></span></div>';
	strInner += '	</div>';
	strInner += '</div>';
	profilecontainer.innerHTML = strInner;
}



function addDefaultProfileImage ()
{
	try
	{
		document.getElementById( "profileimgcontainer" ).innerHTML = '<img src="/images/webmessenger/personalImageGeneric.jpg" />';
	}
	catch( e ){}
}



function changePersonalMessageInputBackground ()
{
	closeEmoticonPanel();
	var textArea = document.getElementById("personalmessageinput");
	if( isIE )
		textArea.getAttribute( "style" ).background = PersonalMessageInputBackground;
	else
		textArea.style.background = PersonalMessageInputBackground;
}



function resetPersonalMessageInputBackground ()
{
	var textArea = document.getElementById("personalmessageinput");
	if( isIE )
		textArea.getAttribute( "style" ).background = "transparent";
	else
		textArea.style.background = "transparent";
	changeMyPersonalMessage();
}



function showPresenceStatus ()
{
	try
	{
		var changeStatusContainer = document.getElementById( "changeStatusContainer" );
		
		if( applicationType != "customer" && !isIE )
		{
			changeStatusContainer.style.left = changeStatusContainerLeft;
			changeStatusContainer.style.top = changeStatusContainerTop;
		}
		
		changeStatusContainer.style.display = "block";
	}
	catch( e ){}
}



function changeMyPersonalMessage ()
{
	var textArea = document.getElementById("personalmessageinput");
	var value = textArea.value;
	
	_user.get_presence().set_personalMessage( value );
	
	return false;
}
   

/* Called by the Windows Live Messenger Library when a new message is received. */
function recvMsg(sender, e)
{
   ////console.log("recvMsg(sender, e)");
    switch (e.get_message().get_type())
    {
        case Microsoft.Live.Messenger.MessageType.applicationMessage:
            var message = e.get_message();
            if (message.get_id() == _myApplicationMessage.Id)
            {
                displayCustomMsg(message);
            }
            break;
        case Microsoft.Live.Messenger.MessageType.nudgeMessage:
            break;
        case Microsoft.Live.Messenger.MessageType.textMessage:
            var message = e.get_message();
            displayMsg(message);
            break;
        default:
            break;
    }
}


/* Show text for a received message in the conversation window. */
function displayMsg(message)
{
  ////console.log("displayMsg(message)");
    var elMsg = message.createTextElement();
    //var txtConv = document.getElementById("txtConv");

    var sender = message.get_sender();
    var dispName = sender.get_presence().get_displayName() || sender.get_address();

		var strongDiv = document.createElement( "strong" );
		strongDiv.innerHTML = dispName + ": ";

    txtConv.appendChild( strongDiv );
    txtConv.appendChild(elMsg);
    txtConv.appendChild(document.createElement("br"));
}



function newMessageReceived(sender, e)
{
	var _myaddress = sender.get_id().split(':')[0];
  	var _mycontact = _contactCollection.find(_myaddress, Microsoft.Live.Messenger.IMAddressType.windowsLive);
	
	var messageTmp = new Object;
	
	var targetObj = document.getElementById("history" + _mycontact.get_id())
	displayMsgNew(e.get_message(), targetObj);
  	targetObj.scrollTop = targetObj.scrollHeight;
}


function sendMessage(convIndex,contactId)
{
	closeEmoticonPanel();	
	
	var txtMessage = document.getElementById("conv" + contactId);
    var messageText = txtMessage.value;

	if( messageText == messageDefaultIM )
	{
		alert( noTextInsertedSendWillBlocked );
		return;
	}

    /* send messagge only if is not empty */
	if (messageText != '')
	{ 
		var message = new Microsoft.Live.Messenger.TextMessage(messageText);
		var _conv = _user.get_conversations().get_item(convIndex);
	   
		if (_user)
		{
		    _conv.sendMessage(message, null);
		}
	    
	    displayMsgNew(message, document.getElementById("history" + contactId), true);
		var historyBox = document.getElementById("history" + contactId);
	    historyBox.scrollTop = historyBox.scrollHeight;
	    
	    txtMessage.value = "";
	}
}


function closeConv(convIndex,contactId, contactAddress, contactIndex)
{
	closeEmoticonPanel();	
   var conversations = _user.get_conversations();

	try
	{
		
		/**
		  * ATTENTION! this loop close the first conversation founded for the contact!
		  * If in the future you will improve multi-users chat you have to rewrite this loop
		  * 
		  **/
		var founded = false;
		var enumerator = conversations.getEnumerator();
		while (enumerator.moveNext() ) 
		{
	      conversation = enumerator.get_current();
			var roster = conversation.get_roster();
			var rosterEnumerator = roster.getEnumerator()
			while( rosterEnumerator.moveNext() )
			{
				if( contactAddress == getContactAddress( rosterEnumerator.get_current().get_contact() ) )
				{
					founded = true;
					break;
				}
			}
			if( founded )
				break;
		}
		
		if( conversation )
		{
	    	conversation.close();
			conversation.dispose();
		}
		
		
		/* old close, perfect for fullsix, bad for creeo that changed conversation management */
		/*
		var conversation = conversations.get_item(convIndex);
	    conversation.close();
		conversation.dispose();
		*/
	}
	catch( e ){}


	var id = getConversationBlockBy( undefined, true, contactAddress );	
	var nextConversationAddressToShow = closingConversationGetAnother( undefined, contactAddress );


    /*removeChildrenFromNode('usr' + contactId);*/
		removeChildrenFromNode( id );
    /*document.getElementById('usr' + contactId).id = "";*/
		var element = document.getElementById( id );
		element.parentNode.removeChild( element );
		element.id = "";
		
		removeConversationFor( undefined, contactAddress );		

	////console.log( "there are " + getConversationNumbers() + " conversations opened, next to show is " + nextConversationAddressToShow );

	if ( getConversationNumbers() == 0 )
    {
		document.getElementById('friendstab').className = "contatti contattiselected";
		document.getElementById('contactlist').className = "";
		document.getElementById('conversations').className = "hide";
		showContactList();
    }


	if( textaresIdForContactAddress[ contactAddress ] == textareaNow )
		nextConversationAddressToShow == null;

	if( nextConversationAddressToShow != null )
		showOnlyConversationBlockFor( undefined, nextConversationAddressToShow );
}


function displayMsgNew(message, targetObJ, sendingMessage)
{
   ////console.log("displayMsgNew(message)");
    
    var elMsg = message.createTextElement();
   
    var sender = message.get_sender();
    var dispName = savedDisplayNames[ sender.get_address() ];//sender.get_presence().get_displayName() || sender.get_address();
	  
		var strongDiv = document.createElement( "strong" );
		strongDiv.innerHTML = dispName + ": ";

		if( targetObJ )
		{
		var innerStr = targetObJ.innerHTML;
		innerStr += "<span><strong>" + dispName + ": </strong>";
		innerStr += elMsg.innerHTML + "</span>";
		innerStr += "<br/>";
		targetObJ.innerHTML = innerStr;

	}

	if( sendingMessage )
		return;
		
	////console.warn(getContactAddress( message.get_sender().get_contact() ));
	showOnlyConversationBlockFor( undefined, getContactAddress( message.get_sender().get_contact() ) );
	showConversationBox(0);
}


/* Clear all children from the specified node
(i.e. clear messages from the conversation window). */
function removeChildrenFromNode(id)
{
    var node = document.getElementById(id);
    if (!node)
    {
        return;
    }

    while (node.hasChildNodes())
    {
        node.removeChild(node.firstChild);
    }
}


function closeAllConv()
{
	for (var i = 0; i < _user.get_conversations().get_count(); i++)
    {
        var c = _user.get_conversations().get_item(i);

        if (c.get_closed())
        {
            continue;
        }
        c.close();	
    }
}

function shareThisContent(message, url)
{
	if(contactsIsShowed!=true)
	{
		alert('Il Messenger non è ancora attivo');
		return;
	}
	
	var stay=confirm('Scegli un contatto per condividere il contenuto selezionato');
	if (stay)
	{
		sharedMessage=message;
		sharedUrl=url;
		showContactList();
	}
}


function eraseSharedContent()
{
	if(sharedMessage){sharedMessage=null;}
	if(sharedUrl){sharedUrl=null;}
}


_user = null;
_signin = null;
_conv = null;
_convSink = null;



