extensions/net.sf.basedb.reggie/trunk/resources/admin/stray-files.js

Code
Comments
Other
Rev Date Author Line
3837 12 Apr 16 nicklas 1 var StrayFiles = function()
3837 12 Apr 16 nicklas 2 {
3837 12 Apr 16 nicklas 3   var sf = {};
3837 12 Apr 16 nicklas 4   var debug = 0;
3837 12 Apr 16 nicklas 5
3838 13 Apr 16 nicklas 6   var strayFolders;
3837 12 Apr 16 nicklas 7   
3837 12 Apr 16 nicklas 8   // Page initialization
3837 12 Apr 16 nicklas 9   sf.initPage = function()
3837 12 Apr 16 nicklas 10   {
3837 12 Apr 16 nicklas 11     // Step 1
3838 13 Apr 16 nicklas 12     Events.addEventHandler('pathFilter', 'change', sf.filterOnChange);
3838 13 Apr 16 nicklas 13     Events.addEventHandler('serverFilter', 'change', sf.filterOnChange);
3838 13 Apr 16 nicklas 14     Events.addEventHandler('dateFilter', 'change', sf.filterOnChange);
3839 13 Apr 16 nicklas 15     Events.addEventHandler('ownerFilter', 'change', sf.filterOnChange);
3837 12 Apr 16 nicklas 16
3838 13 Apr 16 nicklas 17     Buttons.addClickHandler('check_uncheck', sf.selectAll);
3838 13 Apr 16 nicklas 18     
3838 13 Apr 16 nicklas 19     Buttons.addClickHandler('btnDeleteStrayFolders', sf.deleteStrayFolders);
3838 13 Apr 16 nicklas 20
3837 12 Apr 16 nicklas 21     // Navigation
3837 12 Apr 16 nicklas 22     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
3837 12 Apr 16 nicklas 23     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
3837 12 Apr 16 nicklas 24     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
3837 12 Apr 16 nicklas 25     Buttons.addClickHandler('goregister', Wizard.goRegister);
3837 12 Apr 16 nicklas 26     
3837 12 Apr 16 nicklas 27     // Final registration
3837 12 Apr 16 nicklas 28     Events.addEventHandler('wizard', 'wizard-submit', sf.submit);
3837 12 Apr 16 nicklas 29
3912 02 May 16 nicklas 30     Wizard.showLoadingAnimation('Searching for stray folders...', 'stray-files-progress');
3837 12 Apr 16 nicklas 31     var url = '../Admin.servlet?ID='+App.getSessionId();
3843 13 Apr 16 nicklas 32     url += '&cmd=FindStrayFolders';
3837 12 Apr 16 nicklas 33     Wizard.asyncJsonRequest(url, sf.initializeStep1);
3837 12 Apr 16 nicklas 34   }
3837 12 Apr 16 nicklas 35   
3837 12 Apr 16 nicklas 36   // --- Step 1 -----------------------------------
3837 12 Apr 16 nicklas 37   sf.initializeStep1 = function(response)
3837 12 Apr 16 nicklas 38   {
3838 13 Apr 16 nicklas 39     var frm = document.forms['reggie'];
3837 12 Apr 16 nicklas 40     var fileServers = response.fileServers;
3837 12 Apr 16 nicklas 41     var serverById = [];
3837 12 Apr 16 nicklas 42     for (var serverNo = 0; serverNo < fileServers.length; serverNo++)
3837 12 Apr 16 nicklas 43     {
3837 12 Apr 16 nicklas 44       var fs = fileServers[serverNo];
3837 12 Apr 16 nicklas 45       serverById['id-'+fs.id] = fs;
3837 12 Apr 16 nicklas 46       fs.encodedName = Strings.encodeTags(fs.name);
3838 13 Apr 16 nicklas 47       frm.serverFilter[frm.serverFilter.length] = new Option(fs.name, fs.id); 
3837 12 Apr 16 nicklas 48     }
3837 12 Apr 16 nicklas 49     
3838 13 Apr 16 nicklas 50     strayFolders = response.strayFolders;
3837 12 Apr 16 nicklas 51     var html = '';
3837 12 Apr 16 nicklas 52     for (var strayNo = 0; strayNo < strayFolders.length; strayNo++)
3837 12 Apr 16 nicklas 53     {
3837 12 Apr 16 nicklas 54       var folder = strayFolders[strayNo];
3838 13 Apr 16 nicklas 55       folder.include = true;
3843 13 Apr 16 nicklas 56       folder.index = strayNo;
3837 12 Apr 16 nicklas 57       var server = serverById['id-'+folder.fileServer];
3837 12 Apr 16 nicklas 58       
3838 13 Apr 16 nicklas 59       html += '<tr class="highlight" id="stray.'+strayNo+'">';
3838 13 Apr 16 nicklas 60       html += '<td><span id="index.'+strayNo+'">'+(strayNo+1)+'</span> <input type="checkbox" name="check.'+strayNo+'" value="'+strayNo+'"></td>'
3837 12 Apr 16 nicklas 61       html += '<td>';
3837 12 Apr 16 nicklas 62       html += '<span class="link file-link" data-server="'+server.id+'" data-folder="'+Strings.encodeTags(folder.path)+'" title="View files in this folder"><img src="../images/remote_folder.png"></span>';
3837 12 Apr 16 nicklas 63       html += Strings.encodeTags(folder.path);
3837 12 Apr 16 nicklas 64       html += '</td>';
3838 13 Apr 16 nicklas 65       html += '<td>'+server.encodedName+'</td>';
3838 13 Apr 16 nicklas 66       html += '<td>' + Reggie.reformatDate(folder.lastModified) + '</td>';
3839 13 Apr 16 nicklas 67       html += '<td>' + Strings.encodeTags(folder.owner) + '</td>';
3837 12 Apr 16 nicklas 68       html += '</tr>';
3837 12 Apr 16 nicklas 69     }
3837 12 Apr 16 nicklas 70
3837 12 Apr 16 nicklas 71     Doc.element('strayFilesSection').innerHTML = html;
3838 13 Apr 16 nicklas 72     Doc.element('num-stray').innerHTML = Reggie.formatCount(strayFolders.length);
3838 13 Apr 16 nicklas 73     Doc.element('num-stray').title = strayFolders.length;
3838 13 Apr 16 nicklas 74     Doc.element('num-total').innerHTML = Reggie.formatCount(response.totalFolders);
3838 13 Apr 16 nicklas 75     Doc.element('num-total').title = response.totalFolders;
3837 12 Apr 16 nicklas 76     
3837 12 Apr 16 nicklas 77     // Add click handler to file links
3837 12 Apr 16 nicklas 78     var clickableItems = document.getElementsByClassName('file-link');
3837 12 Apr 16 nicklas 79     for (var i = 0; i < clickableItems.length; i++)
3837 12 Apr 16 nicklas 80     {
3837 12 Apr 16 nicklas 81       Events.addEventHandler(clickableItems[i], 'click', sf.fileLinkOnClick);
3837 12 Apr 16 nicklas 82     }
3837 12 Apr 16 nicklas 83     
3843 13 Apr 16 nicklas 84     Doc.showHide('strayFilesSection', strayFolders.length > 0);
3843 13 Apr 16 nicklas 85     Doc.showHide('no-stray-files', strayFolders.length==0);
3837 12 Apr 16 nicklas 86     Doc.show('step-1');
3837 12 Apr 16 nicklas 87   }
3837 12 Apr 16 nicklas 88   
3838 13 Apr 16 nicklas 89   sf.filterOnChange = function()
3838 13 Apr 16 nicklas 90   {
3838 13 Apr 16 nicklas 91     var frm = document.forms['reggie'];
3838 13 Apr 16 nicklas 92     
3838 13 Apr 16 nicklas 93     var filter = new Filter();
3838 13 Apr 16 nicklas 94
3838 13 Apr 16 nicklas 95     filter.addTextCriteria(ItemProperty.Path, frm.pathFilter.value);
3838 13 Apr 16 nicklas 96     filter.addNumericCriteria(ItemProperty.ServerId, frm.serverFilter.value);
3838 13 Apr 16 nicklas 97     filter.addDateCriteria(ItemProperty.LastModified, frm.dateFilter.value);
3839 13 Apr 16 nicklas 98     filter.addTextCriteria(ItemProperty.Owner, frm.ownerFilter.value);
3838 13 Apr 16 nicklas 99
3838 13 Apr 16 nicklas 100     var numMatching = 0;
3838 13 Apr 16 nicklas 101     for (var strayNo = 0; strayNo < strayFolders.length; strayNo++)
3838 13 Apr 16 nicklas 102     {
3838 13 Apr 16 nicklas 103       var folder = strayFolders[strayNo];
3838 13 Apr 16 nicklas 104       
3838 13 Apr 16 nicklas 105       folder.include = filter.check(folder);
3838 13 Apr 16 nicklas 106       if (folder.include)
3838 13 Apr 16 nicklas 107       {
3838 13 Apr 16 nicklas 108         numMatching++;
3838 13 Apr 16 nicklas 109         Doc.element('index.'+strayNo).innerHTML = numMatching;
3838 13 Apr 16 nicklas 110         Doc.show('stray.'+strayNo);
3838 13 Apr 16 nicklas 111       }
3838 13 Apr 16 nicklas 112       else
3838 13 Apr 16 nicklas 113       {
3838 13 Apr 16 nicklas 114         Doc.hide('stray.'+strayNo);
3838 13 Apr 16 nicklas 115       }
3838 13 Apr 16 nicklas 116     }
3838 13 Apr 16 nicklas 117     
3838 13 Apr 16 nicklas 118     Doc.showHide('strayFilesSection', numMatching > 0);
3838 13 Apr 16 nicklas 119     Doc.showHide('no-stray-files', numMatching==0);
3838 13 Apr 16 nicklas 120   }
3837 12 Apr 16 nicklas 121   
3838 13 Apr 16 nicklas 122   
3837 12 Apr 16 nicklas 123   sf.fileLinkOnClick = function(event)
3837 12 Apr 16 nicklas 124   {
3837 12 Apr 16 nicklas 125     var folder = Data.get(event.currentTarget, 'folder');
3837 12 Apr 16 nicklas 126     var server = Data.get(event.currentTarget, 'server');
3837 12 Apr 16 nicklas 127     var url = '../analysis/view_remote_files.jsp?ID=' + App.getSessionId();
3837 12 Apr 16 nicklas 128     url += '&fileserver='+server;
3837 12 Apr 16 nicklas 129     url += '&path='+encodeURIComponent(folder);
3837 12 Apr 16 nicklas 130     Dialogs.openPopup(url, 'ViewStrayFiles', 750, 500);
3837 12 Apr 16 nicklas 131   }
3837 12 Apr 16 nicklas 132
3838 13 Apr 16 nicklas 133   
3838 13 Apr 16 nicklas 134   sf.selectAll = function()
3838 13 Apr 16 nicklas 135   {
3838 13 Apr 16 nicklas 136     var frm = document.forms['reggie'];
3838 13 Apr 16 nicklas 137     var firstChecked = null;
3838 13 Apr 16 nicklas 138     for (var strayNo = 0; strayNo < strayFolders.length; strayNo++)
3838 13 Apr 16 nicklas 139     {
3838 13 Apr 16 nicklas 140       var sf = strayFolders[strayNo];
3838 13 Apr 16 nicklas 141       var checkbox = frm['check.'+strayNo];
3838 13 Apr 16 nicklas 142       if (sf.include && checkbox)
3838 13 Apr 16 nicklas 143       {
3838 13 Apr 16 nicklas 144         if (firstChecked == null)
3838 13 Apr 16 nicklas 145         {
3838 13 Apr 16 nicklas 146           firstChecked = checkbox.checked;
3838 13 Apr 16 nicklas 147         }
3838 13 Apr 16 nicklas 148         checkbox.checked = !firstChecked;
3838 13 Apr 16 nicklas 149       }
3838 13 Apr 16 nicklas 150     }
3838 13 Apr 16 nicklas 151   }
3838 13 Apr 16 nicklas 152
3838 13 Apr 16 nicklas 153   sf.checkSelected = function(filter, noneSelectedMsg)
3838 13 Apr 16 nicklas 154   {
3838 13 Apr 16 nicklas 155     var frm = document.forms['reggie'];
3838 13 Apr 16 nicklas 156     var selected = [];
3838 13 Apr 16 nicklas 157     
3838 13 Apr 16 nicklas 158     for (var strayNo = 0; strayNo < strayFolders.length; strayNo++)
3838 13 Apr 16 nicklas 159     {
3838 13 Apr 16 nicklas 160       var folder = strayFolders[strayNo];
3838 13 Apr 16 nicklas 161       if (folder.include && frm['check.'+strayNo] && frm['check.'+strayNo].checked)
3838 13 Apr 16 nicklas 162       {
3838 13 Apr 16 nicklas 163         if (!filter || filter.check(folder))
3838 13 Apr 16 nicklas 164         selected[selected.length] = folder;
3838 13 Apr 16 nicklas 165       }
3838 13 Apr 16 nicklas 166     }
3838 13 Apr 16 nicklas 167     
3838 13 Apr 16 nicklas 168     if (selected.length == 0 && noneSelectedMsg)
3838 13 Apr 16 nicklas 169     {
3838 13 Apr 16 nicklas 170       Forms.showNotification('check_uncheck', noneSelectedMsg, null, 'pointer-below');
3838 13 Apr 16 nicklas 171     }
3838 13 Apr 16 nicklas 172     
3838 13 Apr 16 nicklas 173     return selected;
3838 13 Apr 16 nicklas 174   }
3838 13 Apr 16 nicklas 175
6824 30 Aug 22 nicklas 176   sf.deleteStrayFolders = function()
3838 13 Apr 16 nicklas 177   {
3838 13 Apr 16 nicklas 178     var selected = sf.checkSelected(null, 'Select at least one folder');
3838 13 Apr 16 nicklas 179     if (selected.length == 0) return;
3843 13 Apr 16 nicklas 180     
3843 13 Apr 16 nicklas 181     if (!confirm('Delete ' + selected.length + ' folders? This action can\'t be undone.'))
3843 13 Apr 16 nicklas 182     {
3843 13 Apr 16 nicklas 183       return;
3843 13 Apr 16 nicklas 184     }
3843 13 Apr 16 nicklas 185   
3843 13 Apr 16 nicklas 186     var index = [];
3843 13 Apr 16 nicklas 187     for (var i = 0; i < selected.length; i++)
3843 13 Apr 16 nicklas 188     {
3843 13 Apr 16 nicklas 189       index[i] = selected[i].index;
3843 13 Apr 16 nicklas 190     }
3843 13 Apr 16 nicklas 191     
3838 13 Apr 16 nicklas 192     var submitInfo = {};
3838 13 Apr 16 nicklas 193     submitInfo.cmd = 'DeleteStrayFolders';
3838 13 Apr 16 nicklas 194     submitInfo.message = 'Deleting ' + selected.length + ' stray folders';
3843 13 Apr 16 nicklas 195     submitInfo.folders = index;
3838 13 Apr 16 nicklas 196     Wizard.goRegister(submitInfo);
3838 13 Apr 16 nicklas 197   }
3838 13 Apr 16 nicklas 198
3838 13 Apr 16 nicklas 199   
3843 13 Apr 16 nicklas 200   sf.submit = function(event)
3837 12 Apr 16 nicklas 201   {
3843 13 Apr 16 nicklas 202     var submitInfo = event.detail;
3843 13 Apr 16 nicklas 203     var url = '../Admin.servlet?ID='+App.getSessionId();
3843 13 Apr 16 nicklas 204     url += '&cmd='+submitInfo.cmd;
3843 13 Apr 16 nicklas 205     Wizard.showLoadingAnimation(submitInfo.message || 'Registering YellowLabel specimen...');
3843 13 Apr 16 nicklas 206     Wizard.asyncJsonRequest(url, sf.submissionResults, 'POST', JSON.stringify(submitInfo));
3837 12 Apr 16 nicklas 207   }
3843 13 Apr 16 nicklas 208   
3843 13 Apr 16 nicklas 209   sf.submissionResults = function(response)
3843 13 Apr 16 nicklas 210   {
3843 13 Apr 16 nicklas 211     Wizard.showFinalMessage(response.messages);
3843 13 Apr 16 nicklas 212     Doc.show('gorestart');
3843 13 Apr 16 nicklas 213   }
3837 12 Apr 16 nicklas 214
3837 12 Apr 16 nicklas 215   return sf;
3837 12 Apr 16 nicklas 216 }();
3837 12 Apr 16 nicklas 217
3837 12 Apr 16 nicklas 218 Doc.onLoad(StrayFiles.initPage);
3837 12 Apr 16 nicklas 219
3838 13 Apr 16 nicklas 220 /**
3838 13 Apr 16 nicklas 221   Holds one or more filter criterias. Use the 'add*' methods
3838 13 Apr 16 nicklas 222   to add criterias to the filter, and the 'check(item)' method
3838 13 Apr 16 nicklas 223   to evaluate all criterias against a single item.
3838 13 Apr 16 nicklas 224 */
3838 13 Apr 16 nicklas 225 var Filter = function()
3838 13 Apr 16 nicklas 226 {
3838 13 Apr 16 nicklas 227   this.criterias = [];
3838 13 Apr 16 nicklas 228 }
3838 13 Apr 16 nicklas 229
3838 13 Apr 16 nicklas 230 /**
3838 13 Apr 16 nicklas 231   Adds a text criteria comparing the given item property to
3838 13 Apr 16 nicklas 232   a static value (f2).
3838 13 Apr 16 nicklas 233 */
3838 13 Apr 16 nicklas 234 Filter.prototype.addTextCriteria = function(itemProp, f2)
3838 13 Apr 16 nicklas 235 {
3838 13 Apr 16 nicklas 236   if (f2 != '') 
3838 13 Apr 16 nicklas 237   {
3838 13 Apr 16 nicklas 238     this.criterias[this.criterias.length] = function(item) { return Comparator.contains(itemProp(item), f2) };
3838 13 Apr 16 nicklas 239   }
3838 13 Apr 16 nicklas 240 }
3838 13 Apr 16 nicklas 241
3838 13 Apr 16 nicklas 242 /**
3838 13 Apr 16 nicklas 243   Adds a numeric criteria comparing the given item property to
3838 13 Apr 16 nicklas 244   a static value (f2). The 'f2' value may start with either '<' or '>'
3838 13 Apr 16 nicklas 245   to compare with less than/greater than operators, otherwise
3838 13 Apr 16 nicklas 246   it will use the 'approximately equals' operator.
3838 13 Apr 16 nicklas 247 */
3838 13 Apr 16 nicklas 248 Filter.prototype.addNumericCriteria = function(itemProp, f2, factor)
3838 13 Apr 16 nicklas 249 {
3838 13 Apr 16 nicklas 250   if (f2 != '')
3838 13 Apr 16 nicklas 251   {
3838 13 Apr 16 nicklas 252     var firstChar = f2.charAt(0);
3838 13 Apr 16 nicklas 253     if (!firstChar.match(/[\d\-]/)) f2 = f2.substring(1);
3838 13 Apr 16 nicklas 254   
3838 13 Apr 16 nicklas 255     var cmp = Comparator.get(firstChar, Comparator.approx);
3838 13 Apr 16 nicklas 256     var limit = parseFloat(f2);
3838 13 Apr 16 nicklas 257     if (factor) limit *= factor;
3838 13 Apr 16 nicklas 258   
3838 13 Apr 16 nicklas 259     this.criterias[this.criterias.length] = function(item) { return cmp(itemProp(item), limit) };
3838 13 Apr 16 nicklas 260   }
3838 13 Apr 16 nicklas 261 }
3838 13 Apr 16 nicklas 262
3838 13 Apr 16 nicklas 263 /**
3838 13 Apr 16 nicklas 264   Adds a temporal criteria for comparing dates. The 'f2' value
3838 13 Apr 16 nicklas 265   may start with either '<' or '>' to compare with earlier/later
3838 13 Apr 16 nicklas 266   than operators. In all cases, the 'f2' value is stripped from '-'
3838 13 Apr 16 nicklas 267   characters.
3838 13 Apr 16 nicklas 268 */
3838 13 Apr 16 nicklas 269 Filter.prototype.addDateCriteria = function(itemProp, f2)
3838 13 Apr 16 nicklas 270 {
3838 13 Apr 16 nicklas 271   if (f2 != '')
3838 13 Apr 16 nicklas 272   {
3838 13 Apr 16 nicklas 273     var firstChar = f2.charAt(0);
3838 13 Apr 16 nicklas 274     if (firstChar == '<' || firstChar == '>') f2 = f2.substring(1);
3838 13 Apr 16 nicklas 275     f2 = f2.replace(/\-/g, '');
3838 13 Apr 16 nicklas 276     var cmp = Comparator.get(firstChar, Comparator.startsWith);
3838 13 Apr 16 nicklas 277     this.criterias[this.criterias.length] = function(item) { return cmp(itemProp(item), f2) };
3838 13 Apr 16 nicklas 278   }
3838 13 Apr 16 nicklas 279
3838 13 Apr 16 nicklas 280 }
3838 13 Apr 16 nicklas 281
3838 13 Apr 16 nicklas 282 /**
3838 13 Apr 16 nicklas 283   Evaluate all criterias. Return true if all pass, false otherwise.
3838 13 Apr 16 nicklas 284 */
3838 13 Apr 16 nicklas 285 Filter.prototype.check = function(item)
3838 13 Apr 16 nicklas 286 {
3838 13 Apr 16 nicklas 287   for (var i = 0; i < this.criterias.length; i++)
3838 13 Apr 16 nicklas 288   {
3838 13 Apr 16 nicklas 289     if (!this.criterias[i](item)) return false;
3838 13 Apr 16 nicklas 290   }
3838 13 Apr 16 nicklas 291   return true;
3838 13 Apr 16 nicklas 292 }
3838 13 Apr 16 nicklas 293
3838 13 Apr 16 nicklas 294 /**
3838 13 Apr 16 nicklas 295   Functions for extracting various properties from
3838 13 Apr 16 nicklas 296   folder items. Each method accepts a single folder as a parameter
3838 13 Apr 16 nicklas 297   and return a value from the folder item. The methods
3838 13 Apr 16 nicklas 298   are used as parameters to Filter.add*Criteria() methods.
3838 13 Apr 16 nicklas 299 */
3838 13 Apr 16 nicklas 300 var ItemProperty = function()
3838 13 Apr 16 nicklas 301 {
3838 13 Apr 16 nicklas 302   var p = {};
3838 13 Apr 16 nicklas 303   
3838 13 Apr 16 nicklas 304   p.Path = function(item)
3838 13 Apr 16 nicklas 305   {
3838 13 Apr 16 nicklas 306     return item.path;
3838 13 Apr 16 nicklas 307   }
3838 13 Apr 16 nicklas 308   
3838 13 Apr 16 nicklas 309   p.ServerId = function(item)
3838 13 Apr 16 nicklas 310   {
3838 13 Apr 16 nicklas 311     return item.fileServer;
3838 13 Apr 16 nicklas 312   }
3838 13 Apr 16 nicklas 313   
3838 13 Apr 16 nicklas 314   p.LastModified = function(item)
3838 13 Apr 16 nicklas 315   {
3838 13 Apr 16 nicklas 316     return item.lastModified;
3838 13 Apr 16 nicklas 317   }
3838 13 Apr 16 nicklas 318   
3839 13 Apr 16 nicklas 319   p.Owner = function(item)
3839 13 Apr 16 nicklas 320   {
3839 13 Apr 16 nicklas 321     return item.owner;
3839 13 Apr 16 nicklas 322   }
3839 13 Apr 16 nicklas 323   
3838 13 Apr 16 nicklas 324   return p;
3838 13 Apr 16 nicklas 325 }();
3838 13 Apr 16 nicklas 326
3838 13 Apr 16 nicklas 327 /**
3838 13 Apr 16 nicklas 328   Comparator functions for comparing two values.
3838 13 Apr 16 nicklas 329 */
3838 13 Apr 16 nicklas 330 var Comparator = function()
3838 13 Apr 16 nicklas 331 {
3838 13 Apr 16 nicklas 332   var cmp = {};
3838 13 Apr 16 nicklas 333   
3838 13 Apr 16 nicklas 334   /**
3838 13 Apr 16 nicklas 335     Return a comparator based on the symbol
3838 13 Apr 16 nicklas 336     which can be either '>' or '<' to return
3838 13 Apr 16 nicklas 337     Comparator.gt or Comparator.lt. Otherwise
3838 13 Apr 16 nicklas 338     the given default or Comparator.eq is returned.
3838 13 Apr 16 nicklas 339   */
3838 13 Apr 16 nicklas 340   cmp.get = function(symbol, defaultCmp)
3838 13 Apr 16 nicklas 341   {
3838 13 Apr 16 nicklas 342     var c;
3838 13 Apr 16 nicklas 343     if (symbol == '<')
3838 13 Apr 16 nicklas 344     {
3838 13 Apr 16 nicklas 345       c = cmp.lt;
3838 13 Apr 16 nicklas 346     }
3838 13 Apr 16 nicklas 347     else if (symbol == '>')
3838 13 Apr 16 nicklas 348     {
3838 13 Apr 16 nicklas 349       c = cmp.gt;
3838 13 Apr 16 nicklas 350     }
3838 13 Apr 16 nicklas 351     else
3838 13 Apr 16 nicklas 352     {
3838 13 Apr 16 nicklas 353       c = defaultCmp || cmp.eq;
3838 13 Apr 16 nicklas 354     }
3838 13 Apr 16 nicklas 355     return c;
3838 13 Apr 16 nicklas 356   }
3838 13 Apr 16 nicklas 357   
3838 13 Apr 16 nicklas 358   // Compare if two values are equal
3838 13 Apr 16 nicklas 359   cmp.eq = function(v1, v2)
3838 13 Apr 16 nicklas 360   {
3838 13 Apr 16 nicklas 361     return v1 == v2;
3838 13 Apr 16 nicklas 362   }
3838 13 Apr 16 nicklas 363   
3838 13 Apr 16 nicklas 364   cmp.contains = function(v1, v2)
3838 13 Apr 16 nicklas 365   {
3838 13 Apr 16 nicklas 366     return v1 != null && v2 != null && v1.indexOf(v2) >= 0;
3838 13 Apr 16 nicklas 367   }
3838 13 Apr 16 nicklas 368   
3838 13 Apr 16 nicklas 369   // Compare if two values are appoximately equals (difference is not more than 0.05)
3838 13 Apr 16 nicklas 370   cmp.approx = function(v1, v2)
3838 13 Apr 16 nicklas 371   {
3838 13 Apr 16 nicklas 372     return Math.abs(v2 - v1) < 0.05;
3838 13 Apr 16 nicklas 373   }
3838 13 Apr 16 nicklas 374   
3838 13 Apr 16 nicklas 375   // Compare if v1 starts with the same string as v2
3838 13 Apr 16 nicklas 376   cmp.startsWith = function(v1, v2)
3838 13 Apr 16 nicklas 377   {
3838 13 Apr 16 nicklas 378     return v1 != null && v1.indexOf(v2) == 0;
3838 13 Apr 16 nicklas 379   }
3838 13 Apr 16 nicklas 380   
3838 13 Apr 16 nicklas 381   // Compare if v1 is greater than or equal to v2
3838 13 Apr 16 nicklas 382   cmp.gt = function(v1, v2)
3838 13 Apr 16 nicklas 383   {
3838 13 Apr 16 nicklas 384     return v1 != null && v2 != null && v1 >= v2;
3838 13 Apr 16 nicklas 385   }
3838 13 Apr 16 nicklas 386   
3838 13 Apr 16 nicklas 387   // Compare if v1 is less than or equal to v2
3838 13 Apr 16 nicklas 388   cmp.lt = function(v1, v2)
3838 13 Apr 16 nicklas 389   {
3838 13 Apr 16 nicklas 390     return v1 != null && v2 != null && v1 <= v2;
3838 13 Apr 16 nicklas 391   }
3838 13 Apr 16 nicklas 392   
3838 13 Apr 16 nicklas 393   return cmp;
3838 13 Apr 16 nicklas 394 }();