if(!window.Btv){window.Btv={};}Btv.Ajax=new (function(){this.PublicKey=function(){return("");};this.ExtraQS=function(){return("");};this.Decrypt=function(responseText){return(responseText);};this.DictToHash=function(d){var h={};if(d){if(d.getKeys){var a=d.getKeys();for(var i=0;i<a.length;i++){h[a[i]]=d.getValue(a[i]);}}else{for(var i=0;i<d.length;i++){h[d[i].Key]=d[i].Value;}}}return(h);};this.DictToValues=function(d){var v=[];if(d){if(d.getKeys){var a=d.getKeys();for(var i=0;i<a.length;i++){v.push(d.getValue(a[i]));}}else{for(var i=0;i<d.length;i++){v.push(d[i].Value);}}}return(v);};this.MakeFunction=function(obj,str,version,params){return(function(){function R(o){fnc((o&&(o.value!=undefined))?o.value:null);}var a=params||arguments;var iActualParamCount=params?params.length:arguments.length-1;var fnc=arguments[arguments.length-1];var args=[];for(var i=0;i<iActualParamCount;i++){args.push(a[i]);}args.push(version?version:null);args.push(R);obj[str].apply(obj,args);});};this.AjaxDataSupplier=function(ajaxCall,oData){var oInvoker=this;oInvoker.onDataChanged=new YAHOO.util.CustomEvent("onDataChanged");oInvoker.Clear=function(){oData=null;};oInvoker.GetData=function(){return(oData);};oInvoker.Invoke=function(){function F(o){oData=(o&&o.value)?o.value:null;oInvoker.onDataChanged.fire(oData);}var a=[];for(var i=0;i<arguments.length;i++){a[i]=arguments[i];}a.push(null);a.push(F);ajaxCall.obj[ajaxCall.name].apply(ajaxCall.obj,a);};};})();
//--------------------------------------------------------------
// Copyright (C) 2006 Michael Schwarz (http://www.ajaxpro.info).
// All rights reserved.
//--------------------------------------------------------------

// prototype.js
var ajaxProPrototypes = {};

ajaxProPrototypes.Object = {
    extend : function(dest, source, replace) {
	    for(var prop in source) {
		    if(replace == false && dest[prop] != null) { continue; }
		    dest[prop] = source[prop];
	    }
	    return dest;
    }
};

ajaxProPrototypes.Function = {
	bind: function(fnc, o) {
		if(!ajaxProPrototypes.Function.__objs) {
			ajaxProPrototypes.Function.__objs = [];
			ajaxProPrototypes.Function.__funcs = [];
		}
		var objId = o.__oid;
		if(!objId) {
			ajaxProPrototypes.Function.__objs[objId = o.__oid = ajaxProPrototypes.Function.__objs.length] = o;
		}

		var me = fnc;
		var funcId = me.__fid;
		if(!funcId) {
			ajaxProPrototypes.Function.__funcs[funcId = me.__fid = ajaxProPrototypes.Function.__funcs.length] = me;
		}

		if(!o.__closures) {
			o.__closures = [];
		}

		var closure = o.__closures[funcId];
		if(closure) {
			return closure;
		}

		o = null;
		me = null;

		return ajaxProPrototypes.Function.__objs[objId].__closures[funcId] = function() {
			return ajaxProPrototypes.Function.__funcs[funcId].apply(ajaxProPrototypes.Function.__objs[objId], arguments);
		};
	},
	argumentsToArray: function(fnc) {
		var args = [];
		for(var i=0; i<fnc.arguments.length; i++) {
			args.push(fnc.arguments[i]);
		}
		return args;
	}
};

ajaxProPrototypes.Array = {
	addRange: function(a, items) {
		if(items.length > 0) {
			for(var i=0; i<items.length; i++) {
				a.push(items[i]);
			}
		}
	},
	clear: function(a) {
		a.length = 0;
		return a;
	}
};

ajaxProPrototypes.String = {
	trimLeft: function(str) {
		return str.replace(/^\s*/,"");
	},
	trimRight: function(str) {
		return str.replace(/\s*$/,"");
	},
	trim: function(str) {
	    return(ajaxProPrototypes.String.trimLeft(ajaxProPrototypes.String.trimRight(str)));
	},
	endsWith: function(str, s) {
		if(str.length == 0 || str.length < s.length) { return false; }
		return (str.substr(str.length - s.length) == s);
	},
	startsWith: function(str, s) {
		if(str.length == 0 || str.length < s.length) { return false; }
		return (str.substr(0, s.length) == s);
	},
	
	format: function(s) {
		for(var i=1; i<arguments.length; i++) {
			s = s.replace("{" + (i -1) + "}", arguments[i]);
		}
		return s;
	},
	isNullOrEmpty: function(s) {
		if(s == null || s.length == 0) {
			return true;
		}
		return false;
	}
};


