﻿NicoFanSite.Audio = {};

NicoFanSite.Audio.XmlObject = null;
NicoFanSite.Audio.XslObject = null;
NicoFanSite.Audio.FileExtension = ".mp3";

var volume =
{
    value: 0.5,
    volumeObject: null,
    volumeObjectReflected: null
};

function LoadAlbumsFromXml(sender, eventArgs)
{
    if (NicoFanSite.Audio.XmlObject && NicoFanSite.Audio.XslObject)
    {
        DisplayAudio();
        return;
    }
    if (!NicoFanSite.Audio.XmlObject)
    {
        XHRLoader("xml/audio.xml", null, "GET", XmlDownloadCompleted, null,
            { namespace: "NicoFanSite.Audio", successAction: DisplayAudio });
    }
    if (!NicoFanSite.Audio.XslObject)
    {
        XHRLoader("xml/audio.xslt", null, "GET", XmlDownloadCompleted, null,
            { namespace: "NicoFanSite.Audio", successAction: DisplayAudio });
    }
}

function DisplayAudio()
{
    var control = GetControl().content;
    var xaml = XsltTransformation(NicoFanSite.Audio.XmlObject, NicoFanSite.Audio.XslObject);
    var content = control.createFromXaml(xaml);
    var canvas = control.findName("albumsContainer");
    canvas.children.clear();
    canvas.children.add(content);
}

function AlbumsInit(sender, eventArgs)
{
    var count = sender.children.count;
    var top = 10;
    for(var i = 0; i < count; i++)
    {
        var album = sender.children.getItem(i);
        album["Canvas.Top"] = top;
        top += album.Height + 20;
    }
    sender.Height = top - 10;
    
    scroller.Initialize(
        sender.findName("scroller"),
        sender,
        sender.findName("scrollUp"),
        sender.findName("scrollDown"),
        "#FF2373D5"
    );
    
    var volumeChanger = sender.findName("volumeChanger");
    volume.volumeObject = sender.findName("volumeLevel");
    volume.volumeObjectReflected = sender.findName("volumeLevel_reflected");
    volume.volumeObject.Width = volume.value * 54;
    volume.volumeObjectReflected.Width = volume.volumeObject.Width;
    levelChangers[volumeChanger.Name] = 
        new levelChanger(
            volumeChanger,
            function(offset)
            {
                volume.value = offset;
                volume.volumeObject.Width = offset * 54;
                volume.volumeObjectReflected.Width = volume.volumeObject.Width;
                
                if(audioPlayer.player != null &&
                    !audioPlayer.isCollapsing && !audioPlayer.isMoving)
                {
                    audioPlayer.media.Volume = offset;
                }
            },
            null,
            null
        );
}

function PlayTrack(sender, eventArgs)
{
    var top = sender["Canvas.Top"];
    var album = sender.getParent();
    var filename = "audio/" + album["Name"] + "/" + sender.Tag + NicoFanSite.Audio.FileExtension;
    audioPlayer.Initialize(album, top, filename, eventArgs.GetPosition(null));
}

function CloseButtonHover(sender, eventArgs)
{
    sender.children.GetItem(0).Fill = "#FFFFF087";   
}

function CloseButtonNormal(sender, eventArgs)
{
    sender.children.GetItem(0).Fill = "#FFFFFAD7";
}

function CloseButtonClick(sender, eventArgs)
{
    if(!audioPlayer.isMoving)
        audioPlayer.Destroy(false);
}

function PlayButtonClick(sender, eventArgs)
{
    if(!audioPlayer.isCollapsing)
    {
        audioPlayer.buttons.play.Visibility = "Collapsed";
        audioPlayer.buttons.pause.Visibility = "Visible";
        //продолжение воспроизведения:
        audioPlayer.media.Play();
    }
}

function PauseButtonClick(sender, eventArgs)
{
    if(audioPlayer.media.position.seconds > 0)
	{
		audioPlayer.buttons.play.Visibility = "Visible";
	    audioPlayer.buttons.pause.Visibility = "Collapsed";
	    //пауза воспроизведения:
	    audioPlayer.media.Pause();
	}
}

