Mercurial > hg > digilib-old
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]); |