//////////////////////////////////////////////////////////////////////////////////
// AsiZeroClient.js v5.0.0                                                      //
// Copyright ADVIZOR Solutions, Inc. 2005-2008                                  //
//                                                                              //
// Copying, modifying or distributing all or part of the contents of this file  //
// without express written permission is strictly prohibited.                   //
//////////////////////////////////////////////////////////////////////////////////

// The data pool instance to be used by the client, if a specific pool is desired.
var		m_DataPoolName = "";

// Has AsiInitialize successfully completed?
var		m_Initialized = false;
var		m_ServerVersion;

// Global list of valid perspective views.
var		m_ViewList;

// The XML RPC object representing the visualization server.
var		m_VisualizationServer;

// Flag to ignore image refreshing.
var		m_SuspendImageRequests;

// The ASP.NET application's virtual application root path on the server
var		m_AppPathZC;

// A unique identifier for the loaded project instance.  Used to identify
// when multiple projects are loaded in the same session.
var		m_ClientID;

// Initial localized strings from host for button text
var		m_UndoAlt = "X";
var		m_RedoAlt = "+";

var		m_waitObject = null;	// anchor object with wait cursor
var		m_waitOcursor = null;	// cursor style of wait object


function AsiRound(num, decPlaces) {
	var value;
	
	if (decPlaces) {
		value = Math.round(num * Math.pow(10, decPlaces)) / Math.pow(10, decPlaces);
	}
	else {
		value = Math.round(num);
	}
	
	return value;
}

function AsiInitialize( manifestDoc, appPath, handlerMethod ) {
	var		docImages;
	var		anImage;
	var		persName, viewName, typeName;
	var		xPath;
	var		viewNode;
	var		viewList;
	var		x;

	// Initialize the global objects.
	m_ViewList = new Array();
	m_SuspendImageRequests = false;
        m_AppPathZC = appPath;

	XMLRPC.autoroute = false;
	m_VisualizationServer = XMLRPC.getService( "AsiRpcService.aspx" );
	m_VisualizationServer.add("CreateSession", "CreateSession");
	m_VisualizationServer.add("DeleteSession", "DeleteSession");
	m_VisualizationServer.add("FindSelectedValues", "FindSelectedValues");
	m_VisualizationServer.add("MouseEvent", "MouseEvent" );
	m_VisualizationServer.add("FocusEvent", "FocusEvent" );
	m_VisualizationServer.add("KeyEvent", "KeyEvent");
	m_VisualizationServer.add("ResizeView", "ResizeView" );
	m_VisualizationServer.add("SetProperty", "SetProperty" );
	//m_VisualizationServer.add("GetProperty", "GetProperty" );
	m_VisualizationServer.add("GetZoomParams", "GetZoomParams" );
	m_VisualizationServer.add("SetZoomParams", "SetZoomParams" );
	m_VisualizationServer.add("Command", "Command");
	m_VisualizationServer.add("ViewCommand", "ViewCommand");
	m_VisualizationServer.add("ChangedViewList", "ChangedViewList");
	m_VisualizationServer.add("SessionCreationStatus", "SessionCreationStatus", ["New-ASP.NET-Session=true"]);
	m_VisualizationServer.add("SetDefaultTable", "SetDefaultTable" );
	m_VisualizationServer.add("ServerVersion", "ServerVersion");
	m_VisualizationServer.add("Undo", "Undo");
	m_VisualizationServer.add("Redo", "Redo");

	// Retrieve and globally store the version of the server that we are dealing with.
	try {
		m_ServerVersion = m_VisualizationServer.ServerVersion();
	}
	catch( e ) {
		// Version 3.5 of the server did not support the ServerVersion() method.
		m_ServerVersion = {
			Major	: 3,
			Minor	: 5,
			Build	: 0,
			Revision: 0
		};
	}

	// Traverse the list of images in the document to match them with
	// the manifest defined View elements. Each image must have a
	// Perspective and View property that matches the manifest.
	docImages = document.getElementsByTagName( "img" );
	for( x = 0; x < docImages.length; x++ ) {
		anImage = docImages[x];
		if( anImage.Perspective ) {
			persName = anImage.Perspective;
			if( anImage.id ) {
				viewName = anImage.id;

				if (persName == "GlobalComponent") {
					xPath = "//Manifest/GlobalComponents/View[@name='" + viewName + "']";
					viewNode = manifestDoc.selectSingleNode( xPath );
					if( viewNode != null ) {
						typeName =  viewNode.attributes.getNamedItem("type").text;
						m_ViewList[m_ViewList.length] = new ViewObject( persName, viewName, typeName, anImage );

						attr = manifestDoc.createAttribute( "height" );
						attr.text = anImage.height;
						viewNode.attributes.setNamedItem( attr );

						attr = manifestDoc.createAttribute( "width" );
						attr.text = anImage.width;
						viewNode.attributes.setNamedItem( attr );
					}
				}
				else {
					xPath = "//Manifest/Perspective[@name='" + persName + "']/View[@name='" + viewName + "']";
					viewNode = manifestDoc.selectSingleNode( xPath );
					if( viewNode != null ) {
						typeName =  viewNode.attributes.getNamedItem("type").text;
						m_ViewList[m_ViewList.length] = new ViewObject( persName, viewName, typeName, anImage );

						attr = manifestDoc.createAttribute( "height" );
						attr.text = anImage.height;
						viewNode.attributes.setNamedItem( attr );

						attr = manifestDoc.createAttribute( "width" );
						attr.text = anImage.width;
						viewNode.attributes.setNamedItem( attr );
					}
				}
			}
		}
	}

	// Strip out an views that we do not have corresponding images for.
	xPath = "//Manifest/Perspective[@name='" + persName + "']/View";
	viewList = manifestDoc.selectNodes( xPath );
	for( x = 0; x < viewList.length; x++ ) {
		if( viewList[x].attributes.getNamedItem( "height" ) == null ) {
			viewList[x].parentNode.removeChild( viewList[x]);
		}
	}

    // Create a unique ClientID and set Cookie *before* call to CreateSession()
	var date = new Date();
	m_ClientID = date.getTime();
	SetClientIDCookie();

	if ( handlerMethod ) {
		// Create a meta handler
		var metaHandler = function( eventResult ) {
			OnCreateSession( eventResult );
			handlerMethod(eventResult.success);
		};
		
		// Transmit the manifest to the server asynchronously
		m_VisualizationServer.CreateSession( m_DataPoolName, manifestDoc.xml, metaHandler );
	}	
	else {
		// Transmit the manifest to the server synchronously
		return OnCreateSession( m_VisualizationServer.CreateSession( m_DataPoolName, manifestDoc.xml ) );
	}
}