function ShowingPlayerComplete(sender, eventArgs)
{
    audioPlayer.media.Volume = volume.value;
    audioPlayer.media.source = audioPlayer.source;
    audioPlayer.media.Play();
}

function MovingPlayerComplete(sender, eventArgs)
{
    audioPlayer.buttons.pause.Visibility = "Visible";
    audioPlayer.buttons.play.Visibility = "Collapsed";
    audioPlayer.progresstime.Text = "00:00";
    audioPlayer.isMoving = false;
    audioPlayer.media.Stop();
    audioPlayer.media.Volume = volume.value;
    audioPlayer.media.source = audioPlayer.source;
    audioPlayer.media.Play();
}

function HidingPlayerComplete(sender, eventArgs)
{
    sender.findName(sender.children.getItem(0)["Storyboard.TargetName"]).Visibility =
        "Collapsed";
	audioPlayer.lastplayer.children.getItem(6).source = null;
    audioPlayer.isCollapsing = false;
    audioPlayer.buttons.pause.Visibility = "Visible";
    audioPlayer.buttons.play.Visibility = "Collapsed";
}

function AudioOpened(sender, eventArgs)
{
    audioPlayer.isOpened = true;
}

function AudioEnded(sender, eventArgs)
{
    audioPlayer.media.Stop();
    audioPlayer.NewTrackAnimation(false);
    audioPlayer.buttons.play.Visibility = "Visible";
    audioPlayer.buttons.pause.Visibility = "Collapsed";
}

function Buffering(sender, eventArgs)
{
    if(sender["Name"] == audioPlayer.media["Name"])
	{
		var progressState = sender.downloadProgress;
    	audioPlayer.progressbar.line.Stroke.GradientStops.getItem(2).Offset = progressState;
    	audioPlayer.progressbar.line.Stroke.GradientStops.getItem(3).Offset = progressState + 0.02;
    	audioPlayer.progressbar.changer.Width = 
			(progressState - 0.03) > 0?
			(progressState - 0.03) * 178 : 0;
	}
}

function TimerTick(sender, eventArgs)
{
    try //при смене страницы удаление контента может приходиться на этот участок
    {
        sender.Stop();
        sender.Begin();
    }
    catch (e) { return; }
    if(audioPlayer.isOpened)
    {
        if(audioPlayer.media.naturalDuration.seconds == 0) return; //почему возникает?
        if(!audioPlayer.isChanging)
        {
            var percent = audioPlayer.media.position.seconds /
                audioPlayer.media.naturalDuration.seconds;
            var toddlerPosition = percent * 175;
            if(toddlerPosition > audioPlayer.progressbar.toddler["Canvas.Left"])
            {
                audioPlayer.progressbar.line.Stroke.GradientStops.getItem(0).Offset = percent;
                audioPlayer.progressbar.line.Stroke.GradientStops.getItem(1).Offset = percent;
                audioPlayer.progressbar.toddler["Canvas.Left"] = toddlerPosition;
            }
        }        
        var minutes = Math.floor(audioPlayer.media.position.seconds / 60);
        var seconds = Math.floor(audioPlayer.media.position.seconds % 60);
        var timeString = (minutes < 10? "0" : "") + minutes.toString() + ":" +
            (seconds < 10? "0": "") + seconds.toString();
        audioPlayer.progresstime.Text = timeString;
    }
}

function PlayErrorAnimationCompleted(sender, eventArgs)
{
    sender.findName("playErrorCanvas").Visibility = "Collapsed";
}

function VolumeFadeOutCompleted(sender, eventArgs)
{
    var media = sender.findName(sender.children.getItem(0)["Storyboard.TargetName"]);
    media.Stop();
    media.Volume = 0.5;
}

