PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.6.1
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.6.1
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 3.10.4 All 148 releases
visualizer / js / frame.js

frame.js in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.6.1, at js/frame.js

654 lines 26.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* global prompt */
2 /* global visualizer */
3 /* global alert */
4 /* global confirm */
5 /* global ajaxurl */
6 /* global CodeMirror */
7 /* global vizHaveSettingsChanged */
8
9 (function ($) {
10 $(window).on('load', function(){
11 // scroll to the selected chart type.
12 if($('label.type-label.type-label-selected').length > 0) {
13 $('label.type-label.type-label-selected')[0].scrollIntoView();
14 }
15 });
16
17 $(document).ready(function () {
18 onReady();
19 });
20
21 function initTabs(){
22 $( "#sidebar" ).lock();
23 $( "#viz-tabs" ).tabs({
24 create: function( event, ui ) {
25 $(this).addClass('done');
26 $( "#sidebar" ).unlock();
27 },
28 beforeActivate: function( event, ui ) {
29 // if settings have changed in tab #2 and tab #1 is being activated, warn the user.
30 if(vizHaveSettingsChanged() && ui.newTab.find( 'a' ).attr( 'id' ).includes('viz-tab-basic')){
31 return confirm(visualizer.l10n.save_settings);
32 }
33 }
34 });
35 }
36
37 function onReady() {
38 initTabs();
39
40 // open the correct source tab/sub-tab.
41 var source = $('#visualizer-chart-id').attr('data-chart-source');
42 $('li.viz-group.' + source).addClass('open');
43 $('li.viz-group.' + source + ' span.viz-section-title.' + source).addClass('open');
44 $('li.viz-group.' + source + ' span.viz-section-title.' + source + '.open').parent().find('div.viz-section-items').show();
45
46 init_permissions();
47
48 if(typeof visualizer !== 'undefined' && visualizer.is_pro) {
49 init_db_import();
50 init_filter_import();
51 }
52
53 init_json_import();
54
55 init_editor_table();
56
57 // update the manual configuation link to point to the correct chart type.
58 var type = $('#visualizer-chart-id').attr('data-chart-type');
59 var chart_type_in_api_link = type + 'chart';
60 switch (type) {
61 case "gauge":
62 case "table":
63 case "timeline":
64 chart_type_in_api_link = type;
65 break;
66 }
67
68 if($('span.viz-gvlink').length > 0) {
69 $('span.viz-gvlink').html($('span.viz-gvlink').html().replace('?', chart_type_in_api_link));
70 }
71
72 $('.type-radio').change(function () {
73 $('.type-label-selected').removeClass('type-label-selected');
74 $(this).parent().addClass('type-label-selected');
75 });
76
77 // collapse other open sections of this group
78 $(document).on('click', '.viz-group-title', function () {
79 var parent = $(this).parent();
80
81 if (parent.hasClass('open')) {
82 parent.removeClass('open');
83 } else {
84 parent.parent().find('.viz-group.open').removeClass('open');
85 parent.addClass('open');
86 }
87
88 /*
89 * if the user wants to perform an action and click that tab to change the source
90 * and the chart is no longer showing because that particular LHS screen is showing
91 * e.g. create parameters, import json, db query box etc.
92 * we need to make sure we cancel the current process WITHOUT saving
93 * and then show the chart as it was
94 * let's close the LHS window and show the chart that is hidden
95 */
96 $('body').trigger('visualizer:change:action');
97 });
98
99 // collapse other open subsections of this section
100 $(document).on('click', '.viz-section-title', function () {
101 var grandparent = $(this).parent().parent();
102 grandparent.find('.viz-section-title.open ~ .viz-section-items').hide();
103 grandparent.find('.viz-section-title.open').removeClass('open');
104 });
105
106 $('#view-remote-file').click(function () {
107 var url = $(this).parent().find('#vz-schedule-url').val();
108
109 if (url !== '') {
110 if (url.indexOf('localhost') !== -1 || /^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(url)) {
111 if (url.substr(url.length - 8) === '/pubhtml') {
112 url = url.substring(0, url.length - 8) + '/export?format=csv';
113 }
114
115 $('#canvas').lock();
116 $(this).parent().submit();
117 } else {
118 alert(visualizer.l10n.invalid_source);
119 }
120 }
121 });
122
123 $('#vz-import-file').click(function (e) {
124 e.preventDefault();
125 if ($.trim($(this).parent().find("#csv-file").val()) !== '') {
126 $('#canvas').lock();
127 $(this).parent().submit();
128 }
129 });
130
131 $( window ).on( 'load', function() {
132 $('#canvas').unlock();
133 } );
134
135 $(document).on('click', '.viz-section-title', function () {
136 $(this).toggleClass('open').parent().find('.viz-section-items').toggle();
137 });
138
139 $(document).on('click', '.more-info', function () {
140 $(this).parent().find('.viz-section-description:first').toggle();
141 return false;
142 });
143
144 $('#cancel-button').click(function () {
145 $('#cancel-form').submit();
146 });
147
148 init_type_vs_library();
149
150 $('.viz-abort').on('click', function(e){
151 e.preventDefault();
152 window.parent.postMessage('visualizer:mediaframe:close', '*');
153 });
154
155 }
156
157 function init_type_vs_library() {
158 var $data = $('select.viz-select-library').attr('data-type-vs-library');
159 if(typeof $data === 'undefined' || $data.length === 0){
160 return;
161 }
162 var $typeVsLibrary = JSON.parse( $('select.viz-select-library').attr('data-type-vs-library') );
163 // disable all unsupported libraries for the chart type.
164 $('input.type-radio').on('click', function(){
165 enable_libraries_for($(this).val(), $typeVsLibrary);
166 });
167
168 enable_libraries_for($('input.type-radio:checked').val(), $typeVsLibrary);
169 }
170
171 function enable_libraries_for($type, $typeVsLibrary) {
172 $('select.viz-select-library option').addClass('disabled').attr('disabled', 'disabled');
173 var $libs = $typeVsLibrary[$type];
174 $.each($libs, function( i, $lib ) {
175 $('select.viz-select-library option[value="' + $lib + '"]').removeClass('disabled').removeAttr('disabled');
176 });
177 $('select.viz-select-library').val( $('select.viz-select-library option:not(.disabled)').val() );
178 }
179
180 function init_permissions(){
181 $('.visualizer-permission').chosen({
182 width : '50%',
183 search_contains : true
184 });
185
186 $('.visualizer-permission-type').each(function(x, y){
187 var type = $(y).attr('data-visualizer-permission-type');
188 var child = $('.visualizer-permission-' + type + '-specific');
189 if($(y).val() === 'all'){
190 child.next('div.chosen-container').hide();
191 return;
192 }
193 });
194
195 $('.visualizer-permission-type').on('change', function(evt, params) {
196 var type = $(this).attr('data-visualizer-permission-type');
197 var child = $('.visualizer-permission-' + type + '-specific');
198 child.empty();
199 if(params.selected === 'all'){
200 child.next('div.chosen-container').hide();
201 return;
202 } else {
203 child.next('div.chosen-container').show();
204 }
205 child.append('<option value="">' + visualizer.l10n['loading'] + '</option>').trigger('chosen:updated');
206 $.ajax({
207 url : visualizer.ajax['url'],
208 method : 'post',
209 data : {
210 'action' : visualizer.ajax['actions']['permissions'],
211 'nonce' : visualizer.ajax['nonces']['permissions'],
212 'type' : params.selected
213 },
214 success : function(d, textStatus, XMLHttpRequest){
215 if(d.success) {
216 child.empty();
217 $.each(d.data, function(k, v){
218 child.append('<option value="' + k + '">' + v + '</option>');
219 });
220 child.trigger('chosen:updated');
221 }
222 }
223 });
224 });
225 }
226
227 // https://codemirror.net/
228 function init_db_import_component(){
229 var table_columns = visualizer.db_query.tables;
230 var code_mirror = wp.CodeMirror || CodeMirror;
231 var cm = code_mirror.fromTextArea($('.visualizer-db-query').get(0), {
232 value: $('.visualizer-db-query').val(),
233 autofocus: true,
234 mode: 'text/x-mysql',
235 lineWrapping: true,
236 dragDrop: false,
237 matchBrackets: true,
238 autoCloseBrackets: true,
239 extraKeys: {"Ctrl-Space": "autocomplete"},
240 hintOptions: { tables: table_columns }
241 });
242
243 // force refresh so that the query shows on first time load. Otherwise you have to click on the editor for it to show.
244 $('body').on('visualizer:db:query:focus', function(event, data){
245 cm.refresh();
246 });
247
248 cm.focus();
249
250 // update text area.
251 cm.on('inputRead', function(x, y){
252 cm.save();
253 });
254
255 // backspace and delete do not register so the text box does not get empty if the entire query is deleted
256 // from the editor. Let's force this.
257 $('body').on('visualizer:db:query:update', function(event, data){
258 cm.save();
259 });
260
261 // clear the editor.
262 $('body').on('visualizer:db:query:setvalue', function(event, data){
263 cm.setValue(data.value);
264 cm.clearHistory();
265 cm.refresh();
266 });
267
268 // set an option at runtime?
269 $('body').on('visualizer:db:query:changeoption', function(event, data){
270 cm.setOption(data.name, data.value);
271 });
272 }
273
274 function init_filter_import() {
275 $( '#db-filter-save-button' ).on( 'click', function(){
276 $('#vz-filter-wizard').submit();
277 });
278 }
279
280 function init_db_import(){
281 $( '#visualizer-db-query' ).css("z-index", "-1").hide();
282
283 init_db_import_component();
284
285 $('#visualizer-query-fetch').on('click', function(e){
286
287 $('body').trigger('visualizer:db:query:update', {});
288 if($('.visualizer-db-query').val() === ''){
289 return;
290 }
291
292 start_ajax($('#visualizer-db-query'));
293 $('.db-wizard-results').empty();
294 $('.db-wizard-error').empty();
295 $.ajax({
296 url : ajaxurl,
297 method : 'post',
298 data : {
299 'action' : visualizer.ajax['actions']['db_get_data'],
300 'security' : visualizer.ajax['nonces']['db_get_data'],
301 'params' : $('#db-query-form').serialize()
302 },
303 success : function(data){
304 if(data.success){
305 $('.db-wizard-results').html(data.data.table);
306 $('#results').DataTable({
307 "paging": false
308 });
309 }else{
310 $('.db-wizard-error').html(data.data.msg);
311 }
312 },
313 complete: function(){
314 end_ajax($('#visualizer-db-query'));
315 }
316 });
317 });
318
319 $( '#db-chart-button' ).on( 'click', function(){
320
321 $('body').off('visualizer:change:action').on('visualizer:change:action', function(e){
322 var filter_button = $( '#db-chart-button' );
323 $( '#visualizer-db-query' ).css("z-index", "-1").hide();
324 filter_button.val( filter_button.attr( 'data-t-chart' ) );
325 filter_button.html( filter_button.attr( 'data-t-chart' ) );
326 filter_button.attr( 'data-current', 'chart' );
327 $( '#canvas' ).css("z-index", "1").show();
328 });
329
330 $('#content').css('width', 'calc(100% - 300px)');
331 if( $(this).attr( 'data-current' ) === 'chart'){
332 $(this).val( $(this).attr( 'data-t-filter' ) );
333 $(this).html( $(this).attr( 'data-t-filter' ) );
334 $(this).attr( 'data-current', 'filter' );
335 $( '.visualizer-editor-lhs' ).hide();
336 $( '#visualizer-db-query' ).css("z-index", "9999").show();
337 $('body').trigger('visualizer:db:query:focus', {});
338 $( '#canvas' ).hide();
339 }else{
340 var filter_button = $(this);
341 $( '#visualizer-db-query' ).css("z-index", "-1").hide();
342 $('#canvas').lock();
343 filter_button.val( filter_button.attr( 'data-t-chart' ) );
344 filter_button.html( filter_button.attr( 'data-t-chart' ) );
345 filter_button.attr( 'data-current', 'chart' );
346 $( '#canvas' ).css("z-index", "1").show();
347 $( '#db-chart-save-button' ).trigger('click');
348 }
349 } );
350
351 $( '#db-chart-save-button' ).on( 'click', function(){
352 // submit only if a query has been provided.
353 if($('#db-query-form .visualizer-db-query').val().length > 0){
354 $('#viz-db-wizard-params').val($('#db-query-form').serialize());
355 $('#vz-db-wizard').submit();
356 }else{
357 $('#canvas').unlock();
358 }
359 });
360 }
361
362 function init_json_import(){
363 if(typeof visualizer === 'undefined'){
364 return;
365 }
366
367 var regex = new RegExp(visualizer.json_tag_separator, 'g');
368
369 $( '#visualizer-json-screen' ).css("z-index", "-1").hide();
370 $('.visualizer-json-form').accordion({
371 heightStyle: 'content',
372 active: 0
373 });
374 $('.visualizer-json-subform').accordion({
375 heightStyle: 'content',
376 active: false,
377 collapsible: true
378 });
379
380 // open the accordions by default if they are indicated with the 'open' class.
381 $('.visualizer-json-subform .viz-substep.open').each(function(i, e){
382 $('.visualizer-json-subform').accordion( "option", "active", i );
383 });
384
385 // toggle between chart and create/modify parameters
386 $( '#json-chart-button' ).on( 'click', function(){
387
388 $('body').off('visualizer:change:action').on('visualizer:change:action', function(e){
389 var filter_button = $( '#json-chart-button' );
390 $( '#visualizer-json-screen' ).css("z-index", "-1").hide();
391 filter_button.val( filter_button.attr( 'data-t-chart' ) );
392 filter_button.html( filter_button.attr( 'data-t-chart' ) );
393 filter_button.attr( 'data-current', 'chart' );
394 $( '#canvas' ).css("z-index", "1").show();
395 });
396
397 $('#content').css('width', 'calc(100% - 100px)');
398 if( $(this).attr( 'data-current' ) === 'chart'){
399 // toggle from chart to LHS form
400 $(this).val( $(this).attr( 'data-t-filter' ) );
401 $(this).html( $(this).attr( 'data-t-filter' ) );
402 $(this).attr( 'data-current', 'filter' );
403 $( '.visualizer-editor-lhs' ).hide();
404 $( '#visualizer-json-screen' ).css("z-index", "9999").show();
405 $( '#canvas' ).hide();
406 }else{
407 // toggle from LHS form to chart
408 $( '#json-conclude-form' ).trigger('submit');
409 }
410 } );
411
412 $('body').on('visualizer:json:form:submit', function() {
413 var filter_button = $( '#json-chart-button' );
414 $( '#visualizer-json-screen' ).css("z-index", "-1").hide();
415 $('#canvas').lock();
416 filter_button.val( filter_button.attr( 'data-t-chart' ) );
417 filter_button.html( filter_button.attr( 'data-t-chart' ) );
418 filter_button.attr( 'data-current', 'chart' );
419 end_ajax( $( '#visualizer-json-screen' ) );
420 $( '#canvas' ).css("z-index", "1").show();
421 });
422
423
424 // fetch the roots for the provided endpoint
425 $( '#visualizer-json-fetch' ).on( 'click', function(e){
426 e.preventDefault();
427 $('.visualizer-json-form').accordion( 'option', 'active', 0 );
428 $('.visualizer-json-form h3.viz-step:not(.step1)').addClass('ui-state-disabled');
429 $('.json-table').html('');
430 start_ajax( $( '#visualizer-json-screen' ) );
431 $.ajax({
432 url : ajaxurl,
433 method : 'post',
434 data : {
435 'action' : visualizer.ajax['actions']['json_get_roots'],
436 'security' : visualizer.ajax['nonces']['json_get_roots'],
437 'params' : $('#json-endpoint-form').serialize()
438 },
439 success : function(data){
440 if(data.success){
441 $('#vz-import-json-root').empty();
442 $.each(data.data.roots, function(i, name){
443 $('#vz-import-json-root').append('<option value="' + name + '">' + name.replace(regex, visualizer.json_tag_separator_view) + '</option>');
444 });
445 $('#json-root-form').fadeIn('medium');
446 json_accordion_activate(1, true);
447 }else{
448 alert(data.data.msg);
449 }
450 },
451 complete: function(){
452 end_ajax($('#visualizer-json-screen'));
453 }
454 });
455 });
456
457 // fetch the data for the chosen root
458 $( '#visualizer-json-parse' ).on( 'click', function(e){
459 e.preventDefault();
460 $('.visualizer-json-form h3.viz-step:not(.step1):not(.step2)').addClass('ui-state-disabled');
461 $('.json-table').html('');
462 start_ajax( $( '#visualizer-json-screen' ) );
463 $.ajax({
464 url : ajaxurl,
465 method : 'post',
466 data : {
467 'action' : visualizer.ajax['actions']['json_get_data'],
468 'security' : visualizer.ajax['nonces']['json_get_data'],
469 'params' : $('#json-root-form, #json-endpoint-form').serialize()
470 },
471 success : function(data){
472 if(data.success){
473 $('#vz-import-json-paging option:not(.static)').remove();
474 if(data.data.paging.length > 0){
475 var $template = $('#vz-import-json-paging').attr('data-template');
476 $.each(data.data.paging, function(i, name){
477 var display = name.replace(regex, visualizer.json_tag_separator_view);
478 display = $template.replace('?', display);
479 $('#vz-import-json-paging').append('<option value="' + name + '">' + display + '</option>');
480 });
481 $('.json-pagination').show();
482 }
483 $('#json-conclude-form .json-table').html(data.data.table);
484
485 var $table = create_editor_table( '#json-conclude-form' );
486
487 json_accordion_activate(3, true);
488 json_accordion_activate(2, false);
489 $table.columns.adjust().draw();
490 }else{
491 alert(data.data.msg);
492 }
493 },
494 complete: function(){
495 end_ajax($('#visualizer-json-screen'));
496 }
497 });
498 });
499
500 // when the data is set and the chart is updated, toggle the screen so that the chart is shown
501 $('#json-conclude-form').on( 'submit', function(e){
502 // at least one column has to be selected as non-excluded.
503 var count_selected = 0;
504 $('select.viz-select-data-type').each(function(i, element){
505 if($(element).prop('selectedIndex') > 0){
506 count_selected++;
507 }
508 });
509 if(count_selected === 0){
510 alert(visualizer.l10n.select_columns);
511 return false;
512 }
513
514 // populate the form elements that are in the other tabs.
515 $('#json-conclude-form-helper .json-form-element, #json-endpoint-form .json-form-element, #json-root-form .json-form-element, #vz-import-json .json-form-element').each(function(x, y){
516 $('#json-conclude-form').append('<input type="hidden" name="' + y.name + '" value="' + y.value + '">');
517 });
518
519 $('body').trigger('visualizer:json:form:submit');
520 });
521
522 // update the schedule
523 $('#json-chart-save-button').on('click', function(e){
524 e.preventDefault();
525 $('#canvas').lock();
526 $.ajax({
527 url : ajaxurl,
528 method : 'post',
529 data : {
530 'action' : visualizer.ajax['actions']['json_set_schedule'],
531 'security' : visualizer.ajax['nonces']['json_set_schedule'],
532 'chart' : $('#vz-json-time').attr('data-chart'),
533 'time' : $('#vz-json-time').val()
534 },
535 success : function(data){
536 // do nothing.
537 },
538 complete: function(){
539 $('#canvas').unlock();
540 }
541 });
542 });
543
544 }
545
546 function init_editor_table() {
547 $('body').on('visualizer:db:editor:table:init', function(event, data){
548 var $table = create_editor_table('.viz-table-editor', data.config);
549 $('body').on('visualizer:db:editor:table:redraw', function(event, data){
550 $table.draw();
551 });
552 });
553 }
554
555 function create_editor_table(element, config) {
556 var settings = {
557 paging: false,
558 searching: false,
559 ordering: false,
560 select: false,
561 scrollX: "100%",
562 scrollY: "400px",
563 info: false,
564 colReorder: {
565 fixedColumnsLeft: 1
566 }
567 };
568
569 // show column visibility button only when more than 6 columns are found (including the Label column)
570 if($(element + ' table.viz-editor-table thead tr th').length > 6){
571 $.extend( settings, {
572 dom: 'Bt',
573 buttons: [
574 {
575 extend: 'colvis',
576 columns: ':gt(0)',
577 collectionLayout: 'four-column'
578 }
579 ]
580 } );
581 }
582 if(config){
583 $.extend( settings, config );
584 }
585
586 var $table = $(element + ' .viz-editor-table').DataTable(settings);
587 return $table;
588 }
589
590 function json_accordion_activate($step, $activate){
591 $('.visualizer-json-form h3.viz-step.step' + ( $step + 1 )).removeClass('ui-state-disabled');
592 if($activate){
593 $('.visualizer-json-form').accordion( 'option', 'active', $step );
594 }
595 }
596
597 function start_ajax(element){
598 element.lock();
599 }
600
601 function end_ajax(element){
602 element.unlock();
603 }
604
605 })(jQuery);
606
607 (function ($) {
608 $.fn.lock = function () {
609 $(this).each(function () {
610 var $this = $(this);
611 var position = $this.css('position');
612
613 if (!position) {
614 position = 'static';
615 }
616
617 switch (position) {
618 case 'absolute':
619 case 'relative':
620 break;
621 default:
622 $this.css('position', 'relative');
623 break;
624 }
625 $this.data('position', position);
626
627 var width = $this.width(),
628 height = $this.height();
629
630 var locker = $('<div class="locker"></div>');
631 locker.width(width).height(height);
632
633 var loader = $('<div class="locker-loader"></div>');
634 loader.width(width).height(height);
635
636 locker.append(loader);
637 $this.append(locker);
638 $(window).resize(function () {
639 $this.find('.locker,.locker-loader').width($this.width()).height($this.height());
640 });
641 });
642
643 return $(this);
644 };
645
646 $.fn.unlock = function () {
647 $(this).each(function () {
648 $(this).find('.locker').remove();
649 $(this).css('position', $(this).data('position'));
650 });
651
652 return $(this);
653 };
654 })(jQuery);