1/* 2 * Cookie Consent jQuery plugin v1.3.0 3 * http://PrivacyPolicies.com/cookie-consent/ 4 * 5 * Copyright 2012-2018, PrivacyPolicies.com 6 * Dual licensed under the MIT or GPL Version 2 licenses. 7 */ 8 9$.extend({ 10 cookieconsent: function(options){ 11 if(typeof(options) == 'undefined'){ options = {}; } 12 13 var current_level = null; 14 var notice_timeout = null; 15 var our_domain = 'fatgalah.com.au'; 16 var cookieconsent_root_url = '//privacypolicies.com/cookie-consent/'; 17 18 19 20 // overridable config 21 var config = { 22 _demo_mode: false, 23 24 //cookieconsent_css_filepath: cookieconsent_root_url + 'releases/1.3.0/css/cookie-consent.css', 25 cookieconsent_css_filepath: '/cookieLawMin/css/cookie-consent.css?ver=1.2', 26 cookie_name: 'cookie_consent_level', 27 cookie_expires: new Date((new Date()).getTime() + 365*24*60*60*1000), // default to 365 days in the future 28 cookie_GUID_expires: new Date((new Date()).getTime() + 30*24*60*60*1000), // default to 30 day 29 cookie_css : '', 30 31 clear_database_log_in_days : 30, 32 33 hide_reject: false, 34 35 autorun: true, 36 37 post_url : "/cookieLawMin/cookiePost.php", // used for ajax post to save selected cookie level in database 38 39 // the id of one of the supplied levels 40 default_level_id: 'targeting', 41 42 // popup element 43 popup_container: 'body', 44 45 // can either be a string of html or an element containing the intial text explaning what's going on 46 cookie_notice: 'This website uses cookies, by continuing to use this website you are giving consent to cookies being used.', 47 48 cookie_policy_link : '/cookie-policy', 49 privacy_policy_link : '/privacy-policy', 50 51 52 // can either be a string of html or an element containing the intro text to the change settings dialog 53 edit_settings_intro: "<h2>Your cookie settings</h2><p>Cookies are very small text files that are stored on your computer when you visit some websites.</p><p>We use cookies to make our website easier for you to use. You can remove any cookies already stored on your computer, but these may prevent you from using parts of our website.</p>", 54 55 // time in seconds that the notice will be displayed before being automatically hidden 56 cookie_notice_autohide_timeout: 0, // 0 for never 57 58 // an element that when clicked will let the user edit their settings. if the element is empty, this plugin will add some call to action text 59 edit_settings_element: null, 60 61 // callback for when the level is changed *by the user* 62 on_change: function(){}, 63 64 // path to the css file for a jQuery UI theme (stock or custom - doesn't matter) 65 // set to an empty string in order to use one already specified elsewhere on the site 66 jqueryui_theme_css: 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/themes/pepper-grinder/jquery-ui.css', 67 68 // url of a page explaning how cookies are to be used on the website 69 cookie_policy_url: '', 70 71 // consent levels, starting with basic (legal for all sites) and incrementally getting more cookies set 72 // when the run() method is called, callback functions will be invoked from level index 0 through to the current level 73 levels: [ 74 { 75 id: 'necessary', 76 title: 'Strictly necessary<br />& Performance', 77 permissions: ['Remember what is in your shopping basket', 'Remember how far you are through an order'], 78 callback: function(){ } 79 }, 80 { 81 id: 'functional', 82 title: 'Functional', 83 permissions: ['Remember your log-in details', 'Make sure you\'re secure when logged in to the website', 'Make sure the website looks consistent'], 84 callback: function(){ } 85 }, 86 { 87 id: 'tracking', 88 title: 'Tracking', 89 permissions: ['Monitor how you travel through the website'], 90 callback: function(){ } 91 }, 92 { 93 id: 'targeting', 94 title: 'Targeting', 95 permissions: ['Allow you to share pages with social networks like Facebook', 'Send information to other websites so that advertising is more relevant to you'], 96 callback: function(){ } 97 } 98 ] 99 }; 100 101 // if levels have been specified then remove default levels 102 if(options.levels && options.levels.length > 0){ config.levels = []; } 103 104 $.extend(true, config, options); 105 106 if(config.jqueryui_theme_css && config.jqueryui_theme_css .length){ 107 $('head').append('<link id="cookieconsent-theme-link" rel="stylesheet" href="'+config.jqueryui_theme_css+'" t
107ype="text/css" />'); 108 } 109 $('head').append('<link rel="stylesheet" href="'+config.cookieconsent_css_filepath+'" type="text/css" />'); 110 111 function error(message){ 112 if(window.console && window.console.error){ console.error(message, this); } 113 } 114 115 // sanity checks 116 if(config.levels.length == 1){ error('cookieconsent needs at least 2 levels. level 1 is legal without consent, so there\'d be no need for this plugin.'); return; } 117 if(config.levels.length > 4){ error('cookieconsent accepts a maximum of 4 levels.'); return; } 118 for(var i=0, level; level=config.levels[i]; i++){ 119 if(level.id.indexOf(' ') > -1){ error('cookieconsent level id properties cannot contain spaces.'); return; } 120 } 121 config.edit_settings_element = $(config.edit_settings_element); 122 if(config.edit_settings_element.length == 0){ error('cookieconsent could not find the element specific in the edit_settings_element property'); return; } 123 124 // level methods 125 config.levels.get = function(level_id){ 126 return get_by_id.call(this, level_id); 127 }; 128 config.levels.select = function(level){ 129 switch(typeof(level)){ 130 case 'string': 131 level = get_by_id.call(config.levels, level); 132 break; 133 case 'object': 134 level = get_by_id.call(config.levels, level.id); 135 break; 136 default: 137 error('select_level() requires a level id or an actual level object'); 138 return; 139 } 140 141 if(level){ 142 current_level = level; 143 144 // set cookie 145 cookies.set(config.cookie_name, current_level.id); 146 //$.post( config.post_url, { selectedLevel: current_level.id, cookieID: cookies.get('cookie_GUID'), clearLogDays:config.clear_database_log_in_days } ); 147 148 // update level changer 149 var buttons = level_changer.find('a'); 150 buttons.removeClass('activated'); 151 for(var i=0, button; button=buttons[i]; i++){ 152 $(button).addClass('activated'); 153 if($(button).data('level').id == level.id){ break; } 154 } 155 156 // update the permission lists 157 var permission_destination = permission_panels.find('.cookieconsent-permission-panel-allowed ul'); 158 permission_destination.find('*').remove(); 159 for(var i=0, level; level=this[i]; i++){ 160 for(var x=0, permission; permission=level.permissions[x]; x++){ 161 permission_destination.append('<li>'+permission+'</li>'); 162 } 163 if(level.id == current_level.id){ 164 permission_destination = permission_panels.find('.cookieconsent-permission-panel-disallowed ul'); 165 permission_destination.find('*').remove(); 166 } 167 } 168 permission_panels.find('ul').hide().fadeIn('normal'); 169 }else{ 170 // supplied level not found, so first try and fall back to the default level, if that fails, default to first level 171 level = config.levels.get(config.default_level_id); 172 if(!level){ 173 if(config.levels.length > 0){ 174 level = config.levels[0]; 175 }else{ 176 error('cookieconsent level supplied to select_level does not exist, and could not default'); 177 return; 178 } 179 } 180 return config.levels.select(level); 181 } 182 return level; 183 }; 184 config.levels.saved = function(){ 185 return get_by_id.call(config.levels, cookies.get(config.cookie_name)); 186 }; 187 188 // array helpers 189 190 function randomString(length, chars) 191 { 192 var result = ''; 193 for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]; 194 return result; 195 } 196 197 function get_by_id(id){ 198 for(var i=0, elem; elem=this[i]; i++) 199 if(elem.id == id){ return elem;} 200 return null; 201 }; 202 203 // cookie methods 204 var cookies = { 205 set: function(name, value){ 206 document.cookie = name + "=" + escape(value) + "; expires=" + config.cookie_expires.toGMTString() + "; path=/;"; 207 }, 208 209 setGUID: function(name, value){ 210 document.cookie = name + "=" + escape(value) + "; expires=" + config.cookie_expires.toGMTString() + "; path=/;"; 211 }, 212 get: function(name){ 213 var dc = document.cookie; 214 var prefix = name + "="; 215 var begin = dc.indexOf("; " + prefix); 216 if (begin == -1) { 217 begin = dc.indexOf(prefix); 218 if (begin != 0) return ""; 219 } else 220 begin += 2; 221 var end = document.cookie.indexOf(";", begin); 222 if (end == -1) 223 end = dc.length; 224 return unescape(dc.substring(begin + prefix.length, end)); 225 } 226 }; 227 228 if (document.cookie.indexOf("cookie_GUID=") >= 0) 229 { 230 // They've been here before. 231 console.log('GUID has already been set.'); 232 } 233 else 234 { 235 cookies.setGUID('cookie_GUID', randomString(15, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')); 236 } 237 // popup function 238 function show_popup() { 239 var popup = $( 240 '<div class="ui-widget ui-widget-content ui-corner-top cookieconsent-popup"> <span class="cookie-message-content">' + 241 (typeof(config.cookie_notice) == 'string' ? config.cookie_notice : config.cookie_notice.html()) + 242 '</span><div class="cookieconsent-button-wrap" />' + 243 (config.cookie_policy_url.length > 0?'<a href="'+config.cookie_policy_url+'" class="cookieconsent-cookie-policy-link" target="_blank">Read more about cookies</a>':'') + 244 '</div>' 245 ); 246 if(!config.hide_reject) 247 { 248 var change_settings = make_button('Decline', 'btn-decline-cookie ui-icon-circle-close'); 249 } 250 var dismiss = make_button('Accept', 'ui-icon-circle-check'); 251 252 popup.find('.cookieconsent-button-wrap').append(dismiss).append(change_settings); 253 popup.hover(function(){ $(this).data('mouseover', true); }, function(){ $(this).data('mouseover', false); }); 254 popup.find('.cookieconsent-toggle-magic-button').click(function(){ 255 $('.cookieconsent-magic-button-wrap').show(); 256 $('.cookieconsent-toggle-magic-button').hide(); 257 edit_settings(); 258 return false;
259 }); 260 261 if(!config.hide_reject) 262 { 263 change_settings.click(function(){ 264 //edit_settings(); 265 decline_cookie(); 266 popup.fadeOut('normal'); 267 }); 268 } 269 270 dismiss.click(function(){ 271 accept_cookie(); 272 popup.fadeOut('normal'); 273 }); 274 275 276 277 $(config.popup_container).append(popup); 278 279 if(config.cookie_notice_autohide_timeout > 0){ 280 notice_timeout = setTimeout(function(){ 281 if(!popup.data('mouseover')){ popup.fadeOut('normal'); } 282 }, (config.cookie_notice_autohide_timeout * 1000)); 283 } 284 } 285 286 // show popup if no cookie_name is set 287 if(!cookies.get(config.cookie_name)) { 288 show_popup(); 289 } 290 291 // edit settings dialog 292 var overlay = $('<div class="ui-widget-overlay cookieconsent-overlay" />'); 293 var settings_dialog = $( 294 '<div class="ui-widget ui-widget-content ui-corner-all cookieconsent-dialog-content cookieconsent-edit-settings">' + 295 (typeof(config.edit_settings_intro) == 'string' ? config.edit_settings_intro : config.edit_settings_intro.html()) + 296 '<a class="cookieconsent-toggle-magic-button cookieconsent-magic-button-related" href="#" onclick="$(\'.cookieconsent-magic-button-wrap\').fadeIn(\'normal\'); $(\'.cookieconsent-toggle-magic-button\').hide(); return false;"><span class="ui-icon ui-icon-alert"></span>Not concerned with cookies? Click here.</a>' + 297 '<div class="cookieconsent-magic-button-wrap cookieconsent-magic-button-related">' + 298 '<div class="ui-state-highlight ui-corner-all">' + 299 '<iframe allowtransparency="true" frameborder="0" scrolling="auto"></iframe>' + 300 '</div>' + 301 '</div>' + 302 '<div class="cookieconsent-level-changer-wrap">' + 303 '<p style="text-align:center; clear:both; padding:5px 10px;" class="ui-state-highlight">Use the buttons below to see the different types of cookies you can choose to allow.</p>' + 304 '<div class="cookieconsent-level-changer" />' + 305 '<div class="cookieconsent-permission-panels">' + 306 '<div class="ui-corner-all cookieconsent-permission-panel-disallowed"><div class="ui-corner-top ui-widget-header cookieconsent-permission-panel-title">This website cannot:</div><ul class="ui-widget ui-widget-content ui-corner-bottom" /></div>' + 307 '<div class="ui-corner-all cookieconsent-permission-panel-allowed"><div class="ui-corner-top ui-widget-header cookieconsent-permission-panel-title">This website is allowed to:</div><ul class="ui-widget ui-widget-content ui-corner-bottom" /></div>' + 308 '</div>' + 309 '</div>' + 310 (config.cookie_policy_url.length > 0?'<a href="'+config.cookie_policy_url+'" class="cookieconsent-cookie-policy-link" target="_blank">Read more about cookies</a>':'') + 311 '<a href="http://fatgalah.com.au" target="_blank" class="ui-corner-all cookieconsent-logo-link">Powered by Fatgalah.com.au</a>' + 312 '</div>' 313 ); 314 var close_settings_dialog = make_button('Close', 'ui-icon-closethick').addClass('cookieconsent-dialog-close'); 315 settings_dialog.append(close_settings_dialog); 316 $('body').append(overlay.hide()).append($('<div class="cookieconsent-dialog" />').append(settings_dialog.hide())); 317 close_settings_dialog.click(function(){ close_settings(); }); 318 settings_dialog.parent().click(function(){ close_settings(); }); 319 settings_dialog.click(function(e){ e.stopPropagation(); }); 320 overlay.click(function(){ close_settings(); }); 321 322 // level changer 323 var level_changer = settings_dialog.find('.cookieconsent-level-changer'); 324 for(var i=0, level; level=config.levels[i]; i++){ 325 var width = (96 / config.levels.length); 326 var margin = ((4 / config.levels.length) / 2); 327 var button = $( 328 '<a href="#" class="ui-corner-all" style="width:'+width+'%; margin:'+margin+'%;">' + 329 '<span class="cookieconsent-level-button-icon cookieconsent-level-'+level.id+'" />' + 330 '<span class="cookieconsent-level-button-title">'+level.title+'</span>' + 331 '</a>' 332 ); 333 button.data('level', level); 334 button.click(function(){ 335 config.levels.select($(this).data('level')); 336 if(typeof(config.on_change) == 'function'){ config.on_change(); } 337 return false; 338 }); 339 340 // Trigger function from script tags 341 // Stop only when current_level meet 342 var scriptTrigger = function (stop_with_current_level) { 343 for(var i=0, level; level=config.levels[i]; i++){ 344 current_level = cookies.get(config.cookie_name); 345 346 var level_scripts = $('script[cookieconsent-level='+level.id+']'); 347 348 level_scripts.each(function(){ 349 350 var src = $(this).attr('src'); 351 352 if (typeof src !== typeof undefined && src !== false) { 353 $(this).attr('type', 'text/javascript'); 354 console.log($(this).attr('src')); 355 } else { 356 $(this).replaceWith(eval($(this).text())); 357 console.log($(this).text()); 358 } 359 360 }); 361 362 if (level.id === stop_with_current_level) { 363 break; 364 } 365 } 366 }; 367 368 // Trigger function init 369 current_level = cookies.get(config.cookie_name); 370 371 if (current_level) { 372 scriptTrigger(current_level); 373 } else { 374 cookies.set(config.cookie_name, config.default_level_id); 375 } 376 377 // Trigger function when click setting level 378 button.click(function () { 379 var new_current_level_id = $(this).data('level').id 380 if (typeof $(this).data('level').callback == 'function') { 381 run_callbacks(new_current_level_id); 382 } 383 scriptTrigger(new_current_level_id); 384 385 // Save new current_level into cookies 386 cookies.set(config.cookie_name, new_current_level_id); 387 }); 388 level_changer.append(button); 389 390 // set the icon (the bars) 391 var icon_wrap = button.find('.cookieconsent-level-button-icon'); 392 for(var x=0; x<config.levels.length; x++){ 393 var height = (100-((90/config.levels.length)*((config.levels.length-1)-x))); 394 var width = (100/config.levels.length); 395 var left = ((width*x)+(margin*x)); 396 icon_wrap.append('<div style="height:'+height+'%; width:'+width+'%; left:'+left+'%;"'+(x<=i?' class="activated"':'')+' />'); 397 } 398 } 399 400 // permission panels 401 var permission_panels = settings_dialog.find('.cookieconsent-permission-panels'); 402 403 // edit settings link 404 if(config.edit_settings_element != null){ 405 switch(config.edit_settings_element[0].nodeName.toLowerCase()){ 406 case 'input': 407 if(trim(config.edit_settings_element.val()).length == 0){ config.edit_settings_element.val('Change your cookie settings'); } 408 break; 409 default: 410 if(trim(config.edit_settings_element.html()).length == 0){ config.edit_settings_element.html('Change your cookie settings'); } 411 } 412 config.edit_settings_element.click(function(){ edit_settings(); return false; }); 413 } 414 415 function saveInDB(cookieLevel) 416 { 417 $.post( config.post_url, { selectedLevel: cookieLevel, cookieID: cookies.get('cookie_GUID'), clearLogDays:config.clear_database_log_in_days } ); 418 } 419 420 function decline_cookie() 421 {
422 cookies.set(config.cookie_name,'necessary'); 423 cookies.set('user_saved_cookie',1); 424 saveInDB('necessary'); 425 $('.cookieconsent-popup').hide(); 426 } 427 428 function edit_settings(){ 429 overlay.show(); 430 settings_dialog.css({'top': $(window).scrollTop()+'px'}).fadeIn('fast'); 431 $('.cookieconsent-popup').hide(); 432 } 433 434 function accept_cookie(){ 435 436 cookies.set('user_saved_cookie',1); 437 cookies.set(config.cookie_name,'targeting'); 438 saveInDB('targeting'); 439 440 441 } 442 function close_settings(){ 443 cookies.set('user_saved_cookie',1); 444 overlay.hide(); 445 settings_dialog.fadeOut('fast'); 446 } 447 448 // ui elements 449 function make_button(text, icon_class){ 450 var button = $('<button class="ui-button ui-widget ui-state-default ui-corner-all">'+(icon_class?'<span class="ui-icon '+icon_class+' ui-button-icon-primary" />':'')+'<span class="ui-button-text">'+text+'</span></button>'); 451 if(icon_class){ 452 button.addClass('ui-button-text-icon-primary'); 453 }else{ 454 button.addClass('ui-button-text-only'); 455 } 456 return button; 457 } 458 459 // functional helpers 460 function trim(text, char){ 461 if(!char){ char = '\\s'; } 462 return text.replace(eval('/^'+char+'+/'), '').replace(eval('/'+char+'+$/'), ''); 463 }; 464 465 function run_callbacks(stop_with_current_level){ 466 var script_elems = []; 467 var loaded_script_count = 0; 468 469 // when all level-applicable scripts have completed loading (if any) execute callbacks 470 function check_loaded_and_exec(){ 471 if(script_elems.length > loaded_script_count){ return; } 472 473 for(var i=0, level; level=config.levels[i]; i++){ 474 if(typeof(level.callback) == 'function'){ level.callback(); } 475 476 if(stop_with_current_level && level.id == current_level.id){ return; } 477 } 478 } 479 480 // find the scripts to be converted 481 for(var i=0, level; level=config.levels[i]; i++){ 482 var level_scripts = $('script[cookieconsent-level='+level.id+']'); 483 level_scripts.each(function(){ 484 script_elems.push($(this)); 485 }); 486 487 if(stop_with_current_level && level.id == current_level.id){ break; } 488 } 489 490 // convert the scripts 491 for(var i=0, script; script=script_elems[i]; i++){ 492 var self = script; 493 if(self.attr('src')){ 494 $.getScript(self.attr('src'), function(){ 495 loaded_script_count++; 496 check_loaded_and_exec(); 497 }); 498 } else { 499 self.attr('type', 'text/javascript') 500 $('head').append(self); 501 loaded_script_count++; 502 check_loaded_and_exec(); 503 } 504 } 505 506 // check immediately incase there's no scripts needed for callbacks 507 check_loaded_and_exec(); 508 } 509 510 // initialise and run 511 function initialise(){ 512 //alert(document.cookie.indexOf("user_saved_cookie=")); 513 if (document.cookie.indexOf("user_saved_cookie=") < 0) 514 { 515 // They've been here before. 516 show_popup(); 517 } 518 519 function non_global_consent_operations(prevent_callback_execution){ 520 521 // popup message if they haven't yet seen the cookie notice 522 if(config._demo_mode || config.levels.saved() == null){ 523 //show_popup(); 524 } 525 526 //if user has not yet clicked yet 527 528 if (document.cookie.indexOf("user_saved_cookie=") < 0) 529 { 530 // They've been here before. 531 //show_popup(); 532 } 533 534 535 initialise_level_changer(); 536 537 if(!prevent_callback_execution){ 538 // runs through each level's callbacks up to and including the current level 539 run_callbacks(true); 540 } 541 } 542 543 function initialise_level_changer(){ 544 var saved_level = config.levels.saved(); 545 546 if(saved_level == null){ 547 config.levels.select(config.default_level_id); 548 } else { 549 // initialise UI with current level 550 config.levels.select(saved_level); 551 } 552 } 553 554 555 // magic button 556 if(typeof(window.postMessage) == 'function'){ 557 558 function show_level_change(){ 559 $('.cookieconsent-level-changer-wrap').show(); 560 $('.cookieconsent-magic-button-wrap').hide(); 561 $('.cookieconsent-toggle-magic-button').show(); 562 initialise_level_changer(); 563 } 564 function hide_level_change(){ 565 $('.cookieconsent-level-changer-wrap').hide(); 566 $('.cookieconsent-magic-button-wrap').show(); 567 $('.cookieconsent-toggle-magic-button').hide(); 568 } 569 570 window.addEventListener("message", function(event){
571 if(event.origin.replace(/^http(s)?:\/\//, '') == our_domain){ 572 switch(event.data){ 573 case 'global_enabled': 574 hide_level_change(); 575 break; 576 case 'global_disabled': 577 show_level_change(); 578 break; 579 default: 580 var parts = event.data.split(':'); 581 if(parts.length == 2 && parts[0] == 'cookie_consent_global_allow'){ 582 switch(parts[1]){ 583 case 'true': 584 // run all callbacks regardless of set level 585 run_callbacks(false); 586 587 hide_level_change(); 588 589 if(config._demo_mode){ 590 non_global_consent_operations(true); 591 } 592 break; 593 case 'false': 594 non_global_consent_operations(); 595 break; 596 default: 597 error('unrecognised response from Magic Button frame'); 598 return; 599 } 600 } 601 } 602 } 603 }, false); 604 }else{ 605 // older browsers which don't support cross domain messaging. 606 // show the popup and don't allow Magic Button support 607 608 non_global_consent_operations(); 609 610 // hide Magic Button references 611 $('.cookieconsent-magic-button-related').hide(); 612 } 613 614 // now we've set up the event listener (or not), we can safely set the magic button iframe source, and wait for any responses 615 settings_dialog.find('iframe').attr('src', cookieconsent_root_url+'magic-button/'); 616 // magic button 617 618 } 619 if(config.autorun){ 620 initialise(); 621 } 622 623 // public 624 return { 625 get_levels: function(){ 626 return config.levels; 627 }, 628 get_level: function(level_id){ 629 return config.levels.get(level_id); 630 }, 631 select_level: function(level){ 632 return config.levels.select(level); 633 }, 634 saved_level: function(level){ 635 return config.levels.saved(); 636 }, 637 is_granted: function(level_id){ 638 for(var i=0, level; level=config.levels[i]; i++){ 639 if(level.id == level_id){ return true; } 640 if(level.id == current_level.id){ return false; } 641 } 642 return false; 643 }, 644 edit_settings: function(){ 645 edit_settings(); 646 }, 647 run: function(){ 648 initialise(); 649 } 650 }; 651 } 652});
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.