if(typeof addEvent == "undefined")
	addEvent = function(o, evType, f, capture) {
		if(o == null) { return false; }
		if(o.addEventListener) {
			o.addEventListener(evType, f, capture);
			return true;
		} else if (o.attachEvent) {
			var r = o.attachEvent("on" + evType, f);
			return r;
		} else {
			try{ o["on" + evType] = f; }catch(e){}
		}
	};
	
if(typeof removeEvent == "undefined")
	removeEvent = function(o, evType, f, capture) {
		if(o == null) { return false; }
		if(o.removeEventListener) {
			o.removeEventListener(evType, f, capture);
			return true;
		} else if (o.detachEvent) {
			o.detachEvent("on" + evType, f);
		} else {
			try{ o["on" + evType] = function(){}; }catch(e){}
		}
	};
// core.js
ajaxProPrototypes.Function.argumentsToArray = function(arguments) {
	var args = [];
	for(var i=0; i<arguments.length; i++) {
		args.push(arguments[i]);
	}
	return args;
}

var MS = {"Browser":{}};

ajaxProPrototypes.Object.extend(MS.Browser, {
	isIE: navigator.userAgent.indexOf('MSIE') != -1,
	isFirefox: navigator.userAgent.indexOf('Firefox') != -1,
	isOpera: window.opera != null
}, false);

var AjaxPro = {};

AjaxPro.IFrameXmlHttp = function() {};
AjaxPro.IFrameXmlHttp.prototype = {
	onreadystatechange: null, headers: [], method: "POST", url: null, async: true, iframe: null,
	status: 0, readyState: 0, responseText: null,
	abort: function() {
	},
	readystatechanged: function() {
		var doc = this.iframe.contentDocument || this.iframe.document;
		if(doc != null && doc.readyState == "complete" && doc.body != null && doc.body.res != null) {
			this.status = 200;
			this.statusText = "OK";
			this.readyState = 4;
			this.responseText = doc.body.res;
			this.onreadystatechange();
			return;
		}
		setTimeout(ajaxProPrototypes.Function.bind(this.readystatechanged, this), 10);
	},
	open: function(method, url, async) {
		if(async == false) {
			alert("Synchronous call using IFrameXMLHttp is not supported.");
			return;
		}
		if(this.iframe == null) {
			var iframeID = "hans";
			if (document.createElement && document.documentElement &&
				(window.opera || navigator.userAgent.indexOf('MSIE 5.0') == -1))
			{
				var ifr = document.createElement('iframe');
				ifr.setAttribute('id', iframeID);
				ifr.style.visibility = 'hidden';
				ifr.style.position = 'absolute';
				ifr.style.width = ifr.style.height = ifr.borderWidth = '0px';

				this.iframe = document.getElementsByTagName('body')[0].appendChild(ifr);
			}
			else if (document.body && document.body.insertAdjacentHTML)
			{
				document.body.insertAdjacentHTML('beforeEnd', '<iframe name="' + iframeID + '" id="' + iframeID + '" style="border:1px solid black;display:none"></iframe>');
			}
			if (window.frames && window.frames[iframeID]) {
				this.iframe = window.frames[iframeID];
			}
			this.iframe.name = iframeID;
			this.iframe.document.open();
			this.iframe.document.write("<"+"html><"+"body></"+"body></"+"html>");
			this.iframe.document.close();
		}
		this.method = method;
		this.url = url;
		this.async = async;
	},
	setRequestHeader: function(name, value) {
		for(var i=0; i<this.headers.length; i++) {
			if(this.headers[i].name == name) {
				this.headers[i].value = value;
				return;
			}
		}
		this.headers.push({"name":name,"value":value});
	},
	getResponseHeader: function(name, value) {
		return null;
	},
	addInput: function(doc, form, name, value) {
		var ele;
		var tag = "input";
		if(value.indexOf("\n") >= 0) {
			tag = "textarea";
		}
		
		if(doc.all) {
			ele = doc.createElement("<" + tag + " name=\"" + name + "\" />");
		}else{
			ele = doc.createElement(tag);
			ele.setAttribute("name", name);
		}
		ele.setAttribute("value", value);
		form.appendChild(ele);
		ele = null;
	},
	send: function(data) {
		if(this.iframe == null) {
			return;
		}
		var doc = this.iframe.contentDocument || this.iframe.document;
		var form = doc.createElement("form");
		
		doc.body.appendChild(form);
		
		form.setAttribute("action", this.url);
		form.setAttribute("method", this.method);
		form.setAttribute("enctype", "application/x-www-form-urlencoded");
		
		for(var i=0; i<this.headers.length; i++) {
			switch(this.headers[i].name.toLowerCase()) {
				case "content-length":
				case "accept-encoding":
				case "content-type":
					break;
				default:
					this.addInput(doc, form, this.headers[i].name, this.headers[i].value);
			}
		}
		this.addInput(doc, form, "data", data);
		form.submit();
		
		setTimeout(ajaxProPrototypes.Function.bind(this.readystatechanged, this), 0);
	}
};

