[svn-upgrade] Integrating new upstream version, jabref (2.4.2)
[debian/jabref.git] / src / resource / layout / tablerefs / tablerefs.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 // + allows RegExp searches
18 //   e.g. to search for entries between 1980 and 1989, type:  198[0-9]
19 //   e.g. for any entry ending with 'symmetry', type:  symmetry$
20 //   e.g. for all reftypes that are books: ^book$, or ^article$
21 //   e.g. for entries by either John or Doe, type john|doe
22
23 // Speed optimisation introduced some esoteric problems with certain RegExp searches
24 // 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'
25 // hence the searchOpt can be turned off for RegExp adepts
26 var searchOpt = true;
27
28 if (window.addEventListener) {
29         window.addEventListener("load",initSearch,false); }
30 else if (window.attachEvent) {
31         window.attachEvent("onload", initSearch); }
32
33 function initSearch() {
34         // basic object detection
35         if(!document.getElementById || !document.getElementsByTagName) { return; }
36         if (!document.getElementById('qstable')||!document.getElementById('qs')) { return; }
37
38         // find QS table and appropriate rows
39         searchTable = document.getElementById('qstable');
40         var allRows = searchTable.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
41
42         // split all rows into entryRows and infoRows (e.g. abstract, review, bibtex)
43         entryRows = new Array();
44         infoRows = new Array();
45
46         for (var i=0, k=0, j=0; i<allRows.length;i++) {
47                 if (allRows[i].className.indexOf('entry') != -1) {
48                         entryRows[j++] = allRows[i];
49                 } else {
50                         infoRows[k++] = allRows[i];             
51                 }
52         }
53
54         //number of entries and rows
55         numRows = allRows.length;
56         numEntries = entryRows.length;
57         numInfo = infoRows.length;
58
59         //find the query field
60         qsfield = document.getElementById('qsfield');
61
62         // previous search term; used for speed optimisation
63         prevSearch = '';
64
65         //find statistics location
66         stats = document.getElementById('stat');
67         setStatistics(-1);
68
69         // shows the searchfield
70         document.getElementById('qs').style.display = 'block';
71         document.getElementById('qsfield').onkeyup = testEvent;
72 }
73
74 function quickSearch(tInput){
75
76          if (tInput.value.length == 0) {
77                 showAll();
78                 setStatistics(-1);
79                 qsfield.className = '';
80                 return;
81         } else {
82                 // only search for valid RegExp
83                 try {
84                         var searchText = new RegExp(tInput.value,"i")
85                         closeAllInfo();
86                         qsfield.className = '';
87                 }
88                 catch(err) {
89                         prevSearch = tInput.value;
90                         qsfield.className = 'invalidsearch';
91                         return;
92                 }
93         }
94         
95         // count number of hits
96         var hits = 0;
97
98         // start looping through all entry rows
99         for (var i = 0; cRow = entryRows[i]; i++){
100
101                 // only show search the cells if it isn't already hidden OR if the search term is getting shorter, then search all
102                 // some further optimisation is possible: if the search string is getting shorter, and the row is already visible, skip it. Future work.
103                 if(!searchOpt || cRow.className.indexOf('noshow')==-1 || tInput.value.length <= prevSearch.length){
104                         var found = false; 
105
106                         var inCells = cRow.getElementsByTagName('td');
107                         var numCols = inCells.length;
108                                 
109                         for (var j=0; j<numCols; j++) {
110                                 cCell = inCells[j];
111                                 var t = cCell.innerText?cCell.innerText:getTextContent(cCell);
112                                 if (t.search(searchText) != -1){ 
113                                         found=true; 
114                                         break;
115                                 } 
116                         }
117                         
118                         if(found) {
119                                 cRow.className = 'entry show';
120                                 hits++;
121                         } else {
122                                 cRow.className = 'entry noshow';
123                         }
124                 }
125         }
126
127         // update statistics
128         setStatistics(hits)
129         
130         // set previous search value
131         prevSearch = tInput.value;
132 }
133
134 function setStatistics (hits) {
135         if(hits < 0) { hits=numEntries; }
136         if(stats) { stats.firstChild.data = hits + '/' + numEntries}
137 }
138
139 function getTextContent(node) {
140         // Function written by Arve Bersvendsen
141         // http://www.virtuelvis.com
142         
143         if (node.nodeType == 3) {
144         return node.nodeValue;
145         } // text node
146         if (node.nodeType == 1) { // element node
147         var text = [];
148         for (var chld = node.firstChild;chld;chld=chld.nextSibling) {
149                 text.push(getTextContent(chld));
150         }
151         return text.join("");
152         } return ""; // some other node, won't contain text nodes.
153 }
154
155 function showAll(){
156         // first close all abstracts, reviews, etc.
157         closeAllInfo();
158
159         for (var i = 0; i < numEntries; i++){
160                 entryRows[i].className = 'entry show'; 
161         }
162 }
163
164 function closeAllInfo(){
165         for (var i=0; i < numInfo; i++){
166                 if (infoRows[i].className.indexOf('noshow') ==-1) {
167                         infoRows[i].className = infoRows[i].className + ' noshow';
168                 }
169         }
170 }
171
172 function testEvent(e){
173         if (!e) var e = window.event;
174         quickSearch(this);
175 }
176
177 function clearQS() {
178         qsfield.value = '';
179         quickSearch(qsfield);
180 }
181
182 function redoQS(){
183         showAll();
184         quickSearch(qsfield);
185 }
186 -->
187 </script>
188 <style type="text/css">
189 body { background-color: white; font-family: "Trebuchet MS", Arial, sans-serif; font-size: 12px; line-height: 1.2; padding: 1em; color: #2E2E2E; }
190
191 #qs { width: auto; border-style: solid; border-color: gray; border-width: 1px 1px 0px 1px; padding: 0.5em 0.5em; display:none;  }
192 #qs form { padding: 0px; margin: 0px; }
193 #qs form p { padding: 0px; margin: 0px; }
194
195 .invalidsearch { background-color: red; }
196
197 table { border: 1px gray solid; width: 100%; empty-cells: show; }
198 th, td { border: 1px gray solid; padding: 0.5em; vertical-align: top;  }
199 td { text-align: left; vertical-align: top; }
200 th { background-color: #EFEFEF; }
201
202 td a { color: navy; text-decoration: none; }
203 td a:hover  { text-decoration: underline; }
204
205 tr.noshow { display: none;}
206
207 @media print {
208         p.infolinks, #qssettings, #qs { display: none !important; }
209         table { border-width: 0px; }
210         tr { page-break-inside: avoid; }
211         tr > * + * + * + * + * {display: none; }
212         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; }
213         tr[id]::before { content: attr(id); display: table-cell; border: 1px gray solid; padding: 0.5em; vertical-align: top; font-style: italic; }
214 }
215 </style>
216 </head>
217 <body>
218
219 <div id="qs"><form action=""><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></form></div>
220 <table id="qstable" border="1">
221 <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>
222 <tbody>