
var SAP_STATUS_UNINITIALIZED = 0;
var SAP_STATUS_PLAYING 	= 1;
var SAP_STATUS_PAUSED 	= 2;
var SAP_STATUS_STOPPED 	= 3;
var SAP_STATUS_IOERROR 	= 6;
var SAP_STATUS_PLAYER_INITIALIZE_SUCCESS = 7;
var SAP_STATUS_PLAYER_INITIALIZE_FAILED  = 8;
var SAP_STATUS_REQUESTING = 9;
var SAP_STATUS_SOUNDCARD_NOTAVALIABLE = 10;
var SAP_STATUS_IDLE = 11;

var SAP_EVENT_LOADING = 12;
var SAP_EVENT_BUFFER_BUFFERING = 13;
var SAP_EVENT_BUFFER_FINISHED_BUFFERING = 14;
var SAP_EVENT_LOADED = 15;
var SAP_EVENT_PLAYED = 16;
var SAP_EVENT_INVALID_ACTION = 17;
var SAP_EVENT_LOADING_STALLED = 18;
var SAP_EVENT_LOADING_UNSTALLED = 19;
var SAP_EVENT_LENGTH = 20;
var SAP_EVENT_PLAY_UPDATE = 21;

var sap_status = new Array();

function sap_init(op) {
    var c = false;

    var saps = [];
    var f = function(t) {
        if (t.getAttribute && t.getAttribute("sap")) saps.push(t);
        for (var i = 0; i < t.childNodes.length; i++) {
            f(t.childNodes[i]);
        }
    };
    f(document.body);
    
    var l = saps.length;
    for (var i = 0; i < l; i++) {
        var t = saps[i];
        var o2 = null;
        if (op != null) {
            o2 = {
                unique: op.unique,
                url: op.url,
                auto_init: op.auto_init,
                status_cb: op.status_cb,
                event_cb: op.event_cb,
                buffer_cb: op.buffer_cb
            };
        }
        var a = t.getAttribute("sap").split(",", 2);
        if (o2 == null) {
            o2 = { url: a[1] };
        } else if (o2.url == null || o2.url == "") {
            o2.url = a[1];
        }
        if (o2 != null && o2.unique == false) {
            var s = sap_create(a[0], o2);
            t.insertBefore(s, t.childNodes.length > 0 ? t.childNodes[0] : null);
        } else {
            if (c == false) {
                var s = sap_create(a[0], o2);
                document.body.appendChild(s);
                c = true;
            }
        }
        var flashvars = {};
        var params = {
            menu: "false",
            scale: "noScale",
            play: "true",
            loop: "false",
            allowFullscreen: "false",
            allowScriptAccess: "always",
            quality: "high"
        };
        var attributes = {
            id: a[0],
            name: a[0]
        };
        swfobject.embedSWF("http://www.jlpt-practice.com/AudioPlayer/sap.swf", a[0] + "_replacer", "0", "0", "9.0.0", "../AudioPlayer/expressInstall.swf", flashvars, params, attributes);
    }
}

function sap_get_object(id) {
    if (document.getElementById(id)) {
        return document.getElementById(id);
    } else if (document.embeds && document.embeds.length > 0) {
        return document.embeds[id];
    } else {
        return window[id];
    }
}

function sap_play(id) {
    if (sap_get_can_play(id) == true) {
        sap_get_object(id).playSong();
    }
}

function sap_pause(id) {
    if (sap_get_can_play(id) == true) {
        sap_get_object(id).pauseSong();
    }
}

function sap_stop(id) {
    if (sap_get_can_play(id) == true) {
        sap_get_object(id).stopSong();
    }
}

function sap_seek(id, s) {
    if (sap_get_can_play(id) == true && s <= sap_get_length(id)) {
        sap_get_object(id).seekSong(s);
    }
}

function sap_set_url(id, url) {
    sap_get_object(id).setUrl(url);
    for (var i = 0; i < sap_status.length; i++) {
        if (id == sap_status[i].id) {
            sap_status[i].o.url = url;
            break;
        }
    }
}

function sap_load(id) {
    sap_get_object(id).loadSong();
}

