function ap_stopAll (playerID) {
    for (container in UFO.foList) {
        fo = UFO.foList[container];
        player = document.getElementById(fo.id);
        if (fo.id != playerID) {
            player.SetVariable("closePlayer", 1);
        } else {
            player.SetVariable("closePlayer", 0);
        }
    }
}

function getTarget (e) {
    // Get the target element
    e = e || window.event;
    return e.target || e.srcElement;
}

// http://www.quirksmode.org/js/cookies.html
function createCookie (name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie (name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function eraseCookie (name) {
    createCookie(name,"",-1);
}

Legends = {
    clickOff: function (e) {
        var target = getTarget(e);
        // Climb the DOM
        // Jump if we clicked on the index or the toggler
        while (target.parentNode) {
            if (target.id == 'index' || target.id == 'indexHead') {
                return true;
            }
            target = target.parentNode;
        }
        // We've reached the top: collapse the index
        return Legends.toggleIndex();
    },
    
    toggleIndex: function () {
        var navBar = document.getElementById('navBar');
        // Toggle the index
        var expanded = navBar.className == 'expand';
        navBar.className = expanded ? '' : 'expand';
        // Start/stop listening for clicks
        document.onclick = expanded ? null: Legends.clickOff;
        
        _gaq.push(['_trackEvent', 'Navigation', 'Index', (expanded ? 'Hide' : 'Show')]);
        
        return false;
    },
    
    toggleNotes: function (e) {
        var target = getTarget(e);
        if (target.id == 'hideNotes') {
            var hidden = false;
        } else if (target.id == 'showNotes') {
            var hidden = true;
        } else {
            return true;
        }
        var note_list = document.getElementById('noteList');
        // Toggle the inline note links in the entry
        var entry = document.getElementById('entry');
        if (entry) {
            var entry_links = entry.getElementsByTagName('a');
            for (var i = 0; i < entry_links.length; i++) {
                var entry_link = entry_links[i];
                if (/\bentryNote\b/.exec(entry_link.className)) {
                    entry_link.className = (hidden ? 'entryNote' : 'entryNote hidden');
                } else if (/\bmap\b/.exec(entry_link.className)) {
                    entry_link.className = (hidden ? 'map' : 'map mapHidden');
                }
            }
        }
        // Toggle the note list
        if (note_list) {
            note_list.className = hidden ? '' : 'hidden';
        }
        // Toggle the toggle links
        document.getElementById('hideNotes').className = hidden ? '' : 'hidden';
        document.getElementById('showNotes').className = hidden ? 'hidden' : '';
        // Set a cookie
        createCookie('showNotes', (hidden ? 'yes' : 'no'), 365*10);
        
        // GA Event tracking
        _gaq.push(['_trackEvent', 'Preferences', (hidden ? 'Show notes' : 'Hide notes')]);
        return false;
    },
    
    toggleNoteHighlight: function (e) {
        var target = getTarget(e);
        // Find the corresponding note
        var noteID = target.hash.replace('#', '');
        var note = document.getElementById(noteID);
        // Toggle the highlight
        var active = note.className == 'active';
        note.className = active ? '' : 'active';
    },
    
    noteFade: function (e, step, noteID) {
        var interval = 100;
        var steps = [
            '',
            '#ffe',
            '#ffd',
            '#ffc',
            '#ffb',
            '#ffa'
        ];
        // Start at the end and work up
        if (step === undefined) {
            var step = 5;
        }
        // Find the corresponding note
        if (e) {
            noteID = getTarget(e).hash.replace('#', '');
        }
        if (!noteID) {
            return;
        }
        // Set the colour
        document.getElementById(noteID).style.backgroundColor = steps[step];
        // Recurse if we're not at the end
        if (step >= 1) {
            step--;
            setTimeout('Legends.noteFade(null, ' + step + ', "' + noteID + '")', interval);
        }
    },
    
    /* Flash player */
    
    // Win/Loss music
    
    Flash: {
        postgameLoadingHandler: function (obj) {
            var player = document.getElementById(obj.id);
            var playlist = player.getPlaylist();
            if (!playlist) {
                return false;
            }
            var type = playlist[0].tags;
            var progress = obj.loaded / obj.total;
            var loading = document.getElementById(type + 'Loading');
            if (progress < 1) {
                var percent = Math.round(progress * 100);
                loading.innerHTML = 'Loading: ' + percent + '%';
            } else {
                loading.innerHTML = '';
            }
        },
        
        handlePostGame: function (obj, type) {
            var link = document.getElementById('postgame' + type);
            if (link) {
                link.onclick = function (e) {
                    var target = getTarget(e);
                    while (target.parentNode) {
                        if (target.id == 'postgame' + type) {
                            obj.type = type.toLowerCase();
                            return Legends.Flash.winLossHandler(Legends.Flash.buildPlaylist(obj));
                        }
                        target = target.parentNode;
                    }
                };
            }
        },
        
        buildPlaylist: function (obj) {
            var file = Page.musicRoot + "-" + obj.type + ".mp3";
            obj.playlist = [{
                'file': file,
                'tags': obj.type,
                'title': Page.journalEntry.game + ": " + Page.journalEntry.title
            }];
            return obj;
        },
        winLossHandler: function (obj) {
            var player = document.getElementById(obj.id);
            var playlist = obj.playlist;
            if (!playlist) {
                return true;
            }
            var file = playlist[0];
            var label = file.title + " (" + file.tags + ")";
            var current_playlist = player.getPlaylist();
            var loaded = (current_playlist && current_playlist[0].tags == file.tags);
            
            var config = player.getConfig();
            var current_state = config.state;
            switch (current_state) {
            case "BUFFERING":
            case "PLAYING":
                if (loaded) {
                    // Pause
                    player.sendEvent("PLAY", false);
                    // GA Event tracking
                    _gaq.push(['_trackEvent', 'Postgame music', 'Pause', label]);
                    break;
                }
            case "PAUSED":
            case "IDLE":
                if (loaded) {
                    // Play
                    player.sendEvent("PLAY", true);
                    // GA Event tracking
                    _gaq.push(['_trackEvent', 'Postgame music', 'Play', label]);
                    break;
                }
            default:
                // Load
                player.sendEvent("LOAD", playlist);
                break;
            }
            return false;
        },
        
        // Menu music
        
        menuItemHandler: function (obj) {
            var musicSwitch = document.getElementById('musicSwitch');
            var music_links = musicSwitch.getElementsByTagName('a');
            for (var i = 0; i < music_links.length; i++) {
                if (music_links[i].className != 'stop') {
                    music_links[i].className = '';
                }
            }
            music_links[obj.index].className = 'current';
        },
        switchMusic: function (e) {
            if (player) {
                var musicSwitch = document.getElementById('musicSwitch');
                var music_links = musicSwitch.getElementsByTagName('a');
                var target = getTarget(e);
                for (var i = 0; i < music_links.length; i++) {
                    if (music_links[i].className != 'stop') {
                        if (target.className == 'stop') {
                            music_links[i].className = '';
                        } else if (music_links[i] == target) {
                            // Choose menu music item
                            player.sendEvent("ITEM", i);
                            // GA Event tracking
                            var playlist = player.getPlaylist();
                            _gaq.push(['_trackEvent', 'Menu music', 'Play', playlist[i].title]);
                            return false;
                        }
                    }
                }
                // Stop
                player.sendEvent("STOP");
                // GA Event tracking
                _gaq.push(['_trackEvent', 'Menu music', 'Stop']);
            }
            return false;
        },
        
        // Cutscenes
        
        custsceneStateHandler: function (obj) {
            var player = document.getElementById(obj.id);
            var action = false;
            switch (obj.newstate) {
            case 'PLAYING':
                action = 'Play';
                break;
            case 'COMPLETED':
                action = 'Complete';
                break;
            }
            if (action !== false) {
                // GA Event tracking
                var config = player.getConfig();
                var label = Page.journalEntry.game + ": " + Page.journalEntry.title + " (" + config.title + ")";
                _gaq.push(['_trackEvent', 'Cutscene', action, label]);
            }
        }
    }
};

var player = null;
function playerReady(obj) {
    player = document.getElementById(obj.id);
    switch (obj.id) {
    case 'win_loss_music_player':
        player.addModelListener("LOADED", "Legends.Flash.postgameLoadingHandler");
        player.addControllerListener("PLAYLIST", "Legends.Flash.winLossHandler");
        
        Legends.Flash.handlePostGame(obj, 'Win');
        Legends.Flash.handlePostGame(obj, 'Loss');
        break;
    case 'menu_music_player':
        player.addControllerListener("ITEM", "Legends.Flash.menuItemHandler");
        
        // Menu music switcher
        var musicSwitch = document.getElementById('musicSwitch');
        musicSwitch.onclick = Legends.Flash.switchMusic;
        break;
    }
    if (obj.id.indexOf('cutscene') === 0) {
        player.addModelListener("STATE", "Legends.Flash.custsceneStateHandler");
    }
}

window.onload = function () {
    // Prime the index toggle
    var toggle = document.getElementById('indexHead');
    if (toggle) {
        toggle.onclick = Legends.toggleIndex;
    }
    
    var note_toggle = document.getElementById('noteToggle');
    if (note_toggle) {
        note_toggle.onclick = Legends.toggleNotes;
    }
    // Prime the entry note highlighter
    var entry = document.getElementById('entry');
    if (entry) {
        var entry_links = entry.getElementsByTagName('a');
        for (var i = 0; i < entry_links.length; i++) {
            var entry_link = entry_links[i];
            if (/\bentryNote\b/.exec(entry_link.className)) {
                entry_link.onclick = Legends.noteFade;
                entry_link.onmouseover = Legends.toggleNoteHighlight;
                entry_link.onmouseout = Legends.toggleNoteHighlight;
            }
        }
    }
};
