jQuery.fn.youtubeplayer = function(data) {
	var config = {
		playlist_id: 'B31BF05DDCCB7270',
		videos_per_page: 3,
		width: 425,
		height: 344,
		max_teaser_length: 70,
		next_img: '/wp-content/themes/moveforward/img/next.gif',
		prev_img: '/wp-content/themes/moveforward/img/prev.gif',
		playlist_hdr_img: '/assets/img/headers/hdr_turtle_tv_playlist.gif',
		thumb_height: 65,
		color_scheme: 'normal',
		corner_settings: 'bevel 10px'
	};
	if (data) jQuery.extend(config, data);
	if (this.length > 1) {
		jQuery(this).eq(0).html('<div id="player">Loading video player...</div><div id="playlist"></div>');
	} else {
		jQuery(this).html('<div id="player">Loading video player...</div><div id="playlist"></div>');
	}
	jQuery.youtubeplayer.init(config);
};
jQuery.youtubeplayer = {
	config: {},
	playlist: new Array(),
	num_pages: 0,
	video_id: null,
	thumbs: new Array(),
	init: function(config) {
		this.config = config;
		var script  = document.createElement('script');
		script.type = 'text/javascript';
		script.src  = 'http://gdata.youtube.com/feeds/api/playlists/'+config.playlist_id+'?alt=json-in-script&v=2&callback=jQuery.youtubeplayer.build_player&start-index=1';;
		document.documentElement.firstChild.appendChild(script);
	},
	get_video_id: function(url) {
	   var a = url.split("=");
	   return (a) ? a[1] : null;
	},
	build_player: function(json_data) {
		if (json_data.feed.entry) {
			var plyr = this;
			jQuery.each(json_data.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;
					}
				}
				var video_id = plyr.get_video_id(url);
				var title = item.title.$t;
				var tmb = new Image();
				if (typeof(item.media$group.media$thumbnail) != 'undefined') {
					var thumb = item.media$group.media$thumbnail[1].url;
					var width = parseInt(item.media$group.media$thumbnail[1].width);
					var height = parseInt(item.media$group.media$thumbnail[1].height);
					tmb.src = thumb;
				} else {
					tmb.src = '/assets/img/spacer.gif';
					var width = 0;
					var height = 0;
				}
				var teaser = (typeof(item.media$group.media$description) == 'undefined') ? '' : plyr.truncate(item.media$group.media$description.$t);
				plyr.playlist.push({video_id: video_id, title: title, thumb: thumb, teaser: teaser, thmb_width: width, thmb_height: height});
				plyr.thumbs.push(tmb)
			});
			this.num_pages = Math.ceil(this.playlist.length / this.config.videos_per_page);
			if (this.playlist.length > 0) {
				this.play(this.playlist[0].video_id, 0, this.playlist[0].title.replace(/'/g,'&#39;'));
				this.video_id = this.playlist[0].video_id;
			}
			if (this.config.playlist_hdr_img != '') {
				jQuery('#playlist').html('<img src="'+this.config.playlist_hdr_img+'" id="playlist_hdr_img" />');
			} else {
				jQuery('#playlist').html('');
			}
			this.build_playlist(1);
		}
	},
	build_playlist: function(page_num) {
		if (this.playlist.length > 0) {
			jQuery('#playlist .item, #playlist #controls').hide().remove();
			var start_row = (page_num - 1) * this.config.videos_per_page;
			var cnt = 1;
			for(var p=start_row; p<this.playlist.length; p++) {
				if (cnt > this.config.videos_per_page) break;
				var item = '<div class="item" id="'+this.playlist[p].video_id+'">';
				item += '	<div class="thumb">';
				item += '		<a href="javascript:jQuery.youtubeplayer.play(\''+this.playlist[p].video_id+'\', 1);">';
				item += '			<img src="'+this.thumbs[p].src+'" alt="'+this.playlist[p].title.replace(/"/g,'&quot;')+'" border="0"';
				if (this.config.thumb_height != null) {
					item += ' height="'+this.config.thumb_height+'"';
					var width = Math.round(parseInt(this.config.thumb_height)*this.playlist[p].thmb_width/this.playlist[p].thmb_height);
					item += ' width="'+width+'"';
				} else {
					item += ' height="'+this.playlist[p].thmb_height+'"';
					item += ' width="'+this.playlist[p].thmb_width+'"';
				}
				var title = this.playlist[p].title.replace(/'/g,"&#39;");
				var link_title = this.playlist[p].title.replace(/'/g,"\\'");
				item += ' /> </a>';
				item += '	</div>';
				item += '	<div class="meta">';
				item += '		<div class="title"><a href="javascript:jQuery.youtubeplayer.play(\''+this.playlist[p].video_id+'\', 1, \''+link_title+'\');">'+title+'</a></div>';
				item += '		<div class="teaser">'+this.playlist[p].teaser+'</div>';
				item += '		<div class="watch"><a href="javascript:jQuery.youtubeplayer.play(\''+this.playlist[p].video_id+'\', 1, \''+link_title+'\');">Watch the video &raquo;</a></div>';
				item += '	</div>';
				item += '	<div class="clear">&nbsp;</div>';
				item += '</div>';
				jQuery('#playlist').append(item);
				cnt++;
			}
		}
		var prev_page_num = (page_num > 1  && this.num_pages > 0) ? parseInt(page_num)-1 : 0;
		var next_page_num = (page_num < this.num_pages && this.num_pages > 0) ? parseInt(page_num)+1 : 0;
		var controls = '<div id="controls"><div class="prev_page">';
		if (prev_page_num) {
			controls += '<a href="javascript:jQuery.youtubeplayer.build_playlist(\''+prev_page_num+'\')"><img src="'+this.config.prev_img+'" border="0" /></a>';
		} else {
			controls += '&nbsp;';
		}
		controls += '</div>';
		controls += '<div class="next_page">';
		if (next_page_num) {
			controls += '<a href="javascript:jQuery.youtubeplayer.build_playlist(\''+next_page_num+'\')"><img src="'+this.config.next_img+'" border="0" /></a>';
		} else {
			controls += '&nbsp;';
		}
		controls += '</div></div>';
		jQuery('#playlist').append(controls);
		/*
		if (this.config.corner_settings != '' && !(jQuery.browser.safari || (jQuery.browser.msie && parseInt(jQuery.browser.version) < 7))) {
			jQuery('#playlist .item').corner(this.config.corner_settings);
		}
		*/
		jQuery('#playlist .item').hover(
			function(){jQuery(this).addClass('item_hover')},
			function(){jQuery(this).removeClass('item_hover')}
		);
		jQuery('#playlist .item, #playlist #controls').show();
		jQuery('#playlist .item').removeClass('item_sel');
		jQuery('#playlist #'+this.video_id).addClass('item_sel');
	},
	play: function(id, autoplay, title) {
		var html  = '';
		html += '<object width="'+this.config.width+'" height="'+this.config.height+'">';
		html += '<param name="movie" value="http://www.youtube.com/v/'+id+'&hl=en&fs=1&rel=0'+this.color()+'"></param>';
		html += '<param name="autoplay" value="'+autoplay+'">';
		html += '<param name="allowFullScreen" value="true"></param>';
		html += '<param name="wmode" value="transparent"></param>';
		html += '<embed src="http://www.youtube.com/v/'+id+'&hl=en&fs=1&rel=0'+this.color()+'&autoplay='+autoplay+'" wmode="transparent" type="application/x-shockwave-flash" allowfullscreen="true" width="'+this.config.width+'" height="'+this.config.height+'"></embed>';
		html += '</object>';
		html += '<div id="title">'+title+'</div>';
		this.video_id = id;
		jQuery('#playlist .item').removeClass('item_sel');
		jQuery('#playlist #'+id).addClass('item_sel');
		jQuery('#player').html(html);
	},
	truncate: function(str) {
		if (typeof(str) == 'string') {
			if (str.length > this.config.max_teaser_length) {
				var words = str.split(' ');
				var trunc_str = '';
				for (var w = 0; w < words.length; w++) {
					if ((words[w].length + trunc_str.length) <= this.config.max_teaser_length) {
						trunc_str += ' ' + words[w];
					}
					else {
						break;
					}
				}
				return trunc_str.substring(1) + '...';
			}
			else {
				return str;
			}
		} else {
			return '';
		}
	},
	color: function(){
		var color_str = '';
	    switch (this.config.color_scheme) {
			case 'darkgrey':  color_str = '&color1=0x3a3a3a&color2=0x999999'; break;
			case 'darkblue':  color_str = '&color1=0x2b405b&color2=0x6b8ab6'; break; 
			case 'lightblue': color_str = '&color1=0x006699&color2=0x54abd6'; break;
			case 'green':     color_str = '&color1=0x234900&color2=0x4e9e00'; break; 
			case 'orange':    color_str = '&color1=0xe1600f&color2=0xfebd01'; break;
			case 'pink':      color_str = '&color1=0xcc2550&color2=0xe87a9f'; break; 
			case 'purple':    color_str = '&color1=0x402061&color2=0x9461ca'; break;
			case 'red':       color_str = '&color1=0x5d1719&color2=0xcd311b'; break;
	    }
	    return color_str;
	}
};
