/* <copyright>
This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
(c) Copyright 2011 Motorola Mobility, Inc.  All Rights Reserved.
</copyright> */

/*
* Simple socket connection discovery and management
*/

g_connectionManager = null;

function CreateSocket(url, listenList, connectedList, messageHandler, socketID, openHandler, closeHandler)
{
	var ws = new WebSocket(url);

	ws.listenIndex = socketID;

	ws.onmessage = messageHandler;

	ws.connectedList = connectedList;
	ws.listenList = listenList;

	// make up a flag
	ws.rdge_isConnected = false;
	ws.rdge_tryDisconnect = false;
	
	if (openHandler)
	{
	    ws.addEventListener("open", openHandler);
	}
	if (closeHandler)
	{
	    ws.addEventListener("close", closeHandler);
	    ws.addEventListener("error", closeHandler);
	}	
	
	ws.onopen = function(evt)
	{
		var websocket = evt.srcElement;
		document.getElementById("socketConnection").innerHTML += "connected: " + websocket.URL +"</br>";
		
		websocket.rdge_isConnected = true;
		
		websocket.connectedList.push(ws);
		
		// save the connected array index of this item
		ws.connectedIndex = websocket.connectedList.length - 1;
	}

	ws.onerror = function(event) 
	{
		window.console.log("error: " + event);
	}

	ws.onclose = function(evt) 
	{
		var websocket = evt.srcElement;
		
		websocket.rdge_isConnected = false;
		
		// send disconnect message
		websocket.send("type=srv\nmsg=2\n");
		
		// remove from connected sockets
		websocket.connectedList[websocket.connectedIndex, 1];
		
		// re-open port for listening
		//websocket.listenList[websocket.listenIndex] = new WebSocket(websocket.URL.toString());
		
		//document.getElementById("socketConnection").innerHTML += "disconnected: " + websocket.URL +"</br>";
	}
	
	return ws;
}

// The DCHP range on Whitney 10.0.0.1 - 10.0.0.254

/*
* manages a connection
* @param base: base url minus the last octet (ie "ws://192.168.1.")
* @param startAddr: the last octect of the beginning address range (ie 10.0.0.x where x is the value passed in for startAddr)
* @param endAddr: the last octect of the end address range (ie 10.0.0.x where x is the value passed in for endAddr)
* @param messageHandlerFunc: handle to onMessage function
*/
function ConnectionPool(base, startAddr, endAddr, messageHandlerFunc)
{
	this.start = startAddr;
	this.end = endAddr;
	this.port = 38951;
	this.messageHandler = messageHandlerFunc;
	
	this.listenSockets		= [];
	this.connectedSockets	= [];
	
	this.openHandler = null;
	this.closeHandler = null;
	
	this.interval = null;

	this.Init = function(openHandler, closeHandler) 
	{
		// emtpy out lists
		this.listenSockets		= [];
		this.connectedSockets	= [];
		
		this.openHandler = openHandler;
		this.closeHandler = closeHandler;
	
		var len = this.end - this.start;
		for (var i = 0; i < len; ++i) 
		{
			var url = base + (this.start + i) + ":" + this.port + "/resourcePath";
			var ws = CreateSocket(url, this.listenSockets, this.connectedSockets, this.messageHandler, i, this.openHandler, this.closeHandler);
			
			this.listenSockets.push(ws);
		}
		
		this.interval = setInterval(ConnPoll, 200);
	}
	
	this.Shutdown = function()
	{
		if(this.interval != null)
		{
			clearInterval(this.interval);
			this.interval = null;
		}
		var len = this.connectedSockets.length;
		for (var i = 0; i < len; ++i) 
		{
			// send disconnect message
			this.connectedSockets[i].send("type=srv\nmsg=2\n");;
		}
	}
	
	this.Close = function(socket)
	{
		socket.rdge_tryDisconnect = true;
	}
	
	this.Poll = function()
	{
		var len =this. end - this.start;
		for (var i = 0; i < len; ++i) 
		{
			// re init the sockets to simulate broadcast
			if(this.listenSockets[i].readyState == 3/*CLOSING*/ || this.listenSockets[i].readyState == 2/*CLOSING*/ || this.listenSockets[i].rdge_tryDisconnect == true)
			{
				if(this.listenSockets[i].rdge_tryDisconnect)
				{
					document.getElementById("socketConnection").innerHTML += "graceful discon: " + this.listenSockets[i].URL +"</br>";
				}
				
				this.listenSockets[i].rdge_tryDisconnect = false;
				
				var url = base + (this.start + i) + ":" + this.port + "/resourcePath";
				this.listenSockets[i].close();
				this.listenSockets[i] = CreateSocket(url, this.listenSockets, this.connectedSockets, this.messageHandler, i, this.openHandler, this.closeHandler);
			}
		}
		
	}
	
}