/*
** RequestObject class
*/

function RequestObject() {
	this.Url = '';
	this.FullUrl = '';
	this.SecureFullUrl = '';
	this.Method = 'GET';
	this.QueryString = new Array();
	this.Form = new Array();
	
	function _AddQueryString(oKeyValue) {
		return lnkAddQueryString(this, oKeyValue);
	};

	// 20100831 ddignazi
	function _ReplaceQueryString(sKey, oNewKeyValue) {
		return lnkReplaceQueryString(this, sKey, oNewKeyValue);
	};
	
	function _AddForm(oKeyValue) {
		return lnkAddForm(this, oKeyValue);
	};

	// 20100831 ddignazi
	function _ReplaceForm(sKey, oNewKeyValue) {
		return lnkReplaceForm(this, sKey, oNewKeyValue);
	};
	
	// 20100831 ddignazi
	function _GetQueryStringValues(sIgnoreKey, bEscape, bEncodeUTF8) {
		return lnkGetQueryStringValues(this, sIgnoreKey, bEscape, bEncodeUTF8);
	};

	// 20100831 ddignazi
	function _GetQueryStringValue(sKey) {
		return lnkGetQueryStringValue(this, sKey);
	};

	// 20100831 ddignazi
	function _GetFormValues(sIgnoreKey, bEscape, bEncodeUTF8) {
		return lnkGetFormValues(this, sIgnoreKey, bEscape, bEncodeUTF8);
	};
	
	// 20100831 ddignazi
	function _GetFormValue(sKey) {
		return lnkGetFormValue(this, sKey);
	};
	
	// 20100831 ddignazi
	function _RemoveQueryString(sKey) {
		return lnkRemoveQueryStringByKey(this, sKey);
	};

	// 20100831 ddignazi
	function _RemoveForm(sKey) {
		return lnkRemoveFormByKey(this, sKey);
	};

	this.AddQueryString = _AddQueryString;
	this.AddForm = _AddForm;
	// 20100831 ddignazi
	this.ReplaceQueryString = _ReplaceQueryString;
	this.ReplaceForm = _ReplaceForm;
	this.RemoveQueryString = _RemoveQueryString;
	this.RemoveForm = _RemoveForm;
	this.GetQueryStringValue = _GetQueryStringValue;
	this.GetFormValue = _GetFormValue;
	this.GetQueryStringValues = _GetQueryStringValues;
	this.GetFormValues = _GetFormValues;
};

function lnkCreateObject(sRequestObject) {
	var oRequestObject = JSON.parse(sRequestObject);
	if (!oRequestObject) {
		oRequestObject = new RequestObject();
	};
	return oRequestObject;
};

