source: branches/bibliolocean/src/locean_tablerefsabsbibsort.begin.layout @ 213

Last change on this file since 213 was 213, checked in by pinsard, 12 years ago

add PHYBIOCAR theme column on html

File size: 19.9 KB
Line 
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2<html lang="en">
3<!--
4
5FILES
6=====
7
8/usr/home/fplod/locean/hal/src/data/locean_tablerefsabsbibsort.begin.layout sur aedon.locean-ipsl.upmc.fr
9
10EVOLUTIONS
11==========
12
13$Id$
14
15$URL$
16
17- fplod 20120627T154718Z cratos (Linux)
18
19  * add phybiocar column
20  * try to reduce width of page to solve print pb
21
22- fplod 20120419
23
24  * remove link to main page (desastrous effect on sort)
25    now in end.layout
26
27- fplod 20120406
28
29  * remove DOI/URL column (they are in journal column)
30  * remove css media print
31  * add a link to the main page
32   
33- fplod 20100616T072219Z aedon.locean-ipsl.upmc.fr (Darwin)
34
35  * add meta robots
36
37- fplod 2009-09-04T15:17:15Z aedon.locean-ipsl.upmc.fr (Darwin)
38
39  * change media print to see year, journal, page,vol and so on on printed
40    version
41
42- fplod 2009-08-21T07:10:53Z aedon.locean-ipsl.upmc.fr (Darwin)
43
44  * add loceanaffectation column
45  * sort by year descendant
46
47- fplod 2009-03-04T10:13:46Z aedon.locean-ipsl.upmc.fr (Darwin)
48
49  * creation from http://www.markschenk.com/tools/jabref/filterfiles/tablerefsabsbibsort/v2/
50
51  * adaptation for LOCEAN (add team column)
52  * add some little help
53
54-->
55<head>
56<title>JabRef References output for LOCEAN</title>
57<meta http-equiv="Content-Type" content="text/html; charset=\encoding">
58<meta name="robots" content="noindex,nofollow,noarchive">
59
60<script type="text/javascript">
61<!--
62// QuickSearch script for JabRef HTML export
63// Version: 2.0
64//
65// Copyright (c) 2006-2008, Mark Schenk
66//
67// This software is distributed under a Creative Commons Attribution 3.0 License
68// http://creativecommons.org/licenses/by/3.0/
69
70// Some features:
71// + optionally searches Abstracts and Reviews
72// + allows RegExp searches
73//   e.g. to search for entries between 1980 and 1989, type:  198[0-9]
74//   e.g. for any entry ending with 'symmetry', type:  symmetry$
75//   e.g. for all reftypes that are books: ^book$, or ^article$
76//   e.g. for entries by either John or Doe, type john|doe
77// + easy toggling of Abstract/Review/BibTeX
78
79// Search settings
80var searchAbstract = true;
81var searchReview = true;
82
83// Speed optimisation introduced some esoteric problems with certain RegExp searches
84// e.g. if the previous search is 200[-7] and the next search is 200[4-7] then the search doesn't work properly until the next 'keyup'
85// hence the searchOpt can be turned off for RegExp adepts
86var searchOpt = true;
87
88if (window.addEventListener) {
89        window.addEventListener("load",initSearch,false); }
90else if (window.attachEvent) {
91        window.attachEvent("onload", initSearch); }
92
93function initSearch() {
94        // basic object detection
95        if(!document.getElementById || !document.getElementsByTagName) { return; }
96        if (!document.getElementById('qstable')||!document.getElementById('qs')) { return; }
97
98        // find QS table and appropriate rows
99        searchTable = document.getElementById('qstable');
100        var allRows = searchTable.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
101
102        // split all rows into entryRows and infoRows (e.g. abstract, review, bibtex)
103        entryRows = new Array();
104        infoRows = new Array(); absRows = new Array(); revRows = new Array();
105
106        for (var i=0, k=0, j=0; i<allRows.length;i++) {
107                if (allRows[i].className.match(/entry/)) {
108                        entryRows[j++] = allRows[i];
109                } else {
110                        infoRows[k++] = allRows[i];
111                        // check for abstract/review
112                        if (allRows[i].className.match(/abstract/)) {
113                                absRows.push(allRows[i]);
114                        } else if (allRows[i].className.match(/review/)) {
115                                revRows.push(allRows[i]);
116                        }
117                }
118        }
119
120        //number of entries and rows
121        numRows = allRows.length;
122        numEntries = entryRows.length;
123        numInfo = infoRows.length;
124        numAbs = absRows.length;
125        numRev = revRows.length;
126
127        //find the query field
128        qsfield = document.getElementById('qsfield');
129
130        // previous search term; used for speed optimisation
131        prevSearch = '';
132
133        //find statistics location
134        stats = document.getElementById('stat');
135        setStatistics(-1);
136
137        // creates the appropriate search settings
138        createQSettingsDialog();
139
140        // shows the searchfield
141        document.getElementById('qs').style.display = 'block';
142        document.getElementById('qsfield').onkeyup = testEvent;
143}
144
145function quickSearch(tInput){
146
147         if (tInput.value.length == 0) {
148                showAll();
149                setStatistics(-1);
150                qsfield.className = '';
151                return;
152        } else {
153                // only search for valid RegExp
154                try {
155                        var searchText = new RegExp(tInput.value,"i")
156                        closeAllInfo();
157                        qsfield.className = '';
158                }
159                catch(err) {
160                        prevSearch = tInput.value;
161                        qsfield.className = 'invalidsearch';
162                        return;
163                }
164        }
165       
166        // count number of hits
167        var hits = 0;
168
169        // start looping through all entry rows
170        for (var i = 0; cRow = entryRows[i]; i++){
171
172                // only show search the cells if it isn't already hidden OR if the search term is getting shorter, then search all
173                // some further optimisation is possible: if the search string is getting shorter, and the row is already visible, skip it. Then be careful with hits!
174                if(!searchOpt || cRow.className.indexOf('noshow')==-1 || tInput.value.length <= prevSearch.length){
175                        var found = false;
176
177                        var inCells = cRow.getElementsByTagName('td');
178                        var numCols = inCells.length;
179                               
180                        for (var j=0; j<numCols; j++) {
181                                cCell = inCells[j];
182                                var t = cCell.innerText?cCell.innerText:getTextContent(cCell);
183                                if (t.search(searchText) != -1){
184                                        found=true;
185                                        break;
186                                }
187                        }
188
189                        // look for further hits in Abstract and Review
190                        if(!found) {
191                                var articleid = cRow.id;
192                                if(searchAbstract && (abs = document.getElementById('abs_'+articleid))) {
193                                        if (getTextContent(abs).search(searchText) != -1){ found=true; }
194                                }
195                                if(searchReview && (rev = document.getElementById('rev_'+articleid))) {
196                                        if (getTextContent(rev).search(searchText) != -1){ found=true; }
197                                }
198                        }
199                       
200                        if(found) {
201                                cRow.className = 'entry show';
202                                hits++;
203                        } else {
204                                cRow.className = 'entry noshow';
205                        }
206                }
207        }
208
209        // update statistics
210        setStatistics(hits)
211       
212        // set previous search value
213        prevSearch = tInput.value;
214}
215
216function toggleInfo(articleid,info) {
217
218        var entry = document.getElementById(articleid);
219        var abs = document.getElementById('abs_'+articleid);
220        var rev = document.getElementById('rev_'+articleid);
221        var bib = document.getElementById('bib_'+articleid);
222
223        // Get the abstracts/reviews/bibtext in the right location
224        // in unsorted tables this is always the case, but in sorted tables it is necessary.
225        // Start moving in reverse order, so we get: entry, abstract,review,bibtex
226        if (searchTable.className.indexOf('sortable') != -1) {
227                if(bib) { entry.parentNode.insertBefore(bib,entry.nextSibling); }
228                if(rev) { entry.parentNode.insertBefore(rev,entry.nextSibling); }
229                if(abs) { entry.parentNode.insertBefore(abs,entry.nextSibling); }
230        }
231
232        if (abs && info == 'abstract') {
233                if(abs.className.indexOf('abstract') != -1) {
234                abs.className.indexOf('noshow') == -1?abs.className = 'abstract noshow':abs.className = 'abstract';
235                }
236        } else if (rev && info == 'review') {
237                if(rev.className.indexOf('review') != -1) {
238                rev.className.indexOf('noshow') == -1?rev.className = 'review noshow':rev.className = 'review';
239                }
240        } else if (bib && info == 'bibtex') {
241                if(bib.className.indexOf('bibtex') != -1) {
242                bib.className.indexOf('noshow') == -1?bib.className = 'bibtex noshow':bib.className = 'bibtex';
243                }               
244        } else {
245                return;
246        }
247       
248        // check if one or the other is available
249        var revshow = false;
250        var absshow = false;
251        var bibshow = false;
252        (abs && abs.className.indexOf('noshow') == -1)? absshow = true: absshow = false;
253        (rev && rev.className.indexOf('noshow') == -1)? revshow = true: revshow = false;       
254        (bib && bib.className == 'bibtex')? bibshow = true: bibshow = false;
255       
256        // highlight original entry
257        if(entry) {
258                if (revshow || absshow || bibshow) {
259                entry.className = 'entry highlight show';
260                } else {
261                entry.className = 'entry show';
262                }               
263        }
264       
265        // When there's a combination of abstract/review/bibtex showing, need to add class for correct styling
266        if(absshow) {
267                (revshow||bibshow)?abs.className = 'abstract nextshow':abs.className = 'abstract';
268        }
269        if (revshow) {
270                bibshow?rev.className = 'review nextshow': rev.className = 'review';
271        }
272       
273}
274
275function setStatistics (hits) {
276        if(hits < 0) { hits=numEntries; }
277        if(stats) { stats.firstChild.data = hits + '/' + numEntries}
278}
279
280function getTextContent(node) {
281        // Function written by Arve Bersvendsen
282        // http://www.virtuelvis.com
283       
284        if (node.nodeType == 3) {
285        return node.nodeValue;
286        } // text node
287        if (node.nodeType == 1) { // element node
288        var text = [];
289        for (var chld = node.firstChild;chld;chld=chld.nextSibling) {
290                text.push(getTextContent(chld));
291        }
292        return text.join("");
293        } return ""; // some other node, won't contain text nodes.
294}
295
296function showAll(){
297        // first close all abstracts, reviews, etc.
298        closeAllInfo();
299
300        for (var i = 0; i < numEntries; i++){
301                entryRows[i].className = 'entry show';
302        }
303}
304
305function closeAllInfo(){
306        for (var i=0; i < numInfo; i++){
307                if (infoRows[i].className.indexOf('noshow') ==-1) {
308                        infoRows[i].className = infoRows[i].className + ' noshow';
309                }
310        }
311}
312
313function testEvent(e){
314        if (!e) var e = window.event;
315        quickSearch(this);
316}
317
318function clearQS() {
319        qsfield.value = '';
320        quickSearch(qsfield);
321}
322
323function redoQS(){
324        showAll();
325        quickSearch(qsfield);
326}
327
328// Create Search Settings
329
330function toggleQSettingsDialog() {
331
332        var qssettings = document.getElementById('qssettings');
333       
334        if(qssettings.className.indexOf('active')==-1) {
335                qssettings.className = 'active';
336
337                if(absCheckBox && searchAbstract == true) { absCheckBox.checked = 'checked'; }
338                if(revCheckBox && searchReview == true) { revCheckBox.checked = 'checked'; }
339
340        } else {
341                qssettings.className= '';
342        }
343}
344
345function createQSettingsDialog(){
346        var qssettingslist = document.getElementById('qssettings').getElementsByTagName('ul')[0];
347       
348        if(numAbs!=0) {
349                var x = document.createElement('input');
350                x.id = "searchAbs";
351                x.type = "checkbox";
352                x.onclick = toggleQSetting;
353                var y = qssettingslist.appendChild(document.createElement('li')).appendChild(document.createElement('label'));
354                y.appendChild(x);
355                y.appendChild(document.createTextNode('search abstracts'));             
356        }
357        if(numRev!=0) {
358                var x = document.createElement('input');
359                x.id = "searchRev";
360                x.type = "checkbox";           
361                x.onclick = toggleQSetting;
362                var y = qssettingslist.appendChild(document.createElement('li')).appendChild(document.createElement('label'));         
363                y.appendChild(x);               
364                y.appendChild(document.createTextNode('search reviews'));
365        }
366               
367        // global variables
368        absCheckBox = document.getElementById('searchAbs');
369        revCheckBox = document.getElementById('searchRev');
370       
371        // show search settings
372        if(absCheckBox||revCheckBox) {
373                document.getElementById('qssettings').style.display = 'block';
374        }
375}
376
377function toggleQSetting() {
378        if(this.id=='searchAbs') { searchAbstract = !searchAbstract; }
379        if(this.id=='searchRev') { searchReview = !searchReview; }
380        redoQS()
381}
382-->
383</script>
384<script type="text/javascript">
385<!--
386// Sort Table Script
387// Version: 1.1
388//
389// Copyright (c) 2006-2008, Mark Schenk
390//
391// This software is distributed under a Creative Commons Attribution 3.0 License
392// http://creativecommons.org/licenses/by/3.0/
393
394// NB: slow as molasses in FireFox, especially when sorting columns with a lot of text.
395// An optimization is implemented which makes speed bearable, toggled by the following variable
396var SORT_SPEED_OPT = true;
397// a bit of browser preference: Opera does not need optimization
398if(window.opera) { SORT_SPEED_OPT=false; }
399// the optimization has one limitation on the functionality: when sorting search
400// results, the expanded info, e.g. bibtex/review, is collapsed. In the non-optimized
401// version they remain visible.
402
403
404if (window.addEventListener) {
405        window.addEventListener("load",initSortTable,false) }
406else if (window.attachEvent) {
407        window.attachEvent("onload", initSortTable); }
408
409function initSortTable() {
410var alltables = document.getElementsByTagName('table');
411for(i=0;i<alltables.length;i++) {
412        var currentTable = alltables[i];
413        if(currentTable.className.indexOf('sortable') !=-1) {
414                var thead = currentTable.getElementsByTagName('thead')[0];
415                thead.title = 'Click on any column header to sort';
416                for (var i=0;cell = thead.getElementsByTagName('th')[i];i++) {
417                        cell.onclick = function () { resortTable(this); };
418                        // make it possible to have a default sort column
419                        if(cell.className.indexOf('sort')!=-1) {
420                                resortTable(cell)
421                        }
422                }
423        }
424}
425}
426
427var SORT_COLUMN_INDEX
428
429function resortTable(td) {
430        var column = td.cellIndex;
431        var table = getParent(td,'TABLE');
432
433        var allRows = table.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
434        var newRows = new Array();
435
436        for (var i=0, k=0; i<allRows.length;i++) {
437
438                var rowclass = allRows[i].className;
439
440                if (rowclass.indexOf('entry') != -1) {
441                newRows[k++] = allRows[i];
442                }
443               
444                if (SORT_SPEED_OPT) {
445                // remove highlight class
446                allRows[i].className = rowclass.replace(/highlight/,'');
447                // close information
448                if(rowclass.indexOf('entry') == -1 && rowclass.indexOf('noshow') == -1) { allRows[i].className = rowclass + ' noshow';}
449                }
450        }
451
452
453        // If other sort functions are deemed necessary (e.g. for
454        // dates and currencies) they can be added.
455        var sortfn = ts_sort_firstchild_caseinsensitive;
456        SORT_COLUMN_INDEX = column;
457        newRows.sort(sortfn);
458
459        // create a container for showing sort arrow
460        var arrow =  td.getElementsByTagName('span')[0];
461        if (!arrow) { var arrow = td.appendChild(document.createElement('span'));}
462       
463        if (td.className) {
464                if (td.className.indexOf('sort_asc') !=-1) {
465                        td.className = td.className.replace(/_asc/,"_des");
466                        newRows.reverse();
467                        arrow.innerHTML = '&uArr;';
468                } else if (td.className.indexOf('sort_des') !=-1) {
469                        td.className = td.className.replace(/_des/,"_asc");
470                        arrow.innerHTML = '&dArr;';
471                } else {
472                        td.className += ' sort_asc';
473                        arrow.innerHTML = '&dArr;';
474                }
475        } else {
476                td.className += 'sort_asc';
477                arrow.innerHTML = '&dArr;';
478        }
479       
480        // Remove the classnames and up/down arrows for the other headers
481        var ths = table.getElementsByTagName('thead')[0].getElementsByTagName('th');
482        for (var i=0; i<ths.length; i++) {
483                if(ths[i]!=td && ths[i].className.indexOf('sort_')!=-1) {
484                // argh, moronic JabRef thinks (backslash)w is an output field!!
485                //ths[i].className = ths[i].className.replace(/sort_(backslash)w{3}/,"");
486                ths[i].className = ths[i].className.replace(/sort_asc/,"");
487                ths[i].className = ths[i].className.replace(/sort_des/,"");
488
489                // remove span
490                var arrow =  ths[i].getElementsByTagName('span')[0];
491                if (arrow) { ths[i].removeChild(arrow); }
492                }
493        }
494
495        // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
496        for (i=0;i<newRows.length;i++) {
497                table.getElementsByTagName('tbody')[0].appendChild(newRows[i]);
498
499                if(!SORT_SPEED_OPT){
500                // moving additional information, e.g. bibtex/abstract to right locations
501                // this allows to sort, even with abstract/review/etc. still open
502                var articleid = newRows[i].id;
503
504                var entry = document.getElementById(articleid);
505                var abs = document.getElementById('abs_'+articleid);
506                var rev = document.getElementById('rev_'+articleid);
507                var bib = document.getElementById('bib_'+articleid);           
508       
509                var tbody = table.getElementsByTagName('tbody')[0];
510                // mind the order of adding the entries
511                if(abs) { tbody.appendChild(abs); }
512                if(rev) { tbody.appendChild(rev); }
513                if(bib) { tbody.appendChild(bib); }
514                }
515        }
516}
517
518function ts_sort_firstchild_caseinsensitive(a,b) {
519        // only search in .firstChild of the cells. Speeds things up tremendously in FF
520        // problem is that it won't find all the text in a cell if the firstChild is an element
521        // or if there are other elements in the cell. Risky fix, but the speed boost is worth it.
522        var acell = a.cells[SORT_COLUMN_INDEX];
523        var bcell = b.cells[SORT_COLUMN_INDEX];
524       
525        acell.firstChild? aa = getTextContent(acell.firstChild).toLowerCase():aa = "";
526        bcell.firstChild? bb = getTextContent(bcell.firstChild).toLowerCase():bb = "";
527
528        if (aa==bb) return 0;
529        if (aa<bb) return -1;
530        return 1;
531}
532
533function ts_sort_caseinsensitive(a,b) {
534        aa = getTextContent(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
535        bb = getTextContent(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
536        if (aa==bb) return 0;
537        if (aa<bb) return -1;
538        return 1;
539}
540
541function ts_sort_default(a,b) {
542        aa = getTextContent(a.cells[SORT_COLUMN_INDEX]);
543        bb = getTextContent(b.cells[SORT_COLUMN_INDEX]);
544        if (aa==bb) return 0;
545        if (aa<bb) return -1;
546        return 1;
547}
548
549function getParent(el, pTagName) {
550        if (el == null) {
551                return null;
552        } else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) {
553                return el;
554        } else {
555                return getParent(el.parentNode, pTagName);
556        }
557}
558-->
559</script>
560<style type="text/css">
561body { background-color: white; font-family: "Trebuchet MS", Arial, sans-serif; font-size: 12px; line-height: 1.2; padding: 1em; color: #2E2E2E; }
562
563#qs { width: auto; border-style: solid; border-color: gray; border-width: 1px 1px 0px 1px; padding: 0.5em 0.5em; display:none; position:relative; }
564#qs form { padding: 0px; margin: 0px; }
565#qs form p { padding: 0px; margin: 0px; }
566#qs p.help { font-weight:normal;}
567
568.invalidsearch { background-color: red; }
569
570table { border: 1px gray solid; width: 100%; empty-cells: show; }
571th, td { border: 1px gray solid; padding: 0.5em; vertical-align: top;  }
572td { text-align: left; vertical-align: top; }
573th { background-color: #EFEFEF; }
574
575td a { color: navy; text-decoration: none; }
576td a:hover  { text-decoration: underline; }
577
578tr.noshow { display: none;}
579
580tr.highlight td { background-color: #F1F1F1; border-top: 2px black solid; font-weight: bold; }
581tr.abstract td, tr.review td, tr.bibtex td { background-color: #F1F1F1; border-bottom: 2px black solid; }
582tr.nextshow td { border-bottom: 1px gray solid; }
583
584tr.bibtex pre { width: 100%; overflow: auto;}
585
586p.infolinks { margin: 0.5em 0em 0em 0em; padding: 0px; }
587
588
589#qssettings { padding: 0.5em; position: absolute; top: 0.2em; right: 0.2em; border: 1px gray solid; background-color: white; display: none; }
590#qssettings p { font-weight: bold; cursor: pointer; }
591#qssettings p.help { font-weight:normal;}
592#qssettings ul { display: none; list-style-type: none; padding-left: 0; margin: 0; }
593#qssettings.active ul { display: block; }
594
595
596th.sort_asc, th.sort_des { border: 2px black solid; }
597</style>
598</head>
599<body>
600
601<div id="qs">
602        <form action="">
603        <p>QuickSearch: <input type="text" name="qsfield" id="qsfield" autocomplete="off" title="Allows plain text as well as RegExp searches" /><input type="button" onclick="clearQS()" value="clear" />&nbsp; Number of matching entries: <span id="stat">0</span>.</p>
604<p class="help">
605allows RegExp searches
606<ul>
607 <li><p class="help"> e.g. to search for entries between 1980 and 1989, type:  <code>198[0-9]</code></p></li>
608 <li><p class="help"> e.g. for any entry ending with 'symmetry', type:  <code>symmetry$</code></p></li>
609 <li><p class="help"> e.g. for all reftypes that are books: <code>^book$</code>, or <code>^article$</code></p></li>
610  <li><p class="help">e.g. for entries by either John or Doe, type <code>john|doe</code></p></li>
611</ul>
612</p>
613
614        <div id="qssettings">
615                <p onclick="toggleQSettingsDialog()">Search Settings</p>
616                <ul></ul>
617                <p class="help">optionally searches Abstracts and Reviews</p>
618        </div>
619        </form>
620</div>
621<table id="qstable" class="sortable" summary="LOCEAN bibliography" border="1">
622<thead>
623<tr>
624<th width=".5%">Author</th>
625<th width=".5%">Team</th>
626<th width="0.5%">AERES Team</th>
627<th width=".5%">PHYBIOCAR theme</th>
628<th width=".5%">Organization</th>
629<th width=".5%">Title</th>
630<th class="sort_asc" width=".5%">Year</th>
631<th width=".5%">Journal/Proceedings;<br/> DOI/URL</th>
632<th width=".5%">Reftype</th>
633<th width=".5%">AERES Type</th>
634</tr>
635</thead>
636<tbody>
Note: See TracBrowser for help on using the repository browser.