﻿/*
Add a jQuery validator method to validate the address entered
Displays a jQuery UI dialog with a list of addresses to select if the script returns addresses
Depends:
jQuery
jQuery UI Dialog
Metadata plugin
JQuery validator plugin
jQuery form plugin

*/
////
if (jQuery)
    (function($) {
        $.fn.extend({
            addressValidator: function(options) {
                $('body').append('<div id="AddressSuggesionsDialog" title="Select a valid address"></div>');
                // global defaults
                var defaults = {
                    address1: '.line1',
                    address2: '.line2',
                    city: '.city',
                    state: '.state',
                    zip: '.zip',
                    zipaddon: '.zipaddon',
                    script: '/services/AddressValidator.aspx',
                    dialogHeight: 300,
                    dialogWidth: 300
                };
                var opts = $.extend(defaults, options);
                $(document).data('opts', opts);
                $.validator.addMethod("validaddress", function(value, element, options) {
                    $(element).after("<label class='wait'>Validating address...</label>");
                    var rc = false;
                    var opts = $(document).data('opts');
                    var params = $.extend(opts, options);
                    var data = new Object();
                    data.Line1 = $(params.address1).val();
                    data.Line2 = $(params.address2).val();
                    data.City = $(params.city).val();
                    data.State = $(params.state).val();
                    data.Zip = $(params.zip).val() + '-' + $(params.zipaddon).val();
                    data.Suggestions = true;
                    $.ajax({
                        type: "GET",
                        url: params.script,
                        data: data,
                        async: false,
                        success: function(response) {
                            var status = $('#status', response).text();
                            switch (status) {
                                case 'ACE_NOT_FOUND':
                                    rc = false;
                                    break;
                                case 'ACE_ADDRESS_SUGGESTION':
                                    $('#AddressSuggesionsDialog').html($('#Address-Suggestions', response).html());
                                    $("#AddressSuggesionsDialog").dialog('open');
                                    rc = false;
                                    break;
                                case 'GOOD':
                                    rc = true;
                                    var line1 = $('div.address span[name="line1"]', $(response)).text();
                                    var line2 = $('div.address span[name="line2"]', $(response)).text();
                                    var city = $('div.address span[name="city"]', $(response)).text();
                                    var state = $('div.address span[name="state"]', $(response)).text();
                                    var zip5 = $('div.address span[name="zip5"]', $(response)).text();
                                    var zipaddon = $('div.address span[name="zipaddon"]', $(response)).text();
                                    $(opts.address1).val(line1);
                                    $(opts.address2).val(line2);
                                    $(opts.city).val(city);
                                    $(opts.state).val(state);
                                    $(opts.zip).val(zip5);
                                    $(opts.zipaddon).val(zipaddon);
                                    break;
                                default:
                                    break;
                            }
                            $('.wait').remove();
                        },
                        error: function(xhr, textStatus, errorThrown) {
                        },
                        complete: function() {
                        }
                    }); //ajax

                    return rc;
                }, "Unrecognized address");   //addmethod
                $('a.button.select-address').live('click', function(e) {

                    var opts = $(document).data('opts');

                    var line1 = $('div.address span[name="line1"]', $(this).parent().siblings()).text();
                    var line2 = $('div.address span[name="line2"]', $(this).parent().siblings()).text();
                    var city = $('div.address span[name="city"]', $(this).parent().siblings()).text();
                    var state = $('div.address span[name="state"]', $(this).parent().siblings()).text();
                    var zip5 = $('div.address span[name="zip5"]', $(this).parent().siblings()).text();
                    var zipaddon = $('div.address span[name="zipaddon"]', $(this).parent().siblings()).text();
                    var address1 = $(opts.address1).val();
                    address1 = address1.substring(0, address1.indexOf(' ') + 1)
                    $(opts.address1).val(address1 + line1.substring(line1.indexOf(']') + 2));
                    $(opts.address2).val(line2);
                    $(opts.city).val(city);
                    $(opts.state).val(state);
                    $(opts.zip).val(zip5);
                    $(opts.zipaddon).val(zipaddon);
                    $('#AddressSuggesionsDialog').dialog('close');
                });

                $("#AddressSuggesionsDialog").dialog({
                    bgiframe: true,
                    height: opts.dialogHeight,
                    width: opts.dialogWidth,
                    modal: false,
                    autoOpen: false,
                    buttons: {
                        Cancel: function() {
                            $(this).dialog('close');
                        }
                    }
                });
            } // AddressValidator

        }); // extend
    })(jQuery);
