/** 
 * @fileoverview Widget transaction manager, Thin layer over YUI XHRDataSource
 *
 */

/** @class Transaction manager */
{TSWIDGET.XMGR={};} 

/** if use custom function to parse xml response */
TSWIDGET.XMGR.useCustomParseFunction = false;

/** Base document to use for CoreAPI calls. Overrideable */
TSWIDGET.XMGR.baseDoc = "/users/ken/MS20/wwwroot/coreapi/index.cfm";

/** Base protocol to use for CoreAPI calls. Overrideable */
TSWIDGET.XMGR.baseProtocol = "http://";
// Used for all CoreAPI calls, we can set this value directly when import the js.
TSWIDGET.XMGR.baseURI = TSWIDGET.XMGR.baseProtocol + window.location.host + TSWIDGET.XMGR.baseDoc ;

/**
 * Send out a CoreAPI request in a sytnchronous or modal fashion. Keeps the user from doing anything while the call 
 * proceeds
 * @param {string} postData -- form post data parameters. Required
 * @param {sucessCallBack} objSuccess. Success callback object. This is a single object
 *		This method is passed in the parsed return data object. Required
 * @param {objError} objError. Optional. Error handler object. Pass in null to use default, or omit parameter altogether
 * @param {string} msg -- wait message (can be html) shown in modal UI object during call processing. Optional
 * @param {object} objModality. Optional. Pass in a UI object that implements a waitPane or other modal object
 * 					that keeps thhe UI from proceeding for the call duration. If omitted uses the default WAITPANE. 
 * 					See WAITPANE class in source.
 * @param {responseSchema} for YUI to parse responseXML, for example:
 * 			<?xml version="1.0" encoding="UTF-8"?><TSCoreAPI_SEARCHR2_GETRECENTLYVIEWED_REPLY>
 * 				<PRODUCTS >
 * 					<PRODUCT ID="id1"  THUMBNAIL="Small.jpg"  URL="url"  PRICE="12550"  NAME="name"></PRODUCT>
 * 					<PRODUCT ID="id2"  THUMBNAIL="Small.jpg"  URL="url"  PRICE="12550"  NAME="name"></PRODUCT>
 *				</PRODUCTS>
 *				<ERROR>0</ERROR>
 *			</TSCoreAPI_SEARCHR2_GETRECENTLYVIEWED_REPLY>
 *			var responseSchema = {
 *							resultNode: "PRODUCT",
 *							fields: [{key: "ID"},{key: "THUMBNAIL"},
									 {key:"URL"},{key:"PRICE"},{key:"NAME"},{key:"FORMAT_NAME"}],
 *							metaNode : "TSCoreAPI_SEARCHR2_GETRECENTLYVIEWED_REPLY",
 *						    metaFields : { 												// set metaNode to get error message
 *								error: "ERROR",
 *						        errorMessage : "ERROR_MESSAGE",
 *								errorId: "ERROR_ID"
 *						    } 
 *						}; 
 * @param {scope} The object to serve as the scope for the success and failure handlers.
 */
TSWIDGET.XMGR.sendRequestSync = function(postData, objSuccess, objError, msg, objModality,responseSchema,scope) {
	if(msg == null) msg = "One moment please";
	if(objModality == null) objModality = TSWIDGET.XMGR.WAITPANE;	
	if(objError == null) objError = TSWIDGET.XMGR.ERROR_HANDLER;		
	
	var callback = 
	{ 
		success:function(request,response) {
			objModality.onEnd(); // Reenable UI			
			if(response.meta.error == "1") {
				objError(response);
				return;
			}
			objSuccess(response,scope);
		}, 
		failure: function(request,response) {
			objModality.onEnd(); // Reenable UI	
			response.meta = new Object();
			response.meta.error = "1";
			if(response.statusText){
				response.meta.errorMessage = response.statusText;
			}
			else{
				response.meta.errorMessage = "Response exception";
			}			
			objError(response,scope);
		},
		scope:scope
	};
	
	objModality.onStart(msg);
	try {
		var dsXHR = new YAHOO.util.XHRDataSource(TSWIDGET.XMGR.baseURI);
		if(TSWIDGET.XMGR.useCustomParseFunction==false){
			dsXHR.responseType = YAHOO.util.XHRDataSource.TYPE_XML;
			dsXHR.responseSchema = responseSchema;
		}
		else{
			TSWIDGET.XMGR.useCustomParseFunction = false;  // reset to default behavior---> XHR
			dsXHR.responseType = YAHOO.util.XHRDataSource.TYPE_TEXT;
			dsXHR.parseTextData = TSWIDGET.XMGR.parseTextData;	
		}
		dsXHR.sendRequest('?'+postData, callback,null);		
	} catch (e) {
		var response = new Object();
		response.meta = new Object();
		response.meta.error = "1";
		response.meta.errorMessage = "Request exception";
		objError(response,scope);
	}
}

