//

var proxyId = new Date ().getTime ();

//

function ImageServerClient () {
	this.transactionMap = new Object ();
	
}

// static

ImageServerClient._transactionId = 0;

ImageServerClient.transactionId = function () {
	return "command_" + ImageServerClient._transactionId++;

}

// methods

ImageServerClient.prototype = {

	// public
	
	addImageAtDepth: function (imagePath, depth, thumbPath) {		
		this.execute (["addImageAtDepth",
			ImageServerClient.transactionId (),
			imagePath, depth, thumbPath]);
		
	},
	
	addImageList: function (imageList) {
		var parameterList = ["addImageList",
			ImageServerClient.transactionId ()];
		
		while (imageList.length) {
			var imageDesc = imageList.shift ();
			if (imageDesc) {
				parameterList.push (imageDesc.path);
				parameterList.push (imageDesc.depth);
			
			}
			
		}
		this.execute (parameterList);
		
	},
	
	removeImage: function (imagePath) {
		this.execute (["removeImage",
			ImageServerClient.transactionId (),
			imagePath]);
	
	},
	
	// private

	transactionMap: new Object (),
	
	execute: function (parameterList) {
		parameterList.timeStamp = new Date ().getTime ();
		
		var command = parameterList [0];
		var commandId = parameterList [1];
		this.transactionMap [commandId] = parameterList;
		
		//
		
		var displayServer = navigator.appName.indexOf ("Microsoft") != -1 ?
			window ["serverInstance"] : document ["serverInstance"];
		if (!displayServer.isReady)
			return;

		parameterList = parameterList.concat ();
		switch (command) {
			case "addImageAtDepth":
				displayServer.addImageAtDepth (
					commandId, parameterList [2], parameterList [3], parameterList [4]
				
				);
				break;
				
			case "addImageList":
				parameterList.splice (0, 2);
				displayServer.addImageList (
					commandId, parameterList
					
				);				
				break;
				
			case "removeImage":
				displayServer.removeImage (
					commandId, parameterList [2]
				
				);
				break;
		
		}
		
	},
	
	acknowledge: function (commandId) {
		var parameterList = this.transactionMap [commandId];
		if (parameterList)
			delete this.transactionMap [commandId];
			
	},
	
	pollTransactionMap: function () {
		var time = new Date ().getTime ();

		for (var x in this.transactionMap) {
			var parameterList = this.transactionMap [x];

			if (parameterList.timeStamp < time - 500)
				this.execute (parameterList);
		
		}
		
	}

}

// global

var imageServerClient = new ImageServerClient ();
setInterval ("imageServerClient.pollTransactionMap ();", 250);
				
var displayServer = imageServerClient;

function acknowledge (commandId) {
	imageServerClient.acknowledge (commandId);

}

//
