1/* https://github.com/peledies/google-places */ 2(function($) { 3 4 var namespace = 'googlePlaces'; 5 6 $.googlePlaces = function(element, options) { 7 8 var defaults = { 9 placeId: 'ChIJq6qqqs4DDTkRM_BBa03yyhQ' // placeId provided by google api documentation 10 , render: ['reviews','rating'] 11 , min_rating: 0 12 , max_rows: 0 13 , map_plug_id: 'map-plug' 14 , rotateTime: false 15 , shorten_names: true 16 , schema:{ 17 displayElement: '#schema', 18 type: 'Store', 19 //beforeText: 'Google Users Have Rated', 20 //middleText: 'based on', 21 //afterText: 'ratings and reviews' 22 } 23 24 }; 25 var plugin = this; 26 27 plugin.settings = {} 28 29 var $element = $(element), 30 element = element; 31 32 plugin.init = function() { 33 plugin.settings = $.extend({}, defaults, options); 34 plugin.settings.schema = $.extend({}, defaults.schema, options.schema); 35 $element.html("<div id='" + plugin.settings.map_plug_id + "'></div>"); // create a plug for google to load data into 36 initialize_place(function(place){ 37 plugin.place_data = place; 38 39 // Trigger event before render 40 $element.trigger('beforeRender.' + namespace); 41 42 // if(plugin.settings.render.indexOf('rating') > -1){ 43 // renderRating(plugin.place_data.rating); 44 // alert(plugin.place_data.rating) 45 // } 46 // render specified sections 47 if(plugin.settings.render.indexOf('reviews') > -1){ 48 renderReviews(plugin.place_data.reviews); 49 if(!!plugin.settings.rotateTime) { 50 initRotation(); 51 } 52 } 53 // render schema markup 54 addSchemaMarkup( 55 capture_element(plugin.settings.schema.displayElement) 56 , plugin.place_data 57 ); 58 59 // Trigger event after render 60 $element.trigger('afterRender.' + namespace); 61 62 }); 63 } 64 65 var capture_element = function(element){ 66 if(element instanceof jQuery){ 67 return element; 68 }else if(typeof element == 'string'){ 69 try{ 70 var ele = $(element); 71 if( ele.length ){ 72 return ele; 73 }else{ 74 throw 'Element [' + element + '] couldnt be found in the DOM. Skipping '+element+' markup generation.'; 75 } 76 }catch(e){ 77 console.warn(e); 78 } 79 } 80 } 81 82 var initialize_place = function(c){ 83 var map = new google.maps.Map(document.getElementById(plugin.settings.map_plug_id)); 84 85 var request = { 86 placeId: plugin.settings.placeId 87 }; 88 89 var service = new google.maps.places.PlacesService(map); 90 91 service.getDetails(request, function(place, status) { 92 if (status == google.maps.places.PlacesServiceStatus.OK) { 93 c(place); 94 } 95 }); 96 } 97 98 var sort_by_date = function(ray) { 99 ray.sort(function(a, b){ 100 var keyA = new Date(a.time), 101 keyB = new Date(b.time); 102 // Compare the 2 dates 103 if(keyA < keyB) return -1; 104 if(keyA > keyB) return 1; 105 return 0; 106 }); 107 return ray; 108 } 109 110 var filter_minimum_rating = function(reviews){ 111 for (var i = reviews.length -1; i >= 0; i--) { 112 if(reviews[i].rating < plugin.settings.min_rating){ 113 reviews.splice(i,1); 114 } 115 } 116 return reviews; 117 } 118 119 120 121 122 var shorten_name = function(name) { 123 if (name.split(" ").length > 1) { 124 var xname = ""; 125 xname = name.split(" "); 126 return xname[0] + " " + xname[1][0] + "."; 127 } 128 } 129 130 var renderReviews = function(reviews){ 131 132 reviews = sort_by_date(reviews); 133 reviews = filter_minimum_rating(reviews); 134 var html = ""; 135 var row_count = (plugin.settings.max_rows > 0)? plugin.settings.max_rows - 1 : reviews.length - 1; 136 // make sure the row_count is not greater than available records 137 row_count = (row_count > reviews.length-1)? reviews.length -1 : row_count; 138 for (var i = row_count; i >= 0; i--) { 139 var stars = renderStars(reviews[i].rating); 140 var starsvelue = reviews[i].rating; 141 var date = convertTime(reviews[i].time); 142 var photo = reviews[i].profile_photo_url; 143 if(plugin.settings.shorten_names == true) { 144 var name = shorten_name(reviews[i].author_name); 145 } else { 146 var name = reviews[i].author_name + "</span><span class='review-sep'><small>"+date+"</small></span>"; 147 }; 148 html = html+"<div class='review-item item col-md-12'><blockquote class='testimonial'><p>"+reviews[i].text+"</p></blockquote><div class='testimonial-arrow-down'></div><div class='testimonial-author'><div class='img-thumbnail img-thumbnail-small'><img src="+photo+" class='review-img'></div><p><strong>"+name+" </strong> "+stars+"</p></div></div>" 149 150 151 152 153 }; 154 $element.append(html); 155 } 156 157 158 159 var initRotation = function() { 160 var $reviewEls = $element.children('.review-item'); 161 var currentIdx = $reviewEls.length > 0 ? 0 : false;
162 $reviewEls.hide(); 163 if(currentIdx !== false) { 164 $($reviewEls[currentIdx]).show(); 165 setInterval(function(){ 166 if(++currentIdx >= $reviewEls.length) { 167 currentIdx = 0; 168 } 169 $reviewEls.hide(); 170 $($reviewEls[currentIdx]).fadeIn('slow'); 171 }, plugin.settings.rotateTime); 172 } 173 } 174 175 var renderStars = function(rating){ 176 var stars = "<div class='review-stars'><ul>"; 177 178 // fill in gold stars 179 for (var i = 0; i < rating; i++) { 180 stars = stars+"<li><i class='star'></i></li>"; 181 }; 182 183 // fill in empty stars 184 if(rating < 5){ 185 for (var i = 0; i < (5 - rating); i++) { 186 stars = stars+"<li><i class='star inactive'></i></li>"; 187 }; 188 } 189 stars = stars+"</ul></div>"; 190 return stars; 191 } 192 193 var renderAverageStars = function(rating){ 194 var stars = "<div class='review-stars'><ul><li><i>"+rating+" </i></li>"; 195 var activeStars = parseInt(rating); 196 var inactiveStars = 5 - activeStars; 197 var width = (rating - activeStars) * 100 + '%'; 198 199 // fill in gold stars 200 for (var i = 0; i < activeStars; i++) { 201 stars += "<li><i class='star'></i></li>"; 202 }; 203 204 // fill in empty stars 205 if(inactiveStars > 0){ 206 for (var i = 0; i < inactiveStars; i++) { 207 if (i === 0) { 208 stars += "<li style='position: relative;'><i class='star inactive'></i><i class='star' style='position: absolute;top: 0;left: 0;overflow: hidden;width: "+width+"'></i></li>"; 209 } else { 210 stars += "<li><i class='star inactive'></i></li>"; 211 } 212 }; 213 } 214 stars += "</ul></div>"; 215 return stars; 216 } 217 218 var convertTime = function(UNIX_timestamp){ 219 var a = new Date(UNIX_timestamp * 1000); 220 var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; 221 var time = months[a.getMonth()] + ' ' + a.getDate() + ', ' + a.getFullYear(); 222 return time; 223 } 224 225 226 //var renderRating = function(rating){ 227 // var html = ""; 228 229 // var star = renderAverageStars(rating); 230 231 // html = rating ; 232 // $element.append(html); 233 // } 234 235 var addSchemaMarkup = function(element, placeData) { 236 237 var reviews = placeData.reviews; 238 var avgrate = placeData.rating; 239 var lastIndex = reviews.length - 1; 240 var reviewPointTotal = 0; 241 var schema = plugin.settings.schema; 242 for (var i = lastIndex; i >= 0; i--) { 243 reviewPointTotal += reviews[i].rating; 244 }; 245 // Set totals and averages - may be used later. 246 var averageReview = reviewPointTotal / ( reviews.length ); 247 if(element instanceof jQuery){ 248 element.append( '<span itemscope="" itemtype="http://schema.org/' + schema.type + '">' 249 + '<meta itemprop="url" content="' + location.origin + '">' 250 // + schema.beforeText + ' <span itemprop="name">' + placeData.name + '</span> ' 251 + '<span itemprop="aggregateRating" itemscope="" itemtype="http://schema.org/AggregateRating">' 252 + '<span itemprop="ratingValue">' + avgrate + '</span><div class="top-rating" data-rate-value="'+ avgrate +'" ></div> ' 253 // + schema.middleText + ' <span itemprop="ratingCount">' + reviews.length + '</span> ' 254 // + schema.afterText 255 + '</span>' 256 +'</span>'); 257 } 258 $('#schema').attr("data-rate-value", avgrate ); 259 $("#schema").rateYo({ 260 readOnly: true, 261 rating : avgrate, 262 starWidth: "25px" 263 }); 264 } 265 266 plugin.init(); 267 268 $("#map-plug").remove(); 269 //$(".review-list").owlCarousel({ "items":1, nestedItemSelector: 'review-item' }) 270 271 } 272 273 $.fn.googlePlaces = function(options) { 274 275 return this.each(function() { 276 if (undefined == $(this).data(namespace)) { 277 var plugin = new $.googlePlaces(this, options); 278 $(this).data(namespace, plugin); 279 } 280 }); 281 282 } 283 284})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.