/**
 * Send out a CoreAPI request in an asytnchronous faashion
 * @param {string} postData -- form post data parameters. Required
 * @param {sucessCallBack} objSuccess. Success callback object. This is a single object
 *		This method is passed in the parsed return data object. Required
 * @param {objError} objError. Optional. Error handler object. Pass in null to use default, or omit parameter altogether
 * @param {responseSchema} for YUI to parse responseXML, for example:
 * 			<?xml version="1.0" encoding="UTF-8"?><TSCoreAPI_SEARCHR2_GETRECENTLYVIEWED_REPLY>
 * 				<PRODUCTS >
 * 					<PRODUCT ID="id1"  THUMBNAIL="Small.jpg"  URL="url"  PRICE="12550"  NAME="name"></PRODUCT>
 * 					<PRODUCT ID="id2"  THUMBNAIL="Small.jpg"  URL="url"  PRICE="12550"  NAME="name"></PRODUCT>
 *				</PRODUCTS>
 *				<ERROR>0</ERROR>
 *			</TSCoreAPI_SEARCHR2_GETRECENTLYVIEWED_REPLY>
 *			var responseSchema = {
 *							resultNode: "PRODUCT",
 *							fields: [{key: "ID"},{key: "THUMBNAIL"},
									 {key:"URL"},{key:"PRICE"},{key:"NAME"},{key:"FORMAT_NAME"}],
 *							metaNode : "TSCoreAPI_SEARCHR2_GETRECENTLYVIEWED_REPLY",
 *						    metaFields : { 												// set metaNode to get error message
 *								error: "ERROR",
 *						        errorMessage : "ERROR_MESSAGE",
 *								errorId: "ERROR_ID"
 *						    } 
 *						}; 
 * @param {scope} The object to serve as the scope for the success and failure handlers.
 **/
TSWIDGET.XMGR.sendRequestAsync = function(postData, objSuccess, objError,responseSchema,scope) {
	if(objError == null) objError = TSWIDGET.XMGR.ERROR_HANDLER;		
	
	var callback = 
	{ 
		success:function(request,response) {
			if(response.meta.error == "1") {
				objError(response);
				return;
			}
			objSuccess(response,scope);
		}, 
		failure: function(request,response) {
			response.meta = new Object();
			response.meta.error = "1";
			if(response.statusText){
				response.meta.errorMessage = response.statusText;
			}
			else{
				response.meta.errorMessage = "Response exception";
			}			
			objError(response,scope);
		},
		scope:scope
	};	
	try {
		var dsXHR = new YAHOO.util.XHRDataSource(TSWIDGET.XMGR.baseURI);
		if(TSWIDGET.XMGR.useCustomParseFunction==false){
			dsXHR.responseType = YAHOO.util.XHRDataSource.TYPE_XML;
			dsXHR.responseSchema = responseSchema;
		}
		else{
			TSWIDGET.XMGR.useCustomParseFunction = false;  // reset to default behavior---> XHR
			dsXHR.responseType = YAHOO.util.XHRDataSource.TYPE_TEXT;
			dsXHR.parseTextData = TSWIDGET.XMGR.parseTextData;	
		}		
		dsXHR.sendRequest('?'+postData, callback,null);		
	} catch (e) {
		var response = new Object();
		response.meta = new Object();
		response.meta.error = "1";
		response.meta.errorMessage = "Request exception";
		objError(response,scope);
	}
}

/** custom parse function */
TSWIDGET.XMGR.parseTextData = function(oRequest,oFullResponse){
	var x2o = new TSWIDGET.Xml.Xml2Object(oFullResponse);
	var r = x2o.getObject();
	return r;
}

/** Default modality implementation for XMGR */
TSWIDGET.XMGR.WAITPANE={}
/** Transaction start event handler*/
TSWIDGET.XMGR.WAITPANE.onStart = function(html) {
	if (TSWIDGET.XMGR.WAITPANE.waitePane== undefined) {
		TSWIDGET.XMGR.WAITPANE.waitPane = new YAHOO.widget.Panel("waitBox", { width:"300px", height:"200px", visible:false, fixedcenter:true, draggable:false, close: false, 	constraintoviewport:true, modal: true });
		TSWIDGET.XMGR.WAITPANE.waitPane.render();		
	}
	e = document.getElementById('waitBodyContent')
	e.innerHTML=html;
	TSWIDGET.XMGR.WAITPANE.waitPane.show();
}

/** Transaction end event handler*/
TSWIDGET.XMGR.WAITPANE.onEnd = function() {
	TSWIDGET.XMGR.WAITPANE.waitPane.hide();
}

/** Global default error handler*/
TSWIDGET.XMGR.ERROR_HANDLER= function(response,ref){ //o.meta.error, o.meta.errorId, o.meta.errorMessage
	if (o.meta.error == "1"){
		alert(o.meta.errorMessage);
	}
}
