1kaka = function () { 2 var self = this; 3 self.init = function (container) { 4 self.bindPlugin(container); 5 self.bindSelectorSearchFallback(); 6 $('[data-toggle=tooltip]').mouseover(function () { 7 // åå§å tooltip 8 $(this).tooltip(); 9 // ç¶ååè°ç¨ show æ¹æ³ 10 $(this).tooltip('show'); 11 }); 12 } 13 self.bindSelectorSearchFallback = function () { 14 var runSelectorSearch = function (form, event) { 15 if (event) { 16 event.preventDefault(); 17 event.stopPropagation(); 18 } 19 20 if (form.id === 'content-selector-search-form' && $.contentSelectorSubmit) { 21 return $.contentSelectorSubmit(form, event); 22 } 23 if (form.id === 'image-selector-search-form' && $.imageSelectorSubmit) { 24 return $.imageSelectorSubmit(form, event); 25 } 26 if (form.id === 'content-selector-search-form' && $.contentSelectorQuery) { 27 $.contentSelectorQuery(form); 28 return false; 29 } 30 if (form.id === 'image-selector-search-form' && $.imageSelectorQuery) { 31 $.imageSelectorQuery(form); 32 return false; 33 } 34 35 var modal = $(form).closest('#resource-selector, #img-selector'); 36 var ajaxBody = modal.find('.js-ajax-body'); 37 var ajaxUrl = modal.data('selectorSearchUrl'); 38 if (!ajaxUrl || !ajaxBody.length) { 39 return false; 40 } 41 42 var q = $(form).find('[name=q]').val() || ''; 43 ajaxBody.load(ajaxUrl + '&page=1&q=' + encodeURIComponent(q)); 44 return false; 45 }; 46 47 $(document).off('submit.kakaSelectorSearch', '#resource-selector form, #img-selector form') 48 .on('submit.kakaSelectorSearch', '#resource-selector form, #img-selector form', function (event) { 49 return runSelectorSearch(this, event); 50 }); 51 52 $(document).off('click.kakaSelectorSearch', '#resource-selector form button[type="submit"], #img-selector form button[type="submit"]') 53 .on('click.kakaSelectorSearch', '#resource-selector form button[type="submit"], #img-selector form button[type="submit"]', function (event) { 54 return runSelectorSearch(this.form, event); 55 }); 56 } 57 self.bindPlugin = function (container) { 58 // å¤ç data-plugin çå ç´ 59 $('[data-plugin]', container).each(function () { 60 var el = $(this); 61 var data = el.data(); 62 var pluginName = data.plugin; 63 64 // å°æä»¶å称转æ¢ä¸º camelCase 65 var funcName = pluginName.replace(/-([a-z])/g, function (g) { 66 return g[1].toUpperCase(); 67 }); 68 69 // æ£æ¥å½æ°æ¯å¦åå¨äº self å¯¹è±¡ä¸ 70 var func = self[funcName]; 71 if (typeof func === 'function') { 72 func(el, data); 73 } 74 }); 75 76 // å¤ç data-selected çå ç´ 77 $('[data-selected]').each(function () { 78 var $this = $(this); 79 var selectedValue = $this.data('selected'); 80 81 $this.find('option').each(function () { 82 var $option = $(this); 83 if ($option.val() == selectedValue) { 84 $option.prop('selected', true); 85 } 86 }); 87 }); 88 }; 89 90 self.validator = function (el, opts) { 91 seajs.use(['/assets/js/kaka/libs/kaka.validator.js'], 92 function () { 93 new kakaValidator(el, opts); 94 }); 95 } 96 self.datetimePicker = function (el, opts) { 97 $(el).data('type', 'datetime'); 98 self.datePicker(el, opts); 99 } 100 self.datePicker = function (el, opts) { 101 seajs.use(['/assets/js/kaka/libs/datetime/bootstrap-datetimepicker.min.js', 102 '/assets/js/kaka/libs/datetime/css/bootstrap-datetimepicker.min.css' 103 ], 104 function () { 105 seajs.use(['/assets/js/kaka/libs/datetime/locales/bootstrap-datetimepicker.zh-CN.js'], 106 function () { 107 var defaults = { 108 format: 'yyyy/mm/dd', 109 language: 'zh-CN', 110 weekStart: 1, 111 todayBtn: 1, 112 autoclose: 1, 113 minView: 2, 114 todayHighlight: 1, 115 startView: 2, 116 forceParse: 0, 117 showMeridian: 0 118 }; 119 opts = $.extend(true, defaults, opts); 120 switch (opts.type) { 121 case 'datetime': 122 opts.format = 'yyyy/mm/dd hh:ii'; 123 opts.minView = 0; 124 opts.minuteStep = 5; 125 break; 126 case 'datehour': 127 opts.format = 'yyyy/mm/dd hh:00'; 128 opts.minView = 1; 129 break; 130 } 131 $(el).datetimepicker(opts); 132 }); 133 }); 134 } 135 self.chkGroup = function (el, opts) { 136 var $el = $(el); 137 138 // å¤çå ¨éå¤éæ¡çç¹å»äºä»¶ 139 $el.find('[role=chk-all]').off('click').on('click', function () { 140 var isChecked = $(this).is(":checked"); 141 $el.find('[role=chk-item]').prop('checked', isChecked); 142 }); 143 144 // å¤çå个å¤éæ¡çç¹å»äºä»¶ 145 $el.find('[role=chk-item]').off('click').on('click', function () { 146 var allChecked = $el.find('[role=chk-item]').length === $el.find('[role=chk-item]:checked').length; 147 $el.find('[role=chk-all]').prop('checked', allChecked); 148 }); 149 }; 150 151 152 self.codeEditor = function (el, opts) { 153 var mode = $(el).data('mode'); 154 el.hide(); 155 seajs.use(['/assets/js/kaka/libs/ace/ace.sea.js'], 156 function (ace) { 157 var domId = 'ace-' + $(el).index(); 158 var editorDom = '<div class="ace-editor-wrap" style="height:400px"><div class="form-control" id="' + domId + '" style="height:100%; font-size:13px"></div></div>'; 159 $(editorDom).insertAfter(el); 160 var editor = ace.edit(domId); 161 editor.getSession().setValue($(el).val()); 162 editor.getSession().setMode('ace/mode/' + mode); 163 editor.getSession().on('change', 164 function (e) { 165 var val = editor.getSession().getValue(); 166 $(el).val(val); 167 }); 168 editor.commands.addCommand({ 169 name: "fullscreen", 170 bindKey: { 171 win: "Ctrl-Enter", 172 mac: "Command-Enter" 173 }, 174 exec: function (editor) { 175 var vp = $('body'); 176 var div = $(el).siblings('.ace-editor-wrap'); 177 if (editor.isFullScreen) { 178 div.css('position', 'static'); 179 div.css('height', '360px'); 180 div.css('z-index', '1'); 181 editor.resize(); 182 editor.isFullScreen = false;
183 } else { 184 div.css('position', 'fixed'); 185 div.css('left', '0px'); 186 div.css('right', '0px'); 187 div.css('top', '0px'); 188 div.css('bottom', '0px'); 189 div.css('height', 'auto'); 190 div.css('z-index', '9999999'); 191 editor.resize(); 192 editor.isFullScreen = true; 193 } 194 } 195 }); 196 }); 197 } 198 199 self.resourceSelector = function (el, opts) { 200 var id = 'resource-selector'; 201 var limit = $(el).data('limit'); 202 var idx = $(el).index(); 203 var ipt = $(el).data('ipt'); 204 var ref = $(el).data('ref') ? $(el).data('ref') : 0; 205 var dom = $('[data-ipt="' + ipt + '"]>.sui-selector-box'); 206 var url = '/?module=admincp&controller=content&action=selector&ipt=' + ipt + '&ref=' + ref + '&limit=' + limit + '&idx=' + idx; 207 var ajaxUrl = '/?module=admincp&controller=content&action=selector&aj=1&ref=' + ref; 208 var val = $('[data-ipt="' + ipt + '"]>.sui-selector-value').html(); 209 210 var refreshResourceInputs = function (DOM, ipt) { 211 $('.js-item', DOM).each(function (index) { 212 $('input[data-field]', this).each(function () { 213 var field = $(this).data('field'); 214 $(this).attr('name', ipt + '[' + index + '][' + field + ']'); 215 }); 216 }); 217 } 218 219 var getResourceIds = function (DOM) { 220 var ids = {}; 221 $('.js-item', DOM).each(function () { 222 var id = $(this).data('id'); 223 if (id !== undefined && id !== null && id !== '') { 224 ids[String(id)] = true; 225 } 226 }); 227 return ids; 228 } 229 230 var bindResourceEvents = function (DOM, ipt) { 231 $('.js-del-item', DOM).off('click.resourceSelector').on('click.resourceSelector', 232 function () { 233 $(this).parents('.js-item').remove(); 234 refreshResourceInputs(DOM, ipt); 235 }); 236 } 237 238 $.applyResource = function (files, ipt, DOM, append) { 239 if (typeof files == 'string') { 240 var files = [{ 241 id: 0, 242 src: files, 243 alt: '' 244 }]; 245 } 246 if (!append) { 247 $(DOM).empty(); 248 } 249 250 var exists = append ? getResourceIds(DOM) : {}; 251 for (var x in files) { 252 var file = files[x]; 253 if (append && file.id !== undefined && file.id !== null && exists[String(file.id)]) { 254 continue; 255 } 256 exists[String(file.id)] = true; 257 var tpl = '<div class="js-item img-item" data-id="' + file.id + '" data-thumb="' + file.thumb + '" data-title="' + file.title + '" data-summary="' + file.summary + '">' + '<div class="box">' + '<input type="hidden" data-field="id" name="" value="' + file.id + '">' + '<input type="hidden" data-field="thumb" name="" value="' + file.thumb + '">' + '<input type="hidden" data-field="title" name="" value="' + file.title + '">' + '<input type="hidden" data-field="summary" name="" value="' + file.summary + '">' + '<a class="thumb" title="' + (file.title ? file.title : '') + '">' + (file.thumb ? '<img src="' + file.thumb + '">' : file.title) + '</a>' + '<div class="title cutstr">' + (file.title) + '</div>' + '<div class="summary">' + (file.summary) + '</div>' + '<div class="operate">' + '<a href="javascript:;" class="js-del-item">' + '<i class="fa fa-remove"></i> ç§»é¤</a>' + '</div></div></div>'; 258 $(DOM).append(tpl); 259 } 260 refreshResourceInputs(DOM, ipt); 261 bindResourceEvents(DOM, ipt); 262 seajs.use(['/assets/js/kaka/libs/dragsort/jquery.dragsort-0.5.2.js'], 263 function (dragsort) { 264 $(DOM).dragsort("destroy"); 265 $(DOM).dragsort({ 266 placeHolderTemplate: "<div class='img-item'></div>", 267 dragEnd: function () {
268 refreshResourceInputs(DOM, ipt); 269 } 270 }); 271 }); 272 } 273 if (val) { 274 $.applyResource(eval('(' + val + ')'), ipt, dom); 275 } 276 $('[role="btn"]', el).unbind('click'); 277 $('[role="btn"]', el).bind('click', 278 function () { 279 $('#' + id).remove(); 280 $('body').append('<div class="modal fade" id="' + id + '" tabindex="-1" role="dialog" aria-hidden="false"></div>'); 281 $('#' + id).data('selectorSearchUrl', ajaxUrl); 282 $('#' + id).load(url, 283 function () { 284 $('#' + id).modal("show"); 285 $('#' + id).find('.btn-ok').click(function () { 286 var selectedResources = $.contentSelectorGetSelected ? $.contentSelectorGetSelected() : []; 287 $.applyResource(selectedResources, ipt, dom, limit > 1); 288 }); 289 }) 290 }); 291 } 292 293 self.imgSelector = function (el, opts) { 294 var id = 'img-selector'; 295 var limit = $(el).data('limit'); 296 var name = $(el).data('name') ? $(el).data('name') : ''; // *** 297 var idx = $(el).index(); 298 var ipt = $(el).data('ipt'); 299 var ref = $(el).data('ref') ? $(el).data('ref') : 0; 300 var dom = $('.sui-selector-box', el).first(); 301 if (!dom.length) { 302 dom = $('[data-ipt="' + ipt + '"]>.sui-selector-box').first(); 303 } 304 if (!dom.length) { 305 dom = $('<div class="sui-selector-box"></div>'); 306 var btns = $('.sui-selector-btns', el).first(); 307 if (btns.length) { 308 dom.insertBefore(btns); 309 } else { 310 $(el).append(dom); 311 } 312 } 313 var url = '/?module=admincp&controller=image&action=selector&ipt=' + ipt + '&ref=' + ref + '&limit=' + limit + '&idx=' + idx + '&name=' + name; // ***è¿éæ·»äºname 314 var ajaxUrl = '/?module=admincp&controller=image&action=selector&aj=1&ref=' + ref; 315 var val = $('.sui-selector-value', el).html(); 316 317 var getSelectedImages = function (modal) { 318 var selectedImages = $.imageSelectorGetSelected ? $.imageSelectorGetSelected() : []; 319 if (selectedImages.length) { 320 return selectedImages; 321 } 322 323 return modal.find('.js-ajax-body dl.selected').map(function () { 324 var item = $(this); 325 return { 326 id: item.data('id'), 327 src: item.data('src'), 328 alt: item.data('name') || '' 329 }; 330 }).get(); 331 }; 332 333 $.applyImage = function (file, ipt, DOM) { 334 var _src = file; 335 var _pdfTitle = ''; 336 337 if (file) { 338 var pdfArr = file.split(','); 339 _pdfTitle = pdfArr.map(function (x) { 340 var parts = x.split('/'); 341 return parts[parts.length - 1]; 342 }).join(', '); 343 } 344 345 var tpl = ` 346 <input type="hidden" name="${ipt}" value="${file}" /> 347 <a class="img-preview"> 348 <img src="${_src}" data-test="1" role="btn" /> 349 </a> 350 <div class="file_title" style="text-align:center;margin-bottom:20px;font-size:14px;color:#333;"> 351 ${_pdfTitle} 352 </div> 353 <a class="js-del-item img-remove" href="javascript:;"> 354 <i class="fa fa-remove"></i> <span>ç§»é¤</span> 355 </a>`; 356 357 $(DOM).html(tpl); 358 $(DOM).siblings('.sui-selector-value').html(file || ''); 359 360 $(DOM).find('.js-del-item').on('click', function (event) { 361 $(DOM).empty().html(`<input type="hidden" name="${ipt}" value="" />`); 362 $(DOM).siblings('.sui-selector-value').html(''); 363 event.stopPropagation(); 364 }); 365 }; 366 $.applyImages = function (files, ipt, DOM) { 367 if (typeof files == 'string') { 368 var files = [{ 369 id: 0, 370 src: files, 371 alt: '' 372 }]; 373 } 374 $(DOM).empty(); 375 $(DOM).siblings('.sui-selector-value').html(JSON.stringify(files)); 376 for (x in files) { 377 var file = files[x]; 378 var tpl = '<div class="js-item img-item">' + '<div class="alt">
378' + '<input type="hidden" name="' + ipt + '[' + x + '][id]" value="' + file.id + '">' + '<input type="hidden" name="' + ipt + '[' + x + '][src]" value="' + file.src + '">' + '<textarea name="' + ipt + '[' + x + '][alt]" value="' + file.alt + '" rows="2" class="form-control" placeholder="请è¾å ¥å¾ç说æ">' + (file.alt ? file.alt : '') + '</textarea>' + '<a href="javascript:;$(\'.alt\',\'.js-item\').hide();" class="btn btn-primary btn-xs">ç¡®å®</a>' + '</div>' + '<a class="thumb" title="' + (file.alt ? file.alt : '') + '"><img src="' + file.src + '" data-id="' + file.id + '" alt="' + (file.alt ? file.alt : '') + '"></a>' + '<div class="operate">' + '<a href="javascript:;" class="js-del-item">' + '<i class="fa fa-remove"></i> ç§»é¤</a>' + '</div></div>'; 379 $(DOM).append(tpl); 380 } 381 $('.js-item', DOM).on('click', function (event) { 382 var el = $(this); 383 // åå§åææ½ï¼é¿å å½±åç¹å»äºä»¶çé»è¾ 384 seajs.use(['/assets/js/kaka/libs/dragsort/jquery.dragsort-0.5.2.js'], function (dragsort) { 385 $(DOM).dragsort("destroy"); 386 $(DOM).dragsort({ 387 placeHolderTemplate: "<div class='img-item place-holder'></div>", 388 dragEnd: function () { 389 $(DOM).find('.img-item').removeAttr('style'); 390 } 391 }); 392 }); 393 // æ¾ç¤º/éè .alt å ç´ 394 $('.alt', DOM).hide(); 395 $('.alt', el).show(); 396 // 黿¢ææ½æ¶è§¦åç mouseup äºä»¶ 397 $(document).mouseup(function (e) { 398 var _con = el; 399 if (!_con.is(e.target) && _con.has(e.target).length === 0) { 400 $('.alt', DOM).hide(); 401 } 402 }); 403 // 鲿¢äºä»¶å泡 404 event.stopPropagation(); 405 }); 406 $('.js-del-item', DOM).on('click', 407 function () { 408 $(this).parents('.js-item').remove(); 409 }); 410 } 411 if (val) { 412 if (limit > 1) { 413 $.applyImages(eval('(' + val + ')'), ipt, dom); 414 } else { 415 $.applyImage(val, ipt, dom); 416 } 417 } 418 $('[role="btn"]', el).unbind('click'); 419 $('[role="btn"]', el).bind('click', 420 function () { 421 $('#' + id).remove(); 422 $('body').append('<div class="modal fade" id="' + id + '" tabindex="-1" role="dialog" aria-hidden="false"></div>'); 423 $('#' + id).data('selectorSearchUrl', ajaxUrl); 424 $('#' + id).load(url, 425 function () { 426 $('#' + id).modal("show"); 427 $('#' + id).find('.btn-ok').click(function () { 428 var selectedImages = getSelectedImages($('#' + id)); 429 if (limit > 1) { 430 $.applyImages(selectedImages, ipt, dom); 431 } else if (selectedImages[0]) { 432 $.applyImage(selectedImages[0].src, ipt, dom); 433 } 434 }); 435 }) 436 }); 437 } 438 self.userSelector = function (el, opts) { 439 var id = 'user-selector'; 440 var role = $(el).data('role'); 441 var url = '/?module=admincp&controller=user&action=selector&role=' + role; 442 $('[role="btn"]', el).unbind('click'); 443 $('[role="btn"]', el).bind('click', 444 function () { 445 $('#' + id).remove(); 446 $('body').append('<div class="modal fade" id="' + id + '" tabindex="-1" role="dialog" aria-hidden="false"></div>'); 447 $('#' + id).load(url, 448 function () { 449 $('#' + id).modal("show"); 450 }); 451 }); 452 } 453 self.tagsinput = function (el, opts) { 454 seajs.use(['/assets/js/kaka/libs/tagsinput/bootstrap-typeahead.js', '/assets/js/kaka/libs/tagsinput/bootstrap-tagsinput.js', '/assets/js/kaka/libs/tagsinput/bootstrap-tagsinput.css'], 455 function () { 456 var remoteUrl = $(el).data('typeahead'); 457 if (remoteUrl) { 458 $(el).tagsinput({ 459 typeaheadjs: { 460 valueKey: 'value', 461 source: function (query, process) { 462 $.getJSON(remoteUrl, { 463 q: query 464 }, 465 function (data) { 466 process(data); 467 }); 468 } 469 } 470 }); 471 } else { 472 $(el).tagsinput(); 473 } 474 }); 475 } 476 self.dragsort = function (el, opts) { 477 seajs.use(['/assets/js/kaka/libs/dragsort/jquery.dragsort
477-0.5.2.js'], 478 function (dragsort) { 479 $(el).dragsort({ 480 dragSelectorExclude: "input, textarea, select, a, button", 481 dragSelector: 'tr', 482 }); 483 }); 484 } 485 self.chart = function (el, opts) { 486 seajs.use(['/assets/js/kaka/libs/highcharts/highcharts.js'], 487 function () { 488 var defaults = { 489 title: { 490 text: false 491 }, 492 chart: {}, 493 legend: {}, 494 credits: { 495 enabled: false 496 }, 497 yAxis: { 498 title: { 499 text: '' 500 }, 501 } 502 }; 503 opts = $.extend(true, defaults, opts); 504 if ($(el).attr('id')) { 505 var obj = $(el).attr('id'); 506 } else { 507 var obj = 'charts-' + $(el).index(); 508 $(el).attr('id', obj); 509 } 510 if (opts.series && opts.series.length == 1) { 511 } 512 Highcharts.chart(obj, opts); 513 }); 514 } 515 self.peity = function (el, opts) { 516 seajs.use(['/assets/js/kaka/libs/peity/peity.min.js'], 517 function () { 518 var defaults = { 519 width: $(el).css('width'), 520 height: $(el).css('height'), 521 } 522 opts = $.extend(true, defaults, opts); 523 $(el).peity(opts.type, opts); 524 }); 525 } 526 self.dmenu = function (el, opts) { 527 seajs.use(['/assets/js/kaka/libs/kaka.dmenu.js'], 528 function () { 529 var className = 'js-kaka-dmenu-' + $(el).index(); 530 $(el).hide().after('<div class="' + className + ' form-inline"></div>'); 531 if (opts.rows) { 532 var tpl = '<select size="' + (opts.rows) + '" class="form-control" style="margin-right:8px; width:200px"></select>'; 533 } else { 534 var tpl = '<select class="form-control form-control-select" style="margin-right:8px; width:200px"></select>'; 535 } 536 var defaults = { 537 htmlTpl: tpl, 538 script: opts.srv, 539 selected: $(opts.iptDom).val(), 540 firstText: opts.deftext ? opts.deftext : '主åç±»', 541 callback: function (el, data) { 542 $(el).val(data.id > 0 ? data.id : 0); 543 var path = new Array(); 544 $('.' + className + '>select').each(function () { 545 path.push($('option:selected', this).text()); 546 }); 547 $(opts.textDom).val(path.join(' > ')); 548 $(opts.iptDom).val(data.id); 549 } 550 } 551 opts = $.extend(true, defaults, opts); 552 new kakaDmenu('.' + className, opts); 553 }); 554 } 555 self.slider = function (el, opts) { 556 seajs.use(['/assets/js/kaka/libs/slider/bxslider.min.js'], 557 function () { 558 var defaults = { 559 'controls': false, 560 'pager': false, 561 'auto': true, 562 } 563 opts = $.extend(true, defaults, opts); 564 if (opts.min) { 565 opts.minSlides = opts.min; 566 } 567 if (opts.max) { 568 opts.maxSlides = opts.max; 569 } 570 if (opts.move) { 571 opts.moveSlides = opts.move; 572 } 573 return $(el).bxSlider(opts); 574 }); 575 } 576 self.explorer = function (el, opts) { 577 seajs.use(['/assets/js/kaka/libs/kaka.explorer.js?v=1.43'], 578 function () { 579 return new kakaExplorer(el, opts); 580 }); 581 } 582 self.init('body'); 583 return self; 584} 585var kaka = new kaka(); 586window.kaka = kaka;
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.