jQuery.fn.youtube = function(data)
{
	var config = {
		type              : null,          	// allowed values: 'playlist', 'search','user'
		keyword           : null,          	//A search query term. Searches for the specified string in all video metadata, such as titles, tags, and descriptions.
		url               : null,
		users             : null,          	// videos uploaded by a user
		alt               : null,          	//The format of feed to return, such as atom (the default), rss, or json.
		orderby           : null,          	//The order in which to list entries, such as relevance (the default for the videos feed) or viewCount.
		start_index       : null,          	//The 1-based index of the first result to be retrieved (for paging). 
		max_results       : null,          	//The maximum number of entries to return at one time
		categories        : null,          	//The categories and/or tags to use in filtering the feed results. 
					 						//  For example, feedURL/-/fritz/laurie returns all entries 
					 						// that are tagged with both of the user-defined tags fritz and laurie.
		format            : null,          	//A specific video format. For example, format=1 restricts search results to videos for mobile devices.		
		most_viewed       : null,
		top_rated         : null,
		recently_featured : null,
		top_favorites     : null,
		most_discussed    : null,
		most_linked       : null,
		most_responded    : null,
		
		recently_featured : null,
		playlist_id       : null,          	//playlists feed contains a list of public playlists defined by a user.
		div               : this,
		
		cleanReturn       : 1,             	//do you want a full youtube return, or just an image list
		inlineVideo       : 1,             	//do you want to redirect to youtube, or play inlinevideo
		callback          : null,
		api_key           : null,
		blockUI           : true,           // boolean, if true requires jquery.litebox.js
		inlinePlayerID	  : null,			// Id of the UI video player
		initialVideoID	  : null, 			// Default video id. If it is null then we use first movie from the list 
		initialAutoPlay	  : 0,				// Set to 1 if you want autoplay initial movie
		autoPlay		  : 1,				// Set to 1 if you want autoplay movie from the list
		addCarousel		  : null
	
	};//end of config
		 
	if(data) {
		$.extend(config, data);
	}
	
	/**/
	return this.each(function() {
		$('#youtubelist').remove();
		
		$(this).append('<ul id="#youtubelist">');
		
		var url = $.youtube.getURL(config);
		
		$.youtube.request(url);
	});//end of each 
}
/*end of youtube function*/
	
/** 
 *extend the youtube function

 */

$.youtube = 
{
	config   :{},
	
	/**
	  * genereate the url 
	  * according to the configaation
	  *
	  *
	  
	  */
	
	getURL: function(config)
	{
	    var url='';
		this.config = config;
		config.type = config.type;
		
		if( (config.type =='search') || (config.type=='tag') || (config.type=='title') || (config.type =='description') )
		{
		    config.type='search';
		}
			
        if (config.url) return config.url;
        if (!config.callback) config.callback = 'jQuery.youtube.response';
		
		var url = 'http://gdata.youtube.com/feeds/';
		
		switch (config.type){
			case 'users':    url +='users/'+config.keyword+'/uploads?alt=json-in-script&callback='+config.callback;
			                 break;
			    
            case 'search':   url  +='videos?alt=json-in-script&callback='+config.callback;
				             url  += '&vq='+config.keyword;   
			                 break;
			              
			case 'playlist': url +='playlists/'+config.keyword;
			                 break;
			                 
			case 'category': break;
			                 
            default        : url ='http://gdata.youtube.com/feeds/videos';
				
        }
        
		if (config.start_index) 
		{
		   url +='&start-index='+ config.start_index;
		}
		
		
		if (config.max_results) 
		{
		    url +='&max-results='+ config.max_results;
		}
	   return url;
	},
	
	/* 
	*request the url in the head and get the jsondata
	*@param url string
	*@return null,
	*/
	request: function(url)
	{
		var script  = document.createElement('script');
        script.type = 'text/javascript';
        script.src  = url;
        
        document.documentElement.firstChild.appendChild(script); //add into <head>
		
		//$("head").append(script);
		//$>getjson ()url,jsondata);
    },
	
	/**
	* this function process the jsondata
	* and display into the div 
	*
	*@param jsonData jsondata
	*/
	response : function (jsonData)
	{
		var inlineVideo = this.config.inlineVideo;
		var initialVideoID = this.config.initialVideoID;
		var autoPlay = this.config.autoPlay;
        
        if(jsonData.feed.entry)
        {
			var html='';
			$.each( jsonData.feed.entry, function(i, item) { 
								
				for( var k = 0; k <item.link.length; k++ ) {
					
					if( item.link[k].rel == 'alternate' ) {
						url = item.link[k].href;
						break;
					}
				}
			
				if (!initialVideoID) {
					initialVideoID = $.youtube.getVideoId(item.link[0].href);	
				}
				
				var thumb = item.media$group.media$thumbnail[1].url;
			
				if (inlineVideo){
					var videoId  = $.youtube.getVideoId(url);
					html += '<li><a href="javascript:$.youtube.playVideo(\'' + videoId + '\', ' + autoPlay + ');"><img src="'+thumb+'" width="84" border="0" alt="' + item.title.$t + '"></a></li>';
				} 
				else {   			
					html += '<li><a href="'+url+'"><img src="'+thumb+'" id="youtubethumb" alt="'+item.title.$t+'"></a></li>';
				}
			});
			
			$(this.config.div).html(html);
	    }
		
		this.config.initialVideoID = (!this.config.initialVideoID) ? initialVideoID : this.config.initialVideoID;
		
		$.youtube.playVideo(this.config.initialVideoID, this.config.initialAutoPlay);
		
		//$.youtube.addCarousel();
		if (this.config.addCarousel) addCarousel();
	},
	
    /** 
     * @param url 
     * @return video id   
     */	
	getVideoId: function (url)
	{
	   var arrayURL= url.split("=");
	   if (arrayURL)
	    {
		   return arrayURL[1];
		}
	},
	
	/** 
	 * Play the video in bolockUI  
	 *
	 *@param id videoid
	 */
	playVideo : function (id, autoplay)
    {
		var html  = '';
		var oPlayer = $(this.config.inlinePlayerID)[0];
		
		oPlayer.style.visibility = "hidden";
		
		var strVideoUrl = 'http://www.youtube.com/v/' + id + '&rel=0&disablekb=1&egm=0&fs=1&autoplay=' + autoplay;
		
		html += '<object width="300" height="245">';
		html += '	<param name="movie" value="' + strVideoUrl + '"></param>';
		html += '	<param name="autoplay" value="' + autoplay + '">';
		html += '	<param name="wmode" value="transparent"></param>';
		html += '	<param name="allowFullScreen" value="true"></param>';
		html += '<embed src="' + strVideoUrl + '" type="application/x-shockwave-flash" wmode="transparent" allowfullscreen="true" width="300" height="245"></embed>';
		html += '</object>';
		
		if (this.config.blockUI) {
			oPlayer.innerHTML = html;
			var showPlayer = setTimeout(function() { oPlayer.style.visibility = "visible" }, 1500);
		}
	},
    
    /** 
      *unblock the UI
      */
    stopVideo : function ()
    {
	   if (this.config.blockUI)
	   {
	       $.unblockUI();
	   }
	}	  
};