[svn-upgrade] Integrating new upstream version, jabref (2.4.2)
[debian/jabref.git] / src / resource / layout / tablerefsabsbib / tablerefsabsbib.begin.layout
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2 <html lang="en">
3 <head>
4 <title>JabRef References output</title>
5 <meta http-equiv="Content-Type" content="text/html; charset=\encoding">
6 <script type="text/javascript">
7 <!--
8 // QuickSearch script for JabRef HTML export 
9 // Version: 2.0
10 //
11 // Copyright (c) 2006-2008, Mark Schenk
12 //
13 // This software is distributed under a Creative Commons Attribution 3.0 License
14 // http://creativecommons.org/licenses/by/3.0/
15
16 // Some features:
17 // + optionally searches Abstracts and Reviews
18 // + allows RegExp searches
19 //   e.g. to search for entries between 1980 and 1989, type:  198[0-9]
20 //   e.g. for any entry ending with 'symmetry', type:  symmetry$
21 //   e.g. for all reftypes that are books: ^book$, or ^article$
22 //   e.g. for entries by either John or Doe, type john|doe
23 // + easy toggling of Abstract/Review/BibTeX
24
25 // Search settings
26 var searchAbstract = true;
27 var searchReview = true;
28
29 // Speed optimisation introduced some esoteric problems with certain RegExp searches
30 // 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'
31 // hence the searchOpt can be turned off for RegExp adepts
32 var searchOpt = true;
33
34 if (window.addEventListener) {
35         window.addEventListener("load",initSearch,false); }
36 else if (window.attachEvent) {
37         window.attachEvent("onload", initSearch); }
38
39 function initSearch() {
40         // basic object detection
41         if(!document.getElementById || !document.getElementsByTagName) { return; }
42         if (!document.getElementById('qstable')||!document.getElementById('qs')) { return; }
43
44         // find QS table and appropriate rows
45         searchTable = document.getElementById('qstable');
46         var allRows = searchTable.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
47
48         // split all rows into entryRows and infoRows (e.g. abstract, review, bibtex)
49         entryRows = new Array();
50         infoRows = new Array(); absRows = new Array(); revRows = new Array();
51
52         for (var i=0, k=0, j=0; i<allRows.length;i++) {
53                 if (allRows[i].className.match(/entry/)) {
54                         entryRows[j++] = allRows[i];
55                 } else {
56                         infoRows[k++] = allRows[i];
57                         // check for abstract/review
58                         if (allRows[i].className.match(/abstract/)) {
59                                 absRows.push(allRows[i]);
60                         } else if (allRows[i].className.match(/review/)) {
61                                 revRows.push(allRows[i]);
62                         }
63                 }
64         }
65
66         //number of entries and rows
67         numRows = allRows.length;
68         numEntries = entryRows.length;
69         numInfo = infoRows.length;
70         numAbs = absRows.length;
71         numRev = revRows.length;
72
73         //find the query field
74         qsfield = document.getElementById('qsfield');
75
76         // previous search term; used for speed optimisation
77         prevSearch = '';
78
79         //find statistics location
80         stats = document.getElementById('stat');
81         setStatistics(-1);
82
83         // creates the appropriate search settings
84         createQSettingsDialog();
85
86         // shows the searchfield
87         document.getElementById('qs').style.display = 'block';
88         document.getElementById('qsfield').onkeyup = testEvent;
89 }
90
91 function quickSearch(tInput){
92
93          if (tInput.value.length == 0) {
94                 showAll();
95                 setStatistics(-1);
96                 qsfield.className = '';
97                 return;
98         } else {
99                 // only search for valid RegExp
100                 try {
101                         var searchText = new RegExp(tInput.value,"i")
102                         closeAllInfo();
103                         qsfield.className = '';
104                 }
105                 catch(err) {
106                         prevSearch = tInput.value;
107                         qsfield.className = 'invalidsearch';
108                         return;
109                 }
110         }
111         
112         // count number of hits
113         var hits = 0;
114
115         // start looping through all entry rows
116         for (var i = 0; cRow = entryRows[i]; i++){
117
118                 // only show search the cells if it isn't already hidden OR if the search term is getting shorter, then search all
119                 // 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!
120                 if(!searchOpt || cRow.className.indexOf('noshow')==-1 || tInput.value.length <= prevSearch.length){
121                         var found = false; 
122
123                         var inCells = cRow.getElementsByTagName('td');
124                         var numCols = inCells.length;
125                                 
126                         for (var j=0; j<numCols; j++) {
127                                 cCell = inCells[j];
128                                 var t = cCell.innerText?cCell.innerText:getTextContent(cCell);
129                                 if (t.search(searchText) != -1){ 
130                                         found=true; 
131                                         break;
132                                 } 
133                         }
134
135                         // look for further hits in Abstract and Review
136                         if(!found) {
137                                 var articleid = cRow.id;
138                                 if(searchAbstract && (abs = document.getElementById('abs_'+articleid))) {
139                                         if (getTextContent(abs).search(searchText) != -1){ found=true; } 
140                                 }
141                                 if(searchReview && (rev = document.getElementById('rev_'+articleid))) {
142                                         if (getTextContent(rev).search(searchText) != -1){ found=true; } 
143                                 }
144                         }
145                         
146                         if(found) {
147                                 cRow.className = 'entry show';
148                                 hits++;
149                         } else {
150                                 cRow.className = 'entry noshow';
151                         }
152                 }
153         }
154
155         // update statistics
156         setStatistics(hits)
157         
158         // set previous search value
159         prevSearch = tInput.value;
160 }
161
162 function toggleInfo(articleid,info) {
163
164         var entry = document.getElementById(articleid);
165         var abs = document.getElementById('abs_'+articleid);
166         var rev = document.getElementById('rev_'+articleid);
167         var bib = document.getElementById('bib_'+articleid);
168         
169         if (abs && info == 'abstract') {
170                 if(abs.className.indexOf('abstract') != -1) {
171                 abs.className.indexOf('noshow') == -1?abs.className = 'abstract noshow':abs.className = 'abstract';
172                 }
173         } else if (rev && info == 'review') {
174                 if(rev.className.indexOf('review') != -1) {
175                 rev.className.indexOf('noshow') == -1?rev.className = 'review noshow':rev.className = 'review';
176                 }
177         } else if (bib && info == 'bibtex') {
178                 if(bib.className.indexOf('bibtex') != -1) {
179                 bib.className.indexOf('noshow') == -1?bib.className = 'bibtex noshow':bib.className = 'bibtex';
180                 }               
181         } else { 
182                 return;
183         }
184
185         // check if one or the other is available
186         var revshow = false;
187         var absshow = false;
188         var bibshow = false;
189         (abs && abs.className.indexOf('noshow') == -1)? absshow = true: absshow = false;
190         (rev && rev.className.indexOf('noshow') == -1)? revshow = true: revshow = false;        
191         (bib && bib.className == 'bibtex')? bibshow = true: bibshow = false;
192         
193         // highlight original entry
194         if(entry) {
195                 if (revshow || absshow || bibshow) {
196                 entry.className = 'entry highlight show';
197                 } else {
198                 entry.className = 'entry show';
199                 }               
200         }
201         
202         // When there's a combination of abstract/review/bibtex showing, need to add class for correct styling
203         if(absshow) {
204                 (revshow||bibshow)?abs.className = 'abstract nextshow':abs.className = 'abstract';
205         } 
206         if (revshow) {
207                 bibshow?rev.className = 'review nextshow': rev.className = 'review';
208         }
209         
210 }
211
212 function setStatistics (hits) {
213         if(hits < 0) { hits=numEntries; }
214         if(stats) { stats.firstChild.data = hits + '/' + numEntries}
215 }
216
217 function getTextContent(node) {
218         // Function written by Arve Bersvendsen
219         // http://www.virtuelvis.com
220         
221         if (node.nodeType == 3) {
222         return node.nodeValue;
223         } // text node
224         if (node.nodeType == 1) { // element node
225         var text = [];
226         for (var chld = node.firstChild;chld;chld=chld.nextSibling) {
227                 text.push(getTextContent(chld));
228         }
229         return text.join("");
230         } return ""; // some other node, won't contain text nodes.
231 }
232
233 function showAll(){
234         // first close all abstracts, reviews, etc.
235         closeAllInfo();
236
237         for (var i = 0; i < numEntries; i++){
238                 entryRows[i].className = 'entry show'; 
239         }
240 }
241
242 function closeAllInfo(){
243         for (var i=0; i < numInfo; i++){
244                 if (infoRows[i].className.indexOf('noshow') ==-1) {
245                         infoRows[i].className = infoRows[i].className + ' noshow';
246                 }
247         }
248 }
249
250 function testEvent(e){
251         if (!e) var e = window.event;
252         quickSearch(this);
253 }
254
255 function clearQS() {
256         qsfield.value = '';
257         quickSearch(qsfield);
258 }
259
260 function redoQS(){
261         showAll();
262         quickSearch(qsfield);
263 }
264
265 // Create Search Settings
266
267 function toggleQSettingsDialog() {
268
269         var qssettings = document.getElementById('qssettings');
270         
271         if(qssettings.className.indexOf('active')==-1) {
272                 qssettings.className = 'active';
273
274                 if(absCheckBox && searchAbstract == true) { absCheckBox.checked = 'checked'; }
275                 if(revCheckBox && searchReview == true) { revCheckBox.checked = 'checked'; }
276
277         } else {
278                 qssettings.className= '';
279         }
280 }
281
282 function createQSettingsDialog(){
283         var qssettingslist = document.getElementById('qssettings').getElementsByTagName('ul')[0];
284         
285         if(numAbs!=0) {
286                 var x = document.createElement('input');
287                 x.id = "searchAbs";
288                 x.type = "checkbox";
289                 x.onclick = toggleQSetting;
290                 var y = qssettingslist.appendChild(document.createElement('li')).appendChild(document.createElement('label'));
291                 y.appendChild(x);
292                 y.appendChild(document.createTextNode('search abstracts'));             
293         }
294         if(numRev!=0) {
295                 var x = document.createElement('input');
296                 x.id = "searchRev";
297                 x.type = "checkbox";            
298                 x.onclick = toggleQSetting;
299                 var y = qssettingslist.appendChild(document.createElement('li')).appendChild(document.createElement('label'));          
300                 y.appendChild(x);               
301                 y.appendChild(document.createTextNode('search reviews'));
302         }
303                 
304         // global variables
305         absCheckBox = document.getElementById('searchAbs');
306         revCheckBox = document.getElementById('searchRev');
307         
308         // show search settings
309         if(absCheckBox||revCheckBox) {
310                 document.getElementById('qssettings').style.display = 'block';
311         }
312 }
313
314 function toggleQSetting() {
315         if(this.id=='searchAbs') { searchAbstract = !searchAbstract; }
316         if(this.id=='searchRev') { searchReview = !searchReview; }
317         redoQS()
318
319 -->
320 </script>
321 <style type="text/css">
322 body { background-color: white; font-family: "Trebuchet MS", Arial, sans-serif; font-size: 12px; line-height: 1.2; padding: 1em; color: #2E2E2E; }
323
324 #qs { width: auto; border-style: solid; border-color: gray; border-width: 1px 1px 0px 1px; padding: 0.5em 0.5em; display:none; position:relative; }
325 #qs form { padding: 0px; margin: 0px; }
326 #qs form p { padding: 0px; margin: 0px; }
327
328 .invalidsearch { background-color: red; }
329
330 table { border: 1px gray solid; width: 100%; empty-cells: show; }
331 th, td { border: 1px gray solid; padding: 0.5em; vertical-align: top;  }
332 td { text-align: left; vertical-align: top; }
333 th { background-color: #EFEFEF; }
334
335 td a { color: navy; text-decoration: none; }
336 td a:hover  { text-decoration: underline; }
337
338 tr.noshow { display: none;}
339
340 tr.highlight td { background-color: #F1F1F1; border-top: 2px black solid; font-weight: bold; }
341 tr.abstract td, tr.review td, tr.bibtex td { background-color: #F1F1F1; border-bottom: 2px black solid; }
342 tr.nextshow td { border-bottom: 1px gray solid; }
343
344 tr.bibtex pre { width: 100%; overflow: auto;}
345
346 p.infolinks { margin: 0.5em 0em 0em 0em; padding: 0px; }
347
348 #qssettings { padding: 0.5em; position: absolute; top: 0.2em; right: 0.2em; border: 1px gray solid; background-color: white; display: none; }
349 #qssettings p { font-weight: bold; cursor: pointer; }
350 #qssettings ul { display: none; list-style-type: none; padding-left: 0; margin: 0; }
351 #qssettings.active ul { display: block; }
352
353 @media print {
354         p.infolinks, #qssettings, #qs { display: none !important; }
355         table { border-width: 0px; }
356         tr { page-break-inside: avoid; }
357         tr > * + * + * + * + * {display: none; }
358         thead tr::before { content: "Reference"; border: 1px gray solid; padding: 0.5em; vertical-align: top; font-weight: bold; text-align: center; display: table-cell; background-color: #EFEFEF; }
359         tr[id]::before { content: attr(id); display: table-cell; border: 1px gray solid; padding: 0.5em; vertical-align: top; font-style: italic; }
360 }
361 </style>
362 </head>
363 <body>
364
365 <div id="qs">
366         <form action="">
367         <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>
368         <div id="qssettings">
369                 <p onclick="toggleQSettingsDialog()">Search Settings</p>
370                 <ul></ul>
371         </div>
372         </form>
373 </div>
374 <table id="qstable" border="1">
375 <thead><tr><th width="20%">Author</th><th width="30%">Title</th><th width="5%">Year</th><th width="30%">Journal/Proceedings</th><th width="10%">Reftype</th><th width="5%">DOI/URL</th></tr></thead>
376 <tbody>