// Handle the results of the call to CreateSession()
function OnCreateSession( eventResult ) {
	// Update the images on the page;
	if( eventResult.success == true ) {
		// Don't update images here.  Script in main page will handle image updates.
		//AsiUpdateImages( eventResult, false );
		m_Initialized = true;
	}
	else {
		AsiHandleEventResultError( eventResult );
	}
	
	return eventResult.success;
}

// NOTE: This function should be called before any call to Visualization Server
function SetClientIDCookie() {
	document.cookie = "clientID=" + m_ClientID;
}

function AsiEndSession() {
	m_VisualizationServer.DeleteSession();
}

function AsiSelectEvent( viewName, left, top, width, height, shiftState, processCmd ) {
	if (processCmd) {
		// Must set clientID cookie before call to Visualization Server
		SetClientIDCookie();

		var	mouseParams = {
			mouseAction : shiftState,
			startMouseX:  left,
			startMouseY:  top,
			endMouseX:	  left + width,
			endMouseY:	  top + height
		};

		var	eventResult = m_VisualizationServer.MouseEvent( viewName, mouseParams );
		if( eventResult.success == true ) {
			AsiUpdateImages( eventResult, true );
		}
		else {
			AsiHandleEventResultError( eventResult );
		}
	}
	else {
		// Set cursor to hourglass
		DoWaitCursor();

		setTimeout("AsiSelectEvent('" + viewName + "', " + left + ", " + top + ", " + width + ", " + height + ", " + shiftState + ", 'true')", 100);
	}
}

function AsiFocusEvent( viewName, left, top, shiftState ) {
	// Must set clientID cookie before call to Visualization Server
	SetClientIDCookie();

	var mouseParams = {
		mouseAction: shiftState,
		startMouseX: left,
		startMouseY: top,
		endMouseX:	 0,
		endMouseY:	 0
	};

	// Set cursor to hourglass
	DoWaitCursor();

	var eventResult = m_VisualizationServer.FocusEvent( viewName, mouseParams );
	if( eventResult.success == true ) {
		AsiUpdateImages( eventResult, true );
	}
	else {
		AsiHandleEventResultError( eventResult );
	}
}

