function include(file) {
    var selfref = $$('script[src $= "DE_panoplayer.js"]');
    if (selfref.length != 1) return;
    var path = selfref[0].readAttribute('src').match('^(.*)DE_panoplayer.js$')[1];
    document.write('<script type="text/javascript" src="' + path + file + '"></script>'); 
}
include('chat.js');

var defaultScene, defaultSite;
var language, resolution, editMode;
var viewportScale, granularity;
var userID;
var sceneIconWidth, sceneIconHeight, siteIconWidth, siteIconHeight;
var iconWidth = 0;
var iconHeight = 0;

// Extend DE_prototype.js:
Element.addMethods({
    centerOnParent: function(element) {
        element = $(element);
        element.absolutize();
        var edim = element.getDimensions();
        var pdim = element.getOffsetParent().getDimensions();
        element.setStyle({
            top: Math.floor((pdim.height - edim.height) / 2) + 'px',
            left: Math.floor((pdim.width - edim.width) / 2) + 'px'
        });
    }
});

var chat;
var baseURL = "";
function Init() {
    userID = GetCookie('VHI_UID');
    if (!userID) {
        userID = '';
        for (var i = 0; i < 18; i++) userID += Math.floor(Math.random() * 10);
    }
    SetCookie('VHI_UID', userID, 7);
    
    var selfref = $$('script[src $= "javascript/DE_panoplayer.js"]');
    if (selfref.length == 1)
        baseURL = selfref[0].readAttribute('src').match('^(.*/?)javascript/DE_panoplayer.js$')[1];
    
    InitializeMainMenu();
    if (defaultScene != undefined && scenes[defaultScene]) ChangeScene(scenes[defaultScene]);
    else if (defaultSite) ChangeSite(defaultSite);
    
    if (language && !$('languageselector')) language = undefined;
    if (language) {
        $('languageselector').select('img').each(function(lang) {
            $(lang).addClassName('unselected');
        });
        ToggleSelection('languageselector', language);
    }
    if (resolution  && !$('resolutionselector')) resolution = undefined;
    if (resolution) {
        $('resolutionselector').select('img').each(function(res) {
            $(res).addClassName('unselected');
        });
        ToggleSelection('resolutionselector', resolution);
    }
    
    if (GetCookie('VHI_EMAIL')) { // registered user, enable edit mode
        $('edittoggle').show();
        $('edittoggle').select('img').each(function(img) {
            $(img).addClassName('unselected');
        });
    }
}

function InitializeMainMenu() {
    var menu = $('mainmenu');
    var iw = sceneIconWidth || iconWidth;
    var ih = sceneIconHeight || iconHeight;
    for (var i = 0; i < scenes.size(); i++) {
        var scn = scenes[i];
        if (Object.isString(scn)) {
            menu.insert(scn);
        } else {
            var img = new Element('img', {
                src: scn.icon, alt: scn.name || "", title: scn.name || "", 'class': 'cursor',
                width: scn.iconWidth || iw, height: scn.iconHeight || ih
            });
            img.observe('click', ChangeScene.curry(scn));
            menu.insert(img);
            menu.insert(new Element('br'));
            menu.insert(scn.name);
            menu.insert(new Element('br'));
        }
    }
}

var currentScene;
function ChangeScene(scn) {
    currentScene = scn;

    var menu = $('submenu');
    menu.innerHTML = '';
    var iw = scn.siteIconWidth || siteIconWidth || iconWidth;
    var ih = scn.siteIconHeight || siteIconHeight || iconHeight;
    for (var i = 0; i < scn.sites.size(); i++) {
        var site = scn.sites[i];
        if (Object.isString(site)) {
            menu.insert(site);
        } else {
            var img = new Element('img', {
                src: site.icon, alt: site.name || "", title: site.name || "",
                width: site.iconWidth || iw, height: site.iconHeight || ih, 'class': 'cursor'
            });
            img.observe('click', ChangeSite.curry(site));
            menu.insert(img);
            menu.insert(new Element('br'));
            menu.insert(site.name);
            menu.insert(new Element('br'));
        }
    }
    
    if (scn.chatroom) {
        if (!chat) {
            var username = 'Anonymous #' + Math.floor(Math.random() * 1000);
            chat = new Chat('chat', { width:'560px', height:'100px', allowNameChange:true });
            chat.login(username, scn.chatroom);
        } else {
            chat.changeRoom(scn.chatroom);
        }
    }

    ChangeSite(scn.sites[0]);
}

