(function(myjQuery){
	var __refererContext 	= null;
	var __baseURL 		= '/travel/_tnz/object/shift/ajax/proxy.cfm';
	myjQuery.extend
	({
		TNZCFC :{
			invoke : function(component,method,args,type,resultHandler,errorResultHandler,maintainContext,refererContext,dataType,async,serializeQueryByColumns,parseSimpleValues,cache){
				// Allow for either named or ordered arguments
				var arguments = {};
				
				if(typeof(component) == 'object'){
					var passed = component;
					// Named Arguments
					arguments.component 			= (typeof passed.component == 'undefined') 			? null : passed.component;
					arguments.method 				= (typeof passed.method == 'undefined') 			? null : passed.method;
					arguments.args 					= (typeof passed.args == 'undefined') 				? {} : passed.args;
					arguments.type 					= (typeof passed.type == 'undefined') 				? 'GET' : passed.type;	
					arguments.resultHandler 		= (typeof passed.resultHandler == 'undefined') 		? function(x){return x;} : passed.resultHandler;
					arguments.errorResultHandler 	= (typeof passed.errorResultHandler == 'undefined') ? this.logit : passed.errorResultHandler;
			    	arguments.maintainContext		= (typeof passed.maintainContext == 'undefined') 	? false : passed.maintainContext;
			    	arguments.refererContext		= (typeof passed.refererContext == 'undefined') 	? this.getContext() : passed.refererContext;
					arguments.dataType 				= (typeof passed.dataType == 'undefined') 			? null : passed.dataType;
					arguments.async 				= (typeof passed.async == 'undefined') 				? true : passed.async;
					arguments.serializeQueryByColumns = (typeof passed.serializeQueryByColumns == 'undefined') 	? false : passed.serializeQueryByColumns;
					arguments.parseSimpleValues 	= (typeof passed.parseSimpleValues == 'undefined') 	? false : passed.parseSimpleValues;
					arguments.cache 				= (typeof passed.cache == 'undefined') 				? true : passed.cache;
				}else{
					// Ordered Arguments
					arguments.component 			= (typeof component == 'undefined') 			? null : component;
					arguments.method 				= (typeof method == 'undefined') 				? null : method;
					arguments.args 					= (typeof args == 'undefined') 					? {} : args;
					arguments.type 					= (typeof type == 'undefined') 					? 'GET' : type;	
					arguments.resultHandler 		= (typeof resultHandler == 'undefined') 		? function(x){return x;} : resultHandler;
					arguments.errorResultHandler 	= (typeof errorResultHandler == 'undefined') 	? this.logit : errorResultHandler;
			    	arguments.maintainContext		= (typeof maintainContext == 'undefined') 		? false : maintainContext;
			    	arguments.refererContext		= (typeof refererContext == 'undefined') 		? this.getContext() : refererContext;
					arguments.dataType 				= (typeof dataType == 'undefined') 				? null : dataType;
					arguments.async 				= (typeof async == 'undefined') 				? true : async;
					arguments.serializeQueryByColumns	= (typeof serializeQueryByColumns == 'undefined') 	? false : serializeQueryByColumns;
					arguments.parseSimpleValues 	= (typeof parseSimpleValues == 'undefined') 	? false : parseSimpleValues;
					arguments.cache 				= (typeof parseSimpleValues == 'undefined') 	? true : cache;
				}

				// if they have passed a contextstring and it is an object - convert it to a string
				if(typeof arguments.refererContext == 'object'){
					arguments.refererContext = this.createContextString(arguments.refererContext);
				}
				
				if(!arguments.maintainContext){
					arguments.refererContext = null;;
				}
				
				if( (typeof arguments.component == null) | (typeof arguments.method == null) ){
					alert('ERROR: jQuery.TNZCFC.invoke(component,method,args,type,resultHandler,errorResultHandler,maintainContext,refererContext)\n\nYou must pass both the component argument and the method argument');
				}else if(arguments.maintainContext && arguments.refererContext == null){
					alert('ERROR: jQuery.TNZCFC.invoke(component,method,args,type,resultHandler,errorResultHandler,maintainContext,refererContext)\n\nYou have chosen to maintain the page context, but have not yet configured it.\nRun the setRefererContext(page_uuid,lang,market,rendition) function before making this call or pass the context as an object or a string');
				}else{
				
					// add the component and context details to the call
					if(arguments.refererContext == null){
						arguments.args.refererContext 	= "";
					}else{
						arguments.args.refererContext 	= arguments.refererContext;
					}
					arguments.args._component 		= arguments.component;
					arguments.args._method 			= arguments.method;
					arguments.args._serializeQueryByColumns	= arguments.serializeQueryByColumns;
					arguments.args._parseSimpleValues = arguments.parseSimpleValues;
					
					// Akamai Cache Buster
					if(!arguments.cache){
						arguments.args.bustakamai = Math.random();					
					}
					
					// Make the call
					
					if(arguments.dataType == null){
					
						return myjQuery.ajax({
							async:arguments.async,
							url:__baseURL,
							type:arguments.type,
							data:arguments.args,
							success:arguments.resultHandler,
							error:arguments.errorResultHandler,
							cache:arguments.cache
						});
					
					}else{
						
						return myjQuery.ajax({
							async:arguments.async,
							url:__baseURL,
							type:arguments.type,
							data:arguments.args,
							dataType:arguments.dataType,
							success:arguments.resultHandler,
							error:arguments.errorResultHandler,
							cache:arguments.cache
						});
						
					}
				
				
				}
			}

			, createContextString : function(page_uuid,lang,market,rendition){ 
				// Allow for either named or ordered arguments
				if(page_uuid == null) return null;
					                  		
				var arguments = {};
				if(typeof(page_uuid) == 'object'){
					var passed = page_uuid;
					// Named Arguments
					arguments.page_uuid 	= (typeof passed.page_uuid == 'undefined') 	? '1E557130-5CFC-4B84-8263-8116BCB00DA1' : passed.page_uuid;
					arguments.lang 			= (typeof passed.lang == 'undefined') 		? 'en' : passed.lang;
					arguments.market 		= (typeof passed.market == 'undefined') 	? arguments.lang : passed.market;
					arguments.rendition 	= (typeof passed.rendition == 'undefined') 	? arguments.lang : passed.rendition;	
				}else{
					// Ordered Arguments
					arguments.page_uuid 	= (typeof page_uuid == 'undefined') 		? '1E557130-5CFC-4B84-8263-8116BCB00DA1' : page_uuid;
					arguments.lang 			= (typeof lang == 'undefined') 				? 'en' : lang;
					arguments.market 		= (typeof market == 'undefined') 			? arguments.lang : market;
					arguments.rendition 	= (typeof rendition == 'undefined') 		? arguments.lang : rendition;	
				}
				return arguments.page_uuid + ',' + arguments.lang + ',' + arguments.market + ',' + arguments.rendition;
  			}

			, setRefererContext : function(page_uuid,lang,market,rendition){ 
				// Allow for either named or ordered arguments
				var arguments = {};
				if(typeof(page_uuid) == 'object'){
					var passed = page_uuid;
					// Named Arguments
					arguments.page_uuid 	= (typeof passed.page_uuid == 'undefined') 	? '1E557130-5CFC-4B84-8263-8116BCB00DA1' : passed.page_uuid;
					arguments.lang 			= (typeof passed.lang == 'undefined') 		? 'en' : passed.lang;
					arguments.market 		= (typeof passed.market == 'undefined') 	? arguments.lang : passed.market;
					arguments.rendition 	= (typeof passed.rendition == 'undefined') 	? arguments.lang : passed.rendition;	
				}else{
					// Ordered Arguments
					arguments.page_uuid 	= (typeof page_uuid == 'undefined') 		? '1E557130-5CFC-4B84-8263-8116BCB00DA1' : page_uuid;
					arguments.lang 			= (typeof lang == 'undefined') 				? 'en' : lang;
					arguments.market 		= (typeof market == 'undefined') 			? arguments.lang : market;
					arguments.rendition 	= (typeof rendition == 'undefined') 		? arguments.lang : rendition;	
				}
					
				__refererContext = this.createContextString(arguments);
								                  	
				return this.getContext();
			}
                  
			, getContext : function(){return __refererContext;}
			
			, simpleModalErrorHandler : function(xhr,err,e){
				
				
				
				$('<div id="ajaxProxyErrorContainer" style="display:none">' + xhr.responseText + '</div>').appendTo("body");

				//attempt to close the modal incase there is already one open
				$.modal.close();

				$('#ajaxProxyErrorContainer').modal({
					overlayCss : {
						cursor 			: 'wait',
						backgroundColor: '#000'
					},
					containerCss : {
						height			: '600px',
						width			: '800px',
						left			: '50%',
						top				: '15%',
						marginLeft		: '-400px',
						backgroundColor: '#fff',
						border			: '1px solid #ccc',
						overflow : 'auto'
						
					},
					onShow : function(){
						$('.modalCloseImg').css({
							background : 'url(/travel/_tnz/object/shift/ajax/x.png) no-repeat',
							width:'25px',
							height:'29px',
							display:'inline',
							zIndex:'3200',
							position:'absolute',
							top:'1px',
							right:'1px',
							cursor:'pointer'
						});
						$('#ajaxProxyErrorContainer').css({
							marginTop : '22px',
							padding : '8px',
							font: 'normal 11px/13px Verdana, Arial, Helvetica, sans-serif',
							colour: '#666'
						});
						
					}
				});
			
			}
			, columnsArrayToObject: function( columns )//turns a Column array in to an object with name/value pairs of column name and array position
			  {
			  	var returnValue = {};
			  	for( var i = 0 ; i < columns.length ; i ++ ){ returnValue[ columns[ i ] ] = i; }
			  	return returnValue;
			  }
			
			, basicErrorHander : function(xhr,err,e){
				
				alert('An error occured trying to execute your ajax call: ' + err);
							
			}
			
			, doNothingErrorHander : function(xhr,err,e){
				
				
							
			}
			
			, logit : function(xhr,err,e){
				
				return myjQuery.ajax({
							async:true,
							url:'/travel/_tnz/object/shift/ajax/logerror.cfm',
							type:'POST',
							data:{error:xhr.responseText,status:xhr.status,statusText:xhr.statusText},
							success:null,
							error:null,
							cache:false
						});
			}

		}
	})
})(jQuery);