var audioPlayer = 
{
    player:         null,
    lastplayer:     null,
    progressbar:
    {
        line:       null,
        toddler:    null,
        changer:    null
    },
    buttons:
    {
        play:       null,
        pause:      null,
        close:      null
    },
    progresstime:   null,
    media:          null,
    
    isOpened:       false,
    isCollapsing:   false,
    isMoving:       false,
    isChanging:     false,
    source:         null,
    
    //методы:
    Initialize: function(album, trackTop, fileName, mousePosition)
    {
        var plugin = GetControl().content;
        var albumNumber = album.Tag;
        
        if(audioPlayer.isCollapsing && 
            audioPlayer.lastplayer["Name"] == "player_" + albumNumber)
        {
            var error = plugin.findName("playErrorCanvas");
            error["Canvas.Left"] = mousePosition.X - 183.5 - error.Width - 2;
            error["Canvas.Top"] = mousePosition.Y - 14 - error.Height - 2;      
            error.Visibility = "Visible";
            plugin.findName("playErrorAnimation").Begin();
            return;
        }
        
        var isNull, isCurrent;
        isNull = audioPlayer.player == null? true : false;
        if(!isNull)
        {
            isCurrent =
                audioPlayer.player["Name"] == "player_" + albumNumber?
                true : false;
        }
        else isCurrent = false;
        
        //убираем плеер другого альбома
        if(!isNull && !isCurrent) audioPlayer.Destroy(false);
        //отображаем плеер вновь выбранного альбома
        if(isNull || !isCurrent)
        {
            audioPlayer.player = plugin.findName("player_" + albumNumber);
            var _progressbar = audioPlayer.player.children.getItem(1);
            audioPlayer.progressbar.line = _progressbar.children.getItem(0);
            audioPlayer.progressbar.toddler = _progressbar.children.getItem(1);
            audioPlayer.progressbar.changer = _progressbar.children.getItem(2);
            var _buttons = audioPlayer.player.children.getItem(2);
            audioPlayer.buttons.play = _buttons.children.getItem(0);
            audioPlayer.buttons.pause = _buttons.children.getItem(1);
            audioPlayer.buttons.close = audioPlayer.player.children.getItem(5);
            audioPlayer.progresstime = audioPlayer.player.children.getItem(3);
            audioPlayer.media = audioPlayer.player.children.getItem(6);
            
            audioPlayer.progressbar.changer.Width = 0;
            levelChangers[audioPlayer.progressbar.changer.Name] = 
                new levelChanger(
                    audioPlayer.progressbar.changer,
                    function(offset)
                    {
                        audioPlayer.progressbar.toddler["Canvas.Left"] = offset *
                            audioPlayer.progressbar.changer.Width;
                        audioPlayer.progressbar.line.
                            Stroke.GradientStops.getItem(0).Offset = offset *
                            audioPlayer.progressbar.changer.Width / 178;
                        audioPlayer.progressbar.line.
                            Stroke.GradientStops.getItem(1).Offset = offset *
                            audioPlayer.progressbar.changer.Width / 178;
                    },
                    function(percentPosition)
                    {
                        if(percentPosition == null)
                        {
                            percentPosition = audioPlayer.progressbar.line.
                                Stroke.GradientStops.getItem(0).Offset;
                        }
                        else
                        {
                            percentPosition = percentPosition *
                                audioPlayer.progressbar.changer.Width / 178;
                        }
                        var seconds = percentPosition *
                            audioPlayer.media.naturalDuration.seconds;
                        
                        var minutes = Math.floor(seconds / 60);
                        seconds = Math.floor(seconds % 60);
                        var timeString = (minutes < 10? "0" : "") + minutes.toString() + ":" +
                            (seconds < 10? "0": "") + seconds.toString();
                        
                        audioPlayer.media.position = "0:" + timeString;
                        audioPlayer.progresstime.Text = timeString;
                    },
                    function(value)
                    {
                        audioPlayer.isChanging = value;
                    }
                );
            //анимация появления плеера
            audioPlayer.player["Canvas.Top"] = trackTop - 4;
            audioPlayer.progresstime.Text = "00:00";
            audioPlayer.player.Visibility = "Visible";
            audioPlayer.progressbar.line.Stroke.GradientStops.getItem(0).Offset = 0;
            audioPlayer.progressbar.line.Stroke.GradientStops.getItem(1).Offset = 0;
            audioPlayer.progressbar.line.Stroke.GradientStops.getItem(2).Offset = 0;
            audioPlayer.progressbar.line.Stroke.GradientStops.getItem(3).Offset = 0.02;
            audioPlayer.progressbar.toddler["Canvas.Left"] = 0;
            audioPlayer.StartAnimation(audioPlayer.player["Name"], plugin.findName("ShowPlayer"));
            
        }
        else
        {
            audioPlayer.progressbar.changer.Width = 0;
            //анимация перемещения плеера
            audioPlayer.isOpened = false;
            audioPlayer.isMoving = true;
            audioPlayer.StartAnimation(audioPlayer.player["Name"],
                plugin.findName("MovePlayer"),
                [{
                    firstChild:0,
                    secondChild:0,
                    value:trackTop - 4
                 }]);
            audioPlayer.buttons.play.Visibility = "Collapsed";
            audioPlayer.buttons.pause.Visibility = "Collapsed";
            audioPlayer.NewTrackAnimation(true);
            audioPlayer.VolumeFadeOut();
        }
        audioPlayer.source = fileName;
    },
    
    Destroy: function(pageLeave)
    {
        var plugin = GetControl().content;
	    audioPlayer.isCollapsing = true;
        audioPlayer.lastplayer = audioPlayer.player;
        
        //анимация изчезания плеера
        if(!pageLeave)
        {
            audioPlayer.StartAnimation(audioPlayer.player["Name"], plugin.findName("HidePlayer"));
            audioPlayer.VolumeFadeOut();
            levelChanger.prototype.Destroy(audioPlayer.progressbar.changer.Name);
            
        }
        else
        {
            //остановка воспроизведения
            audioPlayer.media.Stop();
            audioPlayer.isCollapsing = false;
        }
        audioPlayer.isOpened = false;
        audioPlayer.isMoving = false;
        audioPlayer.player = null;
    },
    
    StartAnimation: function(name, storyboard, items)
    {
        var isStop = false;
        for(i = 0; i < storyboard.children.count; i++)
        {        
            if(storyboard.children.getItem(i)["Storyboard.TargetName"] != name)
            {
                if(!isStop) { storyboard.Stop(); isStop = true; }
                storyboard.children.getItem(i)["Storyboard.TargetName"] = name;
            }
        }
        if(items != null)
        {
            for(i = 0; i < items.length; i++)
            {
                storyboard.children.getItem(items[i].firstChild).keyFrames.getItem(items[i].secondChild).Value = items[i].value;
            }
        }
        storyboard.Begin();
    },
    
    NewTrackAnimation: function(setBufferingToStart)
    {
        var offset = audioPlayer.progressbar.line.Stroke.GradientStops.getItem(0).Offset;
        var bufferOffset = audioPlayer.progressbar.line.Stroke.GradientStops.getItem(2).Offset;
        var endBufferOffset = setBufferingToStart? 0 : 1;
	    var plugin = GetControl().content;
        audioPlayer.StartAnimation(audioPlayer.progressbar.line["Name"],
        plugin.findName("StopPlayingLineAnimation"),
        [{
            firstChild:2,
            secondChild:0,
            value:offset
         },
         {
            firstChild:3,
            secondChild:0,
            value:offset
         },
         {
            firstChild:4,
            secondChild:0,
            value:bufferOffset
         },
         {
            firstChild:4,
            secondChild:1,
            value:endBufferOffset
         },
         {
            firstChild:5,
            secondChild:0,
            value:bufferOffset + 0.02
         },
         {
            firstChild:5,
            secondChild:1,
            value:endBufferOffset + 0.02
         }]);
        
        var left = audioPlayer.progressbar.toddler["Canvas.Left"];
        audioPlayer.StartAnimation(audioPlayer.progressbar.toddler["Name"],
        plugin.findName("StopPlayingToddlerAnimation"),
        [{
            firstChild:1,
            secondChild:0,
            value:left
         }]);
    },
    
    VolumeFadeOut: function()
    {
        var plugin = GetControl().content;
	    audioPlayer.StartAnimation(audioPlayer.media["Name"],
        plugin.findName("VolumeFadeOutAnimation"));
    }
}
