/********* * Javascript for file upload demo * Copyright (C) Tomas Larsson 2006 * http://tomas.epineer.se/ * Licence: * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under this License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. */ function PeriodicalAjax(url, parameters, frequency, decay, onSuccess, onFailure) { function createRequestObject() { var xhr; try { xhr = new XMLHttpRequest(); } catch (e) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } return xhr; } function send() { if(!stopped) { xhr.open('post', url, true); xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { self.onComplete(); }; xhr.send(parameters); } } this.stop = function() { stopped = true; clearTimeout(this.timer); } this.start = function() { stopped = false; this.onTimerEvent(); } this.onComplete = function() { if(this.stopped) return false; if ( xhr.readyState == 4) { if(xhr.status == 200) { if(xhr.responseText == lastResponse) { decay = decay * originalDecay; } else { decay = 1; } lastResponse = xhr.responseText; if(onSuccess instanceof Function) { onSuccess(xhr); } this.timer = setTimeout(function() { self.onTimerEvent(); }, decay * frequency * 1000); } else { if(onFailure instanceof Function) { onFailure(xhr); } } } } this.getResponse = function() { if(xhr.responseText) { return xhr.responseText; } } this.onTimerEvent = function() { send(); } var self = this; var stopped = false; var originalDecay = decay || 1.2; decay = originalDecay; var xhr = createRequestObject(); var lastResponse = ""; this.start(); } function ProgressTracker(sid, options) { this.onSuccess = function(xhr) { if(parseInt(xhr.responseText) >= 100) { periodicalAjax.stop(); if(options.onComplete instanceof Function) { options.onComplete(); } } else if(xhr.responseText && xhr.responseText != lastResponse) { if(options.onProgressChange instanceof Function) { options.onProgressChange(xhr.responseText); } if(options.progressBar && options.progressBar.style) { options.progressBar.style.width = parseInt(xhr.responseText) + "%"; } } } this.onFailure = function(xhr) { if(options.onFailure instanceof Function) { options.onFailure(xhr.responseText); } else { alert(xhr.responseText); } periodicalAjax.stop(); } var self = this; var lastResponse = -1; options = options || {}; var url = options.url || 'fileprogress.php'; var frequency = options.frequency || 0.5; var decay = options.decay || 2; var periodicalAjax = new PeriodicalAjax(url, 'sid=' + sid, frequency, decay, function(request){self.onSuccess(request);},function(request){self.onFailure(request);}); }