/*

	Proxy Plug-in

	

	Features:

		Times an upload to see if it appear suspiciously fast which might indicate a proxy server or anti-virus suite intercepting the upload. 

		If the upload seems too fast an uploadError event is fired with PROXY error code after the final uploadProgress event.

		

		Adds a SWFUpload setting allowing you to tweak the bytes/s for triggering the error:

			proxy_detect_threshold : 256000

			

		Adds an UPLOAD_ERROR entry called PROXY:

			function uploadError(file, errorCode, message) {

				if (errorCode === SWFUpload.UPLOAD_ERROR.PROXY) {

					alert("You might have a proxy!");

				}

			}

	*/



var SWFUpload;

if (typeof(SWFUpload) === "function") {

	SWFUpload.proxyDetect = {};

	SWFUpload.UPLOAD_ERROR.PROXY = -30300;

	

	SWFUpload.prototype.initSettings = (function (oldInitSettings) {

		return function (userSettings) {

			if (typeof(oldInitSettings) === "function") {

				oldInitSettings.call(this, userSettings);

			}

			

			this.ensureDefault = function (settingName, defaultValue) {

				this.settings[settingName] = (userSettings[settingName] == undefined) ? defaultValue : userSettings[settingName];

			};



			// List used to keep the speed stats for the files we are tracking

			this.proxyDetectFileStartTimes = {};

			this.proxyDetectSettings = {};



			this.ensureDefault("proxy_detect_threshold", 256000); // Default is 250 KB per second

			

			this.proxyDetectSettings.user_upload_progress_handler = this.settings.upload_progress_handler;

			this.proxyDetectSettings.user_upload_complete_handler = this.settings.upload_complete_handler;

			

			this.settings.upload_progress_handler = SWFUpload.proxyDetect.uploadProgressHandler;

			this.settings.upload_complete_handler = SWFUpload.proxyDetect.uploadCompleteHandler;

			

			

			delete this.ensureDefault;

		};

	}(SWFUpload.prototype.initSettings));



	SWFUpload.proxyDetect.uploadProgressHandler = function (file, bytesComplete, bytesTotal) {

		var ex1 = null, time, differenceMS, bps;

		try {

			if (typeof this.proxyDetectSettings.user_upload_progress_handler === "function") {

				this.proxyDetectSettings.user_upload_progress_handler.call(this, file, bytesComplete, bytesTotal);

			}

		} catch (ex1) { }

			

		

		if (bytesComplete === 0) {

			this.proxyDetectFileStartTimes[file.ID] = new Date();



		} else if (bytesComplete === bytesTotal) {

			try {

				// Calculate the Bps and decide if we should trigger the error

				time = new Date();

				differenceMS = time.getTime() - this.proxyDetectFileStartTimes[file.ID].getTime();

				

				if (differenceMS === 0) {

					differenceMS = 1;

				}

				

				bps = bytesTotal / (differenceMS * 1000);

				if (bps > parseInt(this.settings.proxy_detect_threshold, 10)) {

					this.queueEvent("upload_error_handler", [file, SWFUpload.UPLOAD_ERROR.PROXY, bps]);

				}					

			} catch (ex) {

			}

		}

		

		if (ex1 !== null) {

			throw(ex1);

		}

	};

	

	SWFUpload.proxyDetect.uploadCompleteHandler = function (file) {

		try {

			delete this.proxyDetectFileStartTimes[file.ID];

		} catch (ex) {

		}

		

		if (typeof this.proxyDetectSettings.user_upload_progress_handler === "function") {

			return this.proxyDetectSettings.user_upload_progress_handler.call(this, file);

		}

	};	

}