/**
 * Module is responsible for handling UI updates and getting data from server
 *
 * @param {Cobalt.Core.Sandbox} sandbox
 */
Cobalt.Website.Common.AjaxRequestModule = function(sandbox)
{
    //TODO: COntent changed handler jsunit integration test
    /**
     * handle contentChanged event
     * @param {EventArg} e
     */
    var contentChangedHandler = function(e) 
	{
    	var componentId = getComponentIdFromEventData(e);
        var postData = getPostDataFromCurrentPage(componentId);
        if(getParameter("saved")=="true") {
        	postData = postData + "&saved=" +getParameter("saved");
        }
        executeAJAXRequest("post", "searchVehicles.ajax", postData);
    };

    //TODO: popup handler jsunit integeration; refactor
    /**
     * handle popUpClicked event
     * @param {EventArg} e
     */
    var popUpHandler = function(e) 
	{
    	var vehicleId = "";
        var componentId = getPropertyFromCustomEventData(e, 'componentId');
        vehicleId = componentId.split("_")[3];
        executeAJAXRequest("get", "popup.ajax", { id:vehicleId, componentId:componentId, pageName:getPageName()}, {sourceModule:e.customData.sourceModule, parentModule: e.customData.parentModule});
    };
    
    var getPageName = function() 
	{
		var pageName = sandbox.dom("[name ~= pageName]").attr("value");
		if (!pageName) {
			pageName = ContextManager.getPageName();
		}
		return pageName;
	};

	var formSubmitHandler = function(e) 
	{
        var componentId = getPropertyFromCustomEventData(e, 'componentId');
		var componentName = getPropertyFromCustomEventData(e, 'componentName');
		var postData = getPostDataFromFormField(componentId, componentName);
		executeAJAXRequest("post", "submit.ajax", postData, {sourceModule:e.customData.sourceModule, submitRequest:true, parentModule: e.customData.parentModule});
	};
	
	var formValidateHandler = function(e) 
	{
        var componentId = getPropertyFromCustomEventData(e, 'componentId');
		var componentName = getPropertyFromCustomEventData(e, 'componentName');
		var postData = getPostDataFromFormField(componentId, componentName);
		executeAJAXRequest("post", "validate.ajax", postData, {sourceModule:e.customData.sourceModule, submitRequest:true, parentModule: e.customData.parentModule});
	};
	
	  function getParameter(paramName) {
	  	  var searchString = window.location.search.substring(1),
	  	      i, val, params = searchString.split("&");

	  	  for (i=0;i<params.length;i++) {
	  	    val = params[i].split("=");
	  	    if (val[0] == paramName) {
	  	      return unescape(val[1]);
	  	    }
	  	  }
	  	  return null;
	  };
	
	var similarVehiclesHandler = function(e) 
	{
		executeAJAXRequest("get", "similarVehiclesAjax.do", { similarVehiclesPrice : e.customData.similarVehiclesPrice }, {submitRequest:true,  parentModule: e.customData.parentModule});
	};

    var similarVehiclesSeeMoreClickedHandler = function(e) 
	{
        executeAJAXRequest("get", "similarVehiclesAjax.do", {showAll:true}, { parentModule: e.customData.parentModule });
        return false;
    };
	
	var calculateMonthlyPaymentHandler = function(e) 
	{
		var formSelector = "[name ~= " + e.customData.formName + "]";
		var serializeData = sandbox.dom(formSelector).serialize();
		var postData = getFloatNumber(serializeData);
		postData += "&vehicleId="+e.customData.vehicleId+"&componentId="+e.customData.componentId;
		executeAJAXRequest("get", "calculateMonthlyPayment.ajax", postData, {parentModule: e.customData.parentModule});
	};
	
	var getFloatNumber = function(strNumber) 
	{
		strNumber = strNumber.replace(/,/g, "")
		strNumber = strNumber.replace(/ /g, "");
		strNumber = strNumber.replace(/%2C/g, "");
		return strNumber;
	};
	
	var getPostDataFromFormField = function(componentId, componentName) 
	{
		var formSelector = "[name ~= " + componentName + "]";
		var postData = sandbox.dom(formSelector).serialize();
		postData += "&componentId="+componentId;
		return postData;
	};

    /**
     * handle goto page event and Next/Prev page event
     * @param {EventArg} e
     */
    var paginationHandler = function(e) 
	{
        var componentId = getComponentIdFromCustomEventData(e);
        var postData = getPostDataFromCurrentPage(componentId);
       
        var targetPageNumber = getTargetPageNumberFromCustomEventData(e);
        var paginationPostData = postData + "&pageNumber="+targetPageNumber;
        if(getParameter("saved")=="true") {
        	paginationPostData = paginationPostData + "&saved=" +getParameter("saved");
        }
        executeAJAXRequest("post", "searchVehicles.ajax", paginationPostData);
    };

    var executeAJAXRequest = function(requestType, url, requestData, customData) 
	{
    	var sourceModule = (customData == null) ? requestData.sourceModule : customData.sourceModule;
    	var submitRequest = (customData == null) ? false : customData.submitRequest;
    	var componentId = requestData.componentId;
		var parentModule = (customData == null) ? null : customData.parentModule;
        sandbox.raise(null, Cobalt.Website.Common.Events.LoadingIndicatorStart, { parentModule: parentModule });
        sandbox.request({
            isAsync : true,
            requestType : requestType,
            requestUrl : url,
            dataType : "xml",
            requestData: requestData,
            success : function(xmlDoc)
            {
                
            	if (!xmlDoc) { throw new Error("XmlRenderEngine -> no xmlDoc"); }
                sandbox.raise(null, Cobalt.Website.Common.Events.LoadingIndicatorStop, null);
                sandbox.raise(null, Cobalt.Website.Common.Events.UpdateUI, {xmlDocument:xmlDoc, sourceModule:sourceModule, componentId:componentId});
                return false;     //supress all other event action
            },
            failure : function(response)
            {
                sandbox.raise(null, Cobalt.Website.Common.Events.LoadingIndicatorStop, null);
                throw new Error("XmlRenderEngine = >Unknown error");
            },
            complete : function(response)   //TODO: is this being used anyqhere?
            {
				
                sandbox.raise(null, Cobalt.Website.Common.Events.RequestCompleted, {response:response, url:url, sourceModule:sourceModule, submitRequest:submitRequest});
            } 
        });
    };

    var getComponentIdFromEventData = function(eventArgs) 
	{
        var compId = eventArgs.customData;
        if (!compId) { throw new Error("XmlRenderEngine -> no componentId"); }
        return compId;
    };
    
	var getPropertyFromCustomEventData = function(eventArgs, property) 
	{
		var customProperty = eval("eventArgs.customData."+property);
		if (eventArgs && eventArgs.customData && customProperty || customProperty === false ) { return customProperty; }
		else { throw new Error("XmlRenderEngine => componentId error"); }
	};

	var getTargetPageNumberFromCustomEventData = function(eventArgs) 
	{
		if (eventArgs && eventArgs.customData && eventArgs.customData.targetPageNumber) { return eventArgs.customData.targetPageNumber; }
		else { throw new Error("XmlRenderEngine => targetPageNumber error"); }
	};

	var getComponentIdFromCustomEventData = function(eventArgs) 
	{
		if (eventArgs && eventArgs.customData && eventArgs.customData.componentId) { return eventArgs.customData.componentId; }
		else { throw new Error("XmlRenderEngine => componentId error"); }
	};
	
	var inlineFormSubmitHandler = function(e) 
	{
        var componentId = getPropertyFromCustomEventData(e, 'componentId');
		var componentName = getPropertyFromCustomEventData(e, 'componentName');
		var postData = getPostDataFromFormField(componentId, componentName);
		executeAJAXRequest("post", "validate.ajax", postData, {sourceModule:e.customData.sourceModule, submitRequest:true});
	};	

    var getPostDataFromCurrentPage = function(componentId) 
	{
        //TODO: add unit test for post data serialization

        //serialize the search form data
		var searchFormSelector = "form#search";
        var searchData = sandbox.dom(searchFormSelector).serialize();

        //serialize the results header data
		var headerFormSelector = "form#results_list_header";
        var headerData = sandbox.dom(headerFormSelector).serialize();

		//serialize the results footer data
		var footerFormSelector = "form#results_list_footer";
		var footerData = sandbox.dom(footerFormSelector).serialize();
        //serialize componentId        		
        return  searchData + "&" + headerData + "&" + footerData +"&componentId=" + componentId;
        
	};
    
    var cartOperationHandler = function(e) {
		
	   	executeAJAXRequest("post", "cartOperations.do", e.customData);
	};
	    
	var removeVehicleClickedHandler = function (e) 
	{
		executeAJAXRequest("post", "removeVehicleFromPage.do", e.customData);
	};

	var makePrimaryClickedHandler = function (e) 
	{
		executeAJAXRequest("post", "makePrimaryVehicle.do", e.customData);
	};
	
	var handleShowSavedVehicles = function(e){
		executeAJAXRequest("post", "savedVehiclesList.do", e.customData);
	}
/*
	var saveVehicleCheckedHandler = function(e) 
	{
	   	executeAJAXRequest("post", "addSavedVehicle.do", e.customData);
	};
	    
	var saveVehicleUncheckedHandler = function(e) 
	{
	 	executeAJAXRequest("post", "removeSavedVehicle.do", e.customData);
	};
	*/
	var refreshSaveMarkupHandler = function(e) 
	{
	 	executeAJAXRequest("post", "fetchSaveMarkup.do", e.customData);
	};
	
    return {
        init:function() {
            sandbox.listen(null, Cobalt.Website.Common.Events.ContentChanged, contentChangedHandler, null);
            sandbox.listen(null, Cobalt.Website.Common.Events.PopupClicked, popUpHandler, null);
			sandbox.listen(null, Cobalt.Website.Common.Events.GoToPageBlur, paginationHandler, null);
            sandbox.listen(null, Cobalt.Website.Common.Events.PaginationClicked, paginationHandler, null);
			sandbox.listen(null, Cobalt.Website.Common.Events.FormSubmit, formSubmitHandler, null);
			sandbox.listen(null, Cobalt.Website.Common.Events.FormValidate, formValidateHandler, null);
			sandbox.listen(null, Cobalt.Website.Common.Events.SimilarVehiclesPriceChanged, similarVehiclesHandler, null);
            sandbox.listen(null, Cobalt.Website.Common.Events.SimilarVehiclesSeeMoreClicked, similarVehiclesSeeMoreClickedHandler, null);
			sandbox.listen(null, Cobalt.Website.Common.Events.CalculateMonthlyPayment, calculateMonthlyPaymentHandler, null);
			sandbox.listen(null, Cobalt.Website.Common.Events.CompareVehicleChecked, cartOperationHandler, null);
			sandbox.listen(null, Cobalt.Website.Common.Events.CompareVehicleUnchecked, cartOperationHandler, null);
			sandbox.listen(null, Cobalt.Website.Common.Events.CompareButtonClicked, cartOperationHandler, null);
			sandbox.listen(null, Cobalt.Website.Common.Events.RemoveVehicle, removeVehicleClickedHandler, null);   
	        sandbox.listen(null, Cobalt.Website.Common.Events.MakePrimary, makePrimaryClickedHandler, null);
	        sandbox.listen(null, Cobalt.Website.Common.Events.CompareVehiclesVSRInit, cartOperationHandler, null);
	        sandbox.listen(null, Cobalt.Website.Common.Events.ShowSavedVehicles, handleShowSavedVehicles, null);
	        sandbox.listen(null, Cobalt.Website.Common.Events.SaveVehicleChecked, cartOperationHandler, null);
	        sandbox.listen(null, Cobalt.Website.Common.Events.SaveVehicleUnchecked, cartOperationHandler, null);
	        sandbox.listen(null, Cobalt.Website.Common.Events.RefreshSaveMarkup, refreshSaveMarkupHandler, null);
	     },
        destroy:function() {
            //TODO: handle destroy
        }
    };
};

