﻿Type.registerNamespace('AjaxControlToolkit.Threading');
AjaxControlToolkit.DeferredOperation = function(delay, context, callback) {
this._delay = delay;
this._context = context;
this._callback = callback;
this._completeCallback = null;
this._errorCallback = null;
this._timer = null;
this._callArgs = null;
this._isComplete = false;
this._completedSynchronously = false;
this._asyncResult = null;
this._exception = null;
this._throwExceptions = true;
this._oncomplete$delegate = Function.createDelegate(this, this._oncomplete);
this.post = Function.createDelegate(this, this.post);
}
AjaxControlToolkit.DeferredOperation.prototype = { 
get_isPending : function() {
return (this._timer != null); 
},

get_isComplete : function() { 
return this._isComplete; 
},
get_completedSynchronously : function() {
return this._completedSynchronously;},
get_exception : function() {
return this._exception;
},
get_throwExceptions : function() {
return this._throwExceptions;
},
set_throwExceptions : function(value) {
this._throwExceptions = value;
},
get_delay : function() { 
return this._delay;},
set_delay : function(value) {this._delay = value;},
post : function(args) {
var ar = [];
for (var i = 0; i < arguments.length; i++) {ar[i] = arguments[i];}
this.beginPost(ar, null, null);},
beginPost : function(args, completeCallback, errorCallback) {
this.cancel();
this._callArgs = Array.clone(args || []);
this._completeCallback = completeCallback;
this._errorCallback = errorCallback;
if (this._delay == -1) {
this._oncomplete();
this._completedSynchronously = true;
} else {
this._timer = setTimeout(this._oncomplete$delegate, this._delay);}
}, 
cancel : function() {
if (this._timer) {
clearTimeout(this._timer);
this._timer = null;
}
this._callArgs = null;
this._isComplete = false;
this._asyncResult = null;
this._completeCallback = null;
this._errorCallback = null;
this._exception = null;
this._completedSynchronously = false;
},
complete : function() {
if (this._timer) {
try {
this._oncomplete();
} finally {
this._completedSynchronously = true;
}
return this._asyncResult;
} else if (this._isComplete) {
return this._asyncResult;
}
},
_oncomplete : function() {
var args = this._callArgs;
var completeCallback = this._completeCallback;
var errorCallback = this._errorCallback;
this.cancel();
try {
if (args) {
this._asyncResult = this._callback.apply(this._context, args);
} else {
this._asyncResult = this._callback.call(this._context);
}
this._isComplete = true;
this._completedSynchronously = false;
if (completeCallback) {
completeCallback(this);}
} catch (e) {
this._isComplete = true;
this._completedSynchronously = false;
this._exception = e;
if (errorCallback) {
if (errorCallback(this)) {
return;}} 
if (this._throwExceptions) {
throw e;}}}}
AjaxControlToolkit.DeferredOperation.registerClass("AjaxControlToolkit.DeferredOperation");
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();