function AsiShareResults( perspKey, title, desc, includeColorLegend, includeWhereAmI, format ) {
	var now = new Date();
	var url = m_AppPathZC + "AsiShareResultsServer.aspx?perspKey=" + perspKey + "&title=" + title + "&desc=" + desc + "&colorLegend=" + includeColorLegend + "&whereAmI=" + includeWhereAmI + "&format=" + format + "&" + now.getTime();
	window.location.href = url;
}

function AsiExportProject() {
	var now = new Date();
	var url = m_AppPathZC + "AsiExportProjectServer.aspx?" + now.getTime();
	window.location.href = url;
}

function AsiExportData( tableName, csvFormat, allData ) {
	var now = new Date();
	var url = m_AppPathZC + "AsiExportDataServer.aspx?tableName=" + tableName + "&csvFormat=" + csvFormat + "&allData=" + allData + "&" + now.getTime();
	window.location.href = url;
}

function AsiExcludeSelected(perspKey) {
	m_waitObject = excludeSelected;
	AsiExecuteCommand("DeleteSelected", perspKey);
}

function AsiExcludeUnselected(perspKey) {
	m_waitObject = excludeUnselected;
	AsiExecuteCommand("DeleteUnselected", perspKey);
}

function AsiRestoreExcluded(perspKey) {
	m_waitObject = restore;
	AsiExecuteCommand("RestoreDeleted", perspKey);
}

function AsiSelectAll(perspKey) {
	m_waitObject = selectAll;
	AsiExecuteCommand("SelectAll", perspKey);
}

function AsiUnselectAll(perspKey) {
	m_waitObject = unselectAll;
	AsiExecuteCommand("SelectNone", perspKey);
}

function AsiToggleSelection(perspKey) {
	m_waitObject = toggleSelection;
	AsiExecuteCommand("ToggleSelection", perspKey);
}

function AsiColorBy(perspKey, colorKey) {
	AsiExecuteCommand("ColorBy", colorKey);
}

function AsiWeightBy(perspKey, weightByKey) {
	AsiExecuteViewCommand("WeightBy", perspKey, weightByKey);
}

function AsiGoToBookmark(param) {
	AsiExecuteCommand("GoToBookmark", param);
}

function AsiExecuteCommand( command, param, processCmd ) {
	if (processCmd) {
		// Must set clientID cookie before call to Visualization Server
		SetClientIDCookie();

		if ( param == null) {
			param = "";
		}

		var	eventResult = m_VisualizationServer.Command( command, param );
		if( eventResult.success == true ) {
			//AsiUpdateImages( eventResult, false );
			// Update zoombars when executing commands (eg. Exclude or Restore data)
			AsiUpdateImages( eventResult, true );
		}
		else {
			AsiHandleEventResultError( eventResult );
		}
	}
	else {
		// Set cursor to hourglass
		DoWaitCursor();

		setTimeout("AsiExecuteCommand('" + command + "', '" + param + "', 'true')", 100);
	}
}

function AsiExecuteViewCommand( command, key, param, processCmd ) {
	if (processCmd) {
		// Must set clientID cookie before call to Visualization Server
		SetClientIDCookie();

		if ( param == null) {
			param = "";
		}

		var	eventResult = m_VisualizationServer.ViewCommand( key, command, param );
		if( eventResult.success == true ) {
			//AsiUpdateImages( eventResult, false );
			// Update zoombars when executing view commands (eg. Exclude or Restore data)
			AsiUpdateImages( eventResult, true );
		}
		else {
			AsiHandleEventResultError( eventResult );
		}
	}
	else {
		// Set cursor to hourglass
		DoWaitCursor();

		setTimeout("AsiExecuteViewCommand('" + command + "', '" + key + "', '" + param + "', 'true')", 100);
	}
}

//function AsiGetProperty( viewName, propertyName ) {
//	// Must set clientID cookie before call to Visualization Server
//	SetClientIDCookie();
//
//	var	propertyValue = m_VisualizationServer.GetProperty( viewName, propertyName );
//
//	return( propertyValue );
//}

function AsiSessionCreationStatus( handlerMethod ) {
	// Must set clientID cookie before call to Visualization Server
	SetClientIDCookie();

	if ( handlerMethod ) {
		// Asynchronous
		m_VisualizationServer.SessionCreationStatus( handlerMethod );
	}	
	else {
		// Synchronous
		return m_VisualizationServer.SessionCreationStatus();
	}
}

