	
	// jCFC 1.1
	
	var jCFC = new Object( );
		jCFC.useGlobalCallback = false;
		jCFC.proxyObjectCache = new Object( );
	
		// Customize: Path to your jCFC.cfc file here
		jCFC.path = '/ajax/wiring.cfc';
	
	/*
	// class: proxyObject
	function proxyObject( cfc ){
		
			var methods = "";
			
			// Retrieve the proxy object configuration a maximum of 1 time per context per CFC
			if( jCFC.proxyObjectCache[ cfc ] != undefined ){
				
				methods = jCFC.proxyObjectCache[ cfc ];
				
			} else {
				
				// Retreive the cfc's remote-able methods
				jQuery.ajax( { url: jCFC.path + '?method=relay&argumentCollection={ "cfc":"' + cfc + '", "method":"getAccessSignature" }', async: false, success: function( result ){  methods = jQuery.evalJSON( result )  }  } );
				
				// Cache them for serverless reuse
				jCFC.proxyObjectCache[ cfc ] = methods;
			
			}
			
			// Loop through the remote-accessible methods and build a $.cfc( ) simulator for each one
			for( var cm = 0; cm < methods.length; cm++ ){
							
					eval( 'function ' + methods[ cm ] + '( ){ var pta = ""; var cem = arguments.callee.toString( ); cem = cem.substr( "function ".length ); cem = cem.substr( 0, cem.indexOf( "(" ) ); for( var ca = 0; ca < arguments.length; ca++ ){ if( ca > 0 ) pta += ", "; pta += "arguments[ " + ca + " ]"; } return ( pta.length == 0 ) ? eval( "jQuery.cfc( cfc, cem )" ) : eval( "jQuery.cfc( cfc, cem, " + pta + " )" ) ; }' );
			
					this[ methods[ cm ] ] = eval( methods[ cm ] );
							
			}
			
			// Return the proxyObject
			return this;
		
	} // xclass: proxyObject
	*/
	
	
	// jQuery utility method: $.cfc( )
	jQuery.cfcp = function( cfc, method, option1, option2 ) {
			
			   // Proxy object distributor
			   if( method == undefined ){  return new proxyObject( cfc );  }
						   
				var argumentCollection = { cfc: cfc, method: method };
				var configuration = { }; // Will be passed to the jQuery.ajax( ) call
				var result = true; // Used to return the synchronous result to the calling context or true for asynchronous calls
				var urlCollection = jCFC.path + '?method=relay'; 

				   // Handle a variable number and order of arguments
				   // 1. No args or callback
				   if( typeof( option1 ) == 'undefined' ){
											
										// Set sync mode and an internal anonymous callback to be able to return result to calling context
										if( !jCFC.useGlobalCallback ){ 
											configuration.async = false;
											configuration.success = function( rs ){ result = jQuery.evalJSON( rs ); }; 
										}
							
				   } else {
							// 2. Args and callback
							if( typeof( option2 ) != 'undefined' && (  typeof( option1 ) == 'function' || typeof( arguments[ arguments.length - 1 ] ) == 'function'  )  ){
								
									// Leading callback
									if( typeof( option1 ) == 'function' ){ 
									
											configuration.success =  function( rs ){ option1( jQuery.evalJSON( rs ) ); }; 
											
																if( typeof( option2 ) == 'object' && option2.length == undefined && arguments.length == 4 ){
																// Single named argument object	
												
																				jQuery.extend( argumentCollection, option2 );
																		
																} else {
																// Unnamed
																		
																		for( var cua = 3; cua < arguments.length; cua++ ){
																				argumentCollection[ cua - 2 ] = arguments[ cua ];	
																		}
																		
																}
															
									// Trailing callback
									} else { 
									
											var cb = arguments[ arguments.length -1 ];
											configuration.success =  function( rs ){ cb( jQuery.evalJSON( rs ) ); }; 
									
																if( typeof( option1 ) == 'object' && option1.length == undefined && arguments.length == 4 ){
																// Single named argument object	
																
																		jQuery.extend( argumentCollection, option1 );
																		
																} else {
																// Unnamed
																		
																		for( var cua = 3; cua <= arguments.length - 1; cua++ ){
																				argumentCollection[ cua - 2 ] = arguments[ cua - 1 ];	
																		}
																		
																}
									
									}
								
							} else {
										// 3. Args but no callback
										if( typeof( option1 ) != 'function' ){
											
													if( typeof( option1 ) == 'object' && ( option1.length == undefined || typeof option1.length == "string" ) && arguments.length == 3 ){
													// Single named argument object	
													
															jQuery.extend( argumentCollection, option1 );
															
													} else {
													// Unnamed
															
															for( var cua = 3; cua <= arguments.length; cua++ ){
																	argumentCollection[ cua - 2 ] = arguments[ cua - 1 ];	
															}
															
													}
													
													// Set sync mode and callback to be able to return result to calling context
													if( !jCFC.useGlobalCallback ){
													 	configuration.async = false;
													 	configuration.success = function( rs ){ result = jQuery.evalJSON( rs ); }; 
													 }
													
										// x3.
										} else { 
													// 4. Callback but no args
											
													configuration.success = function( rs ){ option1( jQuery.evalJSON( rs ) ); };
											
										} 			// x4.

							} // x2.
				   } // x1.
		
		
			// Merge configuration and CFC method arguments
			
			// Gets
			// urlCollection = urlCollection + '&argumentCollection=' + jQuery.toJSON( argumentCollection );
			
			// Posts
			configuration.data = argumentCollection;
			
			// Add the serialized URL and query string to the jQuery.ajax configuration object
			configuration.url = urlCollection;
			
			configuration.type = "POST";

			// Execute the jQuery AJAX call
			jQuery.ajax( configuration );
			
			// Returns true if asynchronous or the cfc method result if synchronous
			return result;
				
	} //  xjQuery utility method: $.cfc( )