/* FILE::			oProtocol.js
 *
 * This file contains, some functions and Protocol Object which will be created
 * on Client Side on Browser and is responsible for sending data back down
 * to server in a NYCSERV Protocol format. Please see NYCSERV Protocol Design
 * document for further information.
 *
 * <p> </p>
 * <pre>
 ******************************************************************************
 *                     M O D I F I C A T I O N   L O G                        *
 *                                                                            *
 *                                                                            *
 *      DATE        RELEASE #   AUTHOR      DESCRIPTION                       *
 *      ----        ---------   ------      -----------                       *
 *      06/15/2000  1.0         spurohit    Created and unit Tested           *
 *                                                                            *
 ******************************************************************************
 * </pre>
 *
 * @author  Siddharth Purohit
 * @version 1.0
 *
 *
 */


// need to make it global for use with all functions


// Common String Variables for Protocol.


var CHANNEL_TYPE	= "ChannelType";
var REQUEST_TYPE 	= "RequestType";
var SUBSYSTEM_TYPE	= "SubSystemType";
var AGENCY_TYPE 	= "AgencyType";
var SERVICE_NAME 	= "ServiceName";
var METHOD_NAME 	= "MethodName";

var PARAM_COUNT 	= "ParamCount";

var NYCSERV_REQUEST 	= "NycservRequest";


// Common defines for subscripts for HTML that are to be ignored
// add more to it as need be and update the method "oProtocol_fbIsIgnorableField"
// to reflect the change.

var SUBSCRIPT_LENGTH = 3; 	// Only check for 3 characters as all subscripts should
							// be defined as 3 character length.

var SUBSCRIPT_TXT_FIELD = "TXT";
var SUBSCRIPT_CHK_FIELD = "CHK";
//var SUBSCRIPT_SEL_FIELD = "SEL";

// Common variables for different types of elements in HTML/JavaScript

var ELEMENT_TYPE_TEXT = "text";
var ELEMENT_TYPE_HIDDEN = "hidden";
var ELEMENT_TYPE_CHECK ="checkbox";
var ELEMENT_TYPE_RADIO ="radio";
var ELEMENT_TYPE_SELECT ="select-one";
var ELEMENT_TYPE_TEXT_AREA ="textarea";


/*
 * This function is just a facade to call actual Protocol Class that is responsible
 * for building a NYCSERVProtocol Request. For further information on how a request
 * in case of Scalar and Vectors should look from Internet, please refer to NYCSERV
 * Protocol Design Document.
 *
 */

var protocol ;

function cbfBuildRequest (form)
{
    protocol = new oProtocol();

	return (protocol.fbBuildRequest(form));

}

// Protocol Object that will support NYCSERV Protocol
// Also look at how form is built, as each form carrie swith it NYCSERV Protocol Header Overhead

function oProtocol ()
{
	this.fsGetHeader = oProtocol_fsGetHeader;
	this.fsGetParam = oProtocol_fsGetParam;

	this.fbBuildRequest = oProtocol_fbBuildRequest;
	this.fbIsNamePartOfHeaderField = oProtocol_fbIsNamePartOfHeaderField;
	this.fbIsIgnorableField = oProtocol_fbIsIgnorableField;
}

function oProtocol_fsGetHeader(channelType,
				requestType,
				subSystemType,
				agencyType,
				serviceName,
				methodName,
				paramCount)
{
	var sHeader = "";
	sHeader += CHANNEL_TYPE + "=" + channelType + "|" ;
	sHeader += REQUEST_TYPE + "=" + requestType + "|" ;
	sHeader += SUBSYSTEM_TYPE + "=" + subSystemType + "|";
	sHeader += AGENCY_TYPE + "=" + agencyType + "|" ;
	sHeader += SERVICE_NAME + "=" + serviceName + "|";
	sHeader += METHOD_NAME + "=" + methodName + "|";
	sHeader += PARAM_COUNT + "=" + paramCount + "|";

	return sHeader;
}

// Build Name Value pairs based on element type.

function oProtocol_fsGetParam ( element)
{

	var nameValuePair = "";
	// Dont bother to add Ignorable fields.

	if ( this.fbIsIgnorableField (element.name))
	{
		return null;
	}

	if ( (element.type == ELEMENT_TYPE_TEXT) || 
	     (element.type == ELEMENT_TYPE_TEXT_AREA)  )
	{
		nameValuePair = element.name + "=" + element.value + "|";
		return nameValuePair;
	}
	else if ( element.type == ELEMENT_TYPE_CHECK )
		{
			nameValuePair = element.name + "=" + element.value + "|";
			return nameValuePair;
	}
	else if ( element.type == ELEMENT_TYPE_RADIO )
	{           if (element.checked)
		        {
					nameValuePair = element.name + "=" + element.value + "|";
					return nameValuePair;
				}
	}
	else if ( element.type == ELEMENT_TYPE_SELECT )
	{
				nameValuePair = element.name + "=" + element[element.selectedIndex].value + "|";
				return nameValuePair;
	}

	else if ( element.type == ELEMENT_TYPE_HIDDEN )
	{
		if ( this.fbIsNamePartOfHeaderField (element.name))
		{
			return null; // No need to add Header fields again.
		}

		nameValuePair = element.name + "=" + element.value + "|";
		return nameValuePair;
	}

	return null;

}


