// ==UserScript==
// @name          Webster-say-word
// @namespace     http://kailasa.net/userscripts
// @description	  say word on mouse hover
// @include       http://webster.com/*
// @include       http://www.webster.com/*
// @include       http://m-w.com/*
// @include       http://www.m-w.com/*
// @include	  http://*.merriam-webster.com/*
// ==/UserScript==

const DEBUG = true;

function debug(str) {
    if (DEBUG)
	GM_log(str);
}

function get_pron_link(js_url) {
    debug('get_pron_link: js_url = |' + js_url + '|');
    var matches = js_url.match(/([a-zA-Z0-9]+.wav)/);
    if (matches) {
	var audio_file = matches[1];
	var audio_href = 'http://cougar.eb.com/sound/' + audio_file.substring(0, 1) + '/' + audio_file;
	debug('get_pron_link: audio_href = |' + audio_href + '|');
	return audio_href;
    }

    debug('get_pron_link: audio_href not found.');
    return null;
}

function play_word(e)
{
    var url = this.href;
    var audio_href = get_pron_link(url);
    if (audio_href) {
	debug('audio_href = |' + audio_href + '|');
	add_embed_elem(audio_href);
    } else {
	debug('audio_href not found.');
    }
}

function add_embed_elem(href)
{
    var audio_embed_el = document.getElementById('audio_embed');
    if (audio_embed_el) {
	audio_embed_el.parentNode.removeChild(audio_embed_el);
    }
    audio_embed_el = document.createElement('embed');
    audio_embed_el.id = 'audio_embed';
    audio_embed_el.setAttribute('src', href);
    audio_embed_el.setAttribute('autostart', 'true');
    audio_embed_el.setAttribute('loop', 'false');
    audio_embed_el.setAttribute('hidden', 'href');

    document.getElementsByTagName('body')[0].appendChild(audio_embed_el);
}

var links = document.getElementsByTagName('a');
debug(links.length + ' links found');
var pron_link_found = false;
for (var i = 0; i < links.length; i++) {
    if (links[i].href.match(/javascript:popWin\('([^']+)'\)/)) {
	debug('adding event listener to audio link');
	links[i].addEventListener("mouseover", play_word, true);
	pron_link_found = true;
    }
}

var audio_area = null;
if (!pron_link_found) {
    // look for collegiate dictionary entry
    var areas = document.getElementsByTagName('area');
    for (var i = 0; i < areas.length; i++) {
	if (areas[i].getAttribute('title') == 'audio') {
	    debug('adding event listener to area |' + areas[i]);
	    audio_area = areas[i];
	    // areas[i].addEventListener("mouseover", play_word, true);
	    break;
	}
    }
}

if (audio_area) {
    // replace href for audio area with the JS link for pronunciation
    debug('audio_area = |' + audio_area.href + '|');

    var req = new XMLHttpRequest();
    req.onreadystatechange = function() {
	if (req.readyState == 4) {
	    if(req.status == 200) {
		var m = req.responseText.match(/Main Entry:.*?href="(javascript:.*?)"/);
		if (m) {
		    var pron_js_link = m[1];
		    debug('pron_js_link = |' + pron_js_link + '|');
		    audio_area.setAttribute('href', pron_js_link);
		    audio_area.addEventListener("mouseover", play_word, true);
		} else {
		    audio_area.setAttribute("title", "Audio not available");
		}
	    }
	}
    }
    req.open('GET', audio_area.href, true);
    req.send(null);
}
