
/*****************************************************************************\
 MESSENGER SERVICE (Messages / Friends / Favourites)
 (c)HubJet LLC 2006 ALL rights Reserverd
\*****************************************************************************/

var timeInterval = 20000; // 20 seconds
var prevMessageCount = 0;
var newMessageCount = 0;
var friendCount = 0;
var favouriteCount = 0;
var bHistory;

function initMessengerService() {
	bHistory = window.history;
	startTimer();
}
function callMessengerService() {
	var pl = new SOAPClientParameters();
	SOAPClient.invoke(document.location.protocol + "//" + document.domain + "/_resources/webservices/messenger.asmx", "status", pl, true, resultMessengerService);
}
function resultMessengerService(status) {
	updateCounters(status.messagesNew,status.friendsOnline,status.favouritesOnline);
}

//MESSENGER SERVICE TIMER
var gTimer = null;
var gTimerCount = 0;
function myTimer() {
	gTimerCount++;
	callMessengerService();
}
function startTimer() {
	//DEBUG: alert("Timer Started");
	gTimer = window.setInterval("myTimer()",timeInterval);
}
function stopTimer() {
	//DEBUG: alert("Timer Stoped");
	window.clearInterval(gTimer);
}

function updateCounters(myMessageCount, myFriendCount, myFavouriteCount) {

	//Populate counters
	if (myMessageCount >= 0) { newMessageCount = myMessageCount; }
	if (myFriendCount >= 0) { friendCount = myFriendCount; }
	if (myFavouriteCount >= 0) { favouriteCount = myFavouriteCount; }

	//get the previous message count
	if (document.getElementById('PageNavigation1_lblMessageCount') != null)	{
		prevMessageCount = document.getElementById('PageNavigation1_lblMessageCount').innerHTML;
		if (prevMessageCount == "") { prevMessageCount = 0; }
	}

	//Update Icons & Text
	messageIcon();
	friendIcon();
	favouriteIcon();

	//Check for new messages
	if (newMessageCount > prevMessageCount) {
		//a new message arrived!
		//View messages Popup
		viewMessages();
	}
}

function updateMessageCount(intMessages) {
	prevMessageCount = intMessages;
	newMessageCount = intMessages;
	if (document.getElementById('PageNavigation1_lblMessageCount') != null) {
		document.getElementById('PageNavigation1_lblMessageCount').innerHTML = newMessageCount; }
	messageIcon();
}
function updateFriendCount(intFriends) {
	friendCount = intFriends;
	if (document.getElementById('PageNavigation1_lblFriendCount') != null) {
		document.getElementById('PageNavigation1_lblFriendCount').innerHTML = friendCount; }
	friendIcon();
}
function updateFavouriteCount(intFavourites) {
	favouriteCount = intFavourites;
	if (document.getElementById('PageNavigation1_lblFavouriteCount') != null) {
		document.getElementById('PageNavigation1_lblFavouriteCount').innerHTML = favouriteCount; }
	favouriteIcon();
}

