// jApex is a plugin for jQuery designed to work with Oracle Application Express
// The primary Author is Tyler D. Muth
// http://tylermuth.wordpress.com
//
// Version 0.9.2
//
// JS Lint compliant now
// Added support for Fxx arrays

jQuery.jApex = function(){
	// This is just a placeholder to establish the namespace
}

jQuery.jApex.version = function(){
	return '0.9.2';
}


jQuery.jApex.ajax = function(options) {
  
		var settings = $.extend({}, jQuery.jApex.ajax.defaults, options);		
		var itemNames = '';
		var itemValues = '';
		var itemNamesArr = [];
		var itemValuesArr = [];
		var minusNameArr = [];
		var dataObject;
		
		function parseItems(itemSelector,nameArr,valArr){			
			var isJQuery = itemSelector instanceof jQuery;
			
			function isRealItem(itemId){
				if(itemId == 'pFlowId' ||
				   itemId == 'pFlowStepId' || 
				   itemId == 'pInstance' || 
				   itemId == 'pPageSubmissionId'||
				   itemId == 'pRequest'||
				   itemId == 'pdebug'||
				   itemId.length < 3){
					return false;
				}
				else {
					return true;
				} 
			} // end isRealItem
			
			if (isJQuery){
				$(itemSelector).each(function(){
					if (isRealItem($(this).attr('id'))){
						nameArr.push($(this).attr('id'));
						if (valArr !== undefined){
							valArr.push($v($(this).attr('id')));
						}
					}
				});
			} // if (isJQuery)
			
			
            if ($.isArray(itemSelector)){
				for (var i in itemSelector){
					if (isRealItem(itemSelector[i])){
						nameArr.push(itemSelector[i]);
						if (valArr !== undefined){
							valArr.push($v(itemSelector[i])); 
						}
					}
				}
			} //  if ($.isArray(itemSelector))
			
		} // parseItems
		
		function getArrayOfItems(selector){
			var x = [];
			$(selector).each(
				function(){
					itemType = $(this).attr('type');
					if(itemType == 'text'){
						x.push($(this).val());
					} //text
					else if(itemType == 'select-one'){
						x.push($(this).find('option:selected').val());
					} // select-one
					else if(itemType == 'checkbox'){
						if($(this).attr('checked')){
							x.push($(this).val());
						}
						else{
							x.push('');
						}
					} // checkbox
				} // function()
			); // $.each
			
			return x;
		}

		
		
		
		// settings Error Checking
		//
		if (settings.request !== undefined & settings.appProcess !== undefined)
			{alert('You can only define request OR appProcess, not both');}
		
		if (settings.request === undefined & settings.appProcess === undefined)
			{alert('You must define either request OR appProcess');}
		//
		// End settings Error Checking
		
		var apexRequest;
		if (settings.appProcess !== undefined)
			{apexRequest = 'APPLICATION_PROCESS='+settings.appProcess;}
		else
			{apexRequest = settings.request;}
		
		dataObject = { p_flow_id: $("#pFlowId").val(), 
					p_flow_step_id: $("#pFlowStepId").val(), 
					p_instance: $("#pInstance").val(),
					p_request: apexRequest,
					x01: settings.x01, 
					x02: settings.x02,
					x03: settings.x03,
					x04: settings.x04,
					x05: settings.x05,
					x06: settings.x06, 
					x07: settings.x07,
					x08: settings.x08,
					x09: settings.x09,
					x10: settings.x10
				};
		
		// add in any fxx items if set
		var i=1;
		for (i=1;i<=50;i++)
		{	var j = 'f';
			if(i <= 9){
				j = j +'0';
			}
			j = j+i.toString(10);
			var f = eval('settings.'+j);
			if(f){
				var isJQuerySelector = f instanceof jQuery;
				
				// if jQuery Selector ...
				if (isJQuerySelector){
					var x = [];
					$(f).each(
						function(){
							itemType = $(this).attr('type');
							if(itemType == 'text'){
								x.push($(this).val());
							}
							else if(itemType == 'select-one'){
								x.push($(this).find('option:selected').val());
							}
							else if(itemType == 'checkbox'){
								if($(this).attr('checked')){
									x.push($(this).val());
								}
								else{
									x.push('');
								}
							}
						}
					);
					eval('dataObject.'+j+' = x');
				}
				else{
					// if array ...
					eval('dataObject.'+j+' = settings.'+j);
				}			
			}
		} // end loop i
		
		if (settings.clearCache !== undefined)
			{dataObject.p_clear_cache = settings.clearCache;}
		
		$('#pdebug').each(function(){
			dataObject.p_debug = 'YES';
		});
		
		if (settings.pageItems !== undefined){
			parseItems(settings.pageItems,itemNamesArr,itemValuesArr);}
			
		if (settings.pageItemsMinus !== undefined){
			parseItems(settings.pageItemsMinus,minusNameArr);
			for ( var i = 0; i < minusNameArr.length; i++ ) {
				for ( var j = 0; j < itemNamesArr.length; j++ ) {
					if (minusNameArr[i] === itemNamesArr[j]){
						itemNamesArr.splice(j,1);
						itemValuesArr.splice(j,1);
					} // end if
				} // end J
			} // end I
		} // end if pageItemsMinus
		dataObject.p_arg_names = itemNamesArr;
		dataObject.p_arg_values = itemValuesArr;
	
		if (settings.setF20ItemArray)
			{dataObject.F20 = itemNamesArr;}
		
		var internalSuccess;
		
		internalSuccess = function (data,status){
			if (settings.validation !== undefined){
				if(settings.validation(data,status))
					{settings.success(data,status);
					return;}
			}
			else
				{settings.success(data,status);
				return;}
		};
		
		
		$.ajax({
			url: "wwv_flow.show", 
			data: dataObject,
			type: 'post',
			success: internalSuccess,
			dataFilter: settings.dataFilter,
			dataType: settings.dataType,
			timeout: settings.timeout,
			error: settings.error
		});
		
	//};
	
	// plugin defaults - added as a property on our plugin function
	
	jQuery.jApex.ajax.defaults = {
		appProcess: undefined,
		request: undefined,
		clearCache: undefined,
		success: undefined,
		validation: undefined,
		pageItems: undefined,
		pageItemsMinus: undefined,
		x01: '',
		x02: '',
		x03: '',
		x04: '',
		x05: '',
		x06: '',
		x07: '',
		x08: '',
		x09: '',
		x10: '',
		setF20ItemArray: false, // this option sets apex_application.g_f20 with the array of items names in case you want to loop over all items passed in
		// additional options suppported by jQuery.ajax(), but you probably don't need to use them
		async: true,
		dataFilter: '',
		dataType: 'html',
		error: '',
		timeout: ''
	};
}