// Called from Zoom bar code
function AsiSetProperty( viewName, propertyName, propertyValue, processCmd ) {
    if (processCmd) {
		// Must set clientID cookie before call to Visualization Server
		SetClientIDCookie();

		var	eventResult = m_VisualizationServer.SetProperty( viewName, propertyName, propertyValue );
		if( eventResult.success == true ) {
			AsiUpdateImages( eventResult, true );
		}
		else {
			AsiHandleEventResultError( eventResult );
		}
    }
    else {
		// Set cursor to hourglass
		DoWaitCursor();

		setTimeout("AsiSetProperty('"+viewName+"','"+propertyName+"','"+propertyValue+"',true)", 0);
    }
}

function AsiSetDefaultTable( tableName ) {
	// Must set clientID cookie before call to Visualization Server
	SetClientIDCookie();

	var	retval = m_VisualizationServer.SetDefaultTable( tableName );
	if( retval.success != true ) {
		AsiHandleEventResultError( retval );
	}
}

function AsiGetSelectedValues( viewName, options, maxReturnedValues ) {
	// Must set clientID cookie before call to Visualization Server
	SetClientIDCookie();

	var	selValues = m_VisualizationServer.FindSelectedValues( viewName, options, maxReturnedValues );
	var	retValue = "";

	if( selValues.success == true ) {
		if( selValues.valueSet.length > 0 ) {
			retValue = selValues.valueSet[0];
			
			for( var i = 1; i < selValues.valueSet.length; i++ ) {
				retValue = retValue + " " + selValues.valueSet[i];
			}
		}
	}

	return( retValue );
}

function AsiGetZoomFactors( viewName ) {
	// Must set clientID cookie before call to Visualization Server
	SetClientIDCookie();

	var zoomParamsResult = m_VisualizationServer.GetZoomParams(viewName);
	if( zoomParamsResult.success == true ) {
		return zoomParamsResult.zoomParams;
	}
	else {
		AsiHandleZoomParamsResultError(zoomParamsResult);
		return null;
	}
}

function AsiSetZoomFactors( viewName, which, zoomScale, panPixels, processCmd ) {
    if (processCmd) {
		// Must set clientID cookie before call to Visualization Server
		SetClientIDCookie();

		var parmblock = new AsiZoomParams();

		parmblock.whatParams = which;

		if(( which & 0x30 ) == 0x10 ) {
			parmblock.zoomX = "" + zoomScale;
		}
		else if(( which & 0x30 ) == 0x20 ) {
			parmblock.zoomY = "" + zoomScale;
		}

		if(( which & 3 ) == 1 ) {
			parmblock.panX = panPixels;
		}
		else if((which & 3) == 2 ) {
			parmblock.panY = panPixels;
		}

		var eventResult = m_VisualizationServer.SetZoomParams( viewName, parmblock );
		if( eventResult.success == true ) {
			AsiUpdateImages( eventResult, true );
		}
		else {
			AsiHandleEventResultError( eventResult );
		}
    }
    else {
		// Set cursor to hourglass
		DoWaitCursor();

		setTimeout("AsiSetZoomFactors('"+viewName+"',"+which+","+zoomScale+","+panPixels+",true)", 0);
    }
}

function AsiSuspendImages() {
	m_SuspendImageRequests = true;
}

function AsiResizeView( viewName, height, width, handlerMethod, processCmd ) {
	if (processCmd || handlerMethod) {
	
		// If a handler was provided (call will be asynchronous), set cursor to hourglass
		if ( handlerMethod ) {
			DoWaitCursor();
		}

		// Must set clientID cookie before call to Visualization Server
		SetClientIDCookie();

		// Insure that we have been initialized before calling the server.
		// When AsiInitialize() accesses the height and width properties of the
		// images there are cases where this will trigger an onresize event.
		if( m_Initialized == true ) {
			
			if ( handlerMethod ) {
				// Create a meta handler
				var metaHandler = function( eventResult ) {
					AsiResizeViewHandler( eventResult );
					handlerMethod();
				};
				
				// Asynchronous
				m_VisualizationServer.ResizeView( viewName, height, width, metaHandler )
			}	
			else {
				// Synchronous
				AsiResizeViewHandler( m_VisualizationServer.ResizeView( viewName, height, width ) );
			}
		}
	}
	else {
		// Set cursor to hourglass
		DoWaitCursor();

		setTimeout("AsiResizeView('" + viewName + "', " + height + ", " + width + ", " + handlerMethod + ", 'true')", 100);
	}
}

