function ProfileMgr() {
	this.url = "/user-edit/action.json";
	this.infourl = "/user-edit/info.json";

	this.instanceId = Math.floor(Math.random()*10000000);

    //This will allow us to change a config for a module
	this.setTopLevelConfig = function(name,value,handler) {
        //set-toplevel-[name]=[value]
         
    	var action = "set-toplevel-"+name;
    	var content = $H({action:value,
    	    		  returntype: "object"});
		var callback = function (data){
			handler(data);
		}
    	this.sendMessage(this.url, content, callback);
    };

	this.getTimestamp = function( handler ) {
    	var content = $H({"action":"getTimestamp",
    	    		  returntype: "object"});
		var callback = function (data){
			handler(data);
		}
    	this.sendMessage(this.url, content, callback);	
	};
	
	this.getFriendTopArtists = function( rhapUserId, handler ) {
    	var content = $H({"action":"getFriendTopArtists",
						"rhapuserid":rhapUserId,
    	    		  returntype: "object"});
		var callback = function (data){
			handler(data);
		}
    	this.sendMessage(this.infourl, content, callback);	
	};
	
	this.getFriends = function( handler ) {
    	var content = $H({"action":"getFriends",
    	    		  returntype: "object"});
		var callback = function (data){
			handler(data);
		}
    	this.sendMessage(this.url, content, callback);	
	};
	
	this.addFriend = function( rhapUserId, handler ) {
    	var content = $H({"add-guid-friends":rhapUserId,
    	    		  returntype: "object"});
		var callback = function (data){
			handler(data);
		}
    	this.sendMessage(this.url, content, callback);	
	};
	
	this.removeFriend = function( rhapUserId, handler ) {
    	var content = $H({"remove-guid-friends":rhapUserId,
    	    		  returntype: "object"});
		var callback = function (data){
			data.id = rhapUserId;
			handler(data);
		}
    	this.sendMessage(this.url, content, callback);	
	};
	
	this.searchForMember = function( searchterm, handler ) {
    	var content = $H({"searchMember":searchterm,
    	    		  returntype: "object"});
		var callback = function (data){
			handler(data);
		}
    	this.sendMessage(this.url, content, callback);	
	};
	
	this.checkAliasAvailability = function( alias, handler ) {
    	var content = $H({"checkAlias":alias,
    	    		  returntype: "object"});
		var callback = function (data){
			handler(data);
		}
    	this.sendMessage(this.url, content, callback);	
	};

	this.getProfileFlyoutHtml = function(rcid,tracklist,handler) {
    	var content = $H({"action":"getProfileFlyoutHtml",
						"rcid":rcid,
						"tracklist":tracklist,
						returntype: "object"});
		var callback = function (data){
			handler(data);
		}
    	this.sendMessage(this.url, content, callback);	
	};
	
	this.setPlaylistAsPublic = function(rcid,flag,handler) {
        //pubplst-[rcid]=[true/false]

    	var action = "pubplst-"+rcid;
    	var content = $H({action:flag,
    	    		  returntype: "object"});
		var callback = function (data){
			handler(data);
		}
    	this.sendMessage(this.url, content, callback);	
    };

	this.setPlaylistsAsPublic = function( trueRcids, falseRcids, handler) {
        //pubplst-[rcid]=[true/false]

    	var content = $H({returntype: "object"});

		for( var i=0 ; i < trueRcids.length ; i++ ) { content[ "pubplst-" + trueRcids[i] ] = "true"; }
		for( var i=0 ; i < falseRcids.length ; i++ ) { content[ "pubplst-" + falseRcids[i] ] = "false"; }

		var callback = function (data){
			handler(data);
		}
    	this.sendMessage(this.url, content, callback);	
    };

	this.sendMessage = function( url, content, callback){

		var CURRENTMESSAGECOUNT = "" + (this.messageCount++);
		var MESSAGEMAPPING = this.messagesReceivedMapping;

		  var wrappedCallback = function (requestObj, emptyData) {
//			if( MESSAGEMAPPING[CURRENTMESSAGECOUNT]=="true" ) { return; }
//			MESSAGEMAPPING[CURRENTMESSAGECOUNT] = "true";
				if(requestObj.status == 200){
					var text = requestObj.responseText;
					if (text.substring(0,2) == "[{"){
						var data = eval(text);
					} else {
						var data = eval('('+text+')');
					}
					callback(data);
				} else {
					var data = new Array();
					data.exception = new Array();
					data.exception.message="Bad response from ajax request. "
					data.exception.code=requestObj.status
					callback(data);
					return;
				}
			}
//		new PeriodicalExecuter( function(pe) {
//			try {
//				if( MESSAGEMAPPING[CURRENTMESSAGECOUNT]!="true" ) {
//					MESSAGEMAPPING[CURRENTMESSAGECOUNT] = "true";
//					var data = new Array();
//					data.hasError = true;
//					callback(data);
//				}
//				MESSAGEMAPPING[CURRENTMESSAGECOUNT] = "true";//
//
//				// Need to stop this thread the first time through...
//				pe.stop();
//			}
//			catch(e) { }
//			}, 30 /* 30s */ );

		  new Ajax.Request( url,{
			    onSuccess: wrappedCallback,
			    method: 'post',
			    parameters: content.toQueryString() });
	}

							
						
}

ProfileMgr.prototype.toString = function () {
	var output = '';
	for (var i = 0; i<this.list.length; i++){
		output = output + this.list[i].id + " " + this.list[i].rcid + " " + this.list[i].playlength + " " + this.list[i].name + " " + this.list[i].discindex + " " + this.list[i].remoteid + " " + this.list[i].artistdisplayname;
	}
	return output;
}		