function sap_event_cb(id, code, l) {
    //console.log("EVENT: " + id + ": " + code + ": " + l);
    switch (code) {
        case SAP_EVENT_LOADING:
            sap_set_can_play(id, true);
            sap_set_length(id, l);
            var o = sap_get_options(id);
            if (o != null && o.event_cb != null) {
                o.event_cb(id, code, l);
            }
            break;
        case SAP_EVENT_LOADED:
            sap_set_can_play(id, true);
            sap_set_length(id, l);
            var o = sap_get_options(id);
            if (o != null && o.event_cb != null) {
                o.event_cb(id, code, l);
            }
            break;
        case SAP_EVENT_PLAYED:
            sap_set_can_play(id, true);
            var o = sap_get_options(id);
            if (o != null && o.event_cb != null) {
                o.event_cb(id, code);
            }
            break;
        case SAP_EVENT_INVALID_ACTION:
            var o = sap_get_options(id);
            if (o != null && o.event_cb != null) {
                o.event_cb(id, code);
            }
            break;
        case SAP_EVENT_LOADING_STALLED:
            var o = sap_get_options(id);
            if (o != null && o.event_cb != null) {
                o.event_cb(id, code);
            }
            break;
        case SAP_EVENT_LOADING_UNSTALLED:
            var o = sap_get_options(id);
            if (o != null && o.event_cb != null) {
                o.event_cb(id, code);
            }
            break;
        case SAP_EVENT_LENGTH:
            sap_set_length(id, l);
            var o = sap_get_options(id);
            if (o != null && o.length_cb != null) {
                o.length_cb(id, code, l);
            }
            break;
        case SAP_EVENT_PLAY_UPDATE:
            var o = sap_get_options(id);
            if (o != null && o.event_cb != null) {
                o.event_cb(id, code, l);
            }
            break;
        default:
            break;
    }
}

function sap_status_cb(id, code, s) {
    //console.log("STATUS: " + id + ": " + code + ": " + s);
    switch (code) {
        case SAP_STATUS_UNINITIALIZED:
            sap_set_status(id, SAP_STATUS_UNINITIALIZED);
            sap_set_can_play(id, false);
            var o = sap_get_options(id);
            if (o != null && o.status_cb != null) {
                o.status_cb(id, code);
            }
            break;
        case SAP_STATUS_PLAYING:
            sap_set_status(id, SAP_STATUS_PLAYING);
            sap_set_can_play(id, true);
            var o = sap_get_options(id);
            if (o != null && o.status_cb != null) {
                o.status_cb(id, code, s);
            }
            break;
        case SAP_STATUS_PAUSED:
            sap_set_status(id, SAP_STATUS_PAUSED);
            sap_set_can_play(id, true);
            var o = sap_get_options(id);
            if (o != null && o.status_cb != null) {
                o.status_cb(id, code, s);
            }
            break;
        case SAP_STATUS_STOPPED:
            sap_set_status(id, SAP_STATUS_STOPPED);
            sap_set_can_play(id, true);
            var o = sap_get_options(id);
            if (o != null && o.status_cb != null) {
                o.status_cb(id, code);
            }
            break;
        case SAP_STATUS_IOERROR:
            sap_set_status(id, SAP_STATUS_IOERROR);
            sap_set_can_play(id, false);
            var o = sap_get_options(id);
            if (o != null && o.status_cb != null) {
                o.status_cb(id, code);
            }
            break;
        case SAP_STATUS_PLAYER_INITIALIZE_SUCCESS:
            sap_set_status(id, SAP_STATUS_PLAYER_INITIALIZE_SUCCESS);
            sap_set_can_play(id, false);
            var o = sap_get_options(id);
            if (o != null && o.status_cb != null) {
                o.status_cb(id, code);
            }
            if (o != null && o.auto_init != null && o.auto_init == true) {
                if (o.url && o.url != "") {
                    sap_set_url(id, o.url);
                    sap_load(id);
                }
            }
            break;
        case SAP_STATUS_PLAYER_INITIALIZE_FAILED:
            sap_set_status(id, SAP_STATUS_PLAYER_INITIALIZE_FAILED);
            sap_set_can_play(id, false);
            var o = sap_get_options(id);
            if (o != null && o.status_cb != null) {
                o.status_cb(id, code);
            }
            break;
        case SAP_STATUS_REQUESTING:
            sap_set_status(id, SAP_STATUS_REQUESTING);
            sap_set_can_play(id, false);
            var o = sap_get_options(id);
            if (o != null && o.status_cb != null) {
                o.status_cb(id, code);
            }
            break;
        case SAP_STATUS_SOUNDCARD_NOTAVALIABLE:
            sap_set_status(id, SAP_STATUS_SOUNDCARD_NOTAVALIABLE);
            sap_set_can_play(id, false);
            var o = sap_get_options(id);
            if (o != null && o.status_cb != null) {
                o.status_cb(id, code);
            }
            break;
        case SAP_STATUS_IDLE:
            sap_set_status(id, SAP_STATUS_IDLE); 
            sap_set_can_play(id, true);
            var o = sap_get_options(id);
            if (o != null && o.status_cb != null) {
                o.status_cb(id, code);
            }
            break;
        default:
            break;
    }
}

