wp/wp-content/plugins/option-tree/assets/js/ot-admin.js
changeset 0 d970ebf37754
child 5 5e2f62d02dcd
equal deleted inserted replaced
-1:000000000000 0:d970ebf37754
       
     1 /**
       
     2  * Option Tree UI
       
     3  * 
       
     4  * Dependencies: jQuery, jQuery UI, ColorPicker
       
     5  *
       
     6  * @author Derek Herman (derek@valendesigns.com)
       
     7  */
       
     8 ;(function($) {
       
     9   OT_UI = {
       
    10     processing: false,
       
    11     init: function() {
       
    12       this.init_hide_body();
       
    13       this.init_sortable();
       
    14       this.init_add();
       
    15       this.init_edit();
       
    16       this.init_remove();
       
    17       this.init_edit_title()
       
    18       this.init_edit_id();
       
    19       this.init_activate_layout();
       
    20       this.init_upload();
       
    21       this.init_upload_remove();
       
    22       this.init_numeric_slider();
       
    23       this.init_tabs();
       
    24       this.init_radio_image_select();
       
    25       this.init_select_wrapper();
       
    26       this.fix_upload_parent();
       
    27       this.fix_colorpicker();
       
    28       this.fix_textarea();
       
    29       this.replicate_ajax();
       
    30       this.reset_settings();
       
    31     },
       
    32     init_hide_body: function(elm,type) {
       
    33       var css = '.option-tree-setting-body';
       
    34       if ( type == 'parent' ) {
       
    35         $(css).not( elm.parent().parent().children(css) ).hide();
       
    36       } else if ( type == 'child' ) {
       
    37         elm.closest('ul').find(css).not( elm.parent().parent().children(css) ).hide();
       
    38       } else if ( type == 'child-add' ) {
       
    39         elm.children().find(css).hide();
       
    40       } else if ( type == 'toggle' ) {
       
    41         elm.parent().parent().children(css).toggle();
       
    42       } else {
       
    43         $(css).hide();
       
    44       }
       
    45     },
       
    46     init_remove_active: function(elm,type) {
       
    47       var css = '.option-tree-setting-edit';
       
    48       if ( type == 'parent' ) {
       
    49         $(css).not(elm).removeClass('active');
       
    50       } else if ( type == 'child' ) {
       
    51         elm.closest('ul').find(css).not(elm).removeClass('active');
       
    52       } else if ( type == 'child-add' ) {
       
    53         elm.children().find(css).removeClass('active');
       
    54       } else {
       
    55         $(css).removeClass('active');
       
    56       }
       
    57     },
       
    58     init_sortable: function() {
       
    59       $('.option-tree-sortable').each( function() {
       
    60         if ( $(this).children('li').length ) {
       
    61           var elm = $(this);
       
    62           elm.show();
       
    63           elm.sortable({
       
    64             items: 'li:not(.ui-state-disabled)',
       
    65             handle: 'div.open',
       
    66             placeholder: 'ui-state-highlight',
       
    67             start: function (event, ui) {
       
    68               ui.placeholder.height(ui.item.height()-2);
       
    69             },
       
    70             stop: function(evt, ui) {
       
    71               setTimeout(
       
    72                 function(){
       
    73                   OT_UI.update_ids(elm);
       
    74                 },
       
    75                 200
       
    76               )
       
    77             }
       
    78           });
       
    79         }
       
    80       });
       
    81     },
       
    82     init_add: function() {
       
    83       $('.option-tree-section-add').live('click', function(e) {
       
    84         e.preventDefault();
       
    85         OT_UI.add(this,'section');
       
    86       });
       
    87       $('.option-tree-setting-add').live('click', function(e) {
       
    88         e.preventDefault();
       
    89         OT_UI.add(this,'setting');
       
    90       });
       
    91       $('.option-tree-help-add').live('click', function(e) {
       
    92         e.preventDefault();
       
    93         OT_UI.add(this,'the_contextual_help');
       
    94       });
       
    95       $('.option-tree-choice-add').live('click', function(e) {
       
    96         e.preventDefault();
       
    97         OT_UI.add(this,'choice');
       
    98       });
       
    99       $('.option-tree-list-item-add').live('click', function(e) {
       
   100         e.preventDefault();
       
   101         OT_UI.add(this,'list_item');
       
   102       });
       
   103       $('.option-tree-list-item-setting-add').live('click', function(e) {
       
   104         e.preventDefault();
       
   105         if ( $(this).parents('ul').parents('ul').hasClass('ui-sortable') ) {
       
   106           alert(option_tree.setting_limit);
       
   107           return false;
       
   108         }
       
   109         OT_UI.add(this,'list_item_setting');
       
   110       });
       
   111     },
       
   112     init_edit: function() {
       
   113       $('.option-tree-setting-edit').live('click', function(e) {
       
   114         e.preventDefault();
       
   115         if ( $(this).parents().hasClass('option-tree-setting-body') ) {
       
   116           OT_UI.init_remove_active($(this),'child');
       
   117           OT_UI.init_hide_body($(this),'child');
       
   118         } else {
       
   119           OT_UI.init_remove_active($(this),'parent');
       
   120           OT_UI.init_hide_body($(this), 'parent');
       
   121         }
       
   122         $(this).toggleClass('active');
       
   123         OT_UI.init_hide_body($(this), 'toggle');
       
   124       });
       
   125     },
       
   126     init_remove: function() {
       
   127       $('.option-tree-setting-remove').live('click', function(event) {
       
   128         event.preventDefault();
       
   129         if ( $(this).parents('li').hasClass('ui-state-disabled') ) {
       
   130           alert(option_tree.remove_no);
       
   131           return false;
       
   132         }
       
   133         var agree = confirm(option_tree.remove_agree);
       
   134         if (agree) {
       
   135           var list = $(this).parents('ul');
       
   136           OT_UI.remove(this);
       
   137           setTimeout( function() { 
       
   138             OT_UI.update_ids(list); 
       
   139           }, 200 );
       
   140         }
       
   141         return false;
       
   142       });
       
   143     },
       
   144     init_edit_title: function() {
       
   145       $('.option-tree-setting-title').live('keyup', function() {
       
   146         OT_UI.edit_title(this);
       
   147       });
       
   148     },
       
   149     init_edit_id: function() {
       
   150       $('.section-id').live('keyup', function(){
       
   151         OT_UI.update_id(this);
       
   152       });
       
   153     },
       
   154     init_activate_layout: function() {
       
   155       $('.option-tree-layout-activate').live('click', function() { 
       
   156         var active = $(this).parents('.option-tree-setting').find('.open').text();
       
   157         $('.option-tree-layout-activate').removeClass('active');
       
   158         $(this).toggleClass('active');
       
   159         $('.active-layout-input').attr({'value':active});
       
   160       });
       
   161       $('#option-tree-options-layouts-form select').live('change', function() {
       
   162         var agree = confirm(option_tree.activate_layout_agree);
       
   163         if (agree) {
       
   164           $('#option-tree-options-layouts-form').submit();
       
   165         } else {
       
   166           var active = $('#the_current_layout').attr('value');
       
   167           $('#option-tree-options-layouts-form select option[value="' + active + '"]').attr({'selected':'selected'});
       
   168           $('#option-tree-options-layouts-form select').prev('span').replaceWith('<span>' + active + '</span>');
       
   169         }
       
   170       });
       
   171     },
       
   172     add: function(elm,type) {
       
   173       var self = this, 
       
   174           list = '', 
       
   175           list_class = '',
       
   176           name = '', 
       
   177           post_id = 0, 
       
   178           get_option = '', 
       
   179           settings = '';
       
   180       if ( type == 'the_contextual_help' ) {
       
   181         list = $(elm).parent().find('ul:last');
       
   182         list_class = 'list-contextual-help';
       
   183       } else if ( type == 'choice' ) {
       
   184         list = $(elm).parent().children('ul');
       
   185         list_class = 'list-choice';
       
   186       } else if ( type == 'list_item' ) {
       
   187         list = $(elm).parent().children('ul');
       
   188         list_class = 'list-sub-setting';
       
   189       } else if ( type == 'list_item_setting' ) {
       
   190         list = $(elm).parent().children('ul');
       
   191         list_class = 'list-sub-setting';
       
   192       } else {
       
   193         list = $(elm).parent().find('ul:first');
       
   194         list_class = ( type == 'section' ) ? 'list-section' : 'list-setting';
       
   195       }
       
   196       name = list.data('name');
       
   197       post_id = list.data('id');
       
   198       get_option = list.data('getOption');
       
   199       settings = $('#'+name+'_settings_array').val();
       
   200       if ( this.processing === false ) {
       
   201         this.processing = true;
       
   202         var count = parseInt(list.children('li').length);
       
   203         if ( type == 'list_item' ) {
       
   204           list.find('li input.option-tree-setting-title', self).each(function(){
       
   205             var setting = $(this).attr('name'),
       
   206                 regex = /\[([0-9]+)\]/,
       
   207                 matches = setting.match(regex),
       
   208                 id = null != matches ? parseInt(matches[1]) : 0;
       
   209             id++;
       
   210             if ( id > count) {
       
   211               count = id;
       
   212             }
       
   213           });
       
   214         }
       
   215         $.ajax({
       
   216           url: option_tree.ajax,
       
   217           type: 'post',
       
   218           data: {
       
   219             action: 'add_' + type,
       
   220             count: count,
       
   221             name: name,
       
   222             post_id: post_id,
       
   223             get_option: get_option,
       
   224             settings: settings,
       
   225             type: type
       
   226           },
       
   227           complete: function( data ) {
       
   228             if ( type == 'choice' || type == 'list_item_setting' ) {
       
   229               OT_UI.init_remove_active(list,'child-add');
       
   230               OT_UI.init_hide_body(list,'child-add');
       
   231             } else {
       
   232               OT_UI.init_remove_active();
       
   233               OT_UI.init_hide_body();
       
   234             }
       
   235             list.append('<li class="ui-state-default ' + list_class + '">' + data.responseText + '</li>');
       
   236             list.children().last().find('.option-tree-setting-edit').toggleClass('active');
       
   237             list.children().last().find('.option-tree-setting-body').toggle();
       
   238             list.children().last().find('.option-tree-setting-title').focus();
       
   239             if ( type != 'the_contextual_help' ) {
       
   240               OT_UI.update_ids(list);
       
   241             }
       
   242             setTimeout( function() {
       
   243               OT_UI.init_sortable();
       
   244               OT_UI.init_select_wrapper();
       
   245               OT_UI.init_numeric_slider();
       
   246             }, 500);
       
   247             self.processing = false;
       
   248           }
       
   249         });
       
   250       }
       
   251     },
       
   252     remove: function(e) {
       
   253       $(e).parent().parent().parent('li').remove();
       
   254     },
       
   255     edit_title: function(e) {
       
   256       if ( this.timer ) {
       
   257         clearTimeout(e.timer);
       
   258       }
       
   259       this.timer = setTimeout( function() {
       
   260         $(e).parent().parent().parent().parent().parent().children('.open').text(e.value);
       
   261       }, 100);
       
   262       return true;
       
   263     },
       
   264     update_id: function(e) {
       
   265       if ( this.timer ) {
       
   266         clearTimeout(e.timer);
       
   267       }
       
   268       this.timer = setTimeout( function() {
       
   269         OT_UI.update_ids($(e).parents('ul'));
       
   270       }, 100);
       
   271       return true;
       
   272     },
       
   273     update_ids: function(list) {
       
   274       var last_section, section, list_items = list.children('li');
       
   275       list_items.each(function(index) {
       
   276         if ( $(this).hasClass('list-section') ) {
       
   277           section = $(this).find('.section-id').val().trim().toLowerCase().replace(/[^a-z0-9]/gi,'_');
       
   278           if (!section) {
       
   279             section = $(this).find('.section-title').val().trim().toLowerCase().replace(/[^a-z0-9]/gi,'_');
       
   280           }
       
   281           if (!section) {
       
   282             section = last_section;
       
   283           }
       
   284         }
       
   285         if ($(this).hasClass('list-setting') ) {
       
   286           $(this).find('.hidden-section').attr({'value':section});
       
   287         }
       
   288         last_section = section;
       
   289       });
       
   290     },
       
   291     init_upload: function() {
       
   292       $(document).on('click', '.ot_upload_media', function() {
       
   293         var field_id    = $(this).parent('.option-tree-ui-upload-parent').find('input').attr('id'),
       
   294             post_id     = $(this).attr('rel'),
       
   295             btnContent  = '';
       
   296         if ( window.wp && wp.media ) {
       
   297           window.ot_media_frame = window.ot_media_frame || new wp.media.view.MediaFrame.Select({
       
   298             title: $(this).attr('title'),
       
   299             button: {
       
   300               text: option_tree.upload_text
       
   301             }, 
       
   302             multiple: false
       
   303           });
       
   304           window.ot_media_frame.on('select', function() {
       
   305             var attachment = window.ot_media_frame.state().get('selection').first(), 
       
   306                 href = attachment.attributes.url, 
       
   307                 mime = attachment.attributes.mime,
       
   308                 regex = /^image\/(?:jpe?g|png|gif|x-icon)$/i;
       
   309             if ( mime.match(regex) ) {
       
   310               btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+href+'" alt="" /></div>';
       
   311             }
       
   312             btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button red light" title="'+option_tree.remove_media_text+'"><span class="icon trash-can">'+option_tree.remove_media_text+'</span></a>';
       
   313             $('#'+field_id).val(href);
       
   314             $('#'+field_id+'_media').remove();
       
   315             $('#'+field_id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+field_id+'_media" />');
       
   316             $('#'+field_id+'_media').append(btnContent).slideDown();
       
   317             window.ot_media_frame.off('select');
       
   318           }).open();
       
   319         } else {
       
   320           var backup = window.send_to_editor,
       
   321               intval = window.setInterval( 
       
   322                 function() {
       
   323                   if ( $('#TB_iframeContent').length > 0 && $('#TB_iframeContent').attr('src').indexOf( "&field_id=" ) !== -1 ) {
       
   324                     $('#TB_iframeContent').contents().find('#tab-type_url').hide();
       
   325                   }
       
   326                   $('#TB_iframeContent').contents().find('.savesend .button').val(option_tree.upload_text); 
       
   327                 }, 50);
       
   328           tb_show('', 'media-upload.php?post_id='+post_id+'&field_id='+field_id+'&type=image&TB_iframe=1');
       
   329           window.send_to_editor = function(html) {
       
   330             var href = $(html).find('img').attr('src');
       
   331             if ( typeof href == 'undefined') {
       
   332               href = $(html).attr('src');
       
   333             } 
       
   334             if ( typeof href == 'undefined') {
       
   335               href = $(html).attr('href');
       
   336             }
       
   337             var image = /\.(?:jpe?g|png|gif|ico)$/i;
       
   338             if (href.match(image) && OT_UI.url_exists(href)) {
       
   339               btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+href+'" alt="" /></div>';
       
   340             }
       
   341             btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button red light" title="'+option_tree.remove_media_text+'"><span class="icon trash-can">'+option_tree.remove_media_text+'</span></a>';
       
   342             $('#'+field_id).val(href);
       
   343             $('#'+field_id+'_media').remove();
       
   344             $('#'+field_id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+field_id+'_media" />');
       
   345             $('#'+field_id+'_media').append(btnContent).slideDown();
       
   346             OT_UI.fix_upload_parent();
       
   347             tb_remove();
       
   348             window.clearInterval(intval);
       
   349             window.send_to_editor = backup;
       
   350           };
       
   351         }
       
   352         return false;
       
   353       });
       
   354     },
       
   355     init_upload_remove: function() {
       
   356       $('.option-tree-ui-remove-media').live('click', function(event) {
       
   357         event.preventDefault();
       
   358         var agree = confirm(option_tree.remove_agree);
       
   359         if (agree) {
       
   360           OT_UI.remove_image(this);
       
   361           return false;
       
   362         }
       
   363         return false;
       
   364       });
       
   365     },
       
   366     init_upload_fix: function(elm) {
       
   367       var id  = $(elm).attr('id'),
       
   368           val = $(elm).val(),
       
   369           img = $(elm).parent().next('option-tree-ui-media-wrap').find('img'),
       
   370           src = img.attr('src'),
       
   371           btnContent = '';
       
   372       if ( val != src ) {
       
   373         img.attr('src', val);
       
   374       }
       
   375       if ( val !== '' && ( typeof src == 'undefined' || src == false ) && OT_UI.url_exists(val) ) {
       
   376         var image = /\.(?:jpe?g|png|gif|ico)$/i;
       
   377         if (val.match(image)) {
       
   378           btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+val+'" alt="" /></div>';
       
   379         }
       
   380         btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button red light" title="'+option_tree.remove_media_text+'"><span class="icon trash-can">'+option_tree.remove_media_text+'</span></a>';
       
   381         $('#'+id).val(val);
       
   382         $('#'+id+'_media').remove();
       
   383         $('#'+id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+id+'_media" />');
       
   384         $('#'+id+'_media').append(btnContent).slideDown();
       
   385       } else if ( val == '' || ! OT_UI.url_exists(val) ) {
       
   386         $(elm).parent().next('.option-tree-ui-media-wrap').remove();
       
   387       }
       
   388     },
       
   389     init_numeric_slider: function() {
       
   390       $(".ot-numeric-slider-wrap").each(function() {
       
   391         var hidden = $(".ot-numeric-slider-hidden-input", this),
       
   392             value  = hidden.val(),
       
   393             helper = $(".ot-numeric-slider-helper-input", this);
       
   394         if ( ! value ) {
       
   395           value = hidden.data("min");
       
   396           helper.val(value)
       
   397         }
       
   398         $(".ot-numeric-slider", this).slider({
       
   399           min: hidden.data("min"),
       
   400           max: hidden.data("max"),
       
   401           step: hidden.data("step"),
       
   402           value: value, 
       
   403           slide: function(event, ui) {
       
   404             hidden.add(helper).val(ui.value);
       
   405           }
       
   406         });
       
   407       });
       
   408     },
       
   409     init_tabs: function() {
       
   410       $(".wrap.settings-wrap .ui-tabs").tabs({ 
       
   411         fx: { 
       
   412           opacity: "toggle", 
       
   413           duration: "fast"
       
   414         }
       
   415       });
       
   416       $(".wrap.settings-wrap .ui-tabs a.ui-tabs-anchor").on("click", function(event, ui) {
       
   417         var obj = "input[name='_wp_http_referer']";
       
   418         if ( $(obj).length > 0 ) {
       
   419           var url = $(obj).val(),
       
   420               hash = $(this).attr('href');
       
   421           if ( url.indexOf("#") != -1 ) {
       
   422             var o = url.split("#")[1],
       
   423                 n = hash.split("#")[1];
       
   424             url = url.replace(o, n);
       
   425           } else {
       
   426             url = url + hash;
       
   427           }
       
   428           $(obj).val(url);
       
   429         }
       
   430       });
       
   431     },
       
   432     init_radio_image_select: function() {
       
   433       $('.option-tree-ui-radio-image').live('click', function() {
       
   434         $(this).closest('.type-radio-image').find('.option-tree-ui-radio-image').removeClass('option-tree-ui-radio-image-selected');
       
   435         $(this).toggleClass('option-tree-ui-radio-image-selected');
       
   436         $(this).parent().find('.option-tree-ui-radio').attr('checked', true);
       
   437       });
       
   438     },
       
   439     init_select_wrapper: function() {
       
   440       $('.option-tree-ui-select').each(function () {
       
   441         if ( ! $(this).parent().hasClass('select-wrapper') ) {
       
   442           $(this).wrap('<div class="select-wrapper" />');
       
   443           $(this).parent('.select-wrapper').prepend('<span>' + $(this).find('option:selected').text() + '</span>');
       
   444         }
       
   445       });
       
   446       $('.option-tree-ui-select').live('change', function () {
       
   447         $(this).prev('span').replaceWith('<span>' + $(this).find('option:selected').text() + '</span>');
       
   448       });
       
   449       $('.option-tree-ui-select').bind($.browser.msie ? 'click' : 'change', function(event) {
       
   450         $(this).prev('span').replaceWith('<span>' + $(this).find('option:selected').text() + '</span>');
       
   451       });
       
   452     },
       
   453     bind_colorpicker: function(field_id) {
       
   454       $('#'+field_id).ColorPicker({
       
   455         onSubmit: function(hsb, hex, rgb) {
       
   456           $('#'+field_id).val('#'+hex);
       
   457         },
       
   458         onBeforeShow: function () {
       
   459           $(this).ColorPickerSetColor(this.value);
       
   460           return false;
       
   461         },
       
   462         onChange: function (hsb, hex, rgb) {
       
   463           var bc = $.inArray(hex, [ 'FFFFFF', 'FFF', 'ffffff', 'fff' ]) != -1 ? 'ccc' : hex;
       
   464           $('#cp_'+field_id).css({'backgroundColor':'#'+hex,'borderColor':'#'+bc});
       
   465           $('#cp_'+field_id).prev('input').attr('value', '#'+hex);
       
   466         }
       
   467       })  
       
   468       .bind('keyup', function(){
       
   469         $(this).ColorPickerSetColor(this.value);
       
   470       });
       
   471     },
       
   472     fix_upload_parent: function() {
       
   473       $('.option-tree-ui-upload-input').live('focus blur', function(){
       
   474         $(this).parent('.option-tree-ui-upload-parent').toggleClass('focus');
       
   475         OT_UI.init_upload_fix(this);
       
   476       });
       
   477     },
       
   478     remove_image: function(e) {
       
   479       $(e).parent().parent().find('.option-tree-ui-upload-input').attr('value','');
       
   480       $(e).parent('.option-tree-ui-media-wrap').remove();
       
   481     },
       
   482     fix_colorpicker: function() {
       
   483       $('.cp_input').live('blur', function() {
       
   484         $('.cp_input').each( function(index, el) {
       
   485           var val = $(el).val();
       
   486           var reg = /^[A-Fa-f0-9]{6}$/;
       
   487           if( reg.test(val) && val != '' ) { 
       
   488             $(el).attr('value', '#'+val)
       
   489           } else if ( val == '' ) {
       
   490             $(this).next('.cp_box').css({'background':'#f1f1f1','border-color':'#ccc'});
       
   491           }
       
   492         });
       
   493       });
       
   494     },
       
   495     fix_textarea: function() {
       
   496       $('.wp-editor-area').focus( function(){
       
   497         $(this).parent('div').css({borderColor:'#bbb'});
       
   498       }).blur( function(){
       
   499         $(this).parent('div').css({borderColor:'#ccc'});
       
   500       });
       
   501     },
       
   502     replicate_ajax: function() {
       
   503       if (location.href.indexOf("#") != -1) {
       
   504         var url = $("input[name=\'_wp_http_referer\']").val(),
       
   505             hash = location.href.substr(location.href.indexOf("#"));
       
   506         $("input[name=\'_wp_http_referer\']").val( url + hash );
       
   507         this.scroll_to_top();
       
   508       }
       
   509       setTimeout( function() {
       
   510         $(".wrap.settings-wrap .fade").fadeOut("fast");
       
   511       }, 3000 );
       
   512     },
       
   513     reset_settings: function() {
       
   514       $(".reset-settings").live("click", function(event){
       
   515         var agree = confirm(option_tree.reset_agree);
       
   516         if (agree) {
       
   517           return true;
       
   518         } else {
       
   519           return false;
       
   520         }
       
   521         event.preventDefault();
       
   522       });
       
   523     },
       
   524     url_exists: function(url) {
       
   525       var http = new XMLHttpRequest();
       
   526       http.open('HEAD', url, false);
       
   527       http.send();
       
   528       return http.status!=404;
       
   529     },
       
   530     scroll_to_top: function() {
       
   531       setTimeout( function() {
       
   532         $(this).scrollTop(0);
       
   533       }, 50 );
       
   534     }
       
   535   };
       
   536   $(document).ready( function() {
       
   537     OT_UI.init();
       
   538   });
       
   539 })(jQuery);