// Handle the results of the call to ResizeView()
function AsiResizeViewHandler( eventResult ) {
	if( eventResult.success == true ) {
		AsiUpdateImages( eventResult, true );
	}
	else {
		AsiHandleEventResultError( eventResult );
	}
}

function AsiUndo(processCmd) {
    if (processCmd) {
		// Must set clientID cookie before call to Visualization Server
		SetClientIDCookie();

		var	eventResult = m_VisualizationServer.Undo();
		if( eventResult.success == true ) {
			AsiUpdateImages( eventResult, true );
		}
		else {
			AsiHandleEventResultError( eventResult );
		}
    }
    else {
		m_waitObject = undo;
		DoWaitCursor();

		setTimeout("AsiUndo('true')", 0);
    }
}

function AsiRedo(processCmd) {
    if (processCmd) {
		// Must set clientID cookie before call to Visualization Server
		SetClientIDCookie();

		var	eventResult = m_VisualizationServer.Redo();
		if( eventResult.success == true ) {
			AsiUpdateImages( eventResult, true );
		}
		else {
			AsiHandleEventResultError( eventResult );
		}
	}
    else {
		m_waitObject = redo;
		DoWaitCursor();

		setTimeout("AsiRedo('true')", 0);
    }
}

function AsiRefreshImages() {
	// Must set clientID cookie before call to Visualization Server
	SetClientIDCookie();

	// Retrieve the list of views with pending updates.
	var eventResult = m_VisualizationServer.ChangedViewList();
	
	// Clear the suspend image request flag.
	m_SuspendImageRequests = false;

	// Update the images on the page;
	if( eventResult.success == true ) {
		//AsiUpdateImages( eventResult, false );
		// Update zoombars when we refresh
		AsiUpdateImages( eventResult, true );
	}
	else {
		AsiHandleEventResultError( eventResult );
	}
}

function AsiUpdateImages( eventResult, zoomflag ) {
	if( m_SuspendImageRequests == false ) {
		if( self != top ) {
			if( top.AsiCascadeUpdate ) {
				top.AsiCascadeUpdate( eventResult, zoomflag );
			}
			else {
				AsiCascadeUpdate( eventResult, zoomflag );
			}
		}
		else {
			AsiCascadeUpdate( eventResult, zoomflag );
		}

		// Enable/Disable and set tooltip for Undo/Redo buttons.
		// (First time through, remember the initial settings.)
		if (m_UndoAlt == "X")
			m_UndoAlt = undo.alt;
		if (m_RedoAlt == "+")
			m_RedoAlt = redo.alt;
		
		if (eventResult.canUndo)
		{
			undo.style.filter = '';
			undo.alt = eventResult.undoMessage;
		}
		else
		{
			undo.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(grayScale=1)';
			undo.alt = m_UndoAlt;
		}
		if (eventResult.canRedo)
		{
			redo.style.filter = '';
			redo.alt = eventResult.redoMessage;
		}
		else
		{
			redo.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(grayScale=1)';
			redo.alt = m_RedoAlt;
		}
	}
}

function AsiCascadeUpdate( eventResult, zoomflag ) {
	var	now = new Date();
	var	x, y;
	var	img;
    var	imgNumList = "";
	var	updateImage;

	// g_CurrentPerspective is a global var defined in script for main page
	var	curPerspective = g_CurrentPerspective;

	// g_ColorLegendOn and g_WhereAmIOn are global variables defined in script for main page
	var	colorLegendOn = g_ColorLegendOn;
	var	whereAmIOn = g_WhereAmIOn;

	if( m_ViewList != null ) {
		for( y = 0; y < eventResult.changedViews.length; y++ ) {
			for( x = 0; x < m_ViewList.length; x++ ) {
				if( eventResult.changedViews[y] == m_ViewList[x].Name ) {
					img = m_ViewList[x].Image;
					updateImage = false;

					if (img.Perspective == curPerspective) {
						updateImage = true;
					}
					else if (img.Perspective == "GlobalComponent") {
						if (img.id == "CompositeLegend") {
							if (colorLegendOn) {
								updateImage = true;
							}
						}
						else if (img.id == "WhereAmI") {
							if (whereAmIOn) {
								updateImage = true;
							}
						}
					}

					if (updateImage) {
						img.src = "./AsiImageServer.aspx?image=" + m_ViewList[x].Name + "&" + now.getTime();

						if (imgNumList == "") {
							imgNumList += x.toString();
						}
						else {
							imgNumList += "|" + x.toString();
						}
					}

					break;
				}
			}
		}
	}

	if (zoomflag) {
		DoUpdateZoombarList(imgNumList);
	}

	if( frames.length > 0 ) {
		for( x = 0; x < frames.length; x++ ) {
			if( frames[x].AsiCascadeUpdate ) {
				frames[x].AsiCascadeUpdate( eventResult, zoomflag );
			}
		}
	}

	DoResetCursor(imgNumList);
}

