// create closure
//
(function($) {
	
	$.ajaxSetup({
	  timeout: 60000
	});

	jQuery.ajaxHelper = {

		sessionId: null,
		globalTimeout: 60000,
		hostedPage: "hosted.htm",
		baseUrl: "/service/session/",
		commonErrorHandler: null,
		// Cache the current ajax request for resending at time of session timeout.
		requestCache: {requestType: null, service: null, request: null, handler: null, errorHandler: null, options: null, tm: null, extra: null},
		getBaseUrl: function(target) {
			//for testing
			if (target.indexOf(".json")!= -1)
			{
				return target;
			}
			return jQuery.ajaxHelper.baseUrl+jQuery.ajaxHelper.sessionId+"/"+target;
		},
		newGuid: function() {
			//return new ActiveXObject("Scriptlet.TypeLib").GUID.substr(1,36);
			var result, i, j;
			result = '';
			for(j=0; j<32; j++)
			{
				if( j == 8 || j == 12|| j == 16|| j == 20)
				result = result + '-';
				i = Math.floor(Math.random()*16).toString(16).toUpperCase();
				result = result + i;
			}
			return result;
		},
		/**
		 * Retrieve name/value from URL query string
		 */
		getParameter: function( queryString, parameterName ) {
		   // Add "=" to the parameter name (i.e. parameterName=value)
		   var parameterName = parameterName + "=";
		   if ( queryString != null && queryString.length > 0 ) {
			  // Find the beginning of the string
			  begin = queryString.indexOf ( parameterName );
			  // If the parameter name is not found, skip it, otherwise return the value
			  if ( begin != -1 ) {
				 // Add the length (integer) to the beginning
				 begin += parameterName.length;
				 // Multiple parameters are separated by the "&" sign
				 end = queryString.indexOf ( "&" , begin );
				  if ( end == -1 ) {
					 end = queryString.length
				  }
				  // Return the string
				  return unescape ( queryString.substring ( begin, end ) );
			   }
			   // Return "null" if no parameter has been found
			   return null;
		   }
		   return null;
		},
		createTMsg: function(name, content)
		{
			var guid = jQuery.ajaxHelper.newGuid();
			var msg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
			msg += "<TMsg TUID=\"" + guid + "\">";
			if (content.indexOf('<TReq') != 0)
			{
				msg += "<TReq Type=\"" + name + "\">";
				msg += content;
				msg += "</TReq>";
			}else{
				msg += content;
			}
			msg += "</TMsg>";
			return  msg;
		},		
		isFailure: function(jsonData)
		{
			var errorCode = null;
			if (jsonData.TMsg.TRes.length)
			{
				for (var i=0; i<jsonData.TMsg.TRes.length; i++)
				{
					if (jsonData.TMsg.TRes[i]["@Status"] == "ERROR")
					{
						errorCode = jsonData.TMsg.TRes[i].Code.$;
					}
				}
			}else{
				if (jsonData.TMsg.TRes["@Status"] == "ERROR")
				{
					errorCode = jsonData.TMsg.TRes.Code.$;
				}
			}
			return errorCode;
		},
		sendAjaxPostRequest: function(service, request, handler, errorHandler, options, tm)
		{
			$.ajax({ 
				type: "POST",
				url: jQuery.ajaxHelper.getBaseUrl(service), 
				data: jQuery.ajaxHelper.createTMsg(service.substring(0, service.indexOf("JSON")), request),  //have to remove JSON
				dataType: "json",
				timeout: (tm == null || tm == undefined) ? jQuery.ajaxHelper.globalTimeout : tm,
				success: function(jsonData){ 
					//determine error code
					var errorCode = jQuery.ajaxHelper.isFailure(jsonData);
					if (jQuery.ajaxHelper.commonErrorHandler && errorCode)
					{
						jQuery.ajaxHelper.storeRequest("post", service, request, handler, errorHandler, options, tm);
						jQuery.ajaxHelper.commonErrorHandler(handler, jsonData.TMsg, errorCode, options);
					}else if (handler)
					{
						handler(jsonData.TMsg, options);
					}
				},
				error: function(xhr, b){ 
					if(jQuery.ajaxHelper.ajaxErrorHandler(xhr))
					{
						jQuery.ajaxHelper.sendAjaxPostRequest(service, request, handler, errorHandler, options, tm);
					}else{
						if (errorHandler)
						{
							errorHandler(b);
						}
					}			
				}
			});
		},
		sendAjaxPostRequestAjax: function(service, request, handler, errorHandler, options)
		{
			$.ajax({ 
				type: "POST",
				url: jQuery.ajaxHelper.getBaseUrl(service), 
				data: jQuery.ajaxHelper.createTMsg(service.substring(0, service.length-4), request),  //have to remove JSON
				dataType: "json",
				success: function(jsonData){ 
					if (handler)
					{
						handler(jsonData.TMsg, options);
					}
				},
				error: function(xhr, b){ 
					if(jQuery.ajaxHelper.ajaxErrorHandler(xhr))
					{
						jQuery.ajaxHelper.sendAjaxPostRequest(service, request, handler, errorHandler, options);
					}else{
						if (errorHandler)
						{
							errorHandler(b);
						}
					}			
				}
			});
		},
		sendAjaxGetRequest: function(service, handler, errorHandler, options)
		{
			$.ajax({
				type: "GET",
				url: jQuery.ajaxHelper.getBaseUrl(service), 
				dataType: "json",
				success: function(jsonData)
				{
					//determine error code
					var errorCode = jQuery.ajaxHelper.isFailure(jsonData);
					if (jQuery.ajaxHelper.commonErrorHandler && errorCode)
					{
						jQuery.ajaxHelper.storeRequest("get", service, null, handler, errorHandler, options);
						jQuery.ajaxHelper.commonErrorHandler(handler, jsonData.TMsg, errorCode, options);
					}else if (handler)
					{
						handler(jsonData.TMsg, options);
					}
				},
				error: function(xhr, b){ 
					if(jQuery.ajaxHelper.ajaxErrorHandler(xhr))
					{
						jQuery.ajaxHelper.sendAjaxGetRequest(service, handler, errorHandler, options);
					}else{
						if (errorHandler)
						{
							errorHandler(b);
						}
					}				
				}
			});
		},

		/**
		 * Store ajax requests so they can be reissued in case of session time out.
		 */
		storeRequest: function(requestType, service, request, handler, errorHandler, options, tm, extra){
			jQuery.ajaxHelper.requestCache.requestType = requestType;
			jQuery.ajaxHelper.requestCache.service = service;
			jQuery.ajaxHelper.requestCache.request = request;
			jQuery.ajaxHelper.requestCache.handler = handler;
			jQuery.ajaxHelper.requestCache.errorHandler = errorHandler;
			jQuery.ajaxHelper.requestCache.options = options;
			jQuery.ajaxHelper.requestCache.tm = tm;
			jQuery.ajaxHelper.requestCache.extra = extra;
		},

		/**
		 * Resend ajax requests interrupted by session time out.
		 */
		resendRequest: function(){
			switch (jQuery.ajaxHelper.requestCache.requestType) {
				case "post":
					jQuery.ajaxHelper.sendAjaxPostRequest(jQuery.ajaxHelper.requestCache.service, jQuery.ajaxHelper.requestCache.request, jQuery.ajaxHelper.requestCache.handler, jQuery.ajaxHelper.requestCache.errorHandler, jQuery.ajaxHelper.requestCache.options, jQuery.ajaxHelper.requestCache.tm);
					break;
				case "get":
					jQuery.ajaxHelper.sendAjaxGetRequest(jQuery.ajaxHelper.requestCache.service, jQuery.ajaxHelper.requestCache.handler, jQuery.ajaxHelper.requestCache.errorHandler, jQuery.ajaxHelper.requestCache.options);
					break;
				case "dynamic":
					jQuery.ajaxHelper.requestCache.handler(jQuery.ajaxHelper.requestCache.errorHandler, jQuery.ajaxHelper.requestCache.options, jQuery.ajaxHelper.requestCache.tm, jQuery.ajaxHelper.requestCache.service, jQuery.ajaxHelper.requestCache.request, jQuery.ajaxHelper.requestCache.extra);
					break;
				default:
					break;
			}
		},

		web_convert_timeslots: function(requestXML, zone_label, text, handler, errorHandler){
			$.ajax({ 
				type: "POST", 
					url: "tslot.xml",
				//url: "/service/session/"+jQuery.ajaxHelper.sessionId+"/Utils.TZConvert", 
				data: jQuery.ajaxHelper.createTMsg("Utils.TZConvert", "POST", requestXML), 
				timeout: 5000,
				dataType: "xml",
				success: function(xmlData){ 
					if (handler && jQuery.ajaxHelper.isSuccess(xmlData))
					{
						handler(xmlData, zone_label, text);
					}		
				},
				error: function(xhr, b){ 
					if(jQuery.ajaxHelper.ajaxErrorHandler(xhr))
					{
						jQuery.ajaxHelper.web_convert_timeslots(requestXML, zone_label, text, handler, errorHandler);
					}else{
						if (errorHandler)
						{
							errorHandler(b);
						}
					}		
				}
			});
		},
		web_send_request: function(requestXML, handler, errorHandler){
			$.ajax({ 
				type: "POST", 
					//url: "test.xml",
				url: "/service/session/"+jQuery.ajaxHelper.sessionId+"/CreateGuestSpace", 
				data: jQuery.ajaxHelper.createTMsg("CreateGuestSpace", "POST", requestXML),
				timeout: 5000,
				dataType: "xml",
				success: function(xmlData){ 
					//if (handler && jQuery.ajaxHelper.isSuccess(xmlData))
					//{
						handler();
					//}else{
						//page version is outdated
					//	errorHandler();
					//}
				},
				error: function(xhr, b){ 
					if(jQuery.ajaxHelper.ajaxErrorHandler(xhr))
					{
						jQuery.ajaxHelper.web_send_request(requestXML, handler, errorHandler);
					}else{
						if (errorHandler)
						{
							errorHandler(b);
						}
					}			
				}
			});
		},
		web_send_create_request: function(requestXML, handler, errorHandler){
			$.ajax({ 
				type: "POST", 
					//url: "test.xml",
				url: "/service/GuestSpaceEmail", 
				data: jQuery.ajaxHelper.createTMsg("GuestSpaceEmail", "POST", requestXML),
				timeout: 5000,
				dataType: "xml",
				success: function(xmlData){ 
					if (handler && jQuery.ajaxHelper.isSuccess(xmlData))
					{
						handler();
					}else{
						//page version is outdated
						errorHandler();
					}
				},
				error: function(xhr, b){ 
					if(jQuery.ajaxHelper.ajaxErrorHandler(xhr))
					{
						jQuery.ajaxHelper.web_send_create_request(requestXML, handler, errorHandler);
					}else{
						if (errorHandler)
						{
							errorHandler(b);
						}
					}			
				}
			});
		},
		
		quickRegister: function(requestXML, handler, errorHandler, auth){
			$.ajax({
				type: "POST",
					//url: "test4.json",
				url: "/service/session/"+jQuery.ajaxHelper.sessionId+"/Register",
				data: jQuery.ajaxHelper.createTMsg("Register", requestXML), 
				timeout: 5000,
				dataType: "xml",
				success: function(xml)
				{  
					if (handler)
					{
						handler(xml, auth);
					}
				},
				error: function(xhr, b){ 
					if(jQuery.ajaxHelper.ajaxErrorHandler(xhr))
					{
						jQuery.ajaxHelper.quickRegister(requestXML, handler, errorHandler, auth);
					}else{
						if (errorHandler)
						{
							errorHandler(b);
						}
					}
				}
			});
		},
		isSuccess: function(msgXml)
		{
			try {
				return $("TRes",msgXml).eq(0).attr("Status").toLowerCase() == "success";
			}
			catch(e)
			{
				return false;
			}
		},
		isSuccessJSON: function(json)
		{
			try {
				return  json['@Status'] ? json['@Status'].toLowerCase() == "success": (json.TRes ? jQuery.ajaxHelper.isSuccessJSON(json.TRes) : jQuery.ajaxHelper.isSuccessJSON(json.TMsg.TRes));
			}
			catch(e)
			{
				return false;
			}
		},
		ajaxErrorHandler: function(xhr)
		{
			try
			{
				switch (xhr.status)
				{
					case 12029:
					case 12030:
					case 12031:
					case 12152:
					case 12159:
					case 12002: //also the long timeout error - try again
						return true;
						break;
					default:
//						alert("HTTP request has failed on error #" + xhr.status); // Temporary.
						break;
				} 
				return false; // No more trying.
			}
			catch(e)
			{
				return false; // XHR.status unknown, such as Timeout. Should turn to the other variables returned by jQuery. 
			}
		}	
		
	};

//
// end of closure
//
})(jQuery);




//ajax requests


/*




*/