var progids = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
var progid = null;

if(typeof ActiveXObject != "undefined") {
	var ie7xmlhttp = false;
	if(typeof XMLHttpRequest == "object") {
		try{ var o = new XMLHttpRequest(); ie7xmlhttp = true; }catch(e){}
	}
	if(typeof XMLHttpRequest == "undefined" || !ie7xmlhttp) {
		XMLHttpRequest = function() {
			var xmlHttp = null;
			if(!AjaxPro.noActiveX) {
				if(progid != null) {
					return new ActiveXObject(progid);
				}
				for(var i=0; i<progids.length && xmlHttp == null; i++) {
					try {
						xmlHttp = new ActiveXObject(progids[i]);
						progid = progids[i];

					}catch(e){}
				}
			}
			if(xmlHttp == null && MS.Browser.isIE) {
				return new AjaxPro.IFrameXmlHttp();
			}
			return xmlHttp;
		};
	}
}

ajaxProPrototypes.Object.extend(AjaxPro, {
	noOperation: function() {},
	onLoading: function() {},
	onError: function() {},
	onTimeout: function() { return true; },
	onStateChanged: function() {},
	cryptProvider: null,
	queue: null,
	token: "",
	version: "7.7.31.1",
	ID: "AjaxPro",
	noActiveX: false,
	timeoutPeriod: 45*1000,
	queue: null,
	noUtcTime: false,
	m : {
		'\b': '\\b',
		'\t': '\\t',
		'\n': '\\n',
		'\f': '\\f',
		'\r': '\\r',
		'"' : '\\"',
		'\\': '\\\\'
	},
	toJSON: function(o) {	
		if(o == null) {
			return "null";
		}
		var v = [];
		var i;
		var c = o.constructor;
		if(c == Number) {
			return isFinite(o) ? o.toString() : AjaxPro.toJSON(null);
		} else if(c == Boolean) {
			return o.toString();
		} else if(c == String) {
			if (/["\\\x00-\x1f]/.test(o)) {
				o = o.replace(/([\x00-\x1f\\"])/g, function(a, b) {
					var c = AjaxPro.m[b];
					if (c) {
						return c;
					}
					c = b.charCodeAt();
					return '\\u00' +
						Math.floor(c / 16).toString(16) +
						(c % 16).toString(16);
				});
            }
			return '"' + o + '"';
		} else if (c == Array) {
			for(i=0; i<o.length; i++) {
				v.push(AjaxPro.toJSON(o[i]));
			}
			return "[" + v.join(",") + "]";
		} else if (c == Date) {
			var d = {};
			d.__type = "System.DateTime";
			if(AjaxPro.noUtcTime == true) {
				d.Year = o.getFullYear();
				d.Month = o.getMonth() +1;
				d.Day = o.getDate();
				d.Hour = o.getHours();
				d.Minute = o.getMinutes();
				d.Second = o.getSeconds();
				d.Millisecond = o.getMilliseconds();
			} else {
				d.Year = o.getUTCFullYear();
				d.Month = o.getUTCMonth() +1;
				d.Day = o.getUTCDate();
				d.Hour = o.getUTCHours();
				d.Minute = o.getUTCMinutes();
				d.Second = o.getUTCSeconds();
				d.Millisecond = o.getUTCMilliseconds();
			}
			return AjaxPro.toJSON(d);
		}
		if(typeof o.toJSON == "function") {
			return o.toJSON();
		}
		if(typeof o == "object") {
			for(var attr in o) {
				if(typeof o[attr] != "function") {
					v.push('"' + attr + '":' + AjaxPro.toJSON(o[attr]));
				}
			}
			if(v.length>0) {
				return "{" + v.join(",") + "}";
			}
			return "{}";		
		}
		return o.toString();
	},
	dispose: function() {
		if(AjaxPro.queue != null) {
			AjaxPro.queue.dispose();
		}
	}
}, false);

addEvent(window, "unload", AjaxPro.dispose);

AjaxPro.Request = function(url) {
	this.url = url;
	this.xmlHttp = null;
};

AjaxPro.Request.prototype = {
    url: null,
    callback: null,
    onLoading: null,
    onError: null,
    onTimeout: null,
    onStateChanged: null,
    args: null,
    context: null,
    isRunning: false,
    abort: function()
    {
        if (this.timeoutTimer != null)
        {
            clearTimeout(this.timeoutTimer);
        }
        if (this.xmlHttp)
        {
            this.xmlHttp.onreadystatechange = AjaxPro.noOperation;
            this.xmlHttp.abort();
        }
        if (this.isRunning)
        {
            this.isRunning = false;
            this.onLoading(false);
        }
    },
    dispose: function()
    {
        this.abort();
    },
    getEmptyRes: function()
    {
        return {
            error: null,
            value: null,
            request: { method: this.method, args: this.args },
            context: this.context,
            duration: this.duration
        };
    },
    endRequest: function(res)
    {
        this.abort();
        if (res.error != null)
        {
            this.onError(res.error, this);
        }

        if (typeof this.callback == "function")
        {
            this.callback(res, this);
        }
    },
    mozerror: function()
    {
        if (this.timeoutTimer != null)
        {
            clearTimeout(this.timeoutTimer);
        }
        var res = this.getEmptyRes();
        res.error = { Message: "Unknown", Type: "ConnectFailure", Status: 0 };
        this.endRequest(res);
    },
    doStateChange: function()
    {
        this.onStateChanged(this.xmlHttp.readyState, this);
        if (this.xmlHttp.readyState != 4 || !this.isRunning)
        {
            return;
        }
        this.duration = new Date().getTime() - this.__start;
        if (this.timeoutTimer != null)
        {
            clearTimeout(this.timeoutTimer);
        }
        var res = this.getEmptyRes();
        if (this.xmlHttp.status == 200 && this.xmlHttp.statusText == "OK")
        {
            res = this.createResponse(res);
        } else
        {
            res = this.createResponse(res, true);
            res.error = { Message: this.xmlHttp.statusText, Type: "ConnectFailure", Status: this.xmlHttp.status };
        }

        this.endRequest(res);
    },
    createResponse: function(r, noContent)
    {
        if (!noContent)
        {
            if (typeof (this.xmlHttp.responseText) == "unknown")
            {
                r.error = { Message: "XmlHttpRequest error reading property responseText.", Type: "XmlHttpRequestException" };
                return r;
            }

            var responseText = "" + this.xmlHttp.responseText;

            if (AjaxPro.cryptProvider != null && typeof AjaxPro.cryptProvider.decrypt == "function")
            {
                responseText = AjaxPro.cryptProvider.decrypt(responseText);
            }

            if (this.xmlHttp.getResponseHeader("Ajax-Encrypt") == "true")
            {
                responseText = this.CustomHook.Decrypt(responseText);
            }


            if (this.xmlHttp.getResponseHeader("Content-Type") == "text/xml")
            {
                r.value = this.xmlHttp.responseXML;
            } else
            {
                if (responseText != null && ajaxProPrototypes.String.trim(responseText).length > 0)
                {
                    r.json = responseText;
                    var v = null;
                    try
                    {
                        eval("v = " + responseText + ";");
                    }
                    catch (e)
                    {
                        if (this.CustomHook && this.CustomHook.Decrypt)
                        {
                            responseText = this.CustomHook.Decrypt(responseText);
                            r.json = responseText;
                            v = null;
                            eval("v = " + responseText + ";");
                        }
                    }
                    if (v != null)
                    {
                        if (typeof v.value != "undefined") r.value = v.value;
                        else if (typeof v.error != "undefined") r.error = v.error;
                    }
                }
            }
        }
        /* if(this.xmlHttp.getResponseHeader("X-" + AjaxPro.ID + "-Cache") == "server") {
        r.isCached = true;
        } */
        return r;
    },
    timeout: function()
    {
        this.duration = new Date().getTime() - this.__start;
        try
        {
            var r = this.onTimeout(this.duration, this);
            if (typeof r == "undefined" || r != false)
            {
                this.abort();
            } else
            {
                this.timeoutTimer = setTimeout(ajaxProPrototypes.Function.bind(this.timeout, this), AjaxPro.timeoutPeriod);
            }
        }
        catch (e)
        {
        }
    },
    invoke: function(useEncryption, versionBuilder, httpMethod, method, args, callback, context)
    {
        this.__start = new Date().getTime();

        // if(this.xmlHttp == null) {
        this.xmlHttp = new XMLHttpRequest();
        // }

        this.isRunning = true;
        this.method = method;
        this.args = args;
        this.callback = callback;
        this.context = context;

        var async = typeof (callback) == "function" && callback != AjaxPro.noOperation;

        if (async)
        {
            if (MS.Browser.isIE)
            {
                this.xmlHttp.onreadystatechange = ajaxProPrototypes.Function.bind(this.doStateChange, this);
            } else
            {
                this.xmlHttp.onload = ajaxProPrototypes.Function.bind(this.doStateChange, this);
                this.xmlHttp.onerror = ajaxProPrototypes.Function.bind(this.mozerror, this);
            }
            this.onLoading(true);
        }

        var json = AjaxPro.toJSON(args) + "";
        if (AjaxPro.cryptProvider != null && typeof AjaxPro.cryptProvider.encrypt == "function")
        {
            json = AjaxPro.cryptProvider.encrypt(json);
        }

        httpMethod = httpMethod || "POST";

        var versionString = "";
        if (versionBuilder)
        {
            var strUniqueVersionValue = versionBuilder;
            if (typeof (versionBuilder) != "string")
            {
                strUniqueVersionValue = (versionBuilder == 1) ? (new Date()).valueOf() : versionBuilder();
            }
            versionString = "&dvcp=" + encodeURIComponent(strUniqueVersionValue);
        }


        var publicKey = "";
        if (useEncryption)
        {
            publicKey = "&penckey=" + encodeURIComponent(this.CustomHook.PublicKey());
        }

        var extraQS = this.CustomHook.ExtraQS();
        if (extraQS) extraQS = "&" + extraQS;


        var urlToSend = this.url + "&" + encodeURIComponent("X-" + AjaxPro.ID + "-Method") + "=" + encodeURIComponent(method) + versionString + publicKey + extraQS;
        if (httpMethod == "GET")
        {
            var getQs = encodeURIComponent(json);
            urlToSend += "&get=" + getQs;
            json = null;
        }

        this.xmlHttp.open(httpMethod, urlToSend, async);
        this.xmlHttp.setRequestHeader("Content-Type", "text/plain; charset=utf-8");
        //this.xmlHttp.setRequestHeader("X-" + AjaxPro.ID + "-Method", method);

        if (AjaxPro.token != null && AjaxPro.token.length > 0)
        {
            this.xmlHttp.setRequestHeader("X-" + AjaxPro.ID + "-Token", AjaxPro.token);
        }

        /* if(!MS.Browser.isIE) {
        this.xmlHttp.setRequestHeader("Connection", "close");
        } */

        this.timeoutTimer = setTimeout(ajaxProPrototypes.Function.bind(this.timeout, this), AjaxPro.timeoutPeriod);

        try { this.xmlHttp.send(json); } catch (e) { } // IE offline exception

        if (!async)
        {
            return this.createResponse({ error: null, value: null });
        }

        return true;
    }
};

AjaxPro.RequestQueue = function(conc) {
	this.queue = [];
	this.requests = [];
	this.timer = null;
	
	if(isNaN(conc)) { conc = 2; }

	for(var i=0; i<conc; i++) {		// max 2 http connections
		this.requests[i] = new AjaxPro.Request();
		this.requests[i].callback = function(res) {
			var r = res.context;
			res.context = r[3][1];

			r[3][0](res, this);
		};
		this.requests[i].callbackHandle = ajaxProPrototypes.Function.bind(this.requests[i].callback, this.requests[i]);		
	}
	
	this.processHandle = ajaxProPrototypes.Function.bind(this.process, this);
};

AjaxPro.RequestQueue.prototype = {
	process: function() {
		this.timer = null;
		if(this.queue.length == 0) {
			return;
		}
		for(var i=0; i<this.requests.length && this.queue.length > 0; i++) {
			if(this.requests[i].isRunning == false) {
				var r = this.queue.shift();

				this.requests[i].url = r[0];
				this.requests[i].onLoading = r[3].length >2 && r[3][2] != null && typeof r[3][2] == "function" ? r[3][2] : AjaxPro.onLoading;
				this.requests[i].onError = r[3].length >3 && r[3][3] != null && typeof r[3][3] == "function" ? r[3][3] : AjaxPro.onError;
				this.requests[i].onTimeout = r[3].length >4 && r[3][4] != null && typeof r[3][4] == "function" ? r[3][4] : AjaxPro.onTimeout;
				this.requests[i].onStateChanged = r[3].length >5 && r[3][5] != null && typeof r[3][5] == "function" ? r[3][5] : AjaxPro.onStateChanged;

				this.requests[i].invoke(r[6], r[5], r[4], r[1], r[2], this.requests[i].callbackHandle, r);
				r = null;
			}
		}
		if(this.queue.length > 0 && this.timer == null) {
			this.timer = setTimeout(this.processHandle, 0);
		}
	},
	add: function(useEncryption, versionBuilder, httpMethod, url, method, args, e) {
		this.queue.push([url, method, args, e, httpMethod, versionBuilder, useEncryption]);
		if(this.timer == null) {
			this.timer = setTimeout(this.processHandle, 0);
		}
		// this.process();
	},
	abort: function() {
		this.queue.length = 0;
		if (this.timer != null) {
			clearTimeout(this.timer);
		}
		this.timer = null;
		for(var i=0; i<this.requests.length; i++) {
			if(this.requests[i].isRunning == true) {
				this.requests[i].abort();
			}
		}
	},
	dispose: function() {
		for(var i=0; i<this.requests.length; i++) {
			var r = this.requests[i];
			r.dispose();
		}
		ajaxProPrototypes.Array.clear(this.requests);
	}
};

AjaxPro.queue = new AjaxPro.RequestQueue(2);	// 2 http connections

AjaxPro.AjaxClass = function(url) {
	this.url = url;
};

AjaxPro.AjaxClass.prototype = {
	invoke: function(useEncryption, versionBuilder, httpMethod, method, args, e) {
	
		if(e != null) {
			if(e.length != 6) {
				for(;e.length<6;) { e.push(null); }
			}
			if(e[0] != null && typeof(e[0]) == "function") {
				return AjaxPro.queue.add(useEncryption, versionBuilder, httpMethod, this.url, method, args, e);
			}
		}
		var r = new AjaxPro.Request();
		r.url = this.url;
		return r.invoke(useEncryption, versionBuilder, httpMethod, method, args);
	}
};
AjaxPro.Request.prototype.CustomHook = Btv.Ajax;
//--------------------------------------------------------------
// Copyright (C) 2006 Michael Schwarz (http://www.ajaxpro.info).
// All rights reserved.
//--------------------------------------------------------------
// Converter.js

// NameValueCollectionConverter
if(typeof Ajax == "undefined") Ajax={};
if(typeof Ajax.Web == "undefined") Ajax.Web={};

Ajax.Web.NameValueCollection = function(items) {
	this.__type = "System.Collections.Specialized.NameValueCollection";
	this.keys = [];
	this.values = [];

	if(items != null && !isNaN(items.length)) {
		for(var i=0; i<items.length; i++)
			this.add(items[i][0], items[i][1]);
	}
};
ajaxProPrototypes.Object.extend(Ajax.Web.NameValueCollection.prototype, {
	add: function(k, v) {
		if(k == null || k.constructor != String || v == null || v.constructor != String)
			return -1;
		this.keys.push(k);
		this.values.push(v);
		return this.values.length -1;
	},
	containsKey: function(key) {
		for(var i=0; i<this.keys.length; i++) {
			if(this.keys[i] == key) return true;
		}
		return false;
	},
	getKeys: function() {
		return this.keys;
	},
	getValue: function(k) {
		for(var i=0; i<this.keys.length && i<this.values.length; i++) {
			if(this.keys[i] == k) return this.values[i];
		}
		return null;
	},
	setValue: function(k, v) {
		if(k == null || k.constructor != String || v == null || v.constructor != String)
			return -1;
		for(var i=0; i<this.keys.length && i<this.values.length; i++) {
			if(this.keys[i] == k) this.values[i] = v;
			return i;
		}
		return this.add(k, v);
	},
	toJSON: function() {
		return AjaxPro.toJSON({__type:this.__type,keys:this.keys,values:this.values});
	}
}, true);

// DataSetConverter
if(typeof Ajax == "undefined") Ajax={};
if(typeof Ajax.Web == "undefined") Ajax.Web={};

Ajax.Web.DataSet = function(t) {
	this.__type = "System.Data.DataSet,System.Data";
	this.Tables = [];
	this.addTable = function(t) {
		this.Tables.push(t);
	};
	if(t != null) {
		for(var i=0; i<t.length; i++) {
			this.addTable(t[i]);
		}
	}
};

// DataTableConverter
if(typeof Ajax == "undefined") Ajax={};
if(typeof Ajax.Web == "undefined") Ajax.Web={};

Ajax.Web.DataTable = function(c, r) {
	this.__type = "System.Data.DataTable,System.Data";
	this.Columns = [];
	this.Rows = [];
	this.addColumn = function(name, type) {
		this.Columns.push({Name:name,__type:type});
	};
	this.toJSON = function() {
		var dt = {};
		var i;
		dt.Columns = [];
		for(i=0; i<this.Columns.length; i++)
			dt.Columns.push([this.Columns[i].Name, this.Columns[i].__type]);
		dt.Rows = [];
		for(i=0; i<this.Rows.length; i++) {
			var row = [];
			for(var j=0; j<this.Columns.length; j++)
				row.push(this.Rows[i][this.Columns[j].Name]);
			dt.Rows.push(row);
		}
		return AjaxPro.toJSON(dt);
	};
	this.addRow = function(row) {
		this.Rows.push(row);
	};
	if(c != null) {
		for(var i=0; i<c.length; i++)
			this.addColumn(c[i][0], c[i][1]);
	}
	if(r != null) {
		for(var y=0; y<r.length; y++) {
			var row = {};
			for(var z=0; z<this.Columns.length && z<r[y].length; z++)
				row[this.Columns[z].Name] = r[y][z];
			this.addRow(row);
		}
	}
};

// ProfileBaseConverter
if(typeof Ajax == "undefined") Ajax={};
if(typeof Ajax.Web == "undefined") Ajax.Web={};

Ajax.Web.Profile = function() {
	this.toJSON = function() {
		throw "Ajax.Web.Profile cannot be converted to JSON format.";
	};
	this.setProperty_callback = function(res) {
	};
	this.setProperty = function(name, object) {
		this[name] = object;
		AjaxPro.Services.Profile.SetProfile({name:o}, ajaxProPrototypes.Function.bind(this.setProperty_callback, this));
	};
};

// IDictionaryConverter
if(typeof Ajax == "undefined") Ajax={};
if(typeof Ajax.Web == "undefined") Ajax.Web={};

Ajax.Web.Dictionary = function(type,items) {
	this.__type = type;
	this.keys = [];
	this.values = [];

	if(items != null && !isNaN(items.length)) {
		for(var i=0; i<items.length; i++)
			this.add(items[i][0], items[i][1]);
	}
};
ajaxProPrototypes.Object.extend(Ajax.Web.Dictionary.prototype, {
	add: function(k, v) {
		this.keys.push(k);
		this.values.push(v);
		return this.values.length -1;
	},
	containsKey: function(key) {
		for(var i=0; i<this.keys.length; i++) {
			if(this.keys[i] == key) return true;
		}
		return false;
	},
	getKeys: function() {
		return this.keys;
	},
	getValue: function(key) {
		for(var i=0; i<this.keys.length && i<this.values.length; i++) {
			if(this.keys[i] == key){ return this.values[i]; }
		}
		return null;
	},
	setValue: function(k, v) {
		for(var i=0; i<this.keys.length && i<this.values.length; i++) {
			if(this.keys[i] == k){ this.values[i] = v; }
			return i;
		}
		return this.add(k, v);
	},
	toJSON: function() {
		return AjaxPro.toJSON({__type:this.__type,keys:this.keys,values:this.values});
	}
}, true);


