Ext.data.GoogleDataService = function(config){
                Ext.data.GoogleDataService.superclass.constructor.apply(this, arguments);
                 
                this.buildEngine();
				
				this.addEvents(["request", "response", "web", "local", "news", "video", "image"]);
				
                
            };
Ext.extend(Ext.data.GoogleDataService, Ext.util.Observable, {
	searchWeb : function(query){                
		this.search(this.engine.web, query);
	},
	searchLocal : function(query){                
		this.search(this.engine.local, query);
							
	},
	searchImage : function(query){                
		this.search(this.engine.image, query);   
		
	},
	searchNews : function(query){                
		this.search(this.engine.news, query);   
		
	},
	searchVideo : function(query){
		this.search(this.engine.video, query);  
		
	},
	search : function(searcher, query){                  
	  this.fireEvent("request", query);
	  
	  searcher.execute(query);  
		
	},             
	buildEngine : function(){
		
		this.engine = {};
		
		this.engine.web = this.createWebSearch();
		this.engine.news = this.createNewsSearch();
		this.engine.local = this.createLocalSearch();
		this.engine.image = this.createImageSearch();  
		this.engine.video = this.createVideoSearch();                    
		
	},
	createWebSearch : function(){
		var ret = new google.search.WebSearch();
		
		ret.setResultSetSize(google.search.Search.LARGE_RESULTSET);
		ret.setSearchCompleteCallback(this, this.handleSearchResult.createDelegate(this, [this.handleWebSearch.createDelegate(this)]));                    
		
		return ret;                    
	},
	createLocalSearch : function(){
		var ret = new google.search.LocalSearch();
		
		ret.setSearchCompleteCallback(this, this.handleSearchResult.createDelegate(this, [this.handleLocalSearch.createDelegate(this)]));
		
		return ret;                    
	},
	createVideoSearch : function(){
		var ret = new google.search.VideoSearch();
		ret.setResultSetSize(google.search.Search.LARGE_RESULTSET);
		ret.setSearchCompleteCallback(this, this.handleSearchResult.createDelegate(this, [this.handleVideoSearch.createDelegate(this)]));
		
		return ret;                     
	},
	createNewsSearch : function(){
		var ret = new google.search.NewsSearch();
		ret.setResultSetSize(google.search.Search.LARGE_RESULTSET);
		ret.setSearchCompleteCallback(this, this.handleSearchResult.createDelegate(this, [this.handleNewsSearch.createDelegate(this)]));
		
		return ret;                    
	},
	createImageSearch : function(){
	   var ret = new google.search.ImageSearch();
	   ret.setResultSetSize(google.search.Search.LARGE_RESULTSET);
	   ret.setResultSetSize(google.search.Search.LARGE_RESULTSET);
	   ret.setSearchCompleteCallback(this, this.handleSearchResult.createDelegate(this, [this.handleImageSearch.createDelegate(this)]));
		
	   return ret;
	},
	handleSearchResult : function(fn){
		this.fireEvent("response", fn());  
	},
	handleWebSearch : function(result){		                  
		this.fireEvent("web", this.engine.web.results);		
		return this.engine.web.results;
	},
	handleImageSearch : function(result){                    
		this.fireEvent("image", this.engine.image.results);
		return this.engine.image.results;
	},
	handleLocalSearch : function(result){                    
		this.fireEvent("local", this.engine.local.results);
		return this.engine.local.results;
	},
	handleNewsSearch : function(result){                    
		this.fireEvent("news", this.engine.news.results);
		return this.engine.news.results;
	},
	handleVideoSearch : function(result){               
		this.fireEvent("video", this.engine.video.results);
		return this.engine.video.results;
	}
});