var currentSite;
function ChangeSite(site) {
    if (site) currentSite = site;
    else site = currentSite;
    var flash = { userID:userID };
    if (site.program || (currentScene && currentScene.program)) {
        flash.program = site.program || currentScene.program;
        if (site.track) flash.track = site.track;
    } else {
        if (site.flv) flash.flv = site.flv;
        if (site.stillimage) flash.stillimage = site.stillimage;
        if (currentScene) {
            if (currentScene.sound) flash.sound = currentScene.sound;
            if (currentScene.metadata) flash.metadata = currentScene.metadata;
            if (currentScene.subtitle) flash.subtitle = currentScene.subtitle;
            if (currentScene.physx) flash.physx = currentScene.physx;
            if (currentScene.flat) flash.flat = 1;
        }
        if (site.sound) flash.sound = site.sound;
        if (site.metadata) flash.metadata = site.metadata;
        if (site.subtitle) flash.subtitle = site.subtitle;
        if (site.physx) flash.physx = site.physx;
        if (site.timeOffset) flash.timeOffset = site.timeOffset;
        if (site.flat) flash.flat = 1;
        if (resolution) {
            if (flash.flat == undefined) {
                $('resolutionselector').style.visibility = 'visible';
                if (flash.flv)
                    flash.flv = flash.flv.replace(/.flv$/, resolution + '.flv');
                if (flash.stillimage)
                    flash.stillimage = flash.stillimage.replace(/(.[a-z]+)$/, resolution + '$1');
            } else {
                $('resolutionselector').style.visibility = 'hidden';
            }
        }
        if (flash.subtitle && language)
            flash.subtitle = flash.subtitle.replace(/.sub$/, language + '.sub');
        if (flash.metadata && language)
            flash.metadata = flash.metadata.replace(/.xml$/, language + '.xml');
    }
    if (resolution) {
        flash.res = resolution;
        if (viewportScale && viewportScale[resolution])
            flash.viewportScale = viewportScale[resolution];
        if (granularity && granularity[resolution])
            flash.segments = granularity[resolution];
    }
    if (language) flash.lang = language;
    if (editMode) flash.editor = 1;
    
    Element.replace('swf', '\
<object id="swf" class="swf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" \
        codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0"> \
    <param name="movie" value="' + baseURL + 'VHIPanoPlayer2011.swf"/> \
    <param name="flashvars" value="' + Object.toQueryString(flash) + '"/> \
    <param name="quality" value="high"/> \
    <param name="menu" value="false"/> \
    <param name="allowFullScreen" value="true"/> \
    <embed class="swf" type="application/x-shockwave-flash" \
           src="' + baseURL + 'VHIPanoPlayer2011.swf" flashvars="' + Object.toQueryString(flash) + '" \
           quality="high" menu="false" allowfullscreen="true" \
           pluginspage="http://www.macromedia.com/go/getflashplayer"></embed> \
</object>');
    $('swf').observe('mousewheel', StopEventPropagation)
            .observe('DOMMouseScroll', StopEventPropagation);
    if (editMode) $$('.swf').each(function (elt) { elt.addClassName('editor'); });
}

function StopEventPropagation(event) {
    event.stop();
}

function ChangeLanguage(lang) {
    ToggleSelection('languageselector', language);
    if (Object.isString(lang)) language = lang;
    else language = lang.name;
    ToggleSelection('languageselector', language);
    ChangeSite();
}

function ChangeResolution(res) {
    ToggleSelection('resolutionselector', resolution);
    if (Object.isString(res)) resolution = res;
    else resolution = res.name;
    ToggleSelection('resolutionselector', resolution);
    ChangeSite();
}

function ToggleEditor(img) {
    editMode = !editMode;
    $(img).toggleClassName('unselected').toggleClassName('selected');
    ChangeSite();
}

function ToggleSelection(parent, eltName) {
    var elt = $(parent).select('[name="' + eltName + '"]')[0];
    if (elt)
        elt.toggleClassName('unselected').toggleClassName('selected');
}

function SetCookie(name, value, days) {
	if (days) {
		var date = new Date();
		date.setDate(date.getDate() + days);
		var expires = "; expires=" + date.toGMTString();
	}
	else var expires = "";
	document.cookie = name + "=" + escape(value) + expires + "; path=/";
}

function GetCookie(name) {
    if (document.cookie.length > 0) {
        var start = document.cookie.indexOf(name + "=");
        if (start != -1) {
            start = start + name.length + 1;
            var end = document.cookie.indexOf(";", start);
            if (end == -1) end = document.cookie.length;
            return unescape(document.cookie.substring(start, end));
        } 
    }
    return null;
}