/*
 * fields that start with following subscripts should be ignored
 * This will be used to help keep processing of NYCSERVRequest fields small.
 * and avoid duplication when hte data comes in.
 *
 * note that the subscripts are assumed to be 3 characters and
 * case-insensitive.
 *
 */

function oProtocol_fbIsIgnorableField ( fieldName )
{
	if (fieldName.length <= SUBSCRIPT_LENGTH)
		return false; // No point in processing

	var fieldNameSubscript = fieldName.substr ( 0, 3);

	fieldNameSubscript = fieldNameSubscript.toUpperCase();

	if ( (fieldNameSubscript == SUBSCRIPT_TXT_FIELD) ||
		//	(fieldNameSubscript == SUBSCRIPT_SEL_FIELD ) ||
			( fieldNameSubscript == SUBSCRIPT_CHK_FIELD ))

	{
		return true;
	}
	else
	{
		return false;
	}
}

/*
 * Following are the fieds that are considered header or fields with
 * significance in programming pattern for NYCSERV request processing
 *
 *
 */

function oProtocol_fbIsNamePartOfHeaderField ( fieldName )
{

	if ( (fieldName == CHANNEL_TYPE) ||
			(fieldName == REQUEST_TYPE ) ||
			( fieldName == SUBSYSTEM_TYPE ) ||
			( fieldName == AGENCY_TYPE ) ||
			( fieldName == SERVICE_NAME ) ||
			( fieldName == METHOD_NAME ) ||
			( fieldName == NYCSERV_REQUEST ) ||
			( fieldName == PARAM_COUNT ))
	{
		return true;
	}
	else
	{
		return false;
	}
}

function oProtocol_fbBuildRequest ( form )
{
	// Iterate through all elements of form and build NYCSERV Request

	var i = 0;
	var length = 0;
	var e ;
	var sNameValuePairs = "";
	var sNameValuePair = "";
	var sHeaderInfo = "";
	var nycservRequest = "";
	var paramCount = 0;

	// Get Fields needed for ProtocolHeader information

	var channelType = form.elements [CHANNEL_TYPE];
	var requestType = form.elements [REQUEST_TYPE];
	var subSystemType = form.elements [SUBSYSTEM_TYPE];
	var agencyType = form.elements [AGENCY_TYPE];
	var serviceName = form.elements [SERVICE_NAME];
	var methodName = form.elements [METHOD_NAME];
	var paramCount = form.elements [PARAM_COUNT];

	// Check and make sure that none of hte required values are null;
	// This will help in Initial Dev. Phases.

	if ((fbIsNull(channelType)) ||
			(fbIsNull(requestType)) ||
			(fbIsNull(subSystemType)) ||
			(fbIsNull(agencyType)) ||
			(fbIsNull(serviceName)) ||
			(fbIsNull(methodName)) ||
			(fbIsNull(paramCount)))
	{
		//alert ( "ERRROR: Protocol header Parameters need to be part of the form being submitted.");
		//alert ("VALUES::" + this.fsGetHeader( channelType,
											//requestType,
											//subSystemType,
											//agencyType,
											//serviceName,
											//methodName,
											//paramCount));
		return false;
	}


	paramCount = 0;
	// Get Values for all elements that are needed

	length = form.length;

	for ( i = 0; i < length; i++)
	{
		e = form.elements[i];
		sNameValuePair = this.fsGetParam (e);

		if ( sNameValuePair != null)
		{
			sNameValuePairs += sNameValuePair;
			paramCount ++;
		}
	}

	// Build and set value for nycervRequest Hidden field.

	nycservRequest = this.fsGetHeader ( channelType.value,
							requestType.value,
							subSystemType.value,
							agencyType.value,
							serviceName.value,
							methodName.value,
							paramCount.value);

	nycservRequest += sNameValuePairs;

	// REMOVE LAST PIPE
	var sStr = nycservRequest;

	var nLength = sStr.length;

	var j = nLength - 1;
	var cPipe = sStr.charAt(j);
	if (cPipe == "|" )
	{
		nycservRequest = sStr.substring (0, nLength - 1);

	}

	// Set Final Field that is needed for Server Side

	e = form.elements[NYCSERV_REQUEST];
	e.value = nycservRequest;

	//e = form.elements[NYCSERV_REQUEST];
	//alert ( e.value );


	return true;
}


function fbIsNull(sAnyThing)
{
	return ((sAnyThing + "" == "") ||
		(sAnyThing + "" == "null") ||
		(sAnyThing + "" == "undefined") ||
		(sAnyThing + "" == "<undefined>"));
}

