1(function($) { 2 window.Simplepage = function(params) { 3 this.params = params; 4 5 this.selectors = { 6 agreementCheckBox: "#agreement_checkbox", 7 agreementWarning: "#agreement_warning", 8 warning: ".warning" 9 }; 10 11 this.callback = params.javascriptCallback || function() {}; 12 13 this.formSubmitted = false; 14 15 this.callFunc = function(func, $target) { 16 var self = this; 17 18 if (func && typeof self[func] === "function") { 19 self[func]($target); 20 } else if (func) { 21 //console.log(func + " is not registered"); 22 } 23 }; 24 25 this.init = function() { 26 var self = this; 27 28 var callbackForComplexField = function($target) { 29 var func = $target.attr("data-onchange"); 30 if (!func) { 31 func = $target.attr("data-onchange-delayed"); 32 } 33 if (func && typeof self[func] === "function") { 34 self[func]($target); 35 } else if (func) { 36 //console.log(func + " is not registered"); 37 } 38 }; 39 40 self.requestTimerId = 0; 41 42 if (self.params.useGoogleApi) { 43 self.initGoogleApi(callbackForComplexField); 44 } 45 46 if (self.params.useAutocomplete) { 47 self.initAutocomplete(callbackForComplexField); 48 } 49 50 var $redirect = $(self.params.mainContainer).find('#simple_redirect_url'); 51 52 if ($redirect.length) { 53 window.location = $redirect.val(); 54 } 55 56 self.checkIsHuman(); 57 self.initPopups(); 58 self.initMasks(); 59 self.initTooltips(!self.params.useAutocomplete); 60 self.initDatepickers(callbackForComplexField); 61 self.initTimepickers(callbackForComplexField); 62 self.initSelect2(); 63 self.initFileUploader(function() { 64 self.overlay(); 65 }, function() { 66 self.removeOverlay(); 67 }); 68 self.initHandlers(); 69 self.scroll(); 70 self.displayWarning(); 71 self.initValidationRules(); 72 73 if (typeof self.callback === "function") { 74 self.callback(); 75 } 76 }; 77 78 this.initHandlers = function() { 79 var self = this; 80 var $mainContainer = $(self.params.mainContainer); 81 82 $mainContainer.find("*[data-onchange], *[data-onclick]").each(function() { 83 var $element = $(this); 84 85 var funcOnChange = $element.attr("data-onchange"); 86 if (funcOnChange) { 87 $element.on("change", function() { 88 self.callFunc(funcOnChange, $element); 89 }); 90 } 91 92 var funcOnClick = $element.attr("data-onclick"); 93 if (funcOnClick) { 94 $element.on("click", function() { 95 self.callFunc(funcOnClick, $element); 96 }); 97 } 98 }); 99 100 $mainContainer.submit(function(event) { 101 self.requestReloadAll(); 102 event.preventDefault(); 103 return false; 104 }); 105 }; 106 107 this.addSystemFieldsInForm = function() { 108 var self = this; 109 if (self.formSubmitted) { 110 $(self.params.mainContainer).append($("<input/>").attr("type", "hidden").attr("name", "submitted").val(1)); 111 } 112 }; 113 114 this.validateAgreements = function() { 115 var self = this; 116 117 var result = true; 118 119 var $agreementCheckbox = $(self.params.mainContainer).find(self.selectors.agreementCheckBox).find("input[type=checkbox]"); 120 var $agreementCheckboxChecked = $(self.params.mainContainer).find(self.selectors.agreementCheckBox).find("input[type=checkbox]:checked"); 121 var $agreementWarning = $(self.params.mainContainer).find(self.selectors.agreementWarning); 122 123 if ($agreementCheckbox.length && $agreementCheckbox.is(":visible") && $agreementCheckbox.length != $agreementCheckboxChecked.length) { 124 if ($agreementWarning.length) { 125 if (self.params.notificationDefault) { 126 $agreementWarning.show(); 127 128 $agreementCheckbox.each(function() { 129 if ($(this).is(":checked")) { 130 $(".agreement_" + $(this).val()).hide(); 131 } else { 132 $(".agreement_" + $(this).val()).show(); 133 } 134 }); 135 } 136 137 if (self.params.notificationToasts) { 138 $agreementCheckbox.each(function() { 139 if (!$(this).is(":checked")) { 140 toastr.error($(".agreement_" + $(this).val()).text()); 141 } 142 }); 143 } 144 145 result = false; 146 } 147 } else { 148 $agreementWarning.hide(); 149 } 150 151 return result; 152 }; 153 154 this.validate = function() { 155 var self = this; 156 var promises = []; 157 var result = true; 158 159 if (!self.validateAgreements()) { 160 result = false; 161 } 162 163 var promise = self.checkRules().then(function(r) { 164 if (!r) { 165 result = false 166 } 167 }); 168 169 var deferred = $.Deferred(); 170 171 $.when(promise).then(function() { 172 deferred.resolve(result); 173 }); 174 175 return deferred.promise(); 176 }; 177 178 this.submit = function() { 179 var self = this; 180 181 self.validate().then(function(result) { 182 if (result) { 183 self.formSubmitted = true; 184 $(self.params.mainContainer).submit(); 185 } else { 186 self.scroll(); 187 188 if (typeof toastr !== 'undefined' && self.params.notificationCheckForm) { 189 toastr.error(self.params.notificationCheckFormText); 190 } 191 } 192 }); 193 }; 194 195 this.openLoginBox = function() { 196 window.location = this.params.loginLink; 197 }; 198 199 /** 200 * Adds delay for reload execution on 150 ms, it allows to check
200sequence of events and to execute only the last request to handle of more events in one reloading 201 * @param {Function} callback 202 */ 203 this.requestReloadAll = function(callback) { 204 var self = this; 205 if (self.requestTimerId) { 206 clearTimeout(self.requestTimerId); 207 self.requestTimerId = 0; 208 } 209 self.requestTimerId = window.setTimeout(function() { 210 self.reloadAll(callback); 211 }, 150); 212 }; 213 214 this.overlay = function() { 215 var self = this; 216 var $block = $(self.params.mainContainer); 217 if ($block.length) { 218 $block.find("input,select,textarea").attr("disabled", "disabled"); 219 $block.append( 220 $("<div>") 221 .addClass("simplepage_overlay") 222 .attr("id", $block.attr("id") + "_overlay") 223 .css({ 224 "background": "url(" + self.params.additionalPath + self.resources.loading + ") no-repeat center center", 225 "opacity": 0.4, 226 "position": "absolute", 227 "width": $block.width(), 228 "height": $block.height(), 229 "z-index": 5000 230 }) 231 ); 232
233 var $overlay = $("#"+$block.attr("id") + "_overlay"); 234 235 $overlay.offset({ 236 top: $block.offset().top, 237 left: $block.offset().left 238 }); 239 } 240 }; 241 242 this.removeOverlay = function() { 243 var self = this; 244 var $mainContainer = $(self.params.mainContainer); 245 246 $mainContainer.find("input,select,textarea").removeAttr("disabled"); 247 $mainContainer.find(".simplepage_overlay").remove(); 248 }; 249 250 this.displayWarning = function() { 251 var self = this; 252 var $mainContainer = $(self.params.mainContainer); 253 254 var selectors = [self.selectors.warning, self.selectors.agreementWarning] 255 .map(function(item) { 256 return item + ":visible"; 257 }) 258 .join(","); 259 260 if ($mainContainer.find(selectors).length) { 261 if (typeof toastr !== 'undefined') { 262 if (self.params.notificationToasts) { 263 toastr.error($mainContainer.find(selectors).text()); 264 } 265 266 if (self.params.notificationCheckForm) { 267 toastr.error(self.params.notificationCheckFormText); 268 } 269 } 270 271 if (!self.params.notificationDefault) { 272 $mainContainer.find(selectors).hide(); 273 } 274 } 275 }, 276 277 this.scroll = function() { 278 var self = this, 279 error = false, 280 top = 10000, 281 bottom = 0; 282 283 var $mainContainer = $(self.params.mainContainer); 284 285 var isOutsideOfVisibleArea = function(y) { 286 if (y < $(document).scrollTop() || y > ($(document).scrollTop() + $(document).height())) { 287 return true; 288 } 289 return false; 290 }; 291 292 if (self.params.popup) { 293 return; 294 } 295 296 if (self.params.scrollToError) { 297 $($mainContainer.find(".simplecheckout-rule:visible, .has-error")).each(function() { 298 if ($(this).parents(".simpleregister-block-content").length) { 299 var offset = $(this).parents(".simpleregister-block-content").offset(); 300 if (offset.top < top) { 301 top = offset.top; 302 } 303 if (offset.bottom > bottom) { 304 bottom = offset.bottom; 305 } 306 } 307 }); 308 309 if ($mainContainer.find(".warning").length) { 310 var offset = $mainContainer.find(".warning").offset(); 311 if (offset.top < top) { 312 top = offset.top; 313 } 314 if (offset.bottom > bottom) { 315 bottom = offset.bottom; 316 } 317 } 318 319 if (top < 10000 && isOutsideOfVisibleArea(top)) { 320 jQuery("html, body").animate({ 321 scrollTop: top 322 }, "slow"); 323 error = true; 324 } else if (bottom && isOutsideOfVisibleArea(bottom)) { 325 jQuery("html, body").animate({ 326 scrollTop: bottom 327 }, "slow"); 328 error = true; 329 } 330 } 331 }; 332 333 this.reloadAll = function(callback) { 334 var self = this; 335 var postData; 336 if (self.isReloading) { 337 return; 338 } 339 self.addSystemFieldsInForm(); 340 self.isReloading = true; 341 342 var fields = []; 343 var serializedFields = self.serializeFields($(self.params.mainContainer)); 344 345 for (var i in serializedFields) { 346 if (!serializedFields.hasOwnProperty(i)) continue; 347 348 var info = serializedFields[i]; 349 350 fields.push(encodeURIComponent(info.name)+"="+encodeURIComponent(info.value)); 351 } 352 353 postData = fields.join("&"); 354 355 var overlayTimeoutId = 0; 356 357 $.ajax({
358 url: self.params.mainUrl, 359 data: postData + "&simple_ajax=1", 360 type: "POST", 361 dataType: "text", 362 beforeSend: function() { 363 $('.tooltip ').remove(); 364 365 overlayTimeoutId = window.setTimeout(function() { 366 if (overlayTimeoutId) { 367 self.overlay(); 368 } 369 }, 250); 370 }, 371 success: function(data) { 372 clearTimeout(overlayTimeoutId); 373 overlayTimeoutId = 0; 374 var newData = $(self.params.mainContainer, $(data)).get(0); 375 if (!newData && data) { 376 newData = data; 377 } 378 $(self.params.mainContainer).replaceWith(newData); 379 self.init(); 380 if (typeof callback === "function") { 381 callback.call(self); 382 } 383 self.removeOverlay(); 384 self.isReloading = false; 385 }, 386 error: function(xhr, ajaxOptions, thrownError) { 387 clearTimeout(overlayTimeoutId); 388 overlayTimeoutId = 0; 389 self.removeOverlay(); 390 self.isReloading = false; 391 } 392 }); 393 }; 394 395 this.instances.push(this); 396 }; 397 398 Simplepage.prototype = inherit(window.Simple.prototype); 399})(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.