function sap_buffer_cb(id, code, s) {
    //console.log("BUFFER: " + id + ": " + code + ": " + s);
    switch (code) {
        case SAP_EVENT_BUFFER_BUFFERING:
            sap_set_is_buffering(id, true);
            var o = sap_get_options(id);
            if (o != null && o.buffer_event_cb != null) {
                o.buffer_event_cb(id, code, s);
            }
            break;
        case SAP_EVENT_BUFFER_FINISHED_BUFFERING:
            sap_set_is_buffering(id, false);
            var o = sap_get_options(id);
            if (o != null && o.buffer_event_cb != null) {
                o.buffer_event_cb(id, code, s);
            }
            break;
        default:
            break;
    }
}

function sap_create(id, o) {
    if (o == null || o == undefined) {
        o = {};
    }
    
    sap_status.push({
        id: id,
        status: SAP_STATUS_UNINITIALIZED,
        can_play: false,
        is_buffering: false,
        download_status: SAP_STATUS_IDLE,
        length: 0,
        o: o
    });

    var d = document.createElement("div");
    d.id = id + "_replacer";

    var p = document.createElement("p");
    var a = document.createElement("a");
    a.href = "http://www.adobe.com/go/getflashplayer";
    var i = document.createElement("img");
    i.src = "http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif";
    i.setAttribute("alt", "Get Adobe Flash player");

    a.appendChild(i);
    p.appendChild(a);
    d.appendChild(p);
    return d;
}

function sap_get_options(id) {
    for (var i = 0; i < sap_status.length; i++) {
        if (id == sap_status[i].id) {
            return sap_status[i].o;
        }
    }
    return null;
}

function sap_set_download_status(id, code) {
    for (var i = 0; i < sap_status.length; i++) {
        if (id == sap_status[i].id) {
            sap_status[i].download_status = code;
            return true;
        }
    }
    return false;
}

function sap_set_is_buffering(id, o) {
    for (var i = 0; i < sap_status.length; i++) {
        if (id == sap_status[i].id) {
            sap_status[i].is_buffering = o;
            return true;
        }
    }
    return false;
}

function sap_set_can_play(id, o) {
    for (var i = 0; i < sap_status.length; i++) {
        if (id == sap_status[i].id) {
            sap_status[i].can_play = o;
            return true;
        }
    }
    return false;
}

function sap_set_status(id, code) {
    for (var i = 0; i < sap_status.length; i++) {
        if (id == sap_status[i].id) {
            sap_status[i].status = code;
            return true;
        }
    }
    return false;
}

function sap_set_length(id, l) {
    for (var i = 0; i < sap_status.length; i++) {
        if (id == sap_status[i].id) {
            sap_status[i].length = l;
            return true;
        }
    }
    return false;
}

function sap_get_status(id) {
    for (var i = 0; i < sap_status.length; i++) {
        if (id == sap_status[i].id) {
            return sap_status[i].status;
        }
    }
    return null;
}

function sap_get_can_play(id) {
    for (var i = 0; i < sap_status.length; i++) {
        if (id == sap_status[i].id) {
            return sap_status[i].can_play;
        }
    }
    return null;
}

function sap_get_is_buffering(id) {
    for (var i = 0; i < sap_status.length; i++) {
        if (id == sap_status[i].id) {
            return sap_status[i].is_buffering;
        }
    }
    return null;
}

function sap_get_download_status(id) {
    for (var i = 0; i < sap_status.length; i++) {
        if (id == sap_status[i].id) {
            return sap_status[i].download_status;
        }
    }
    return null;
}

function sap_get_length(id) {
    for (var i = 0; i < sap_status.length; i++) {
        if (id == sap_status[i].id) {
            return sap_status[i].length;
        }
    }
    return null;
}
