Project

General

Profile

Download (6.8 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("&page="+ dataPager.nextIndex);
55
		}
56
		log('page->'+uri);
57
		$.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
				$.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
$(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 />remainig 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)