// ==UserScript==
// @name            mixiMusicTube
// @namespace       http://wing2.jp/~katumen/program/greasemonkey
// @description     Show YouTube video in mixi music
// @include         http://music.mixi.jp/*
// @version         0.15
// ==/UserScript==

(function() {

	function searchPV(song, artist, title){
		var search_url = "http://www.youtube.com/results?search_type=search_videos&search=Search&search_query=";
		search_url += encodeURI(artist) + " " + encodeURI(title) + "&search_sort=video_view_count";

		GM_xmlhttpRequest({
			method: "GET",
			url: search_url,
			onload: function(response) {
				if(response.responseText.match(/ href="\/watch\?v=(.*)" onclick/)) {
					var vid = RegExp.$1;
					var pvobject = document.createElement('object');
					pvobject.width = 276;
					pvobject.height = 226;
					pvobject.innerHTML = '<param name="movie" value="http://www.youtube.com/v/' + vid + '"></param>';
					pvobject.innerHTML += '<param name="wmode" value="transparent"></param>';
					pvobject.innerHTML += '<embed src="http://www.youtube.com/v/' + vid + '" type="application/x-shockwave-flash" wmode="transparent" width="276" height="226"></embed>';
					
					var br = document.createElement('br');
					song.appendChild(br);
					song.appendChild(pvobject);
				}
			}
		});
	}

	function forEachMatch(path, f) {
		var matches = document.evaluate(
				path, document, null,
				XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

		for (var i = 0; i < matches.snapshotLength; i++)
			f(matches.snapshotItem(i));
	}

	function addPV(song){
		var result = document.evaluate(
				'.//a[contains(@href,"view_track.pl")]', song, null,
				XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
		var title = ( result ) ? result.innerHTML : "live";
		var insert = ( result ) ? result.parentNode : null;
		result = document.evaluate(
				'.//a[contains(@href,"view_artist.pl")]', song, null,
				XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
		var artist = ( result ) ? result.innerHTML : document.title.substring(7);
		if(insert == null) insert = ( result ) ? result.parentNode : null;
		
		if(location.href.match(/view_track/)) {
			result = document.evaluate(
				'.//a[contains(@href,"select_compi.pl")]', song, null,
				XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
			insert = ( result ) ? result.parentNode : null;
			if(song.hasAttribute('align')){
				return;
			}
			if(document.title.match(/^\[mixi\]\s(.+?)\s\|\s(.+?)$/)){
				artist = RegExp.$1;
				title = RegExp.$2;
			}
		} else if(location.href.match(/view_rank.+aid=.+/)){
			result = document.evaluate(
					'//b', document, null,
					XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
			if(result.innerHTML.match(/[^<].+[^>]/)){
				artist = RegExp.$1;
			}
			
		} else if(location.href.match(/show_compi.pl/)){
			if(song.hasAttribute('align')){
				return;
			}
		}
		if(insert != null) searchPV(insert, artist,title);
	}

	forEachMatch("//tr[@bgcolor='#fdf9f2' or @bgcolor='#ffffff']|//td[@bgcolor='#fdf9f2']",addPV);
}());

