var CallbackManager = {

	clientCallbackFunction: null,
	ccFunctions: [],
	targetObjectsIDs: [],

	init: function(controlID, clientCallbackFunction) {
		CallbackManager.controlID = controlID;
		CallbackManager.clientCallbackFunction = clientCallbackFunction;
	},

	getStrFromList: function(lst) {
		var str = "{";
		for (var k in lst) {
			var val = lst[k];
			if (typeof (val) == 'function')
				continue;
			else if (val == null || (val == "" && val != 0))
				str += '"' + k + '":null,';
			else if (typeof (val) == "object")
				str += '"' + k + '":' + CallbackManager.getStrFromList(val) + ',';
			else if (typeof (val) == "boolean" || val == "true" || val == "false")
				str += '"' + k + '":' + val + ',';
			else if (!isNaN(val))
				str += '"' + k + '":' + val + ',';
			else
				str += '"' + k + '"' + ":'" + CallbackManager.replace(val, "'", '\\\'') + "',";
		}
		if (str.charAt(str.length - 1) == ",")
			str = str.substring(0, str.length - 1);
		str += "}";
		return str;
	},

	clientCallback: function(result) {
		var rs = eval("(" + result + ")");
		if (rs["__callbackRefused"] == "true")
			return;

		if (rs["__ExceptionMessage"] != null) {
			alert(rs["__ExceptionType"] + " : " + rs["__ExceptionMessage"] + "\n\n" + rs["__ExceptionStackTrace"]);
			return;
		}
		if (rs["jsExceptionFunction"] != null) {
			eval("jsExceptionFunction=" + rs["jsExceptionFunction"] + ";");
			eval("jsExceptionFunction()");
			return;
		}

		for (var key in rs) {
			var input = document.getElementById(key);
			if (input != null)
				input.value = rs[key];
		}

		var fn = CallbackManager.ccFunctions[rs.requisitionID];
		if (typeof (fn) == "function")
			fn(rs);
		else
			eval(fn + "(rs)");
	},

	callback: function(args, fn, targetObjectID) {
		args = args || {};
		var rID = CallbackManager.ccFunctions.length;
		args["requisitionID"] = rID;
		CallbackManager.ccFunctions[rID] = fn || CallbackManager.clientCallbackFunction;
		if (targetObjectID) {
			CallbackManager.targetObjectsIDs[rID] = targetObjectID;
			args["targetObjectID"] = targetObjectID;
		}
		var val = CallbackManager.getStrFromList(args);
		var context = CallbackManager.controlID;
		var id = CallbackManager.replace(context, "_", "$");
		WebForm_DoCallback(id, val, CallbackManager.clientCallback, context, null, true);
	},

	replace: function(str, oldValue, newValue, replaceAll, caseInsensitive) {
		replaceAll = replaceAll || true;
		caseInsensitive = caseInsensitive || true;
		var flags = "";
		if (replaceAll)
			flags += "g";
		if (caseInsensitive)
			flags += "i";
		return str.replace(new RegExp(oldValue, flags), newValue);
	}
};

//fix the pendingCallbacks js error
function WebForm_CallbackComplete_SyncFixed() {
	for (var i = 0; i < __pendingCallbacks.length; i++) {
			callbackObject = __pendingCallbacks[i];
			if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {
			if (!__pendingCallbacks[i].async) {
			 __synchronousCallBackIndex = -1;
		}
		__pendingCallbacks[i] = null;

		var callbackFrameID = "__CALLBACKFRAME" + i;
		var xmlRequestFrame = document.getElementById(callbackFrameID);
		if (xmlRequestFrame) {
			xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);
		}

		WebForm_ExecuteCallback(callbackObject);
		}
	}
}
