// =============================================================
//
// Copyright (c) 2000-2003 GE Smallworld. All Rights Reserved.
//
// =============================================================


function SubmitHandler() {
	/*	The SubmitHandler is a singleton object that controls all message handling
		in order to package up the message in the desired format and send the message
		to the SIAS server.
   	      
      	Parameters: none
      	Return: none
   */ 

	this._transportHandler = new BatchFormHandler();
	//this.writeRequest = SubmitHandler_writeRequest();
	this.doMessage = SubmitHandler_doMessage;
	
}

function SubmitHandler_doMessage(aMessage) {
	this._transportHandler.setupRequest(aMessage);
	this._transportHandler.submitRequest(aMessage);
}

function BatchFormHandler() {
	/*	The BatchFormHandler object performs the setup and submission of 
		requests to the BatchService through the BatchForm. 
   	      
      	Parameters: none
      	Return: none
   */ 
   
	this._translators = new TranslatorFactory();
	this.parameters = '';
	this.requests = '';
	this.transforms = '';

	this.setupRequest = BatchFormHandler_setupRequest;
	this.submitRequest = BatchFormHandler_submitRequest;
	this.registerTranslator = BatchFormHandler_registerTranslator;
	this.getTranslator = BatchFormHandler_getTranslator;

	var aTransformTranslator = new TransformTranslator();
	this.registerTranslator('transform',aTransformTranslator);

	var aBatchServiceRequestTranslator = new BatchServiceRequestTranslator();
	this.registerTranslator('request',aBatchServiceRequestTranslator);
	
}

function BatchFormHandler_setupRequest(aMessage) {
	/*	The setupRequest member function of BatchFormHandler takes a Message object
		and performs the neccesary encoding and setup of transforms, requests and parameters
   	      
      	Parameters: aMessage
      	Return: none
   */ 
	
	var aRequestsXML = '<requests>';
	var aRequestTranslator = this.getTranslator('request');

	var aRequestVector = aMessage.getRequestVector();
	
	// encode all of the requests in the requests object
	for(var i=0;i < aRequestVector.size();i++) {
		aRequestsXML = aRequestsXML + aRequestTranslator.encode(aRequestVector.elementAt(i));
	}
	
	aRequestsXML = aRequestsXML + '</requests>';
	this.requests = aRequestsXML;
	
	// need to check here if we've defined a transform at all
	// if we haven't then we don't want to generate a transform
	if (aMessage.getTransformVector().size() > 0) {
		var aTransformsXML = '<transforms>';
		var aTransformTranslator = this.getTranslator('transform');
		var aTransformVector = aMessage.getTransformVector();
		
		// encode all of the transforms in the transforms object
		for(i=0;i < aTransformVector.size();i++) {
			aTransformsXML = aTransformsXML + aTransformTranslator.encode(aTransformVector.elementAt(i));
		}
		
		aTransformsXML = aTransformsXML + '</transforms>';

		this.transforms = aTransformsXML;
	}
	else this.transforms = '';
	
	// We need to register any extra params here applicable for every request
	// HCF 2.1 works with SIAS server mode IAS 2.1.0, 
	// so set that up here
	aMessage.registerUrlParam("swldy_server_type", GLOBAL_CONTEXT.serverType);   
	aMessage.registerUrlParam("version", GLOBAL_CONTEXT.serverVersion); 
   
	// now say that we want to use wmt exceptions  
	aMessage.registerUrlParam("exceptions", "wms_ias_xml");  
	
	// need to get URL parameters 
	var aParamURL = '';
	var aUrlParamVector = aMessage.getUrlParamVector();
	
	for(i=0;i < aUrlParamVector.size();i++) {
		aParamURL = aParamURL + 
					aUrlParamVector.elementAt(i).name + 
					'=' +
					aUrlParamVector.elementAt(i).value;
		if (i < aUrlParamVector.size() - 1)
        	aParamURL = aParamURL + '&';
	}
	if (aMessage._url.anchor != '') 
		aParamURL = aParamURL + '#' + aMessage._url.anchor;
	
	this.parameters = aParamURL;

}

function BatchFormHandler_submitRequest(aMessage) {
	/*	The submitRequest function sets all pertinant fields in the BatchForm then
		submits the request to the server.
   	      
      	Parameters: aMessage
      	Return: none
   */ 
   	
	// get the frame
	aFrame = aMessage._target.frame;

	// get a batch form
	aBatchForm = getBatchForm(aFrame.window);

	// store the previous values from the BatchForm in case we need to restore them
	var previousTarget = aBatchForm.target;
	var previousAction = aBatchForm.action;
	var previousCommand = aBatchForm.elements.command.value;
	var previousTransform = aBatchForm.elements.transform.value;

	// set up batch from target
	aBatchForm.target = aMessage.setupTarget();

	// if the target frame is not hcf_content then populate the target frame
	// batch form from the content frame. 
	// Also check if the session_id of hcf_content is set, if it isn't then 
	// abort the execute request. This means that the user has not logged in 
	// and we do not want them to load anything into the panel frames until 
	// a valid session has been established.
	if (!populateBatchFormData(aFrame)) {
		alert(NO_SESSION_ID_MESSAGE);
		return;
	}

   // now setup indicator
   aProgressIndicatorLayer = xbGetElementById('progressIndicator', aFrame.window);
   if (aProgressIndicatorLayer != undefined) {
      // get style
      aProgressIndicatorLayerStyle = new xbStyle(aProgressIndicatorLayer);
      
      // set visiblity
      aProgressIndicatorLayerStyle.setVisibility('visible');
   }      

	// setup parameters
	aBatchForm.action = aBatchForm.action + '?' + this.parameters;
	
	//set up request
	aBatchForm.elements.command.value = this.requests;
	
	// setup transform
	// don't set the transforms element if no stylesheet has been explicitly defined
	if (this.transforms) 
		aBatchForm.elements.transform.value = this.transforms;
	
	//now submit form
   	aBatchForm.submit();
   	
   	if (aMessage._target.openWindow) {
   		// we have opened a new window and need to replace the old batch form data 
   		aBatchForm.target = previousTarget;
		aBatchForm.action = previousAction;
		aBatchForm.elements.command.value = previousCommand;
		aBatchForm.elements.transform.value = previousTransform;
   	}
}