function messageIcon() {
	if (newMessageCount>0) {
		if (document.getElementById('PageNavigation1_imgMessages') != null) {
			document.getElementById('PageNavigation1_imgMessages').src = "/_resources/images/messenger/icons/messages_new.gif"; }
		if (document.getElementById('PageNavigation1_lblMessageCount') != null) {
			document.getElementById('PageNavigation1_lblMessageCount').innerHTML = newMessageCount;
			}
		if (document.getElementById('PageNavigation1_lblMessageText') != null) {
			document.getElementById('PageNavigation1_lblMessageText').innerHTML = "&nbsp;" + "Messages";
			}
	} else {
		if (document.getElementById('PageNavigation1_imgMessages') != null) {
			document.getElementById('PageNavigation1_imgMessages').src = "/_resources/images/messenger/icons/messages_none.gif"; }
		if (document.getElementById('PageNavigation1_lblMessageCount') != null) {
			document.getElementById('PageNavigation1_lblMessageCount').innerHTML = "";
			}
		if (document.getElementById('PageNavigation1_lblMessageText') != null) {
			document.getElementById('PageNavigation1_lblMessageText').innerHTML = "Messages";
			}
	}
}
function friendIcon() {
	if (friendCount>0) {
		//friends online icon
		if (document.getElementById('PageNavigation1_imgFriends') != null) {
			document.getElementById('PageNavigation1_imgFriends').src = "/_resources/images/messenger/icons/friends_online.gif"; }
		if (document.getElementById('PageNavigation1_lblFriendCount') != null) {
			document.getElementById('PageNavigation1_lblFriendCount').innerHTML = friendCount; }
		if (document.getElementById('PageNavigation1_lblFriendText') != null) {
			document.getElementById('PageNavigation1_lblFriendText').innerHTML = "&nbsp;" + "Friends"; }
	} else {
		if (document.getElementById('PageNavigation1_imgFriends') != null) {
			document.getElementById('PageNavigation1_imgFriends').src = "/_resources/images/messenger/icons/friends_none.gif"; }
		if (document.getElementById('PageNavigation1_lblFriendCount') != null) {
			document.getElementById('PageNavigation1_lblFriendCount').innerHTML = ""; }
		if (document.getElementById('PageNavigation1_lblFriendText') != null) {
			document.getElementById('PageNavigation1_lblFriendText').innerHTML = "Friends"; }
	}
}
function favouriteIcon() {
	if (favouriteCount>0) {
		//favourites online icon
		if (document.getElementById('PageNavigation1_imgFavourites') != null) {
			document.getElementById('PageNavigation1_imgFavourites').src = "/_resources/images/messenger/icons/favourites_online.gif"; }
		if (document.getElementById('PageNavigation1_lblFavouriteCount') != null) {
			document.getElementById('PageNavigation1_lblFavouriteCount').innerHTML = favouriteCount; }
		if (document.getElementById('PageNavigation1_lblFavouriteText') != null) {
			document.getElementById('PageNavigation1_lblFavouriteText').innerHTML = "&nbsp;" + "Favourites"; }
	} else {
		if (document.getElementById('PageNavigation1_imgFavourites') != null) {
			document.getElementById('PageNavigation1_imgFavourites').src = "/_resources/images/messenger/icons/favourites_none.gif"; }
		if (document.getElementById('PageNavigation1_lblFavouriteCount') != null) {
			document.getElementById('PageNavigation1_lblFavouriteCount').innerHTML = ""; }
		if (document.getElementById('PageNavigation1_lblFavouriteText') != null) {
			document.getElementById('PageNavigation1_lblFavouriteText').innerHTML = "Favourites"; }
	}
}

function viewMessages() {
	//Alert Popup
	if (document.getElementById('PageNavigation1_divAlertPopup') != null) {
		//Only show alert box if messenger window is closed
		var showAlert = true;
		if (document.getElementById('winMessenger').style.visiblity == "visible") {
			//Window open - disable alert
			showAlert = false;
		}
		if (showAlert) {
			openMessengerWindowAlert();
		}
	}
	//Alert Sound
	if (document.getElementById('PageNavigation1_divAlertSound') != null) {
		document.getElementById('PageNavigation1_divAlertSound').innerHTML = "<embed src='/_resources/sounds/sound111.wav' hidden='true' autostart='true' loop='false'>";
	}
}

//Prevent page caching by using unique url param
function noCache()	{    
	var ticks = '&noCache=' + new Date().getTime();
	return ticks;
}

//LOCAL CLIENT TIMEZONE OFFSET
function timeZone()	{
	//return minutes offset
	var offset = '&timezone=' + new Date().getTimezoneOffset();
	return offset;
}

function openMessengerWindow(winURL, winHeight) {
	try {
		//set the iframe url
		document.getElementById("winMessenger_iframe").src = winURL;
		//display content
		document.getElementById("winMessenger").style.display = "block";
		//set height
		//document.getElementById("winMessenger").style.height = winHeight + "px";
		document.getElementById("winMessenger_iframe").style.height = winHeight + "px";
		//scroll to top of page
		self.scrollTo(0,0);
		return false;
	} catch(ex) {
		//fail over to standard browser window opener
		return true;
	}
}
function displayMessengerWindow() {
	//used in onload to preserve browser back button funtionality
	if (document.getElementById("winMessenger") != null) {
		document.getElementById("winMessenger").style.display = "block";
	}
}
function closeMessengerWindow() {
	//reset the iframe url
	document.getElementById("winMessenger_iframe").src = "/myAccount/messenger/loading.html";
	//hide content
	document.getElementById("winMessenger").style.display = "none";
	//reset the browser history
	if (bHistory.length) window.history.go(-(window.history.length - bHistory.length));
	return false;
}


// MessengerAlert Window
function openMessengerWindowAlert() {
	try {
		//display content
		document.getElementById("winMessengerAlert").style.visibility = "visible";
		//centre window
		offsetWindow('winMessengerAlert',128);
		//Centre when scrolling
		window.onscroll = function() {
			offsetWindow('winMessengerAlert',128);
		}
		return false;
	} catch(ex) {
		//fail over to standard browser window opener
		return true;
	}
}
function closeMessengerWindowAlert() {
	//hide content
	document.getElementById('winMessengerAlert').style.visibility = "hidden";
	return false;
}
function offsetWindow(winID, winHeight) {
	var root = (document.compatMode == "CSS1Compat"?document.documentElement: document.body);
	if (document.getElementById(winID) != null) {
		if (document.getElementById(winID).style.visibility == "visible") {
			document.getElementById(winID).style.top = root.scrollTop + Math.round((root.clientHeight / 2) - (winHeight /2)) + "px";
		}
	}
}






























































