var Checkout = {

    CardDetails: null,
    OrderType: null,

    getQuantityHash: function(){
		var quantityInfo = new Hash()
	    $$('.QuantityBox').each(function(ele){
	        var basketItemId = ele.identify().match(/\d+$/).first();
	        quantityInfo.set(basketItemId, ele.getValue())
	    })
	    return quantityInfo;
	},
    
    updateAfterQuantityChange: function() {
        xajax_updateBasketQuantities(Checkout.getQuantityHash().toJSON())
    },
    
    removeSelectedLines: function(){
    	var quantityInfo = Checkout.getQuantityHash();
    	$$('.BasketLine').each(function(ele){
    		if (!ele.checked) return;
    		var basketItemId = ele.identify().match(/\d+$/).first();
    		quantityInfo.set(basketItemId, 0);
    	});
    	xajax_updateBasketQuantities(quantityInfo.toJSON())
    },

	// Changing delivery address event			 
    onDeliveryAddressChange: function(){
        if (false == $('DeliveryHomeOption').checked) {
            $('DeliveryHomeOption').checked = true;
        }
		if ($('DeliveryAddressBox').value > 0) {
			$('EditDeliveryAddressButton').enable();
		} else {
			$('EditDeliveryAddressButton').disable();
		}
		pageTracker._trackPageview('/checkout/select-delivery-address/');
		this.onWhereToChange();
    },

    onBillingAddressChange: function(){
		if ($('BillingAddressBox').value > 0) {
			$('EditBillingAddressButton').enable();
		} else {
			$('EditBillingAddressButton').disable();
		}
		pageTracker._trackPageview('/checkout/select-billing-address/');
    },
    
    onStoreAddressChange: function(){
        if($('DeliveryStoreOption').checked == false){
            $('DeliveryStoreOption').checked = true;
        }
		pageTracker._trackPageview('/checkout/select-delivery-address/');
        this.onWhereToChange();
    },

    onWhereToChange: function(){
        if($('DeliveryStoreOption').checked){
            //store delivery
            xajax_updateDeliveryOptions('store');
        }else{
            //home delivery
            //should pass back UserAddressId so we can check if it is abroad
            xajax_updateDeliveryOptions('home',$('DeliveryAddressBox').value);
        }
    },
    
    onCardTypeChange: function(){
        var cardType = $F('CCardType');
        if(cardType == 'SWITCH'){
            $('StartDate').hide();
            $('IssueNumber').show();
        }else{
            $('IssueNumber').hide();
            $('StartDate').show();
        }
    },
    
    setCardDetails: function(name, pan, start, expires, issue, cv2){
        this.CardDetails = {
            Name: name,
            Pan: pan,
            Start: start,
            Expires: expires,
            Issue: issue,
            CV2: cv2
        }
        var safePan = "";
        for(var i=0;i<pan.length-4;i++){
            safePan += "x";
        }
        safePan += pan.substring(pan.length-4);
        if(this.validateNewCard() == true){
            xajax_addNewCard(safePan);
            BordersEffects.disappear('divSitePopup');
        }
    },
    
        // Validate registration details before submission
    validateNewCard: function()
    {
        // Initilisation
        var type      = $('CCardType').value;
        var elePan    = $('CCardPan');
        var eleCV2    = $('CCardCV2');
        var eleIssue  = $('CCardIssueNumber');
		var eleName   = $('CCardName');

        // Input validation
        var booPassed = true;

		if (0 == $F(eleName).length) {
            FormValidation.showError(eleName, 'Please enter the name of the cardholder');
            booPassed = false;
		} else {
            FormValidation.removeError(eleName);
        }

        if(!FormValidation.isValidCardNumber(elePan.value) || !elePan.present()){
            FormValidation.showError(elePan, 'The card number entered is not valid');
            booPassed = false;
        } else {
            FormValidation.removeError(elePan);
        }
        
        if(!FormValidation.isValidSecurityNumber(eleCV2.value)){
            FormValidation.showError(eleCV2, 'The security number entered is not valid');
            booPassed = false;
        } else {
            FormValidation.removeError(eleCV2);
        }
       /* 
        if(type == 'SWITCH'){
            //test issue number
            if(!FormValidation.isValidIssueNumber(eleIssue.value)){
	            FormValidation.showError(eleIssue, 'The issue number entered is not valid');
	            booPassed = false;
	        } else {
	            FormValidation.removeError(eleIssue);
	        }
        }        
	    */
        return booPassed;
    },
    
    onCardChange: function(){
        detailsId = $F('CreditCardBox');
        if((detailsId != 0) && (detailsId != 'new')){
            xajax_selectBillingAddress(detailsId);
        }
		pageTracker._trackPageview('/checkout/select-payment-card/');
    },

	lookUpPostcode: function() {
        var elePostcode = $('PostcodeLookup');
        var elePostcodeButton = $('LookUpPostcodeButton');
        var strPostcode = $F(elePostcode).toUpperCase();
        if (!elePostcode.present()) {
            FormValidation.showError(elePostcodeButton, "Please enter a postcode to look up.");
        } else if (!FormValidation.isValidPostCode(strPostcode)) {
            FormValidation.showError(elePostcodeButton, "The postcode '"+strPostcode+"' is not valid, please correct it.");
        } else {
            FormValidation.removeError(elePostcodeButton);
            xajax_getPostcodeOptions(strPostcode);
        }
    },

    insertAddress: function(strFirstName,strLastName,strAddress1,strAddress2,strAddress3,strCounty,strCountry,strPostcode) {
        if (strFirstName.length > 0) $('FirstName').setValue(strFirstName);
        if (strLastName.length > 0) $('LastName').setValue(strLastName);
        $('Address1').setValue(strAddress1);
        $('Address2').setValue(strAddress2);
        $('Address3').setValue(strAddress3);
        $('County').setValue(strCounty);
        $('Postcode').setValue(strPostcode);
    },

	validateAddress: function() {
        var booPassed = true;
        ['FirstName','LastName','Address1'].each(function(name) {
            if (!$(name).present()) {
                FormValidation.showError($(name), "This field is required");
                booPassed = false;
            } else {
                FormValidation.removeError($(name));
            }
        });
        if ($F('Country') == 'UNITED KINGDOM' && !FormValidation.isValidPostCode($('Postcode').value)) {
            FormValidation.showError($('Postcode'), "Please enter a valid UK postcode");
            booPassed = false;
        } else {
            FormValidation.removeError($('Postcode'));
        }
        if (booPassed) {
            xajax_saveAddress(xajax.getFormValues('AddressForm'));
			Checkout.toggleDropdowns(false);
			BordersEffects.disappear($('divSitePopup'));
        }
	},
	
	isComplete: function(){
	   
	   var intDeliveryAddress = $('DeliveryAddressBox').value;
	   var intStoreAddress    = $('StoreAddressBox').value;
	   var fltGiftAccount     = $('GiftAccountUsage').value;
	   if(fltGiftAccount == ""){
	       fltGiftAccount = '0.00';
	   }
	   var fltOrderTotal      = parseFloat($('OrderTotal').innerHTML.replace(/^\s+|\s+$/g, '').substring(1));
	   var strDeliveryType = '';
	   if($('DeliveryHomeOption').checked){
	       strDeliveryType = 'home';
	   }else{
	       strDeliveryType = 'store';
	   }
	   var strDeliveryOptions = 0;
	   if(strDeliveryType == 'home'){
		   strDeliveryOptions = $('DeliveryOptions').select('input[type="radio"]').findAll(function(e){return e.checked}).first().value;
	   }
	   var intBillingAddress = $('BillingAddressBox').value;	   
	   if(Checkout.OrderType == 'EBook'){
		   intDeliveryAddress = intBillingAddress;
	   }
	   var intCardNumber = $('CreditCardBox').value;
	   
	   boolComplete = true;
	   if(strDeliveryType == 'home'){
	       FormValidation.removeError($('StoreAddressBox'));
	       if(intDeliveryAddress < 1){
	           boolComplete = false;
	           FormValidation.showError($('DeliveryAddressBox'),'please select a delivery address');
	       }else{
	           FormValidation.removeError($('DeliveryAddressBox'));
	       }
	   }else{
	       FormValidation.removeError($('DeliveryAddressBox'));
	       if(intStoreAddress < 1){
               boolComplete = false;
               FormValidation.showError($('StoreAddressBox'),'please select a store to deliver to');
           }else{
               FormValidation.removeError($('StoreAddressBox'));
           }
	   }
	   
	   if(intBillingAddress < 1){
           boolComplete = false;
           FormValidation.showError($('BillingAddressBox'),'please select a billing address');
       }else{
           FormValidation.removeError($('BillingAddressBox'));
	   }
	   
	   if(FormValidation.isValidPrice(fltGiftAccount)){
	       FormValidation.removeError($('GiftAccountUsage'));
	       fltGiftAccount = parseFloat(fltGiftAccount);
	       if(fltGiftAccount < fltOrderTotal){
	           //some or all is on the credit card to we must check that there is one selected
	           if((intCardNumber < 1) && (intCardNumber != 'new')){
	           boolComplete = false;
	           FormValidation.showError($('CreditCardBox'),'please select a payment card');
	           }else{
	               FormValidation.removeError($('CreditCardBox'));
	           }
	       }else{
	           FormValidation.removeError($('CreditCardBox'));
	       }
	   }else{
	       FormValidation.showError($('GiftAccountUsage'),'please provide a valid amount');  
	   }
	   
	   
	   return boolComplete;
	},
	
	processPayment: function(){
	   if(this.isComplete()){
	       var strDeliveryType = 'home';
	       var intDeliveryAddressId = null;
	       var strDeliveryOptions = null;
	       if($('DeliveryHomeOption').checked){
               strDeliveryType = 'home';
               intDeliveryAddressId = $('DeliveryAddressBox').value;
               strDeliveryOptions = $('DeliveryOptions').select('input[type="radio"]').findAll(function(e){return e.checked}).first().value;
           }else{
               strDeliveryType = 'store';
               intDeliveryAddressId = $('StoreAddressBox').value;
           }
	       
	       var intBillingAddressId = $('BillingAddressBox').value;
	       
	       if(Checkout.OrderType == 'EBook'){
	    	   intDeliveryAddressId = intBillingAddressId;
		   }
	       
	       var intCardNumber = $('CreditCardBox').value;
	       
	       var fltGiftAccount = $('GiftAccountUsage').value;
	       if(fltGiftAccount == ""){
	           fltGiftAccount = '0.00';
	       }
	       fltGiftAccount = parseFloat(fltGiftAccount);
	       
	       var orderData = null;
	       if(intCardNumber == 'new'){
	           //new card - we need to a proper 3d secure
	           orderData = {
	               cardType: 'new',
	               cardName: this.CardDetails.Name,
	               cardPan: this.CardDetails.Pan,
	               cardStart: this.CardDetails.Start,
	               cardExpires: this.CardDetails.Expires,
	               cardIssueNumber: this.CardDetails.Issue,
	               cardCV2: this.CardDetails.CV2,
	               deliveryType: strDeliveryType,
	               deliveryAddressId: intDeliveryAddressId,
	               deliveryOptions: strDeliveryOptions,
	               billingAddressId: intBillingAddressId,
	               storeCardDetails: 'No'
	           }
	       }else{
	           //re-use
	           orderData = {
                   cardType: 'existing',
                   billingDetailsId: intCardNumber,
                   deliveryType: strDeliveryType,
                   deliveryAddressId: intDeliveryAddressId,
                   deliveryOptions: strDeliveryOptions,
                   billingAddressId: intBillingAddressId,
                   storeCardDetails: 'No'
               }
	       }
	       if($F('StoreCardDetails')){
	           orderData.storeCardDetails = 'Yes'
	       }
	       orderData.AccountMax = fltGiftAccount;
	       var strDetails = Object.toJSON(orderData);
	       this.showWaiting();
	       xajax_processPayment(strDetails);
	   }
	},
	
	displayFailureMessage: function(strMessage, intCode)
    {
        $('divSitePopup').hide();
        $('OrderProcessing').hide();
        $('PlaceOrderButton').show();
        xajax_showError('Payment Error', strMessage, intCode);
    },
    
    displaySuccessScreen: function()
    {
    	$('OrderProcessing').hide();
        $('PlaceOrderButton').show();
        $('divSitePopup').hide();
        xajax_displaySuccessScreen();
    },
    
    setDelivery: function(deliveryCost){
    	$('DeliveryDisplay').innerHTML = "&pound;" + deliveryCost;
		xajax_registerDeliveryCharge(deliveryCost);
    },

	toggleDropdowns: function(booHide) {
		var elePopUp = $('divSitePopupContent');
		$$('select').each(function(ele) {
			if (!ele.descendantOf(elePopUp)) {
				ele.setStyle({visibility: (booHide) ? 'hidden' : 'visible'});
			}
		});
	},
	
	showWaiting: function(){
	   $('PlaceOrderButton').hide();
	   $('OrderProcessing').show();
	   /*var content = '<img src="images/loader-large.gif">';
	   $('divSitePopupContent').innerHTML = content;
	   BordersEffects.appearAndCenter($('divSitePopup'));*/
	},
	
	transferToGiftAccount: function(){
	   var cert = $F('CertificateNumber');
	   var amount = $F('CertToTrans');
	   if(FormValidation.isValidPrice(amount)){
	       FormValidation.removeError($('CertToTrans'));
	       xajax_transferGiftAccount(cert, amount);
	   }else{
	       FormValidation.showError($('CertToTrans'),'please provide a valid amount');
	   }
	},
	
	onAccountMaxChange: function(){
	   var accountMax = $F('GiftAccountUsageInput');
	   $('GiftAccountUsage').value = accountMax;
	   xajax_updateGiftcardSplit(accountMax);
	
	}
}