1jQuery(document).ready(function() { 2 3 // supporting different versions of Font Awesome icons 4 var icon_classes = mr_frontend_data.icon_classes; 5 if (typeof icon_classes === 'string') { 6 icon_classes = jQuery.parseJSON(icon_classes); 7 } 8 9 jQuery(".rating-form :submit").click(function(e) { 10 11 e.preventDefault(); 12 13 var ratingItems = []; 14 var customFields = []; 15 var btnId = e.currentTarget.id; // btnType-postId-sequence 16 var parts = btnId.split("-"); 17 var postId = parts[1]; 18 var sequence = parts[2]; 19 20 // rating items - hidden inputs are used to find all rating items in the rating form 21 jQuery('.rating-form input[type="hidden"].rating-item-' + postId + '-' + sequence).each(function(index) { 22 23 var ratingItemId = jQuery(this).val(); 24 25 // get values for rating items 26 var element = jQuery('[name="rating-item-' + ratingItemId + '-' + sequence + '"]'); 27 var value = null; 28 if (jQuery(element).is(':radio')) { 29 value = jQuery('input[type="radio"][name="rating-item-' + ratingItemId + '-' + sequence + '"]:checked').val(); 30 } else if (jQuery(element).is('select')) { 31 value = jQuery('select[name="rating-item-' +ratingItemId + '-' + sequence + '"] :selected').val(); 32 } else { 33 value = jQuery('input[type="hidden"][name="rating-item-' + ratingItemId + '-' + sequence + '"]').val(); 34 } 35 36 var ratingItem = { 'id' : ratingItemId, 'value' : value }; 37 ratingItems[index] = ratingItem; 38 39 }); 40 41 var data = { 42 action : "save_rating", 43 nonce : mr_frontend_data.ajax_nonce, 44 ratingItems : ratingItems, 45 postId : postId, 46 sequence : sequence 47 }; 48 49 var temp = postId +'-' + sequence; 50 var spinnerId = 'mr-spinner-' + temp; 51 52 jQuery('<i style="margin-left: 10px;" id="' + spinnerId + '" class="' + icon_classes.spinner + '"></i>').insertAfter(jQuery('input#' + btnId).parent()); 53 54 jQuery.post(mr_frontend_data.ajax_url, data, function(response) { 55 handle_rating_form_submit_response(response); 56 }); 57 }); 58 59 /** 60 * Handles rating form submit response 61 */ 62 function handle_rating_form_submit_response(response) { 63 64 var jsonResponse = jQuery.parseJSON(response); 65 var id = jsonResponse.data.post_id + "-" + jsonResponse.data.sequence; 66 67 var ratingForm = jQuery("#rating-form-" + id); 68 69 // update rating results if success 70 if (jsonResponse.status == 'success') { 71 var ratingResult = jQuery(".rating-result-" + jsonResponse.data.post_id).filter(".mr-filter"); 72 73 if (ratingResult) { 74 ratingResult.replaceWith(jsonResponse.data.html); 75 } 76 } 77 78 // remove existing errors for rating items, optional fields and custom fields 79 jQuery("#rating-form-" + id + " .rating-item .mr-error").html(""); 80 81 // update messages 82 if ((jsonResponse.validation_results && jsonResponse.validation_results.length > 0) || jsonResponse.message) { 83 var messages = ''; 84 85 if (jsonResponse.validation_results) { 86 var index = 0; 87 for (index; index<jsonResponse.validation_results.length; index++) { 88 89 if (jsonResponse.validation_results[index].field && jQuery("#" + jsonResponse.validation_results[index].field + "-" + jsonResponse.data.sequence + "-error").length) { 90 jQuery("#" + jsonResponse.validation_results[index].field + "-" + jsonResponse.data.sequence + "-error") 91 .html(jsonResponse.validation_results[index].message); 92 } else { 93 messages += '<p class="mr message mr-' + jsonResponse.validation_results[index].severity + '">' 94 + jsonResponse.validation_results[index].message + '</p>'; 95 } 96 } 97 } 98 99 if (jsonResponse.message) { 100 messages += '<p class="message ' + jsonResponse.status + '">' 101 + jsonResponse.message + '</p>'; 102 } 103 104 if (ratingForm && ratingForm.parent().find('.message')) { 105 ratingForm.parent().find('.message').remove(); 106 } 107 108 if (ratingForm && ratingForm.parent()) { 109 if (jsonResponse.status == 'success' && jsonResponse.data.hide_rating_form) { 110 ratingForm.parent().after(messages); 111 } else { 112 ratingForm.find(".save-rating").before(messages); 113 } 114 } 115 } 116 117 // remove rating form if success 118 if (jsonResponse.status == 'success' && jsonResponse.data.hide_rating_form == true && ratingForm) { 119 ratingForm.remove(); 120 } 121 122 var spinnerId = 'mr-spinner-' + id; 123 jQuery("#" + spinnerId).remove(); 124 } 125 126 /** 127 * Selected rating item value on hover and click 128 */ 129 var ratingItemStatus = {}; 130 131 var useCustomStarImages = mr_frontend_data.use_custom_star_images; 132 if (typeof useCustomStarImages === 'string') { 133 useCustomStarImages = jQuery.parseJSON(useCustomStarImages); 134 } 135 136 jQuery(".mr-star-rating-select .mr-star-empty, .mr-star-rating-select .mr-star-full").on("click", function(e) { 137 138 updateRatingItemStatus(this.id, 'clicked'); 139 140 if (useCustomStarImages == true) { 141 jQuery(this).not('.mr-minus').removeClass('mr-custom-empty-star mr-star-empty mr-custom-hover-star mr-star-hover').addClass('mr-custom-full-star mr-star-full'); 142 jQuery(this).prevAll().not('.mr-minus').removeClass('mr-custom-empty-star mr-star-empty mr-custom-hover-star mr-star-hover').addClass('mr-custom-full-star mr-star-full'); 143 jQuery(this).nextAll().not('.mr-minus').removeClass('mr-custom-full-star mr-star-full mr-custom-hover-star mr-star-hover').addClass('mr-custom-empty-star mr-star-empty'); 144 } else { 145 jQuery(this).not('.mr-minus').removeClass(icon_classes.star_empty + " " + icon_classes.star_hover).addClass(icon_classes.star_full); 146 jQuery(this).prevAll().not('.mr-minus').removeClass(icon_classes.star_empty + " " + icon_classes.star_hover).addClass(icon_classes.star_full); 147 jQuery(this).nextAll().not('.mr-minus').removeClass(icon_classes.star_full + " " + icon_classes.star_hover).addClass(icon_classes.star_empty); 148 } 149 150 updateSelectedHiddenValue(this); 151 }); 152 153 jQuery(".mr-star-rating-select .mr-minus").on("click", function(e) { 154 155 updateRatingItemStatus(this.id, ''); 156 157 if (useCustomStarImages == true) { 158 jQuery(this).not('.mr-minus').removeClass('mr-custom-empty-star mr-star-empty mr-custom-hover-star mr-star-hover').addClass('mr-custom-full-star mr-star-full'); 159 jQuery(this).prevAll().not('.mr-minus').removeClass('mr-custom-empty-star mr-star-empty mr-custom-hover-star mr-star-hover').addClass('mr-custom-full-star mr-star-full'); 160 jQuery(this).nextAll().not('.mr-minus').removeClass('mr-custom-full-star mr-star-full mr-custom-hover-star mr-star-hover').addClass('mr-custom-empty-star mr-star-empty'); 161 } else { 162 jQuery(this).not('.mr-minus').removeClass(icon_classes.star_empty + " " + icon_classes.star_hover).addClass(icon_classes.star_full); 163 jQuery(this).prevAll().not('.mr-minus').removeClass(icon_classes.star_empty + " " + icon_classes.star_hover).addClass(icon_classes.star_full); 164 jQuery(this).nextAll().not('.mr-minus').removeClass(icon_classes.star_full + " " + icon_classes.star_hover).addClass(icon_classes.star_empty); 165 } 166 167 updateSelectedHiddenValue(this); 168 }); 169 170 jQuery(".mr-star-rating-select .mr-minus, .mr-star-rating-select .mr-star-empty, .mr-star-rating-select .mr-star-full").on("mouseenter mouseleave", function(e) { 171 172 var elementId = this.id; 173 var ratingItemIdSequence = getRatingItemIdSequence(elementId); 174 175 if (jQuery("#" + ratingItemIdSequence).val() == 0 || (ratingItemStatus[ratingItemIdSequence] != 'clicked' 176 && ratingItemStatus[ratingItemIdSequence] != undefined)) { 177 178 updateRatingItemStatus(this.id, 'hovered'); 179 180 if (useCustomStarImages == true) { 181 jQuery(this).not('.mr-minus').removeClass('mr-custom-empty-star mr-star-empty').addClass('mr-custom-hover-star mr-star-hover'); 182 jQuery(this).prevAll().not('.mr-minus').removeClass('mr-custom-empty-star mr-star-empty').addClass('mr-custom-hover-star mr-star-hover'); 183 jQuery(this).nextAll().not('.mr-minus').removeClass('mr-custom-hover-star mr-star-hover mr-custom-full-star mr-star-full').addClass('mr-custom-empty-star mr-star-empty'); 184 185 } else { 186 jQuery(this).not('.mr-minus').removeClass(icon_classes.star_empty).addClass(icon_classes.star_hover); 187 jQuery(this).prevAll().not('.mr-minus').removeClass(icon_classes.star_empty).addClass(icon_classes.star_hover); 188 jQuery(this).nextAll().not('.mr-minus').removeClass(icon_classes.star_hover + " " + icon_classes.star_full).addClass(icon_classes.star_empty); 189 } 190 } 191 }); 192 193 // now cater for touch screen devices 194 var touchData = { 195 started : null, // detect if a touch event is sarted 196 currrentX : 0, 197 yCoord : 0, 198 previousXCoord : 0, 199 previousYCoord : 0, 200 touch : null 201 }; 202 203 jQuery(".mr-star-rating-select .mr-star-empty, .mr-star-rating-select .mr-star-full, .mr-star-rating-select .mr-minus").on("touchstart", function(e) { 204 touchData.started = new Date().getTime(); 205 var touch = e.originalEvent.touches[0]; 206 touchData.previousXCoord = touch.pageX; 207 touchData.previousYCoord = touch.pageY; 208 touchData.touch = touch; 209 }); 210 211 jQuery(".mr-star-rating-select .mr-star-empty, .mr-star-rating-select .mr-star-full, .mr-star-rating-select .mr-minus").on("touchend touchcancel", function(e) { 212 var now = new Date().getTime(); 213 // Detecting if after 200ms if in the same position. 214 if ((touchData.started !== null) 215 && ((now - touchData.started) < 200) 216 && (touchData.touch !== null)) { 217 var touch = touchData.touch; 218 var xCoord = touch.pageX; 219 var yCoord = touch.pageY; 220 if ((touchData.previousXCoord === xCoord) 221 && (touchData.previousYCoord === yCoord)) { 222 223 if (useCustomStarImages == true) { 224 jQuery(this).not('.mr-minus').removeClass('mr-custom-empty-star mr-star-empty').addClass('mr-custom-full-star mr-star-full'); 225 jQuery(this).prevAll().not('.mr-minus').removeClass('mr-custom-empty-star mr-star-empty').addClass('mr-custom-full-star mr-star-full'); 226 jQuery(this).nextAll().not('.mr-minus').removeClass('mr-custom-full-star mr-star-full').addClass('mr-custom-empty-star mr-star-empty'); 227 } else { 228 jQuery(this).not('.mr-minus').removeClass(icon_classes.star_empty).addClass(icon_classes.star_full); 229 jQuery(this).prevAll().not('.mr-minus').removeClass(icon_classes.star_empty).addClass(icon_classes.star_full); 230 jQuery(this).nextAll().not('.mr-minus').removeClass(icon_classes.star_full).addClass(icon_classes.star_empty); 231 } 232 updateSelectedHiddenValue(this); 233 } 234 } 235 touchData.started = null; 236 touchData.touch = null; 237 }); 238 239 /** 240 * Updates the rating item status to either hovered or clicked 241 */ 242 function updateRatingItemStatus(elementId, status) { 243 var ratingItemIdSequence = getRatingItemIdSequence(elementId); 244 if (ratingItemIdSequence != null) { 245 ratingItemStatus[ratingItemIdSequence] = status; 246 } 247 } 248 249 /** 250 * Retrieves the rating item id sequence used to store the status of a rating item option 251 */ 252 function getRatingItemIdSequence(elementId) { 253 var parts = elementId.split("-"); 254 255 var ratingItemId = parts[4]; /// skip 2: rating-item- 256 var sequence = parts[5]; 257 258 var ratingItemIdSequence = 'rating-item-' + ratingItemId + '-' + sequence; 259 return ratingItemIdSequence; 260 } 261 262 /** 263 * Updates the selected hidden value for a rating item 264 */ 265 function updateSelectedHiddenValue(element) { 266 267 // id is in format "index-3-rating-item-2-1"
268 var elementId = element.id; 269 270 var parts = elementId.split("-"); 271 var value = parts[1]; // this is the star index 272 var ratingItemId = parts[4]; /// skipt 2: rating-item- 273 var sequence = parts[5]; 274 275 // update hidden value for storing selected option 276 var hiddenValue = '#rating-item-'+ ratingItemId + '-' + sequence; 277 278 jQuery(hiddenValue).val(value); 279 } 280 281});
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.