/*****************************************************************************\
 Javascript "SOAP Client" library
\*****************************************************************************/

function SOAPClientParameters()
{
	var _pl = new Array();
	this.add = function(name, value) 
	{
		_pl[name] = value; 
		return this; 
	}
	this.toXml = function()
	{
		var xml = "";
		for(var p in _pl)
		{
			if(typeof(_pl[p]) != "function")
				xml += "<" + p + ">" + _pl[p].toString().replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;") + "</" + p + ">";
		}
		return xml;	
	}
}

function SOAPClient() {}

SOAPClient.invoke = function(url, method, parameters, async, callback)
{
	if(async)
		SOAPClient._loadWsdl(url, method, parameters, async, callback);
	else
		return SOAPClient._loadWsdl(url, method, parameters, async, callback);
}

// private: wsdl cache
SOAPClient_cacheWsdl = new Array();

// private: invoke async
SOAPClient._loadWsdl = function(url, method, parameters, async, callback)
{
	// load from cache?
	var wsdl = SOAPClient_cacheWsdl[url];
	if(wsdl + "" != "" && wsdl + "" != "undefined")
		return SOAPClient._sendSoapRequest(url, method, parameters, async, callback, wsdl);
	// get wsdl
	var xmlHttp = SOAPClient._getXmlHttp();
	xmlHttp.open("GET", url + "?wsdl", async);
	if(async) 
	{
		xmlHttp.onreadystatechange = function() 
		{
			if(xmlHttp.readyState == 4)
				SOAPClient._onLoadWsdl(url, method, parameters, async, callback, xmlHttp);
		}
	}
	xmlHttp.send(null);
	if (!async)
		return SOAPClient._onLoadWsdl(url, method, parameters, async, callback, xmlHttp);
}
SOAPClient._onLoadWsdl = function(url, method, parameters, async, callback, req)
{
	var wsdl = req.responseXML;
	SOAPClient_cacheWsdl[url] = wsdl;	// save a copy in cache
	return SOAPClient._sendSoapRequest(url, method, parameters, async, callback, wsdl);
}
SOAPClient._sendSoapRequest = function(url, method, parameters, async, callback, wsdl)
{
	// get namespace
	var ns = (wsdl.documentElement.attributes["targetNamespace"] + "" == "undefined") ? wsdl.documentElement.attributes.getNamedItem("targetNamespace").nodeValue : wsdl.documentElement.attributes["targetNamespace"].value;
	// build SOAP request
	var sr = 
				"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
				"<soap:Envelope " +
				"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
				"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
				"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
				"<soap:Body>" +
				"<" + method + " xmlns=\"" + ns + "\">" +
				parameters.toXml() +
				"</" + method + "></soap:Body></soap:Envelope>";
	// send request
	var xmlHttp = SOAPClient._getXmlHttp();
	xmlHttp.open("POST", url, async);
	var soapaction = ((ns.lastIndexOf("/") != ns.length - 1) ? ns + "/" : ns) + method;
	xmlHttp.setRequestHeader("SOAPAction", soapaction);
	xmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
	if(async) 
	{
		xmlHttp.onreadystatechange = function() 
		{
			if(xmlHttp.readyState == 4)
				SOAPClient._onSendSoapRequest(method, async, callback, wsdl, xmlHttp);
		}
	}
	xmlHttp.send(sr);
	if (!async)
		return SOAPClient._onSendSoapRequest(method, async, callback, wsdl, xmlHttp);
}
SOAPClient._onSendSoapRequest = function(method, async, callback, wsdl, req)
{
	var o = null;
	var nd = SOAPClient._getElementsByTagName(req.responseXML, method + "Result");
	if(nd.length == 0)
	{
		if(req.responseXML.getElementsByTagName("faultcode").length > 0)
			throw new Error(500, req.responseXML.getElementsByTagName("faultstring")[0].childNodes[0].nodeValue);
	}
	else
		o = SOAPClient._soapresult2object(nd[0], wsdl);
	if(callback)
		callback(o, req.responseXML);
	if(!async)
		return o;		
}

