Project

General

Profile

Download (7.04 KB) Statistics
| Branch: | Tag: | Revision:
1
function CacheBot(searchTaxaUrl, taxonPageUrl, pageSize, progressCallback, readyCallback, doneCallback, errorCallback){
2

    
3
  var taxonPageUrl = taxonPageUrl;
4
  var searchTaxaUrl = searchTaxaUrl;
5
  var pageSize;
6

    
7
  var progress = 0;
8
  var i = 0;
9
  var doRun = false;
10

    
11
  var dataPager = null;
12

    
13
//  this.elapsedMillies = 0;
14
//  this.estimatedMillies = 0;
15

    
16
  /**
17
   * Log to the Firebug Console if Firebug is available
18
   * @param msg the massage to show in the firebug Console
19
   * @return
20
   */
21
  var log = function(msg){
22
    if (window.console && window.console.firebug){
23
      console.log(msg);
24
    }
25
  }
26

    
27
  /**
28
   *
29
   * @param data
30
   * @param statusText
31
   * @return
32
   */
33
  var init = function(data, statusText){
34
     dataPager = data;
35
     if(dataPager != undefined){
36
       progressCallback(progress, null, null, "Ready!");
37
     }
38
     if(readyCallback != undefined){
39
       readyCallback();
40
     }
41
     elapsedMillies = 0;
42
     estimatedMillies = 0;
43

    
44
  };
45

    
46
  /**
47
   *
48
   * @param callback
49
   * @return
50
   */
51
  var requestNextDataPage = function(callback){
52
    var uri = searchTaxaUrl + escape("&pageSize=" + pageSize);
53
    if(dataPager != null){
54
      uri += escape("&pageNumber="+ dataPager.nextIndex);
55
    }
56
    log('page->'+uri);
57
    jQuery.ajax({
58
      url: uri,
59
      dataType: 'json',
60
      cache: false, // browser will not cache
61
      success: callback,
62
      error: function(XMLHttpRequest, statusText ){
63
          stop();
64
          errorCallback(statusText, 'A network error occurred, please start again.', unescape(uri), true);
65
        }
66
    });
67
  }
68

    
69
  /**
70
   *
71
   */
72
  this.run = function(lastMillies){
73

    
74
     //
75
    var now = new Date();
76
    var nowMillies = now.getTime();
77
    if(lastMillies != undefined){
78
      elapsedMillies += (nowMillies - lastMillies);
79
      estimatedMillies = (elapsedMillies / i) * dataPager.count;
80
    }
81

    
82
    var parent = this;
83
    // get next page of data
84
    if( i > dataPager.lastRecord - 1 && i < dataPager.count && dataPager.nextIndex != undefined){
85
      requestNextDataPage(function(data, statusText){
86
        if(statusText == 'success'){
87
          dataPager = data;
88
          parent.run(nowMillies);
89
        } else {
90
          parent.stop();
91
          readyCallback(statusText);
92
        }
93

    
94
      });
95
    } else {
96
      // update the progress callback
97
      var p = (i / dataPager.count);
98
      if(p != progress){
99
        progress = p;
100
        progressCallback(progress, new Date(elapsedMillies), new Date(estimatedMillies));
101
      }
102
      // get new taxon page
103
      if (doRun == true && i++ < dataPager.count){
104
        var ri = i - (dataPager.firstRecord);
105
        var taxon = dataPager.records[ri];
106
        var taxonUrl = taxonPageUrl + taxon.uuid + '/all';
107
        log('taxon->'+taxonUrl);
108
        jQuery.ajax({
109
          url: taxonUrl,
110
          cache: false, // browser will not cache
111
          complete: function(xmlHttpRequest, statusText){
112
              if(xmlHttpRequest.status != 200){
113
                errorCallback(statusText, null, unescape(taxonUrl), false);
114
              }
115
              parent.run(nowMillies);
116
            }
117
        });
118
        taxon = null;
119
      } else if(i == dataPager.count) {
120
        // DONE!
121
        if(doneCallback != undefined){
122
          doneCallback();
123
         }
124
      } else if(doRun == false){
125
        readyCallback();
126
      }
127
    }
128
  };
129

    
130
  /**
131
   *
132
   */
133
  this.start =  function(){
134
      doRun = true;
135
      this.run();
136
    };
137

    
138
  /**
139
   *
140
   */
141
    this.stop = function(){
142
      doRun = false;
143
    };
144

    
145
  // get list of taxa and initialize the Bot
146
  progressCallback(0, null, null, "Initializing, please wait ...");
147
  requestNextDataPage(function(data, statusText){
148
    init(data, statusText);
149
  });
150
}
151

    
152
// -----------------------------------------------------------------------------
153

    
154
jQuery(document).ready(function($) {
155

    
156
  var searchTaxaUrl = $('#cdm-settings-cache [name=searchTaxaUrl]').val();
157
  var taxonPageUrl = $('#cdm-settings-cache [name=taxonPageUrl]').val();
158

    
159
  $('#cdm-settings-cache [name=start]').attr('disabled', 'disabled');
160
  $('#cdm-settings-cache [name=stop]').attr('disabled', 'disabled');
161
  $('#cdm-settings-cache #progress').css({background: '#012456', color: '#349AAF', fontSize: '100%', padding: '10px'})
162
    $('#cdm-settings-cache #progress').html(
163
        '<div id="usermessage" style="font-size:95%; width: 50%; float:right; font-weight:light; padding:10px; border-left: 1px solid; height: 3.9em;"></div>'
164
        +'<div id="counter" style="font-size:300%; padding:10px;"></div>'
165
        +'<div id="time" style="clear:both; border-top:1px solid #349AAF;"></div>'
166
        +'<div id="log" style="border-top:1px solid #349AAF; font-size:85%; overflow: auto; white-space:nowrap;"></div>');
167

    
168
  var formatTime = function(date){
169
    var h = parseInt(date.getTime() / 1000 / 60 / 60);
170
    var m = parseInt( (date.getTime() / 1000/ 60) % 60);
171
    var s = parseInt( (date.getTime() / 1000 ) % 60);
172
    return '' + h +'h '+ m +'m '+ s +'s ';
173
  }
174

    
175

    
176
  var progressCallback = function(progress, elapsedTime, estimatedTime, userMessage){
177
    var percent = Math.floor(progress * 10000) / 100;
178
    $('#counter').text(percent + '%');
179
    if(elapsedTime != null){
180
      var timehtml =
181
        'elapsed time: ' + formatTime(elapsedTime)
182
        + '<br />estimated time: ' + formatTime(estimatedTime)
183
        + '<br />remaining time: ' + formatTime(new Date(estimatedTime.getTime() - elapsedTime.getTime()));
184
      $('#time').html(timehtml);
185
    }
186
    if(userMessage == undefined || userMessage == null ){
187
      userMessage = '';
188
    }
189
    $('#usermessage').html(userMessage);
190

    
191
  }
192

    
193
  var readyCallback = function(message){
194
    $('#cdm-settings-cache [name=start]').removeAttr('disabled');
195
    if(message != undefined){
196
      $('#cdm-settings-cache').append('<div class="error">'+message+'</div>');
197

    
198
    }
199
  }
200

    
201
  var doneCallback = function(progress){
202
    var percent = Math.floor(progress * 10000) / 100;
203
    $('#cdm-settings-cache #progress').text('DONE');
204
    $('#cdm-settings-cache [name=stop]').removeAttr('disabled');
205
  }
206

    
207
  var errorCallback = function(errorMessage, userMessage, taxonUrl, doStop){
208
    var logentry = '<div>' + errorMessage + ' : ' + taxonUrl + '' + '</div>';
209
    if($('#log div').length == 0){
210
      $('#log').html(logentry);
211
    } else {
212
      $('#log div:last').append(logentry)
213
    }
214
    if(userMessage == undefined || userMessage == null ){
215
      userMessage = '';
216
    }
217
    $('#usermessage').html(userMessage);
218
    if(doStop){
219
      $('#cdm-settings-cache [name=stop]').attr('disabled', 'disabled');
220
      $('#cdm-settings-cache [name=start]').removeAttr('disabled');
221
    }
222
  }
223

    
224
  var cacheBot = new CacheBot(searchTaxaUrl, taxonPageUrl, 25, progressCallback, readyCallback, doneCallback, errorCallback);
225

    
226
  $('#cdm-settings-cache [name=start]').click(function(){
227
    cacheBot.start();
228
    $('#cdm-settings-cache [name=start]').attr('disabled', 'disabled');
229
    $('#cdm-settings-cache [name=stop]').removeAttr('disabled');
230
    $('#usermessage').html(' ');
231
  }).attr('disabled', 'disabled');
232
  $('#cdm-settings-cache [name=stop]').click(function(){
233
    cacheBot.stop();
234
    $('#cdm-settings-cache [name=stop]').attr('disabled', 'disabled');
235
  }).attr('disabled', 'disabled');
236
});
(2-2/11)