(function($) { var Alpaca = $.alpaca; Alpaca.Fields.AddressField = Alpaca.Fields.ObjectField.extend( /** * @lends Alpaca.Fields.AddressField.prototype */ { /** * @see Alpaca.Fields.ObjectField#getFieldType */ getFieldType: function() { return "address"; }, /** * @private * @see Alpaca.Fields.ObjectField#setup */ setup: function() { this.base(); if (this.data === undefined) { this.data = { street: ['', ''] }; } this.schema = { "title": "Home Address", "type": "object", "properties": { "street": { "title": "Street", "type": "array", "items": { "type": "string", "maxLength": 30, "minItems": 0, "maxItems": 3 } }, "city": { "title": "City", "type": "string" }, "state": { "title": "State", "type": "string", "enum": ["AL", "AK", "AS", "AZ", "AR", "CA", "CO", "CT", "DE", "DC", "FM", "FL", "GA", "GU", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MH", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "MP", "OH", "OK", "OR", "PW", "PA", "PR", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VI", "VA", "WA", "WV", "WI", "WY"] }, "zip": { "title": "Zip Code", "type": "string", "pattern": /^(\d{5}(-\d{4})?)?$/ } } }; Alpaca.merge(this.options, { "fields": { "zip": { "maskString": "99999", "size": 5 }, "state": { "optionLabels": ["ALABAMA", "ALASKA", "AMERICANSAMOA", "ARIZONA", "ARKANSAS", "CALIFORNIA", "COLORADO", "CONNECTICUT", "DELAWARE", "DISTRICTOFCOLUMBIA", "FEDERATEDSTATESOFMICRONESIA", "FLORIDA", "GEORGIA", "GUAM", "HAWAII", "IDAHO", "ILLINOIS", "INDIANA", "IOWA", "KANSAS", "KENTUCKY", "LOUISIANA", "MAINE", "MARSHALLISLANDS", "MARYLAND", "MASSACHUSETTS", "MICHIGAN", "MINNESOTA", "MISSISSIPPI", "MISSOURI", "MONTANA", "NEBRASKA", "NEVADA", "NEWHAMPSHIRE", "NEWJERSEY", "NEWMEXICO", "NEWYORK", "NORTHCAROLINA", "NORTHDAKOTA", "NORTHERNMARIANAISLANDS", "OHIO", "OKLAHOMA", "OREGON", "PALAU", "PENNSYLVANIA", "PUERTORICO", "RHODEISLAND", "SOUTHCAROLINA", "SOUTHDAKOTA", "TENNESSEE", "TEXAS", "UTAH", "VERMONT", "VIRGINISLANDS", "VIRGINIA", "WASHINGTON", "WESTVIRGINIA", "WISCONSIN", "WYOMING"] } } }); if (Alpaca.isEmpty(this.options.addressValidation)) { this.options.addressValidation = true; } }, /** * @see Alpaca.Field#isContainer */ isContainer: function() { return false; }, /** * Returns address in a single line string. * * @returns {String} Address as a single line string. */ getAddress: function() { var value = this.getValue(); if (this.view.type === "view") { value = this.data; } var address = ""; if (value) { if (value.street) { $.each(value.street, function(index, value) { address += value + " "; }); } if (value.city) { address += value.city + " "; } if (value.state) { address += value.state + " "; } if (value.zip) { address += value.zip; } } return address; }, /** * @see Alpaca.Field#afterRenderContainer */ afterRenderContainer: function(model, callback) { var self = this; this.base(model, function() { var container = self.getContainerEl(); // apply additional css $(container).addClass("alpaca-addressfield"); if (self.options.addressValidation && !self.isDisplayOnly()) { $('<div style="clear:both;"></div>').appendTo(container); var mapButton = $('<div class="alpaca-form-button">Show Google Map</div>').appendTo(container); if (mapButton.button) { mapButton.button({ text: true }); } mapButton.click(function() { if (google && google.maps) { var geocoder = new google.maps.Geocoder(); var address = self.getAddress(); if (geocoder) { geocoder.geocode({ 'address': address }, function(results, status) { if (status === google.maps.GeocoderStatus.OK) { var mapCanvasId = self.getId() + "-map-canvas"; if ($('#' + mapCanvasId).length === 0) { $("<div id='" + mapCanvasId + "' class='alpaca-field-address-mapcanvas'></div>").appendTo(self.getFieldEl()); } var map = new google.maps.Map(document.getElementById(self.getId() + "-map-canvas"), { "zoom": 10, "center": results[0].geometry.location, "mapTypeId": google.maps.MapTypeId.ROADMAP }); var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location }); } else { self.displayMessage("Geocoding failed: " + status); } }); } } else { self.displayMessage("Google Map API is not installed."); } }).wrap('<small/>'); if (self.options.showMapOnLoad) { mapButton.click(); } } callback(); }); }, /** * @see Alpaca.Fields.ObjectField#getType */ getType: function() { return "any"; } /* builder_helpers */ , /** * @see Alpaca.Fields.ObjectField#getTitle */ getTitle: function() { return "Address"; }, /** * @see Alpaca.Fields.ObjectField#getDescription */ getDescription: function() { return "Standard US Address with Street, City, State and Zip. Also comes with support for Google map."; }, /** * @private * @see Alpaca.Fields.ObjectField#getSchemaOfOptions */ getSchemaOfOptions: function() { return Alpaca.merge(this.base(), { "properties": { "validateAddress": { "title": "Address Validation", "description": "Enable address validation if true", "type": "boolean", "default": true }, "showMapOnLoad": { "title": "Whether to show the map when first loaded", "type": "boolean" } } }); }, /** * @private * @see Alpaca.Fields.ObjectField#getOptionsForOptions */ getOptionsForOptions: function() { return Alpaca.merge(this.base(), { "fields": { "validateAddress": { "helper": "Address validation if checked", "rightLabel": "Enable Google Map for address validation?", "type": "checkbox" } } }); } /* end_builder_helpers */ }); Alpaca.registerFieldClass("address", Alpaca.Fields.AddressField); })(jQuery);