function lnkOpen(oRequestObject, bUseSecureVersion, sTarget, bPreventCache, bEncodeUTF8) {
	var sURL = '';
	
	if (!sTarget) {
		sTarget = (oRequestObject.Method == 'GET') ? '_self' : '_parent';
	};
	
	if (bUseSecureVersion) {
		sURL = oRequestObject.SecureFullUrl;
	} else {
		sURL = oRequestObject.Url;
	};
	
	if (oRequestObject.QueryString.length > 0) {
		for(iIndex = 0; iIndex < oRequestObject.QueryString.length; iIndex++) {
			sURL += (iIndex == 0) ? '?' : '&';
			sURL += oRequestObject.QueryString[iIndex].Key;
			sURL += '=';
			// 20101027 ddignazi
			//sURL += oRequestObject.QueryString[iIndex].UrlValue;
			sURL += (bEncodeUTF8 == true) ? encodeURIComponent(oRequestObject.QueryString[iIndex].Value) : escape(oRequestObject.QueryString[iIndex].Value);
		};
	};
	
	// 20061218 ddignazi
	if (isContextVisible()) {
		document.cookie = 'eFrameworkVisible=1;path=/';
	};
	
	// 20100831 ddignazi
	if (bPreventCache == true) {
		sURL += (oRequestObject.QueryString.length > 0) ? '&' : '?';
		sURL += 'random=' + parseInt(Math.random() * 50000);
	};
	
	if (oRequestObject.Method == 'GET') {
		
		window.open(sURL, sTarget);
		
	} else {
		
		var oContainer = jsrsContextPool[ jsrsGetContextID() ];
		var oPage = null;
		var oInput;
		
		// 20070112 ddignazi: si esta función se invoca desde index.asp la librería
		// JavaScript Remote Scripting falla al buscar el HTTP FORM que crea
		// para realizar el HTTP POST. En ese caso se utiliza el formulario auxiliar 
		// de eFramework.
		if (oContainer.container == undefined) {
		
			oPage = document.getElementById('eF');
			
			oPage.action = sURL;
			oPage.target = sTarget;
			oPage.method = 'POST';
			
			for(iIndex = 0; iIndex < oRequestObject.Form.length; iIndex++) {
				oInput = document.createElement('input');
				oInput.name = oRequestObject.Form[iIndex].Key;
				oInput.type = 'hidden';
				oInput.value = oRequestObject.Form[iIndex].Value;
				oPage.appendChild(oInput);
			};
			
			oPage.submit();
			
		} else {
		
			oContainer = oContainer.container;
			
			oPage = oPage = (jsrsBrowser == 'IE' ) ? oContainer.document : oContainer.contentDocument;
			oPage.open();
			oPage.charset = "windows-1252";
			oPage.write('<html>');
			oPage.write('<body>');
			oPage.write('<form name="RequestObject" method="POST" ');
			oPage.write(' target="' + sTarget + '" ');
			oPage.write(' action="' + sURL + '">');
			
			for(iIndex = 0; iIndex < oRequestObject.Form.length; iIndex++) {
				// 20101027 ddignazi
				//oPage.write('<input type="hidden" name="' + oRequestObject.Form[iIndex].Key + '" value="' + oRequestObject.Form[iIndex].UrlValue + '"/>');
				oPage.write('<input type="hidden" name="' + oRequestObject.Form[iIndex].Key + '" value="' + htmlEncode(oRequestObject.Form[iIndex].Value.toString(), false) + '"/>');
			};
			
			oPage.write('</form>');
			oPage.write('</body>');
			oPage.write('</html>');
			oPage.close();

			// 20070112 ddignazi
			if (isContextVisible()) {
				oPage.cookie = 'eFrameworkVisible=1;path=/';
			};
			
			oPage.forms['RequestObject'].submit();
		
		};
		
	};
};

/*
** RequestObjectKeyValue class
*/

function RequestObjectKeyValue(sKey, sValue) {
	this.Key = (sKey) ? sKey : '';
	this.Value = (sValue) ? sValue : '';
	// 20101027 ddignazi
	//// 20070112 ddignazi
	//this.UrlValue = (sValue) ? escape(sValue) : '';
};

function lnkAddQueryString(oRequestObject, oKeyValue) {
	if (!oKeyValue) oKeyValue = new RequestObjectKeyValue();
	if (oRequestObject) oRequestObject.QueryString.push(oKeyValue);
	return oKeyValue;
};

function lnkRemoveQueryString(oRequestObject, iIndex) {
	var vPrevItems = new Array();
	var vNextItems = new Array();
	
	if (iIndex > 0) {
		vPrevItems = oRequestObject.QueryString.slice(0, iIndex);
	};
	if (iIndex < oRequestObject.QueryString.length - 1) {
		vNextItems = oRequestObject.QueryString.slice(iIndex + 1);
	};
	
	oRequestObject.QueryString = vPrevItems.concat(vNextItems);
	
	return true;
};

function lnkAddForm(oRequestObject, oKeyValue) {
	if (!oKeyValue) oKeyValue = new RequestObjectKeyValue();
	if (oRequestObject) oRequestObject.Form.push(oKeyValue);
	return oKeyValue;
};

function lnkRemoveForm(oRequestObject, iIndex) {
	var vPrevItems = new Array();
	var vNextItems = new Array();
	
	if (iIndex > 0) {
		vPrevItems = oRequestObject.Form.slice(0, iIndex);
	};
	if (iIndex < oRequestObject.Form.length - 1) {
		vNextItems = oRequestObject.Form.slice(iIndex + 1);
	};
	
	oRequestObject.Form = vPrevItems.concat(vNextItems);
	
	return true;
};

// 20100831 ddignazi
function lnkGetQueryStringValues(oRequestObject, sIgnoreKey, bEscape, bEncodeUTF8) {
	var sURL = '';
	var vIgnoreKey = sIgnoreKey.split(',');
	var bFound = false;
	
	if (oRequestObject.QueryString.length > 0) {
		for(iIndex = 0; iIndex < oRequestObject.QueryString.length; iIndex++) {
			
			bFound = false;
			for (iSubIndex=0; iSubIndex < vIgnoreKey.length; iSubIndex++) {
				if (oRequestObject.QueryString[iIndex].Key == vIgnoreKey[iSubIndex]) {
					bFound = true;
					break;
				};
			};
			
			if (!bFound) {
				sURL += (sURL == '') ? '?' : '&';
				sURL += oRequestObject.QueryString[iIndex].Key;
				sURL += '=';
				// 20101027 ddignazi
				//sURL += oRequestObject.QueryString[iIndex].UrlValue;
				if (bEscape == true) {
					sURL += (bEncodeUTF8 == true) ? encodeURIComponent(oRequestObject.QueryString[iIndex].Value) : escape(oRequestObject.QueryString[iIndex].Value);
				} else {
					sURL += oRequestObject.QueryString[iIndex].Value;
				};
			};
			
		};
	};
	
	return sURL;
};

