function jsonSearchManager() {
	/* Will search against artist, album or track as specified by searchType */
	this.typeAheadUrl = "/searchwidget.json"; /* Searches against RDS, used for type ahead */
	this.newTypeAheadUrl = "/typeahead.json";
	this.fullUrl = "/webservice/search.json"; /* Searches against FAST, used for search when you want JSON artist/album/track results back */
	this.metaDataUrl = "/webservice/librarymeta"; /* returns the same meta data for an artist used in LibraryManager. */
	this.getTypeAheadSearch = function( searchString, handler, searchType ) {
		var theRhapsodyBID = ".";
		try { theRhapsodyBID=rhapsodyBID; } catch(e) { }
    	var queryStringParams = "type=" + searchType + "&name=" + escape(this.stripVowelAccent(searchString)) + "&source=rd&page=1&bid=" + theRhapsodyBID;
        
    	queryStringParams += "&mwidth1=36&mwidth2=40";

    	var callback = function (data){
			handler(data);
		}
		
		var firstChar = "-";
		try { firstChar=searchString.charAt(0).toLowerCase(); } catch(e) {}
		if( firstChar<'a' || firstChar>'z' ) { firstChar="_"; }
		
    	this.sendMessage( rhapsodyUrlJson + "/" + firstChar + this.typeAheadUrl, queryStringParams, callback);	
	};

	this.getNewTypeAheadSearch = function( searchString, handler ) {

		var queryStringParams = "name=" + escape(this.stripVowelAccent(searchString));
        
    	queryStringParams += "&mwidth1=36&mwidth2=40";
    	
		var callback = function (data){
			handler(data);
		}
		
		var firstChar = "-";
		try { firstChar=searchString.charAt(0).toLowerCase(); } catch(e) {}
		if( firstChar<'a' || firstChar>'z' ) { firstChar="_"; }
		
    	this.sendMessage( rhapsodyUrlJson + "/" + firstChar + this.newTypeAheadUrl, queryStringParams, callback);	
	};

	this.getFullSearch = function( searchString, dataSource, handler, searchType, start ) {
		var theRhapsodyBID = ".";
		try { theRhapsodyBID=rhapsodyBID; } catch(e) { }
		if(!start){
			start = 1;
		}
    	var queryStringParams = "type=" + searchType + "&name=" + escape(this.stripVowelAccent(searchString)) + "&source="+dataSource+"&page="+start+"&bid=" + theRhapsodyBID;
    	var callback = function (data){
			handler(data);
		}
		this.sendMessage( rhapsodyUrlJson + "/" + this.fullUrl, queryStringParams, callback);	
	};
	
	this.getArtistInfo = function( rcid, handler ) {
		var theRhapsodyBID = ".";
		try { theRhapsodyBID=rhapsodyBID; } catch(e) { }
    	var callback = function (data){
			handler(data);
		}
		var queryStringParams = "todo=get-metadata&ids=" + rcid + "&bid=" + theRhapsodyBID;
		this.sendMessage( rhapsodyUrlJson + "/" + this.metaDataUrl, queryStringParams , callback);	
	};
	
	
	this.stripVowelAccent = function (str) {
		var s=str;
		
		var rExps=[ /[\xC0-\xC2]/g, /[\xE0-\xE2]/g,
		/[\xC8-\xCA]/g, /[\xE8-\xEB]/g,
		/[\xCC-\xCE]/g, /[\xEC-\xEE]/g,
		/[\xD2-\xD4]/g, /[\xF2-\xF4]/g,
		/[\xD9-\xDB]/g, /[\xF9-\xFB]/g ];
		
		var repChar=['A','a','E','e','I','i','O','o','U','u'];
		
		for(var i=0; i<rExps.length; i++)
		s=s.replace(rExps[i],repChar[i]);
		
		return s;
	};

    this.MSGCOUNT = 0;
	this.sendMessage = function( url, queryStringParams, callback){
          var CURRENTMESSAGECOUNT = ++this.MSGCOUNT;
          var CURRENTINSTANCE = this;
		  var wrappedCallback = function (requestObj, emptyData) {
                if (CURRENTMESSAGECOUNT != CURRENTINSTANCE.MSGCOUNT){
                    return;
                }
				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 Ajax.Request( url,{
			    onSuccess: wrappedCallback,
			    method: 'get',
			    parameters: queryStringParams });
	}
}




