/*************************************************************
 ** Simple Ecommerce
 ************************************************************/
(function ($) { // protect the namespace

$.widget( "ui.simpleECommerce", {

    /* _init - Constructor
     */
    _init: function () {
	var self = this;

        var formType = $.parseDataFromElementClass( 
            self.element,
            'ruby-commerce-form-'
        );
        
        self.formType = formType;

        if( formType == 'donate' ) {
	    // Find inputs
            self.amt = self.element.find( '#amount' );
            self.coverFee = self.element.find( '#cover_card_fee-0' );
            self.sameAs = self.element.find( '#same_bill_to_info-0' );
	
	    // Create handler function
	    var update = function () { self._updateOrderTotal.call( self ) }
	    
	    // Attach to quantity and price inputs
            self.amt.bind( 'change.simpleECommerce', update );
            self.coverFee.bind( 'change.simpleECommerce', update );
            self.sameAs.bind( 'change.simpleECommerce', function () {
                self._updateBillingInfo();
            });
        }
        else if( formType == 'peer' ) {
	    // Find inputs
            self.amt = self.element.find( '#amount' );
            self.coverFee = self.element.find( '#cover_card_fee-0' );
	
	    // Create handler function
	    var update = function () { self._updateOrderTotal.call( self ) }
	    
	    // Attach to quantity and price inputs
            self.amt.bind( 'change.simpleECommerce', update );
            self.coverFee.bind( 'change.simpleECommerce', update );
        }
        else if( formType == 'benefit' ) {
            // Find inputs
            self.ticket1 = self.element.find( '#ticket1' );
            self.ticket2 = self.element.find( '#ticket2' );
            self.ticket3 = self.element.find( '#ticket3' );
            self.ticket4 = self.element.find( '#ticket4' );
            self.contrib = self.element.find( '#contribution' );
            self.coverFee = self.element.find( '#cover_card_fee-0' );
            self.sameAs = self.element.find( '#same_bill_to_info-0' );

	    // Create handler function
	    var update = function () { self._updateOrderTotal.call( self ) }
	    
	    // Attach to quantity and price inputs
            self.ticket1.bind( 'change.simpleECommerce', update );
            self.ticket2.bind( 'change.simpleECommerce', update );
            self.ticket3.bind( 'change.simpleECommerce', update );
            self.ticket4.bind( 'change.simpleECommerce', update );
            self.contrib.bind( 'change.simpleECommerce', update );
            self.coverFee.bind( 'change.simpleECommerce', update );
            self.sameAs.bind( 'change.simpleECommerce', function () {
                self._updateBillingInfo();
            });
        }
        else if( formType == 'climber' ) {
            // Find inputs
            self.numberClimbers = self.element.find( '#number_climbers' );
            self.microDonation = self.element.find( '#micro_donation_flag-0' );
            self.climbDates = self.element.find( '#climb_dates' );

	    // Create handler function
	    var update = function () { self._updateOrderTotal.call( self ) }
	    
	    // Attach to quantity and price inputs
            self.numberClimbers.bind( 'change.simpleECommerce', update );
            self.microDonation.bind( 'change.simpleECommerce', update );
            self.climbDates.bind( 'change.simpleECommerce', update );
        }
        else if( formType == 'event' ) {
            // Find inputs
            self.eventQty = self.element.find( '#quantity' );
            self.eventPrice = self.element.find( '.ruby-event-price .amount' );
            self.sameAs = self.element.find( '#same_bill_to_info-0' );
            self.paymentInfo = self.element.find( '#bill_to-box' );
            self.coverFee = self.element.find( '#cover_card_fee-0' );

	    // Create handler function
	    var update = function () { self._updateOrderTotal.call( self ) }
	    
	    // Attach to quantity and price inputs
            self.eventQty.bind( 'change.simpleECommerce', update );
            self.coverFee.bind( 'change.simpleECommerce', update );
            self.sameAs.bind( 'change.simpleECommerce', function () {
                self._updateBillingInfo();
            });
        }

	self._updateOrderTotal();

	return;
    }, // _init

    destroy: function () {
	var self = this;

	self.qtys.unbind( '.simpleECommerce' );
	self.fees.unbind( '.simpleECommerce' );
	$( 'input.rtg-price', self.element ).unbind( '.simpleECommerce' );

	self.qtys = null;
	self.fees = null;

	$.widget.prototype.destroy.apply( self, arguments );
    }, // destroy

    _updateBillingInfo : function () {
        var self = this;

        if( !self.sameAs[0].checked )
            return;

        var sync = [ 
            [ 'first_name', 'bill_to_first_name' ],
            [ 'last_name', 'bill_to_last_name' ],
            [ 'address.address_line_1', 'bill_to_address.address_line_1' ],
            [ 'address.address_line_2', 'bill_to_address.address_line_2' ],
            [ 'address.city', 'bill_to_address.city' ],
            [ 'address.postal_code', 'bill_to_address.postal_code' ],
            [ 'address.country', 'bill_to_address.country' ],
            [ 'address.us_state', 'bill_to_address.us_state' ],
            [ 'address.ca_state', 'bill_to_address.ca_state' ],
            [ 'address.gb_state', 'bill_to_address.gb_state' ],
            [ 'address.other_state', 'bill_to_address.other_state' ]
        ];

        $.each( sync, function (idx, val) {
            var from = $( document.getElementById( val[0] ) );
            var to = $( document.getElementById( val[1] ) );

            if( from[0].tagName.toLowerCase() == 'select' ) {
                to[0].selectedIndex = from[0].selectedIndex;
                $( to ).trigger( 'change' );
            }
            else {
                to.val( from.val() );
            }
        });
    }, // _updateBillingInfo

    _updateOrderTotal: function () {
	var self = this;

        if( self.formType == 'donate' ) {
            self._updateDonateOrderTotal();
        }
        else if( self.formType == 'peer' ) {
            self._updatePeerOrderTotal();
        }
        else if( self.formType == 'benefit' ) {
            self._updateBenefitOrderTotal();
        }
        else if( self.formType == 'climber' ) {
            self._updateClimberOrderTotal();
        }
        else if( self.formType == 'event' ) {
            self._updateEventOrderTotal();
        }
    },

    _updateEventOrderTotal : function () {
        var self = this;

	var subtotal = 0;
        
        // Calc subtotal
        var rawPrice = self.eventPrice.html();
        
        if( /free/i.test( rawPrice ) ) {
            $( '#donation-total-field label' )
                .html( 'FREE' );

            // Hide/show payment info
            self.paymentInfo.hide();
        }
        else {
            var price = $.parse_money( rawPrice ) * 100;
            var qty = $.parse_number( self.eventQty.val() );
            
            subtotal = qty * price;

            // Calc cover fee
            subtotal += self._calcCoverFee( subtotal );

	    // Show subtotal
            self._showSubtotal( subtotal );

            // Hide/show payment info
            self.paymentInfo.show();
        }

        return;
    }, // _updateEventOrderTotal

    _updateClimberOrderTotal : function () {
        var self = this;

        var subtotal = 0;
        var costPerPerson = $('.form-template .climb-person').text();
        var costMicro = $('.form-template .climb-micro').text();
        
        // Calc number of climbers * num dates
        var qty = $.parse_number( self.numberClimbers.val() );
        var dates = self.climbDates.val();
        var numDates = dates == null ? 0 : dates.length;

        if( qty != null ) {
            subtotal += qty * numDates * costPerPerson;
        }

        // Show presubtotal (must be before micro)
        $( '#review-cost-field label' )
            .html( $.format_money( subtotal/100 ) );
        
        // Calc micro
        if( self.microDonation[0].checked )
            subtotal += parseInt(costMicro);

	// Show subtotal
        self._showSubtotal( subtotal );

        return;
    }, // _updateClimberOrderTotal

    _updateBenefitOrderTotal : function () {
        var self = this;

	var subtotal = 0;
        
        // Calc tickets
        $.each( [
            { el : self.ticket1, cost : 500000 },
            { el : self.ticket2, cost : 250000 },
            { el : self.ticket3, cost : 100000 },
            { el : self.ticket4, cost : 60000 }
        ], function (idx, tix) {
            var qty = $.parse_number( tix.el.val() );
            if( qty != null ) {
                subtotal += qty * tix.cost;
            }
            
        });
        
        // Calc contrib
        var contrib = $.parse_money( self.contrib.val() ) * 100;
        if( contrib != null )
            subtotal += contrib;

        // Calc cover fee
        subtotal += self._calcCoverFee( subtotal );

	// Show subtotal
        self._showSubtotal( subtotal );

        return;
    }, // _updateBenefitOrderTotal

    _updatePeerOrderTotal : function () {
        var self = this;

	// Calculate subtotal
	var subtotal = ($.parse_money( self.amt.val() ) || 0) * 100;

        // Calc cover fee
        subtotal += self._calcCoverFee( subtotal );

	// Show subtotal
        self._showSubtotal( subtotal );

        return;
    },

    _updateDonateOrderTotal : function () {
        var self = this;

	// Calculate subtotal
	var subtotal = ($.parse_money( self.amt.val() ) || 0) * 100;

        // Calc cover fee
        subtotal += self._calcCoverFee( subtotal );

	// Show subtotal
        self._showSubtotal( subtotal );

        return;
    },

    _showSubtotal : function ( subtotal ) {
        $( '#donation-total-field label' )
            .html( $.format_money( subtotal/100 ) );
    }, 

    _calcCoverFee : function ( subtotal ) {
        var self = this;
        
        var fee = 0;
        if( self.coverFee.length > 0 && self.coverFee[0].checked ) {
            var rate = 3; // 3%
            fee = Math.round( subtotal * (3/100) );
        }
        
        return fee;
    } // _calcCoverFee

}); // $.widget

$.extend( $.ui.simpleECommerce5A, { 
    version: "1.0",
    defaults: { }
});

})(jQuery); // function ($)