// private: utils
SOAPClient._getElementsByTagName = function(document, tagName)
{
	try
	{
		// trying to get node omitting any namespaces (latest versions of MSXML.XMLDocument)
		return document.selectNodes(".//*[local-name()=\""+ tagName +"\"]");
	}
	catch (ex) {}
	// old XML parser support
	return document.getElementsByTagName(tagName);
}

SOAPClient._soapresult2object = function(node, wsdl)
{
	return SOAPClient._node2object(node, wsdl);
}
SOAPClient._node2object = function(node, wsdl)
{
	// null node
	if(node == null)
		return null;
	// text node
	if(node.nodeType == 3 || node.nodeType == 4)
		return SOAPClient._extractValue(node, wsdl);
	// leaf node
	if (node.childNodes.length == 1 && (node.childNodes[0].nodeType == 3 || node.childNodes[0].nodeType == 4))
		return SOAPClient._node2object(node.childNodes[0], wsdl);
	var isarray = SOAPClient._getTypeFromWsdl(node.nodeName, wsdl).toLowerCase().indexOf("arrayof") != -1;
	// object node
	if(!isarray)
	{
		var obj = null;
		if(node.hasChildNodes())
			obj = new Object();
		for(var i = 0; i < node.childNodes.length; i++)
		{
			var p = SOAPClient._node2object(node.childNodes[i], wsdl);
			obj[node.childNodes[i].nodeName] = p;
		}
		return obj;
	}
	// list node
	else
	{
		// create node ref
		var l = new Array();
		for(var i = 0; i < node.childNodes.length; i++)
			l[l.length] = SOAPClient._node2object(node.childNodes[i], wsdl);
		return l;
	}
	return null;
}
SOAPClient._extractValue = function(node, wsdl)
{
	var value = node.nodeValue;
	switch(SOAPClient._getTypeFromWsdl(node.parentNode.nodeName, wsdl).toLowerCase())
	{
		default:
		case "s:string":			
			return (value != null) ? value + "" : "";
		case "s:boolean":
			return value+"" == "true";
		case "s:int":
		case "s:long":
			return (value != null) ? parseInt(value + "", 10) : 0;
		case "s:double":
			return (value != null) ? parseFloat(value + "") : 0;
		case "s:datetime":
			if(value == null)
				return null;
			else
			{
				value = value + "";
				value = value.substring(0, value.lastIndexOf("."));
				value = value.replace(/T/gi," ");
				value = value.replace(/-/gi,"/");
				var d = new Date();
				d.setTime(Date.parse(value));										
				return d;				
			}
	}
}
SOAPClient._getTypeFromWsdl = function(elementname, wsdl)
{
	var ell = wsdl.getElementsByTagName("s:element");	// IE
	if(ell.length == 0)
		ell = wsdl.getElementsByTagName("element");	// MOZ
	for(var i = 0; i < ell.length; i++)
	{
		if(ell[i].attributes["name"] + "" == "undefined")	// IE
		{
			if(ell[i].attributes.getNamedItem("name") != null && ell[i].attributes.getNamedItem("name").nodeValue == elementname && ell[i].attributes.getNamedItem("type") != null) 
				return ell[i].attributes.getNamedItem("type").nodeValue;
		}	
		else // MOZ
		{
			if(ell[i].attributes["name"] != null && ell[i].attributes["name"].value == elementname && ell[i].attributes["type"] != null)
				return ell[i].attributes["type"].value;
		}
	}
	return "";
}
// private: xmlhttp factory
SOAPClient._getXmlHttp = function() 
{
	try
	{
		if(window.XMLHttpRequest) 
		{
			var req = new XMLHttpRequest();
			// some versions of Moz do not support the readyState property and the onreadystate event so we patch it!
			if(req.readyState == null) 
			{
				req.readyState = 1;
				req.addEventListener("load", 
									function() 
									{
										req.readyState = 4;
										if(typeof req.onreadystatechange == "function")
											req.onreadystatechange();
									},
									false);
			}
			return req;
		}
		if(window.ActiveXObject) 
			return new ActiveXObject(SOAPClient._getXmlHttpProgID());
	}
	catch (ex) {}
	throw new Error("Your browser does not support XmlHttp objects");
}
SOAPClient._getXmlHttpProgID = function()
{
	if(SOAPClient._getXmlHttpProgID.progid)
		return SOAPClient._getXmlHttpProgID.progid;
	var progids = ["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
	var o;
	for(var i = 0; i < progids.length; i++)
	{
		try
		{
			o = new ActiveXObject(progids[i]);
			return SOAPClient._getXmlHttpProgID.progid = progids[i];
		}
		catch (ex) {};
	}
	throw new Error("Could not find an installed XML parser");
}

