1(function(_, $) { 2 3 (function($){ 4 5 function _getTabTools(id) 6 { 7 return $('.cm-tab-tools[id^="tools_' + id + '"]'); 8 } 9 10 function _getTabIds(id) 11 { 12 var result_ids = ['content_' + id]; 13 var additional_ids = $('#content_' + id).data('caTabTargetId'); 14 if (additional_ids) { 15 result_ids.push(additional_ids); 16 } 17 _getTabTools(id).each(function() { 18 result_ids.push($(this).prop('id')); 19 }); 20 21 return result_ids.join(','); 22 } 23 24 function _switchTab(tab_id, tabs_elm, show) 25 { 26 var id_obj = $('#content_' + tab_id); 27 var tab_tools = _getTabTools(tab_id); 28 29 if (show) { 30 id_obj.removeClass('hidden'); 31 tab_tools.removeClass('hidden'); 32 33 if (id_obj.hasClass('cm-hide-save-button')) { 34 $('.cm-save-buttons').addClass('hidden'); 35 } else { 36 $('.cm-save-buttons').removeClass('hidden'); 37 } 38 39 var editors = $(id_obj).find('textarea.cm-wysiwyg'); 40 if (editors.length) { 41 editors.each(function(){ 42 $(this).ceEditor('destroy'); 43 $(this).ceEditor('recover'); 44 }); 45 } 46 47 $.ceEvent('trigger', 'ce.tab.show', [tab_id, tabs_elm]); 48 } else { 49 id_obj.addClass('hidden'); 50 tab_tools.addClass('hidden'); 51 } 52 53 return true; 54 } 55 56 function _cloneTools(tab_id, prev_id) 57 { 58 if (!tab_id || !prev_id) { 59 return; 60 } 61 62 var _prev_tools = _getTabTools(prev_id); 63 _prev_tools.each(function() { 64 var self = $(this); 65 var _new_id = self.prop('id').replace(prev_id, tab_id); 66 67 if (!$('#' + _new_id).length) { 68 var _new_tool = self.clone(); 69 _new_tool.children().remove(); 70 _new_tool.prop('id', _new_id).addClass('hidden').appendTo(self.parent()); 71 } 72 }); 73 74 } 75 76 var methods = { 77 switch: function(tab_id) { 78 if (!tab_id) { 79 return false; 80 } 81 82 var tabs_elm = $(this); 83 var ul = tabs_elm.data('ceTabs').ul; 84 var elm = tabs_elm.data('ceTabs').tabs[tab_id]; 85 86 if (!ul || !elm) { 87 return false; 88 } 89 90 // we set selected_section to keep active tab opened after form submit 91 // we do it for all forms to fix settings_dev situation: forms under tabs 92 if ($(tabs_elm).hasClass('cm-track')) { 93 $('input[name=selected_section]').val(tab_id); 94 } 95 96 if (elm.hasClass('cm-js') == false) { 97 return false; 98 } 99 100 var active_id = $('li.active:first', ul).prop('id'); 101 var content_id = 'content_' + tab_id; 102 103 $('li', ul).each(function() { 104 var self = $(this); 105 self.removeClass('active'); 106 _switchTab(self.prop('id'), tabs_elm, false); 107 }); 108 109 //Select clicked tab and show content 110 elm.addClass('active'); 111 var sub_tab = elm.parents('.cm-subtabs', ul); 112 113 if (sub_tab.length && elm.hasClass('cm-no-highlight')) { 114 sub_tab.addClass('active'); 115 } 116 117 if (elm.hasClass('cm-ajax-onclick') && !elm.hasClass('cm-ajax-onclick-active')) { 118 $.ceAjax('request', $('a', elm).prop('href'), {result_ids: _getTabIds(tab_id), callback: function (data){ 119 _switchTab(tab_id, tabs_elm, true); 120 }}); 121 elm.addClass('cm-ajax-onclick-active'); 122 return true; 123 } 124 125 if (elm.hasClass('cm-ajax-onclick-active')) { 126 _switchTab(tab_id, tabs_elm, true); 127 return true; 128 } 129 130 if (elm.hasClass('cm-ajax') && $('#' + content_id).length == 0) { 131 // Create tab content if it is not exist 132 tabs_elm.after('<div id="' + content_id + '"></div>'); 133 134 _cloneTools(tab_id, active_id); 135 $.ceAjax('request', $('a', elm).prop('href'), {result_ids: _getTabIds(tab_id), callback: function (data){ 136 _switchTab(tab_id, tabs_elm, true); 137 }}); 138 } else { 139 _switchTab(tab_id, tabs_elm, true); 140 } 141 142 return true; 143 }, 144 init: function() { 145 $(this).each(function() { 146 var tabs_elm = $(this); 147 148 $.ceEvent('trigger', 'ce.tab.pre_init', [tabs_elm]); 149 150 //Setup Tabs 151 var ul = $('ul:first', tabs_elm); 152 var list = $('li', ul); 153 154 var data = { 155 ul: ul, 156 tabs: {} 157 }; 158 159 list.each(function () { 160 var elm = $(this); 161 var tab_id = elm.prop('id'); 162 163 data.tabs[tab_id] = elm; 164 }); 165 166 tabs_elm.data('ceTabs', data); 167 168 list.on('click', function (e) { 169 var elm = $(this); 170 var tab_id = elm.prop('id'); 171 172 if (tabs_elm.ceTabs('switch', tab_id)) { 173 e.preventDefault(); 174 } 175 176 return true; 177 }); 178 179 //Select default tab 180 var test; 181 if ((test = list.filter('.active')).length) { 182 test.trigger('click'); //Select tab with class 'active' 183 } else { 184 test = list.filter(':first').trigger('click'); //Select first tab 185 } 186 187 // create similar active tab tools 188 var active_id = test.prop('id'); 189 190 $('li.cm-ajax.cm-js').each(function(){ 191 var self = $(this); 192 var tab_id = self.prop('id'); 193 194 // Check if the active content needs to be loaded 195 if (self.hasClass('active')) { 196 content = $('#content_' + tab_id).html().replace(/<!--.*?-->/, '').replace(/(^\s+|\s+$)/, ''); 197 if (content.length) { 198 return true; 199 } 200 } 201 202 if (!self.data('passed') && $('a', self).prop('href')) { 203 self.data('passed', true); 204 var id = 'content_' + tab_id; 205 // Check if block already exists 206 var block = $('#' + id); 207 208 if (!block.length) { 209 self.parents('.cm-j-tabs').eq(0).next().prepend('<div id="' + id + '"></div>'); 210 block = $('#' + id); 211 } 212 213 if (!self.hasClass('active')) { 214 block.addClass('hidden'); 215 } 216 217 _cloneTools(tab_id, active_id); 218 if (!self.hasClass('cm-ajax-onclick')) { 219 $.ceAjax('request', $('a', self).prop('href'), { 220 result_ids: _getTabIds(tab_id), 221 hidden: true, 222 repeat_on_error: true 223 }); 224 } 225 } 226 }); 227 228 return true; 229 }); 230 231 $.ceEvent('trigger', 'ce.tab.init'); 232 233 } 234 }; 235 236 $.fn.ceTabs = function(method) { 237 if (methods[method]) { 238 return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 239 } else if ( typeof method === 'object' || ! method ) { 240 return methods.init.apply(this, arguments); 241 } else { 242 $.error('ty.tabs: method ' + method + ' does not exist'); 243 } 244 }; 245 246 })($); 247 248}(Tygh, Tygh.$));
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.