// 20100831 ddignazi
function lnkGetQueryStringValue(oRequestObject, sKey) {
	var sValue = '';
	
	if (oRequestObject.QueryString.length > 0) {
		for(iIndex = 0; iIndex < oRequestObject.QueryString.length; iIndex++) {
			if (oRequestObject.QueryString[iIndex].Key == sKey) {
				sValue += (sValue == '') ? '' : ',';
				sValue += oRequestObject.QueryString[iIndex].Value;
			};
		};
	};
	
	return sValue;
};

// 20100831 ddignazi
function lnkGetFormValues(oRequestObject, sIgnoreKey, bEscape, bEncodeUTF8) {
	var sPostData = '';
	var vIgnoreKey = sIgnoreKey.split(',');
	var bFound = false;
	
	if (oRequestObject.Form.length > 0) {
		for(iIndex = 0; iIndex < oRequestObject.Form.length; iIndex++) {
			
			bFound = false;
			for (iSubIndex=0; iSubIndex < vIgnoreKey.length; iSubIndex++) {
				if (oRequestObject.Form[iIndex].Key == vIgnoreKey[iSubIndex]) {
					bFound = true;
					break;
				};
			};
			
			if (!bFound) {
				sPostData += (sPostData == '') ? '' : '&';
				sPostData += oRequestObject.Form[iIndex].Key;
				sPostData += '=';
				// 20101027 ddignazi
				//sPostData += oRequestObject.Form[iIndex].UrlValue;
				if (bEscape == true) {
					sPostData += (bEncodeUTF8 == true) ? encodeURIComponent(oRequestObject.Form[iIndex].Value) : escape(oRequestObject.Form[iIndex].Value);
				} else {
					sPostData += oRequestObject.Form[iIndex].Value;
				};
			};
			
		};
	};
	
	return sPostData;
};

// 20100831 ddignazi
function lnkGetFormValue(oRequestObject, sKey) {
	var sValue = '';
	
	if (oRequestObject.Form.length > 0) {
		for(iIndex = 0; iIndex < oRequestObject.Form.length; iIndex++) {
			if (oRequestObject.Form[iIndex].Key == sKey) {
				sValue += (sValue == '') ? '' : ',';
				sValue += oRequestObject.Form[iIndex].Value;
			};
		};
	};
	
	return sValue;
};

// 20100831 ddignazi
function lnkRemoveQueryStringByKey(oRequestObject, sKey) {
	var iIndex = 0;
	while (iIndex < oRequestObject.QueryString.length) {
		if (oRequestObject.QueryString[iIndex].Key == sKey) {
			lnkRemoveQueryString(oRequestObject, iIndex);
		} else {
			iIndex++;
		};
	};
};

// 20100831 ddignazi
function lnkReplaceQueryString(oRequestObject, sKey, oNewKeyValue) {
	lnkRemoveQueryStringByKey(oRequestObject, sKey);
	oNewKeyValue = lnkAddQueryString(oRequestObject, oNewKeyValue);
	if (oNewKeyValue.Key == '') oNewKeyValue.Key = sKey;
	return oNewKeyValue;
};

// 20100831 ddignazi
function lnkRemoveFormByKey(oRequestObject, sKey) {
	var iIndex = 0;
	while (iIndex < oRequestObject.Form.length) {
		if (oRequestObject.Form[iIndex].Key == sKey) {
			lnkRemoveForm(oRequestObject, iIndex);
		} else {
			iIndex++;
		};
	};
};

// 20100831 ddignazi
function lnkReplaceForm(oRequestObject, sKey, oNewKeyValue) {
	lnkRemoveFormByKey(oRequestObject, sKey);
	oNewKeyValue = lnkAddForm(oRequestObject, oNewKeyValue);
	if (oNewKeyValue.Key == '') oNewKeyValue.Key = sKey;
	return oNewKeyValue;
};

