comparison webapp/src/main/webapp/jquery/jquery.digilib.regions.js @ 1141:bbb09797d7fc

better search autocompletion; better colors
author hertzhaft
date Sat, 17 Nov 2012 01:20:55 +0100
parents 3b5968aeefac
children
comparison
equal deleted inserted replaced
1140:50d6eaa74b4b 1141:bbb09797d7fc
315 // find a region by text data and higlight it 315 // find a region by text data and higlight it
316 findData : function (data) { 316 findData : function (data) {
317 var $elem = data.$elem; 317 var $elem = data.$elem;
318 var findSelector = '#'+CSS+'regionFindData'; 318 var findSelector = '#'+CSS+'regionFindData';
319 if (fn.isOnScreen(data, findSelector)) return; // already onscreen 319 if (fn.isOnScreen(data, findSelector)) return; // already onscreen
320 var textOptions = getTextOptions(data, 'regionHTML'); 320 var options = filteredOptions(data, 'regionHTML');
321 var html = '\ 321 var html = '\
322 <div id="'+CSS+'regionFindData" class="'+CSS+'keep '+CSS+'regionInfo">\ 322 <div id="'+CSS+'regionFindData" class="'+CSS+'keep '+CSS+'regionInfo">\
323 <div>text to find:</div>\ 323 <div>Find object:</div>\
324 <form class="'+CSS+'form">\ 324 <form class="'+CSS+'form">\
325 <div>\ 325 <div>\
326 <select class="'+CSS+'finddata">\ 326 <select class="'+CSS+'finddata">\
327 <option/>\ 327 <option/>\
328 '+textOptions+'\ 328 '+options+'\
329 </select>\ 329 </select>\
330 </div>\ 330 </div>\
331 <input class="'+CSS+'input" name="data" type="text" size="30" /> \ 331 <input class="'+CSS+'input" name="data" type="text" size="30" /> \
332 <input class="'+CSS+'submit" type="submit" name="sub" value="Ok"/>\ 332 <input class="'+CSS+'submit" type="submit" name="sub" value="Ok"/>\
333 <input class="'+CSS+'cancel" type="button" value="Cancel"/>\ 333 <input class="'+CSS+'cancel" type="button" value="Cancel"/>\
345 fn.withdraw($info); 345 fn.withdraw($info);
346 actions.highlightRegions(data, id); 346 actions.highlightRegions(data, id);
347 return false; 347 return false;
348 }; 348 };
349 // adapt dropdown, show only matching entries 349 // adapt dropdown, show only matching entries
350 var filterOptions = function (text) { 350 var filterOptions = function (filter) {
351 if (!text) { 351 var options = filteredOptions(data, 'regionHTML', filter);
352 // not text, display all options, select first (empty) 352 $select.empty();
353 // $options.show(); 353 $select.append($(options));
354 $select.prop("selectedIndex", 0);
355 return;
356 }
357 var first = true;
358 $options.each(function (index) {
359 var $option = $(this);
360 // TODO: more sophisticated matching
361 if (matchText($option.text(), text)) {
362 $option.show();
363 if (first) {
364 $select.prop("selectedIndex", index);
365 first = false;
366 }
367 } else {
368 if (index > 0) $option.hide();
369 }
370 if (first) { // no hit, display and select empty option
371 $select.prop("selectedIndex", 0);
372 }
373 });
374 }; 354 };
375 // handle submit 355 // handle submit
376 $form.on('submit', findRegion); 356 $form.on('submit', findRegion);
377 $select.on('change', findRegion); 357 $select.on('change', findRegion);
378 $input.on('keyup', function (event) { 358 $input.on('keyup', function (event) {
390 fn.centerOnScreen(data, $info); 370 fn.centerOnScreen(data, $info);
391 $input.focus(); 371 $input.focus();
392 } 372 }
393 }; 373 };
394 374
395 // match search text
396 var matchText = function (optiontext, text) {
397 // sanitize and split
398 var parts = text.replace(/([\\\(\)\-\!.+?*])/g, '\\$1').split(/\s+/);
399 // match all parts anywhere in optiontext
400 var regexparts = $.map(parts, function(part) {
401 return '(?=.*'+part+')'; // one lookahead for each part
402 });
403 var RE = new RegExp(regexparts.join(''), 'i');
404 var result = optiontext.match(RE);
405 return result;
406 };
407
408 // make a coords string 375 // make a coords string
409 var packCoords = function (rect, sep) { 376 var packCoords = function (rect, sep) {
410 if (sep == null) sep = ','; // comma as default separator 377 if (sep == null) sep = ','; // comma as default separator
411 return [ 378 return [
412 fn.cropFloatStr(rect.x), 379 fn.cropFloatStr(rect.x),
550 var getRegions = function (data, selector) { 517 var getRegions = function (data, selector) {
551 var $regions = data.$elem.find('div.'+CSS+selector); 518 var $regions = data.$elem.find('div.'+CSS+selector);
552 return $regions; 519 return $regions;
553 }; 520 };
554 521
522 // create a filter text matcher
523 var getFilterRE = function (filter) {
524 if (!filter) return null;
525 // sanitize and split
526 var parts = filter.replace(/([\\\(\)\-\!.+?*])/g, '\\$1').split(/\s+/);
527 // match all parts anywhere in optiontext
528 var regexparts = $.map(parts, function(part) {
529 // one lookahead for each filter part
530 return '(?=.*'+part+')';
531 });
532 var RE = new RegExp(regexparts.join(''), 'i');
533 return RE;
534 };
535
555 // make HTML option from regions text data 536 // make HTML option from regions text data
556 var getTextOptions = function (data, selector) { 537 var filteredOptions = function (data, selector, filter) {
557 var sortfunc = data.settings.regionSortString;
558 var options = []; 538 var options = [];
539 var sort = data.settings.regionSortString;
540 var RE = getFilterRE(filter);
559 var createOption = function (index, region) { 541 var createOption = function (index, region) {
560 var $region = $(region); 542 var $region = $(region);
561 var rect = $region.data('rect'); 543 var rect = $region.data('rect');
562 if (rect == null) 544 if (rect == null) return;
563 return null;
564 // var coords = packCoords(rect, ','); 545 // var coords = packCoords(rect, ',');
565 var id = $region.attr('id');
566 var text = $region.data('text'); 546 var text = $region.data('text');
567 var sortstring = $region.data('sort') 547 if (RE == null || text.match(RE)) {
568 || (typeof sortfunc === 'function') 548 var id = $region.attr('id');
569 ? sortfunc(text) 549 var sortstring = $region.data('sort')
570 : text; 550 || (typeof sort === 'function')
571 var option = '<option value="'+id+'">'+text+'</option>'; 551 ? sort(text)
572 options.push([sortstring, option]); 552 : text;
553 var option = '<option value="'+id+'">'+text+'</option>';
554 options.push([sortstring, option]);
555 }
573 }; 556 };
574 var $regions = getRegions(data, selector); 557 var $regions = getRegions(data, selector);
575 $.each($regions, createOption); 558 $.each($regions, createOption);
576 options.sort(function (a, b) { 559 options.sort(function (a, b) {
577 return a[0].localeCompare(b[0]); 560 return a[0].localeCompare(b[0]);