90edc81a1fa69116051b82051e9586550f341594
[plewww.git] / planetlab / js / plc_tables.js
1 /* $Id$ */
2
3 /* when a table gets paginated, displays context info */
4 function plc_table_paginator (opts,tablename) {
5
6   if(!("currentPage" in opts)) { return; }
7     
8   var p = document.createElement('p');
9   var t = document.getElementById(tablename+'-fdtablePaginaterWrapTop');
10   var b = document.getElementById(tablename+'-fdtablePaginaterWrapBottom');
11
12   /* when there's no visible entry, the pagination code removes the wrappers */
13   if ( (!t) || (!b) ) return;
14
15   /* get how many entries are matching:
16      opts.visibleRows only holds the contents of the current page
17      so we store the number of matching entries in the tbody's classname
18      see plc_table_tbody_matching
19   */
20   var totalMatches = opts.totalRows;
21   var tbody=document.getElementById(tablename).getElementsByTagName("tbody")[0];
22   var cn=tbody.className;
23   if (cn.match (/matching-\d+/)) {
24     totalMatches=cn.match(/matching-\d+/)[0].replace("matching-","");
25   } 
26
27   var label;
28
29   var matches_text;
30   if (totalMatches != opts.totalRows) {
31     matches_text = totalMatches + "/" + opts.totalRows;
32   } else {
33     matches_text = opts.totalRows;
34   }
35   var first = ((opts.currentPage-1) * opts.rowsPerPage) +1;
36   var last = Math.min((opts.currentPage * opts.rowsPerPage),totalMatches);
37   var items_text = "Items [" + first + " - " + last + "] of " + matches_text;
38   var page_text = "Page " + opts.currentPage + " of " + Math.ceil(totalMatches / opts.rowsPerPage);
39   label = items_text + " -- " + page_text;
40
41   p.className = "paginationText";    
42   p.appendChild(document.createTextNode(label));
43
44   /*  t.insertBefore(p.cloneNode(true), t.firstChild); */
45   b.appendChild(p);
46 }
47
48
49 /* locates a table from its id and alters the classname to reflect new table size */
50 function plc_pagesize_set (table_id,size_id,def_size) {
51   var table=document.getElementById(table_id);
52   var size_area=document.getElementById(size_id);
53   if ( ! size_area.value ) {
54     size_area.value=def_size;
55   }
56   var size=size_area.value;
57   table.className=table.className.replace(/paginate-\d+/,"paginate-"+size); 
58   tablePaginater.init(table_id);
59 }
60
61 function plc_pagesize_reset(table_id, size_id, size) {
62   var table=document.getElementById(table_id);
63   var size_area=document.getElementById(size_id);
64   size_area.value=size;
65   table.className=table.className.replace(/paginate-\d+/,"paginate-"+size); 
66   tablePaginater.init(table_id);
67 }
68   
69 /* set or clear the ' invisibleRow' in the tr's classname, according to visible */
70 function plc_table_row_visible (row,visible) {
71   var cn=row.className;
72   /* clear */
73   cn=cn.replace(" invisibleRow","");
74   if (! visible) cn += " invisibleRow";
75   row.className=cn;
76 }
77
78 /* maintain the number of matching entries in the <tbody> element's classname */
79 function plc_table_tbody_matching (tbody, matching) {
80   var new_cn="matching-" + matching;
81   var cn=tbody.className;
82   if (cn.match("matching-")) {
83     cn=cn.replace(/matching-\d+/,new_cn);
84   } else {
85     cn=cn + " " + new_cn;
86   }
87   cn=cn.replace(/^ +/,"");
88   tbody.className=cn;
89 }
90
91 /* scan the table, and mark as visible 
92    the rows that match (either AND or OR the patterns) */
93 function plc_table_filter (table_id,pattern_id,and_id) {
94   var tbody = document.getElementById(table_id).getElementsByTagName("tbody")[0];
95   var rows=tbody.rows;
96   var pattern_area = document.getElementById(pattern_id);
97   var pattern_text = pattern_area.value;
98   var row_index, row, cells, cell_index, cell, visible;
99   var pattern,i;
100   var matching_entries=0;
101   var and_button=document.getElementById(and_id);
102   var and_if_true=and_button.checked;
103
104   // remove whitespaces at the beginning and end
105   pattern_text = pattern_text.replace(/[ \t]+$/,"");
106   pattern_text = pattern_text.replace(/^[ \t]+/,"");
107   // normnalize to lowercase
108   pattern_text = pattern_text.toLowerCase();
109   
110   if (pattern_text.indexOf ("&") != -1) {
111     pattern_text = pattern_text.replace(/&/," ");
112     pattern_area.value=pattern_text;
113     and_button.checked=true;
114     return;
115   } else if (pattern_text.indexOf ("|") != -1 ) {
116     pattern_text = pattern_text.replace(/\|/," ");
117     pattern_area.value=pattern_text;
118     and_button.checked=false;
119     return;
120   }
121     
122   // var counter=0;
123   //  window.console.log ("entering plc_table_filter " + table_id);
124
125   var re_brackets = new RegExp ('<[^>]*>','g');
126   var patterns = pattern_text.split(" ");
127
128   for (row_index = 0; row=rows[row_index]; row_index++) {
129       cells=row.cells;
130     
131     /*empty pattern */
132     if (patterns.length == 0) {
133       visible=true;
134     } else if (and_if_true) {
135       /* AND mode: all patterns must match */
136       visible=true;
137       for (i in patterns) {
138         var pattern_matched=false;
139         pattern=new RegExp(patterns[i],"i");
140         for (cell_index = 0; cell=cells[cell_index]; cell_index++) {
141           var against=cell.innerHTML;
142           against=against.replace(re_brackets,'');
143           //counter++;
144           //window.console.log ("plc_table_filter is matching " + against + " against " + pattern);
145           if ( against.match(pattern)) {
146             pattern_matched=true;
147             // alert ('AND matched! p='+pattern+' c='+cell.innerHTML);
148             break;        
149           }
150         }
151         if ( ! pattern_matched ) visible=false;
152       }
153     } else {
154       /* OR mode: any match is good enough */
155       visible=false;
156       for (cell_index = 0; cell=cells[cell_index]; cell_index++) {
157         for (i in patterns) {
158           pattern=patterns[i];
159           //counter++;
160           if (cell.innerHTML.toLowerCase().match(pattern)) {
161             visible=true;
162             // alert ('OR matched! p='+pattern+' c='+cell.innerHTML);
163             break;
164           }
165         }
166       }
167     }
168     //window.console.log ("plc_table_filter has done " + counter + " matches");
169     plc_table_row_visible(row,visible);
170     if (visible) matching_entries +=1;
171   }
172   plc_table_tbody_matching(tbody,matching_entries);
173   tablePaginater.init(table_id);
174 }
175
176 function plc_table_filter_reset (table_id, pattern_id,and_id) {
177   /* reset pattern */
178   document.getElementById(pattern_id).value="";
179   plc_table_filter (table_id, pattern_id,and_id);
180 }