1 (function($){ 2 'use strict'; 3 4 /** 5 * autocomplete control 6 * @type {Object} 7 * @name Autocomplete 8 * @class autocomplete Control 9 * @memberOf jQuery.fn.jplist.controls 10 */ 11 jQuery.fn.jplist.controls.Autocomplete = {}; 12 13 /** 14 * render control html 15 * @param {jQuery.fn.jplist.view.PanelControl} control 16 * @memberOf jQuery.fn.jplist.controls.Autocomplete 17 */ 18 jQuery.fn.jplist.controls.Autocomplete.render = function(control){ 19 20 var autocomplete 21 ,zoom 22 ,options = {}; 23 24 if(control.controlTypeOptions){ 25 options = control.controlTypeOptions; 26 } 27 28 //init autocomplete 29 autocomplete = new google.maps.places.Autocomplete(control.$control.get(0), options); 30 31 //init zoom 32 zoom = Number(control.$control.attr('data-zoom')); 33 34 if(isNaN(zoom)){ 35 zoom = 17; 36 } 37 38 //add data 39 control.$control.data('jplist-autocomplete', autocomplete); 40 control.$control.data('jplist-autocomplete-zoom', zoom); 41 }; 42 43 /** 44 * init events 45 * @param {jQuery.fn.jplist.view.PanelControl} control 46 * @memberOf jQuery.fn.jplist.controls.Autocomplete 47 */ 48 jQuery.fn.jplist.controls.Autocomplete.initEvents = function(control){ 49 50 var autocomplete 51 ,listenerHandle = control.$control.data('jplist-handle'); 52 53 //get autocomplete 54 autocomplete = control.$control.data('jplist-autocomplete'); 55 56 //remove listener 57 if(listenerHandle){ 58 google.maps.event.removeListener(listenerHandle); 59 } 60 61 //add listener 62 listenerHandle = google.maps.event.addListener(autocomplete, 'place_changed', function(){ 63 64 var place 65 ,lat 66 ,lng; 67 68 //get choosen place 69 place = autocomplete.getPlace(); 70 71 //set latitude and longitude 72 if(place.geometry){ 73 74 lat = place.geometry.location['lat'](); 75 lng = place.geometry.location['lng'](); 76 77 control.$control.attr('data-latitude', lat); 78 control.$control.attr('data-longitude', lng); 79 control.$control.attr('data-name', place.name); 80 81 //trigger jump to map event 82 control.$jplistBox.trigger('jumpEvent', [lat, lng, control.$control.data('jplist-autocomplete-zoom')]); 83 } 84 85 //send panel redraw event 86 control.$jplistBox.trigger(control.options.force_ask_event, [false]); 87 88 }); 89 90 control.$control.off('keyup').on('keyup', function(e){ 91 92 var val; 93 94 //get val 95 val = $.trim($(this).val()); 96 97 if(val === ''){ 98 99 control.$control.attr('data-latitude', ''); 100 control.$control.attr('data-longitude', ''); 101 102 //send panel redraw event 103 control.$jplistBox.trigger(control.options.force_ask_event, [false]); 104 } 105 }); 106 107 //save handler 108 control.$control.data('jplist-handle', listenerHandle); 109 }; 110 111 /** 112 * Set control status 113 * @param {jQuery.fn.jplist.models.Status} status 114 * @param {jQuery.fn.jplist.view.PanelControl} control 115 * @param {boolean} isCookie - is status restored from cookies 116 * @memberOf jQuery.fn.jplist.controls.Autocomplete 117 */ 118 jQuery.fn.jplist.controls.Autocomplete.setStatus = function(status, control, isCookie){ 119 120 //console.log(status.data); 121 }; 122 123 /** 124 * get current control status 125 * @param {boolean} isDefault - if true, get default (initial) control status; else - get current control status 126 * @param {jQuery.fn.jplist.view.PanelControl} control 127 * @return {jQuery.fn.jplist.models.Status} 128 * @memberOf jQuery.fn.jplist.controls.Autocomplete 129 */ 130 jQuery.fn.jplist.controls.Autocomplete.getStatus = function(isDefault, control){ 131 132 var status = null 133 ,latitude 134 ,longitude 135 ,data; 136 137 //get attributes 138 latitude = control.$control.attr('data-latitude'); 139 longitude = control.$control.attr('data-longitude'); 140 141 data = { 142 name: control.$control.attr('data-name') 143 ,radius: control.$control.attr('data-radius') 144 ,filterType: 'autocomplete' 145 }; 146 147 if(isDefault){ 148 149 data.latitude = ''; 150 data.longitude = ''; 151 152 status = new jQuery.fn.jplist.models.Status(control.name, control.action, control.type, data, true); 153 } 154 else{ 155 if($.isNumeric(latitude) && $.isNumeric(longitude)){ 156 157 data.latitude = latitude; 158 data.longitude = longitude; 159 status = new jQuery.fn.jplist.models.Status(control.name, control.action, control.type, data, true); 160 } 161 } 162 163 return status; 164 }; 165 166 167 })(jQuery); 168 169