﻿/// <reference path="../jquery-1.4.4-vsdoc.js" />
/// <reference path="jwplayer.js" />

function Mediaplayer() {
    this.isReview = false;
    this.instance = null;
    this.containerId = null;
    this.currentTrackIndex = null;
    this.isLoadingBuffer = false;
    this.$tracks = null; // playlist jQuery elements
    this.isNewItemPlay = false;
    this.$wait = $("<div class='submit-indicator'> </div>");
}
Mediaplayer.prototype = {
    reset: function () {
        if (this.currentTrackIndex == null) return;
        this.isLoadingBuffer = false;
        this.currentTrackIndex = null;
        this.isNewItemPlay = false;
        this.instance.stop();
    },
    create: function (containerId, width, height) {
        this.containerId = containerId;
        var _this = this;
        var onPlayerLoadingBuffer = function (data) {
            _this.isLoadingBuffer = true;
            _this.toggleWait(true, _this.currentTrackIndex);
        };
        var onPlayerNewItemPlay = function (data) {
            if (_this.currentTrackIndex == null) {
                _this.currentTrackIndex = data.index;
                return;
            }
            _this.isNewItemPlay = true;
            _this.cnangeTrackImageState("play", data.index);
            _this.currentTrackIndex = data.index;
        };
        var onPlayerPlay = function (data) {
            if (data.oldstate == "BUFFERING") {
                _this.isLoadingBuffer = false;
                _this.toggleWait(false, data.index);
            }
            if (_this.isNewItemPlay) return;
            _this.cnangeTrackImageState("play", _this.currentTrackIndex);
            _this.isNewItemPlay = true;
        };
        var onPlayerPause = function (data) {
            _this.isNewItemPlay = false;
            _this.cnangeTrackImageState("pause", _this.currentTrackIndex);
        };
        var onPlayerTime = function (data) {
            _this.cnangeTrackPlayTime(data.duration, data.position);
        };
        var init = function () {
            _this.instance = jwplayer(containerId);
            _this.instance.setup({
                flashplayer: "/content/flash/player.swf",
                controlbar: 'bottom',
                repeat: "list",
                width: width,
                height: height,
                events: {
                    onBuffer: onPlayerLoadingBuffer,
                    onPlaylistItem: onPlayerNewItemPlay,
                    onPlay: onPlayerPlay,
                    onPause: onPlayerPause,
                    onTime: onPlayerTime
                }
            });
        };

        init();
    },
    loadPlaylist: function (tracks, $tracksHtml) {
        var _this = this;
        var onImgTrackActionClick = function () {
            if (_this.currentTrackIndex == null) return;
            if (_this.isLoadingBuffer) return;
            var $this = $(this);
            var index = Number($this.parent().attr("id"));
            var action = $this.attr("alt");
            switch (action) {
                case "play":
                    if (index == _this.currentTrackIndex) {
                        _this.instance.play(true);
                    } else {
                        _this.instance.stop();
                        _this.instance.playlistItem(index);
                    }
                    break;
                case "pause":
                    _this.instance.pause(true);
                    break;
            }
        };
        this.instance.load(tracks);
        this.$tracks = $tracksHtml;
        $tracksHtml.find("img.track_action").click(onImgTrackActionClick);
    },
    cnangeTrackImageState: function (action, index) {
        var $currentTrack = $(this.$tracks[this.currentTrackIndex]);
        $("img[alt='play']", $currentTrack).show();
        $("img[alt='pause']", $currentTrack).hide();
        switch (action) {
            case "play":
                $("div.track_slider", $currentTrack).hide();
                if (this.$tracks.length == (this.currentTrackIndex + 1) && index == 0) {
                    this.currentTrackIndex = null;
                    this.isNewItemPlay = false;
                    return;
                }
                var $track = $(this.$tracks[index]);
                $("img[alt='play']", $track).hide();
                $("img[alt='pause']", $track).show();
                $("div.track_slider", $track).show();
                break;
            case "pause":
                break;
        }
    },
    cnangeTrackPlayTime: function (duration, position) {
        var $currentTrack = $(this.$tracks[this.currentTrackIndex]);
        var $slider = $("div.track_slider", $currentTrack);
        var sliderWidth = Number($slider.css("width").replace("px", ""));
        var ratio = position / duration;
        var indicatorWidth = Math.round(sliderWidth * ratio) + "px";
        $("div", $slider).css("width", indicatorWidth);
    },
    toggleWait: function (isOn, index) {
        if (isOn) {
            var $currentTrack = $(this.$tracks[index]);
            $("td.wait", $currentTrack).html(this.$wait);
        } else {
            this.$wait.remove();
        }
    }
};
