Project

General

Profile

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

    
3
  var taxonPageUrl = taxonPageUrl;
4
  var pageTaxaUrl = pageTaxaUrl;
5
  var pageSize = null;
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

    
53
    var nextPageIndex = 0;
54
    if(dataPager != null){
55
        nextPageIndex = dataPager.nextIndex;
56
    }
57

    
58
    var uriParams = (pageSize != null ? "&pageSize=" + pageSize : '');
59
    uriParams += "&pageNumber="+ nextPageIndex;
60
    log('page->' + uriParams);
61
    uri = pageTaxaUrl +  escape(escape(uriParams));
62
    jQuery.ajax({
63
      url: uri,
64
      dataType: 'json',
65
      cache: false, // browser will not cache
66
      success: callback,
67
      error: function(XMLHttpRequest, statusText ){
68
          stop();
69
          errorCallback(statusText, 'A network error occurred, please start again.', unescape(uri), true);
70
        }
71
    });
72
  };
73

    
74
  /**
75
   *
76
   */
77
  this.processNextPage = function(lastMillies){
78

    
79
     //
80
    var now = new Date();
81
    var nowMillies = now.getTime();
82
    if(lastMillies != undefined){
83
      elapsedMillies += (nowMillies - lastMillies);
84
      estimatedMillies = (elapsedMillies / i) * dataPager.count;
85
    }
86

    
87
    var thisCacheBot = this;
88
    // get next page of data
89
    if( i > dataPager.lastRecord - 1 && i < dataPager.count && dataPager.nextIndex != undefined){
90
      requestNextDataPage(function(data, statusText){
91
        if(statusText == 'success'){
92
          dataPager = data;
93
          thisCacheBot.processNextPage(nowMillies);
94
        } else {
95
          thisCacheBot.stop();
96
          readyCallback(statusText);
97
        }
98

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

    
135
  /**
136
   *
137
   */
138
  this.start =  function(){
139
      doRun = true;
140
      this.processNextPage();
141
    };
142

    
143
  /**
144
   *
145
   */
146
    this.stop = function(){
147
      doRun = false;
148
    };
149

    
150
  // get list of taxa and initialize the Bot
151
  progressCallback(0, null, null, "Initializing, please wait ...");
152
  requestNextDataPage(function(data, statusText){
153
    init(data, statusText);
154
  });
155
}
156

    
157
// -----------------------------------------------------------------------------
158

    
159
jQuery(document).ready(function($) {
160

    
161
  var pageTaxaUrl = $('#cdm-settings-cache [name=pageTaxaUrl]').val();
162
  var taxonPageUrl = $('#cdm-settings-cache [name=taxonPageUrl]').val();
163

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

    
173
  var formatTime = function(date){
174
    var h = parseInt(date.getTime() / 1000 / 60 / 60);
175
    var m = parseInt( (date.getTime() / 1000/ 60) % 60);
176
    var s = parseInt( (date.getTime() / 1000 ) % 60);
177
    return '' + h +'h '+ m +'m '+ s +'s ';
178
  };
179

    
180

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

    
196
  };
197

    
198
  var readyCallback = function(message){
199
    $('#cdm-settings-cache [name=start]').removeAttr('disabled');
200
    if(message != undefined){
201
      $('#cdm-settings-cache').append('<div class="error">'+message+'</div>');
202

    
203
    }
204
  };
205

    
206
  var doneCallback = function(progress){
207
    $('#cdm-settings-cache #progress').text('DONE');
208
    $('#cdm-settings-cache [name=stop]').removeAttr('disabled');
209
  };
210

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

    
228
  var cacheBot = new CacheBot(pageTaxaUrl, taxonPageUrl, 25, progressCallback, readyCallback, doneCallback, errorCallback);
229

    
230
  $('#cdm-settings-cache [name=start]').click(function(){
231
    cacheBot.start();
232
    $('#cdm-settings-cache [name=start]').attr('disabled', 'disabled');
233
    $('#cdm-settings-cache [name=stop]').removeAttr('disabled');
234
    $('#usermessage').html(' ');
235
  }).attr('disabled', 'disabled');
236
  $('#cdm-settings-cache [name=stop]').click(function(){
237
    cacheBot.stop();
238
    $('#cdm-settings-cache [name=stop]').attr('disabled', 'disabled');
239
  }).attr('disabled', 'disabled');
240
});
(2-2/15)