generic.address = {};

/**
 * generic.addresslist
 * - depends on: generic.jsonrpc
 */

generic.address.addresslist = ( function() {
    var AddressList = function(responseData) {
        var data = responseData;
        var addressList = new Array();
    };

    return {
        addressList: new Array(),
        addressByID: new Hash(),

        addressListParams : {
            addressFields: null
        },

        initialize: function(args) {
            Object.extend(this, args);
        },

        // This will get the user addresses.
        // For anonymous shopping it will be useful to merge in
        // payment addresses and order addresses if the
        // generic.checkout.cart items exist.

        getAddressList: function(args) {
            // console.log("generic.addresslist.getAddressList");
            var self = this;
            if (args != null && args.pageDataKey) {
                var pageData = generic.page_data(args.pageDataKey);
                if (pageData.get("rpcdata")) {
                    console.log("addresslist page data found!");
                    self._updateAddressListData(pageData.get("rpcdata"));
                    if (args.excludeRegistrationAddress) {
                        // filter out reg address
                        self.addressList = self.getNonRegAddresses();
                    }
                    console.log( self.addressList );
                    return;
                }
            }

            var params = {};
            params = Object.extend(params, self.addressListParams.addressFields);

            var id = generic.jsonrpc.fetch({
                method : 'user.addresses',
                params: [params],
                onSuccess: function(jsonRpcResponse){
                    self._updateAddressListData(jsonRpcResponse.getValue());
                    if (args != null && args.excludeRegistrationAddress) {
                        // filter out reg address
                        self.addressList = self.getNonRegAddresses();
                    }
                },
                onFailure: function(jsonRpcResponse){
                    //jsonRpcResponse.getError();
                    console.log("Address List JSON failed to load");
                }
            });
            return id;
        },
        
        // sets up internal representation of the address list
        _updateAddressListData: function(data) {
            console.log( "generic.addresslist._updateAddressListData" );
            var self = this;
            this.data = data;
            this.addressList.clear();

            var currentKeys = this.addressByID.keys();
            currentKeys.each(function(key){
                this.addressByID.unset(key);
            });

            if (this.data != null) {
                this.data.each(function(address){
                    if (!address) { return; }
                    var addressID = address.ADDRESS_ID;
                    self.addressByID.set(addressID, address);
                });
                this.addressList = this.addressByID.values();
                this.addressList.sortBy(function(s){
                    return s.ADDRESS_ID;
                });
            }

		    //document.fire("address:loaded");
            generic.events.fire({event:'user:addressesLoaded'});
        },

        _addAddressListData: function(data) {
            var self = this;
            var addressListUpdated = false;
            this.data = data;

            if (this.data != null) {
                this.data.each(function(address){
                    if (!address) { return; }
                    var addressID = address.ADDRESS_ID;
                    if (!self.addressByID.get(addressID)) {
                        self.addressByID.set(addressID, address);
                        addressListUpdated = true;
                    }
                    else {
                        var addressToChange = self.addressByID.get(addressID);
                        if (addressToChange) {
                            Object.extend(addressToChange, address);
                            addressListUpdated = true;
                        }
                    }
                });
                this.addressList = this.addressByID.values();
                this.addressList.sortBy(function(s){
                    return s.ADDRESS_ID;
                });
            }
            if (addressListUpdated) {
                generic.events.fire({event:'user:addressesUpdated'});
            }
        },

        // PENDING: 'user.delete_address' has not yet been implemented
        // user.delete_address should return the updated list of user addresses
        deleteAddress: function(addrId) {
            var params = {delete_address_id: addrId};

            var id = generic.jsonrpc.fetch({
                method : 'user.delete_address',
                params: [params],
                onSuccess: function(jsonRpcResponse){
                    self._updateAddressListData(jsonRpcResponse.getValue());
                },
                onFailure: function(jsonRpcResponse){
                    //jsonRpcResponse.getError();
                    console.log("AddressList.deleteAddress JSON failed to load");
                }
            });
            return id;
        },

        updateAddress: function(data) {
            if (!data) { return; }
            this._addAddressListData([data]);
        },

        // Find an address record that matches the key/value pair.
        find: function(key,val) {
            var i;
            for (i=0; i<this.addressList.length; i++) {
                if (this.addressList[i][key] == val) {
                    return this.addressList[i];
                }
            }
            return null;
        },

        getAddresses: function() { return this.addressList; },
        getNonRegAddresses: function() {
            var filteredAddresses = this.addressList.select(function(addr){
                return addr.ADDRESS_TYPE != 2;
            });
            return filteredAddresses;
        },

        getDefaultShipping: function() { return this.addressList.find('DEFAULT_SHIPPING', '1'); },
        getDefaultBilling:  function() { return this.addressList.find('DEFAULT_BILLING', '1'); }

    }

}() );

