//  ------------------------------------------------------------
//   Result.js
//   ------------------------------------------------------------
//   VCS INFO:
//   
//   $Revision:   1.6  $
//   $Date:   20 Jan 2000 10:58:54  $
//   $Author:   JLUM  $
//   $Workfile:   result.js  $
//   ------------------------------------------------------------
//   INCLUDE DEPEDENCY:
//   WSCAPI/InitPage.js
//   ------------------------------------------------------------
//   All Rights Reserved.  Copyright (c) 1988-1999 FileNET Corp.
//   ------------------------------------------------------------

// IDMWSC_rsCallObjectToResult utility function to convert a Remote Scripting
// Call Object into a IDMWSC_Result object.
function IDMWSC_rsCallObjectToResult(co)
{
	var resultStatus;
	var resultCode;
	var resultMsg;
	var resultRetVal;
	var resultData = co.data;

	if (co.status == -1)
	{
		resultStatus = IDMWSC_Result_error;
		if (co.message == "Request not handled.")
		{
			// Handle this special error condition to workaround the Remote
			// Scripting hanging problem
			resultCode = IDMWSC_Result_E_SILENT;
			// Map co.message into a more user friendly message in case it gets displayed.
			resultMsg = "The server is busy processing other requests.  Please try the operation again.";
		}
		else
		{
			resultCode = co.status;
			resultMsg = "Unexpected error - " + co.message;
		}
		resultRetVal = "";
	}
	else if (co.status == 0)
	{
		// Extract HRESULT error code part of <errorcode;returnvalue> in co.returnvalue
		var pos = co.return_value.indexOf(";");
		var hrCode = co.return_value.substring(0, pos);
		
		// Check highest severity bit of HRESULT code
		// Define 32-bit mask with highest "severity" bit set
		var severityBitMask = -2147483648;
		var val = hrCode & severityBitMask;
		if (val == severityBitMask)
		{
			// hrCode indicates failure
			resultStatus = IDMWSC_Result_error;
			resultCode = hrCode;
			resultMsg = co.return_value.substr(pos+1);
			resultRetVal = "";
		}
		else
		{
			// hrCode indicates success
			resultStatus = IDMWSC_Result_success;
			resultCode = hrCode;
			resultMsg = "";
			resultRetVal = co.return_value.substr(pos+1);
		}
	}
	else
	{
		// Unsupported co.status value (1 for pending status)
		resultStatus = IDMWSC_Result_error;
		resultCode = co.status;
		resultMsg = "Unexpected error - Asynchronous Remote Scripting calls are not supported.";
		resultRetVal = "";
		resultData = "";
	}

	// Create the new Result object to return
	var oResult = new IDMWSC_Result(resultStatus, resultCode, resultMsg, resultRetVal, resultData);
	return oResult;
}


//
// IDMWSC_Result object constant definition
//
var IDMWSC_Result_success = 0;
var IDMWSC_Result_information = 1;
var IDMWSC_Result_warning = 2;
var IDMWSC_Result_error = -1;

var IDMWSC_Result_S_FALSE = 2;
var IDMWSC_Result_E_SILENT = 3;


//
// IDMWSC_Result object's method implementations
//

// IDMWSC_Result_succeeded
function IDMWSC_Result_succeeded()
{
	return (this.status == IDMWSC_Result_success || this.status == IDMWSC_Result_information);
}

// IDMWSC_Result_failed
function IDMWSC_Result_failed()
{
	return (this.status == IDMWSC_Result_error || this.status == IDMWSC_Result_warning);
}

// IDMWSC_Result_showResultMessageDialog
function IDMWSC_Result_showResultMessageDialog()
{
	// Handle this special error condition to workaround the Remote
	// Scripting hanging problem
	if (this.resultCode == IDMWSC_Result_E_SILENT)
	{
		// The failure condition is silent.  Do not show the error message.
		// Displaying a message in the browser's status bar is not an option.
		// Read the description of the JavaScript window.status property for
		// more details.
		//alert(this.resultMessage);
		return;
	}
		
	var msgType;
	if (this.status == IDMWSC_Result_error)
		msgType = IDMWSC_iconCritical;
	else if (this.status == IDMWSC_Result_warning)
		msgType = IDMWSC_iconExclamation;
	else  // IDMWSC_Result_information or IDMWSC_Result_success
		msgType = IDMWSC_iconInformation;
		
	var width = 480;
	var height = 130;
	var x, y;
	x = (screen.width - width) / 2;
	y = (screen.height - height) / 2;
	// clean up message
	var resultMsg = escape(this.resultMessage);
	resultMsg = resultMsg.replace(/\+/g,"%2B");  // replace "+", which would be interpreted as a space
	var sURL = IDMWSC_baseURL + "/Redist/ErrorManager/ErrorUI.asp?ErrorMessage=" + resultMsg + "&Type=" + msgType;
	var sFeatures = "dependent=no,toolbar=no,directories=no,location=no,menubar=no,resizable=no,scrollbars=yes,status=no,width=" + width + ",height=" + height + ",top=" + y + ",left=" + x;
	// ***** WORKAROUND *****
	// The following steps (setting the location obj, blur(), focus(), etc.) seem to
	// address some window (re)focusing issues relating to the Window.open() command.
	// One problem this fixes is if the window is already opened and does not
	// have focus and is in the background, calling open() again does not give it focus
	// and bring it to the foreground.  In another scenario, an "Unspecified error"
	// scripting error may also occur.
	var errWin = open("", "IDMWS_ErrorMessageWindow", sFeatures);
	errWin.document.location = sURL;
	errWin.blur();
	errWin.focus();
}


// IDMWSC_Result object constructor
// The data parameter is optional.  If not specified, it will be defaulted to "".
function IDMWSC_Result(status, resultCode, resultMsg, returnValue, data)
{
	// Properties
	
	this.status = status;
	
	if (status == IDMWSC_Result_success || status == IDMWSC_Result_information)
		this.resultCode = 0;
	else
		this.resultCode = resultCode;
	
	if (status == IDMWSC_Result_success)
		this.resultMessage = "";
	else
		this.resultMessage = resultMsg;
		
	if (status == IDMWSC_Result_error || status == IDMWSC_Result_warning)
		this.returnValue = "";
	else
		this.returnValue = returnValue;
	
	if (typeof data == "undefined")
		this.data = "";
	else
		this.data = data;
}

// IDMWSC_Result object methods
IDMWSC_Result.prototype.succeeded = IDMWSC_Result_succeeded;
IDMWSC_Result.prototype.failed = IDMWSC_Result_failed;
IDMWSC_Result.prototype.showResultMessageDialog = IDMWSC_Result_showResultMessageDialog;