function BatchFormHandler_registerTranslator(aType, aTranslator) {
	
	this._translators.registerTranslator(aType, aTranslator);

}

function BatchFormHandler_getTranslator(aType) {
	return this._translators._translators[aType];
}

function TranslatorFactory() {
	/*	The TranslatorFactory stores a hash table array of Translators related to 
		either a request or transform type. This allows encoding of parameters for 
		each request type via a specific format.
   	      
      	Parameters: none
      	Return: none
   */ 	
	this._translators = new array();
	
	this.registerTranslator = TranslatorFactory_registerTranslator;
	this.unregisterTranslator = TranslatorFactory_unregisterTranslator;
		
}

function TranslatorFactory_registerTranslator(aType, aTranslator) {
	this._translators[aType] = aTranslator;
}

function TranslatorFactory_unregisterTranslator(aType) {
	this._translators[aType] = '';
}

function TransformTranslator() {
	this.encode = TransformTranslator_encode;

}

function TransformTranslator_encode(aTransform) {
	/*	The encode function of TransformTranslator performs all neccesarty XML 
		encoding for the Transform object. 
   	      
      	Parameters: aTransform
      	Return: none
   */ 	
	var aXMLWriter = new XMLWriter();
	var aParamVector = aTransform._params.parameterVector;
	
	var aTransformXML = '<transform>';
	
	if (!aTransform.stylesheet)
		aTransform.stylesheet = '';
		
	if (!aTransform.stylesheetDirectoryName)
		aTransform.stylesheetDirectoryName = 'stylesheets';

	// add in stylesheet and stylesheeet directory
	aTransformXML = aTransformXML + 
	                aXMLWriter.writeElement('stylesheet', aTransform.stylesheet) + 
	                aXMLWriter.writeElement('stylesheet_directory_name', aTransform.stylesheetDirectoryName);
	                aXMLWriter.writeElement('output_format', GLOBAL_CONTEXT.outputFormat);
	                aXMLWriter.writeElement('output_mode', GLOBAL_CONTEXT.outputMode);

	for(var i=0; i < aParamVector.size(); i++) {
		aTransformXML = aTransformXML + aXMLWriter.writeElement(aParamVector.elementAt(i).name, aParamVector.elementAt(i).value);
	}
	
	aTransformXML = aTransformXML + '</transform>';
	return aTransformXML;
}

function BatchServiceRequestTranslator() {
	this.encode = BatchServiceRequestTranslator_encode;
	
}

function BatchServiceRequestTranslator_encode(aRequest) {
	/*	The encode function of BatchServiceRequestTranslator performs all neccesarty XML 
		encoding for the Request object. It encodes it specifically for the BatchService, 
		so that the request can be wrapped into a <requests> block by the BatchFormHandler.
   	      
      	Parameters: aRequest
      	Return: none
   */ 	

	var aXMLWriter = new XMLWriter();

	var aParamVector = aRequest._params.parameterVector;
	
	var aRequestXML = '<request>';
	
	aRequestXML = aRequestXML + aXMLWriter.writeElement('name', aRequest.name);
	aRequestXML = aRequestXML + aXMLWriter.writeElement('format', aRequest.format);
	
	for(var i=0; i < aParamVector.size(); i++) {
		aRequestXML = aRequestXML + aXMLWriter.writeElement(aParamVector.elementAt(i).name, aParamVector.elementAt(i).value);
	}
	
	aRequestXML = aRequestXML + '</request>';
	return aRequestXML;
}


function XMLWriter() {
	/*	The XMLWriter object has functions that do general encoding of name value pairs
		to XML.
   	      
      	Parameters: none
      	Return: none
   */ 		
	
	this.startElement = XMLWriter_startElement;
	this.endElement = XMLWriter_endElement;
	this.writeContent = XMLWriter_writeContent;	
	this.writeElement = XMLWriter_writeElement;
}

function XMLWriter_startElement(aString) {
	var aXMLString = '<' + aString + '>';
	return aXMLString;
}


function XMLWriter_endElement(aString) {
	var aXMLString = '</' + aString + '>';
	return aXMLString;
}

function XMLWriter_writeContent(aString) {
	return aString;
}

function XMLWriter_writeElement(aElementValue, aContentValue) {
	aElement = 	this.startElement(aElementValue) +
				this.writeContent(aContentValue) + 
				this.endElement(aElementValue);
	
	return aElement;
}