function DoWaitCursor() {
	// Set cursor to hourglass
	var tempelem = null;
	if (event != null)
		tempelem = document.elementFromPoint(event.clientX, event.clientY);
	if (tempelem != null)
		m_waitObject = tempelem;

	window.status="Please wait...";

	if (m_waitObject) {
		m_waitOcursor = m_waitObject.style.cursor;
		m_waitObject.style.cursor = "wait";
	}
	document.body.style.cursor = "wait";
}

function DoResetCursor( imgNumList ) {
	var i;
	var img;
	var imgNum;
	var imageNums = "";
	var imgNumArray;

	if (imgNumList == "") {
		// Reset cursor
		document.body.style.cursor = "auto";
		if (m_waitObject)
		{
			m_waitObject.style.cursor = m_waitOcursor;
			m_waitObject = null;
		}
		window.status="";
	}
	else {
		imgNumArray = imgNumList.split("|");

	    for (i = 0; i < imgNumArray.length; i++) {
			imgNum = imgNumArray[i];
			img = m_ViewList[imgNum].Image;

			if (!img.complete) {
				if (imageNums == "") {
					imageNums += imgNum;
				}
				else {
					imageNums += "|" + imgNum;
				}
			}
		}

		setTimeout("DoResetCursor('" + imageNums + "')", 250);
	}
}

function DoUpdateZoombar( imgNum ) {
	var img = m_ViewList[imgNum].Image;
//	try {
//		img.UpdateZoombars();
//	} catch (e) {
//		alert("AsiProps behavior not attached to " + img.id);
//	}

	if (img.complete) {
		img.UpdateZoombars();
	}
	else {
		setTimeout("DoUpdateZoombar('" + imgNum + "')", 100);
	}
}

function DoUpdateZoombarList( imgNumList ) {
	var i;
	var img;
	var imgNum;
	var viewNames = "";
	var imageNums = "";
	var imgNumArray;

	if (imgNumList == "") {
		return;
	}

	imgNumArray = imgNumList.split("|");

        for (i = 0; i < imgNumArray.length; i++) {
		imgNum = imgNumArray[i];
		img = m_ViewList[imgNum].Image;

		if ( !(typeof(img.UpdateZoombars) == "undefined") ) {
			if (viewNames == "") {
				viewNames += img.id;
				imageNums += imgNum;
			}
			else {
				viewNames += "|" + img.id;
				imageNums += "|" + imgNum;
			}
		}
	}

	if (viewNames.length > 0) {
		imgNumArray = imageNums.split("|");
	        for (i = 0; i < imgNumArray.length; i++) {
			imgNum = imgNumArray[i];
			setTimeout("DoUpdateZoombar('" + imgNum + "')", 100);
		}
	}
}

// Handles errors from functions that return AsiEventResult
function AsiHandleEventResultError( eventResult ) {
	// Reset cursor
	DoResetCursor( "" );

	// Display error message
	alert( eventResult.resultMessage );
}

// Handles errors from functions that return AsiZoomParamsResult
function AsiHandleZoomParamsResultError( zoomParamsResult ) {
	// Reset cursor
	DoResetCursor( "" );

	// Display error message
	alert( zoomParamsResult.resultMessage );
}

// A JavaScript object representing a view component in a perspective.
// Constructor
function ViewObject( persName, viewName, viewType, targetImage ) {
	// Properties
	this.Perspective = persName;
	this.Name = viewName;
	this.Type = viewType;
	this.Image = targetImage;

	// Methods
}

// The JavaScript version of the AsiZoomParams server structure.
function AsiZoomParams() {
	this.whatParams = 0;
	this.panX = 0;
	this.panY = 0;
	this.zoomX = "1.0";
	this.zoomY = "1.0";
	this.fitAll = "1.0";
}
