//detail page namespace object
var Detail = {
	//AJAX constants
	AJAX_URL: "/alohaCartRequest",
	AJAX_PARAM_ASIN: "&asin=",
	AJAX_PARAM_ZIP: "&zip=",
	AJAX_PARAM_TRANSACTION: "&transaction=",
	AJAX_PARAM_OPERATION: "&operation=",
	AJAX_RESULT_NOT_FOUND: "NOT_FOUND",
	AJAX_RESULT_INVALID_ZIPCODE: "INVALID_ZIPCODE",
	AJAX_ACTION_ADD_DEVICE: "ADD_DEVICE",
	AJAX_ACTION_ADD_SERVICE: "ADD_SERVICE",

	//DOM ID elements
	EL_BUY_BOX_FORM: $("#buy-box-form"),
	EL_BUY_BOX_SUBMIT: $("#buy-box-submit"),
	EL_BUY_BOX_NEW_WRAPPER: $("#new-contract-wrapper"),
	EL_BUY_BOX_UPGRADE_WRAPPER: $("#upgrade-contract-wrapper"),
	EL_BUY_BOX_UPGRADE_SELETCTION_WRAPPER: $("#upgrade-type-selection-wrapper"),
	EL_BUY_BOX_SINGLE_UPGRADE_WRAPPER: $("#single-upgrade-contract-wrapper"),
	EL_BUY_BOX_FAMILY_UPGRADE_WRAPPER: $("#family-upgrade-contract-wrapper"),
	EL_BUY_BOX_NO_CONTRACT_WRAPPER: $("#phone-only-wrapper"),
	EL_BUY_BOX_NEW_RADIO: $("#new-contract"),
	EL_BUY_BOX_SINGLE_UPGRADE_RADIO: $("#single-upgrade-contract"),
	EL_BUY_BOX_FAMILY_UPGRADE_RADIO: $("#family-upgrade-contract"),
EL_BUY_BOX_NO_CONTRACT_RADIO: $("#no-contract"),
	EL_BUY_BOX_TRANSACTION_SELECTION_WRAPPER: $("#transaction-selection-wrapper"),
	EL_ZIP_WRAPPER: $("#bb-zip-wrapper"),
	EL_ZIP_INPUT_WRAPPER: $("#bb-zip-input-wrapper"),
	EL_ZIP_INPUT: $("#bb-zip-input"),
	EL_SS_ERROR_TOOLTIP: $("#bb-ss-error-tooltip"),
	EL_ZIPCODE_ERROR_TOOLTIP: $("#bb-zipcode-error-tooltip"),
	EL_SS_AND_ZIPCODE_ERROR_TOOLTIP: $("#bb-ss-and-zipcode-error-tooltip"),
	EL_ZIP_SUCCESS_MESSAGE: $("#bb-zip-success-message"),
	EL_ZIP_ERROR_MESSAGE: $("#bb-zip-error-message"),
	EL_TRANSACTION_ERROR_MESSAGE: $("#bb-transaction-error-message"),
	EL_BINDING_ACTION: $("#binding-action"),
	EL_ZIP_EDIT_LINK: $("#bb-zip-edit-link"),
	EL_BUY_BOX_NOTE_UNSELECTED: $("#buy-box-note-unselected"),
	EL_BUY_BOX_NOTE_NEW: $("#buy-box-note-new"),
	EL_BUY_BOX_NOTE_UPGRADE: $("#buy-box-note-upgrade"),
	EL_BUY_BOX_NEW_PRICE_LABEL: $("#new-price"),
	EL_BUY_BOX_UPGRADE_PRICE_LABEL: $("#upgrade-price"),
	EL_BUY_BOX_PRICE_LABEL: $("#bb-price-label"),
	EL_BUY_BOX_PRICE_FROM_LABEL: $("#bb-price-from-label"),
	

	//message constants
	MESSAGE_ZIP_ERROR: "<h3>Please enter a valid ZIP Code</h3>",
	MESSAGE_ZIP_NOT_FOUND: "<h3>We're sorry, but that ZIP Code was not found</h3>",
	MESSAGE_INVALID_ZIPCODE: "<h3>Please enter a valid ZIP Code</h3>",

	//link constants
	LINK_PHONE_ABN: "/b/684177011/ref=bb_br_ph_dp",
	LINK_PLAN_ABN: "/b/684182011/ref=bb_br_pl_dp",

	//binding action
	bindingAction: "",

	/**
	 * Sets up DP JS
	 */
	init: function() {

		//ensure zip is well-formed on submit button hover
		Detail.EL_BUY_BOX_SUBMIT.mouseover(function() { 
            Detail.toggleErrorTooltip(Detail.isServiceSelectionValid(), Detail.isZipCodeValid()); 
        });

		Detail.EL_BUY_BOX_SUBMIT.mouseout(function() { 
            Detail.hide(Detail.EL_SS_ERROR_TOOLTIP); 
            Detail.hide(Detail.EL_ZIPCODE_ERROR_TOOLTIP); 
            Detail.hide(Detail.EL_SS_AND_ZIPCODE_ERROR_TOOLTIP); 
        });
		
		Detail.EL_BUY_BOX_NEW_WRAPPER.click(function() { Detail.updateBuyBoxNote();});
		Detail.EL_BUY_BOX_UPGRADE_WRAPPER.click(function() { Detail.updateBuyBoxNote();});
		Detail.EL_BUY_BOX_NO_CONTRACT_WRAPPER.click(function() { Detail.updateBuyBoxNote();});		
		//determine binding action
		Detail.bindingAction = Detail.EL_BINDING_ACTION.find("input[name='operation']").val() || "";

		//set up AJAX call
		Detail.EL_BUY_BOX_FORM.submit(function() {
			//prevent buy box form from submitting and display error message if zip is not well-formed
			if (Detail.isServiceSelectionValid() && Detail.isZipCodeValid()){
				var asinFragment = Detail.AJAX_PARAM_ASIN + Detail.EL_BUY_BOX_SUBMIT.attr("value") || "";
				var transaction =  $("input[@name='contract-type']:checked").val();
				var transactionFragment = Detail.AJAX_PARAM_TRANSACTION + transaction || "";
				var zipFragment = Detail.AJAX_PARAM_ZIP + Detail.EL_ZIP_INPUT.val() || "";
				var operationFragment = Detail.AJAX_PARAM_OPERATION + Detail.bindingAction;
                var Aloha = $.Aloha;
				var tokenFragment = Aloha.Util.getSecurityTokenQuery();
				var query = tokenFragment + asinFragment + transactionFragment + operationFragment + zipFragment;
				Aloha.AjaxUtil.ajaxCall(Detail.AJAX_URL, query, Detail.handleAjaxSuccess, Detail.handleAjaxError);
			} else {
                var validationResult = Detail.isZipCodeValid();
            
                if (validationResult == false){
    				Detail.EL_ZIP_ERROR_MESSAGE.html(Detail.MESSAGE_ZIP_ERROR);
                }

				Detail.toggleErrorMessaging(validationResult);				
			}

			return false;
		});
		//set up the shoveler

		// Max number of cells
		var simSize = parseInt($("div#shoveler-div #simSize").attr("value"));
		if (! isNaN(simSize)){
			var numCells = simSize;
			var getEndpoint = function(cellStart, numCells) {}
			var getCellContent = function(data) {
				//    return data == null ? '' : data.content;
			};
			$("#shoveler-div").shoveler(getEndpoint, numCells);	
		}
		//set up edit link click
		Detail.EL_ZIP_EDIT_LINK.click(function() {
			Detail.hide(Detail.EL_ZIP_SUCCESS_MESSAGE);
			Detail.show(Detail.EL_ZIP_INPUT_WRAPPER);
		});
	},
	/**
	 * Displays zip error messages if any come back in JSON response. Disables error messages on success.
	 * @param json Response from server
	 * @return true if an error message was displayed
	 */
	showZipErrorOnFailure: function(json) {
		var transactionType = json.bundle.transaction;
		if (transactionType === "NEW_PHONE") {
			return false;
		}

		if (json.zipCodeResult.result === Detail.AJAX_RESULT_NOT_FOUND) {
			Detail.EL_ZIP_ERROR_MESSAGE.html(Detail.MESSAGE_ZIP_NOT_FOUND);
			Detail.toggleErrorMessaging(false);
			return true;
		}
		
		if (json.zipCodeResult.result === Detail.AJAX_RESULT_INVALID_ZIPCODE) {
			Detail.EL_ZIP_ERROR_MESSAGE.html(Detail.MESSAGE_INVALID_ZIPCODE);
			Detail.toggleErrorMessaging(false);
			return true;
		}
		
		if (json.compatibilityResult && !json.compatibilityResult.isCompatible) {
			Detail.EL_ZIP_ERROR_MESSAGE.html(
				"<h3>" + json.compatibilityResult.compatibilityMessage + "</h3>" + json.compatibilityResult.compatibilityLink);
			
			Detail.toggleErrorMessaging(false);
			return true;
		}
		
		Detail.toggleErrorMessaging(true);
		
		return false;
	},

	/**
	 * Handles case where ajax request/response was successful.
	 * @param json Response from server
	 */
	handleAjaxSuccess: function(json) {
		//show zip errors, if any. if no zip errors, show workflow errors. if no workflow errors, show smart cart.
		var isZipError = Detail.showZipErrorOnFailure(json);
		var Aloha = $.Aloha;
		var isWorkflowError = Aloha.Util.showWorkflowErrorOnFailure(json);
		if (!isZipError) {
			Aloha.SmartCart.updateExpandedSmartCart(json);
		}
	},

	/**
	 * Handles case where ajax request/response failed.
	 */
	handleAjaxError: function(xhr, textStatus, errorThrown) {
	    		$.Aloha.AjaxUtil.showAjaxCallError(xhr, textStatus, errorThrown);
	},

	/**
	 * @return true if a transaction type is selected
	 */
	isServiceSelectionValid: function() {
		return ((Detail.EL_BUY_BOX_NEW_RADIO.is(":checked") || 
				Detail.EL_BUY_BOX_SINGLE_UPGRADE_RADIO.is(":checked") ||
				Detail.EL_BUY_BOX_FAMILY_UPGRADE_RADIO.is(":checked") ||
				Detail.EL_BUY_BOX_NO_CONTRACT_RADIO.is(":checked"))
			);
	},
    
	/**
	 * @return true if the value of #input-zip-code is 5-digits
	 */
	isZipCodeValid: function() {
		return (Detail.EL_ZIP_INPUT.val().search(/^\d{5}$/) == 0);
	},
    
	
	toggleErrorMessaging: function(isValid) {
		if (Detail.EL_ZIP_INPUT.val().search(/^\d{5}$/) != 0 || isValid == false) {
		
			Detail.show(Detail.EL_ZIP_ERROR_MESSAGE);
			Detail.EL_ZIP_WRAPPER.removeClass("bb-zip-wrapper-success");
			Detail.EL_ZIP_WRAPPER.addClass("bb-zip-wrapper-error");
			
		}
		else {
			Detail.hide(Detail.EL_ZIP_ERROR_MESSAGE);
			Detail.EL_ZIP_WRAPPER.removeClass("bb-zip-wrapper-error");
			Detail.EL_ZIP_WRAPPER.addClass("bb-zip-wrapper-success");
		}
		
		if (!(Detail.EL_BUY_BOX_NEW_RADIO.is(":checked") || 
				Detail.EL_BUY_BOX_SINGLE_UPGRADE_RADIO.is(":checked") ||
				Detail.EL_BUY_BOX_FAMILY_UPGRADE_RADIO.is(":checked"))){
				
				Detail.show(Detail.EL_TRANSACTION_ERROR_MESSAGE);
				Detail.EL_BUY_BOX_TRANSACTION_SELECTION_WRAPPER.removeClass("bb-zip-wrapper-success");
				Detail.EL_BUY_BOX_TRANSACTION_SELECTION_WRAPPER.addClass("bb-zip-wrapper-error");
		}
		else {
			Detail.hide(Detail.EL_TRANSACTION_ERROR_MESSAGE);
			Detail.EL_BUY_BOX_TRANSACTION_SELECTION_WRAPPER.addClass("bb-zip-wrapper-success");
			Detail.EL_BUY_BOX_TRANSACTION_SELECTION_WRAPPER.removeClass("bb-zip-wrapper-error");
		}
	},
	
	updateBuyBoxNote: function(){
		if (Detail.EL_BUY_BOX_NEW_RADIO.is(":checked")){
			Detail.EL_BUY_BOX_NOTE_UNSELECTED.addClass("hidden");
			Detail.EL_BUY_BOX_NOTE_UPGRADE.addClass("hidden");
			Detail.EL_BUY_BOX_NOTE_NEW.removeClass("hidden");
			
			Detail.EL_BUY_BOX_UPGRADE_PRICE_LABEL.addClass("hidden");
			Detail.EL_BUY_BOX_NEW_PRICE_LABEL.removeClass("hidden");
			$("#phone-only-price").addClass("hidden");			
			Detail.EL_BUY_BOX_PRICE_FROM_LABEL.addClass("hidden");
			Detail.EL_BUY_BOX_PRICE_LABEL.removeClass("hidden");
		}
		else if (Detail.EL_BUY_BOX_SINGLE_UPGRADE_RADIO.is(":checked")
			|| Detail.EL_BUY_BOX_FAMILY_UPGRADE_RADIO.is(":checked")){
			
			Detail.EL_BUY_BOX_NOTE_UNSELECTED.addClass("hidden");
			Detail.EL_BUY_BOX_NOTE_NEW.addClass("hidden");
			Detail.EL_BUY_BOX_NOTE_UPGRADE.removeClass("hidden");
			
			Detail.EL_BUY_BOX_NEW_PRICE_LABEL.addClass("hidden");
			Detail.EL_BUY_BOX_UPGRADE_PRICE_LABEL.removeClass("hidden");
			
			Detail.EL_BUY_BOX_PRICE_FROM_LABEL.addClass("hidden");
			Detail.EL_BUY_BOX_PRICE_LABEL.removeClass("hidden");
			$("#phone-only-price").addClass("hidden");
		} else if (Detail.EL_BUY_BOX_NO_CONTRACT_RADIO.is(":checked")){
			Detail.EL_BUY_BOX_NOTE_UNSELECTED.removeClass("hidden");
			Detail.EL_BUY_BOX_NOTE_UNSELECTED.addClass("hidden");
			Detail.EL_BUY_BOX_NOTE_UPGRADE.addClass("hidden");
			Detail.EL_BUY_BOX_NOTE_NEW.addClass("hidden");
			
			Detail.EL_BUY_BOX_UPGRADE_PRICE_LABEL.addClass("hidden");
			Detail.EL_BUY_BOX_NEW_PRICE_LABEL.addClass("hidden");
			$("#phone-only-price").removeClass("hidden");
			Detail.EL_BUY_BOX_PRICE_LABEL.addClass("hidden");
			Detail.EL_BUY_BOX_PRICE_FROM_LABEL.removeClass("hidden");			
		}
		else{
			Detail.EL_BUY_BOX_NOTE_UNSELECTED.removeClass("hidden");
			Detail.EL_BUY_BOX_NOTE_NEW.addClass("hidden");
			Detail.EL_BUY_BOX_NOTE_UPGRADE.addClass("hidden");
			
			Detail.EL_BUY_BOX_UPGRADE_PRICE_LABEL.addClass("hidden");
			Detail.EL_BUY_BOX_NEW_PRICE_LABEL.removeClass("hidden");
			
			Detail.EL_BUY_BOX_PRICE_LABEL.addClass("hidden");
			Detail.EL_BUY_BOX_PRICE_FROM_LABEL.removeClass("hidden");
		}
	},
	
	

	toggleErrorTooltip: function(isSelectionValid, isZipCodeValid) {
		if (isSelectionValid && isZipCodeValid) {
			Detail.hide(Detail.EL_SS_ERROR_TOOLTIP);
			Detail.hide(Detail.EL_ZIPCODE_ERROR_TOOLTIP);
			Detail.hide(Detail.EL_SS_AND_ZIPCODE_ERROR_TOOLTIP);
		} else if (isSelectionValid) {
			Detail.show(Detail.EL_ZIPCODE_ERROR_TOOLTIP);
		} else if (isZipCodeValid) {
			Detail.show(Detail.EL_SS_ERROR_TOOLTIP);
		} else {
            Detail.show(Detail.EL_SS_AND_ZIPCODE_ERROR_TOOLTIP);
        }
	},
	
	hide: function(el) {
		el.addClass("hidden");
	},

	show: function(el) {
		el.removeClass("hidden");
	}
	
}

$(function() {
	Detail.init();
	Detail.updateBuyBoxNote();
});
