		
		// remote scripting library
		// (c) copyright 2005 modernmethod, inc
		var sajax_debug_mode = false;
		var sajax_request_type = "POST";
		var sajax_throbber_uri = "/tmpl/default/web/css/media/busy.gif";
		
		function sajax_debug(text) {
			if (sajax_debug_mode)
				alert("RSD: " + text)
		}
 		function sajax_init_object() {
 			sajax_debug("sajax_init_object() called..")
 			
 			var A;
			try {
				A=new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					A=new ActiveXObject("Microsoft.XMLHTTP");
				} catch (oc) {
					A=null;
				}
			}
			if(!A && typeof XMLHttpRequest != "undefined")
				A = new XMLHttpRequest();
			if (!A)
				sajax_debug("Could not create connection object.");
			return A;
		}
		function sajax_do_call(func_name, args) {
			var i, x, n;
			var uri;
			var post_data;
			
			uri = "/ajax";
			if (sajax_request_type == "GET") {
				if (uri.indexOf("?") == -1) 
					uri = uri + "?rs=" + escape(func_name);
				else
					uri = uri + "&rs=" + escape(func_name);
				for (i = 0; i < args.length-1; i++) 
					uri = uri + "&rsargs[]=" + escape(args[i]);
				uri = uri + "&rsrnd=" + new Date().getTime();
				post_data = null;
			} else {
				post_data = "rs=" + escape(func_name);
				for (i = 0; i < args.length-1; i++) 
					post_data = post_data + "&rsargs[]=" + escape(args[i]);
			}
			
			if (sajax_throbber_uri) {
				kaywa_sajax_busy(sajax_throbber_uri);
			}
			
			x = sajax_init_object();
			x.open(sajax_request_type, uri, true);
			if (sajax_request_type == "POST") {
				x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
				x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			}
			x.onreadystatechange = function() {
				if (x.readyState != 4) 
					return;
				sajax_debug("received " + x.responseText);
				
				var status;
				var data;
				var predata = x.responseText;
				status = x.responseText.charAt(0);
				data = predata.substring(2);
				if (status == "-") 
					alert("Error: " + data);
				else  
					args[args.length-1](data);
				
				kaywa_sajax_unbusy();
			}
			
			
			x.send(post_data);
			sajax_debug(func_name + " uri = " + uri + "/post = " + post_data);
			sajax_debug(func_name + " waiting..");
			delete x;
		}
		
		function kaywa_sajax_unbusy() {
			span = document.getElementById('ajax_throbber');
			if (span) {
				devnull = span.parentNode.removeChild(span);
			}
			
		}
		
		function kaywa_sajax_busy(imguri) {			
			var span=document.createElement('span');
			span.id='ajax_throbber';
			span.style.position='fixed';
			if (document.ajax_throbber_pos_x) {
				span.style.position='absolute';	
				span.style.left = document.ajax_throbber_pos_x;
			} else { span.style.left = '10px'; }
			if (document.ajax_throbber_pos_y) {
				span.style.position='absolute';	
				span.style.top = document.ajax_throbber_pos_y;				
			} else { span.style.top = '10px'; }
			document.ajax_throbber_pos_y = null;
			document.ajax_throbber_pos_x = null;
    		span.style.padding = '3px;';
    		span.className = 'frame';    	
    		span.innerHTML = '<img src="'+imguri+'" />';
			document.body.appendChild(span);
		}
				
		// wrapper for saveWebsites		
		function x_saveWebsites() {
			sajax_do_call("saveWebsites",
				x_saveWebsites.arguments);
		}
		
				
		// wrapper for saveBio		
		function x_saveBio() {
			sajax_do_call("saveBio",
				x_saveBio.arguments);
		}
		
				
		// wrapper for saveInterests		
		function x_saveInterests() {
			sajax_do_call("saveInterests",
				x_saveInterests.arguments);
		}
		
				
		// wrapper for saveAddress		
		function x_saveAddress() {
			sajax_do_call("saveAddress",
				x_saveAddress.arguments);
		}
		
				
		// wrapper for saveContact		
		function x_saveContact() {
			sajax_do_call("saveContact",
				x_saveContact.arguments);
		}
		
				
		// wrapper for removeContact		
		function x_removeContact() {
			sajax_do_call("removeContact",
				x_removeContact.arguments);
		}
		
		document.app_root = '/';
    //// AJAX ////
    function saveWebsites(a,o) {
        if (o) {
            ajax_place_throbber(o);
        }
        x_saveWebsites(a.toJSONString(),quietResponseHandler);
    }
    function saveBio(bio, o) {
        if (o) {
            ajax_place_throbber(o);
        }
        x_saveBio(bio.toJSONString(),quietResponseHandler);
    }
    function saveInterests(i,o) {
        if (o) {
            ajax_place_throbber(o);
        }
        x_saveInterests(i.toJSONString(),quietResponseHandler);
    }
    function saveAddress(a,o,vis) {
        if (o) {
            ajax_place_throbber(o);
        }
        x_saveAddress(a.toJSONString(),vis,addressPostSaveHandler);
    }
    function saveContact(c,o) {
        if (o) {
            ajax_place_throbber(o);
        }
        x_saveContact(c.toJSONString(),quietResponseHandler);
    }
    function removeContact(o,c,h) {
        if (o) {
            ajax_place_throbber(o);
        }
        x_removeContact(c.toJSONString(),h);
    }
    function addressPostSaveHandler(o) {
        eval('r='+o);
        addressPostSave(r);
    }
    function alertResponseHandler(o) {
        eval('r='+o);
        alert(r);
    }
    function quietResponseHandler(o) {}

    function ajax_place_throbber(ref) {
        var p=getAbsolutePosition(ref);
        document.ajax_throbber_pos_x=(p.x - 30) + 'px';
        document.ajax_throbber_pos_y=(p.y - 5) + 'px';
    }

    //// That's all, folks! ////
    