Project

General

Profile

Download (6.77 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
	};
43

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

    
67
	/**
68
	 *
69
	 */
70
	this.run = function(lastMillies){
71

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

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

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

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

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

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

    
150
// -----------------------------------------------------------------------------
151

    
152
$(document).ready(function() {
153

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

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

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

    
173

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

    
189
	}
190

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

    
196
		}
197
	}
198

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

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

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

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