﻿/******************************************************************************
 ******************  WINDOWS MEDIA PLAYER unversal library  *******************
 ******************************************************************************
 *                 version 1.1.0.5, no support for WMP 6.4 (yet)
 ******************************************************************************/

/*
 * Usage:
 * var wmp = new MediaPlayer(url);          -- create a player
 *                                             url - URL of the media to play
 *
 * wmp.bindPlayButton(playButtonObj);       -- bind play button
 *                                             playButtonObj - DOM object of the play button,
 *                                             get it by document.getElementById()
 *
 * wmp.bindStopButton(stopButtonObj);       -- ***
 *
 * wmp.bindVolumeSlider(volumeSliderObj, maxLeft, maxRight, marginLeft);  
 *                                          -- bind volume slider
 *                                             volumeSliderObj - object
 *                                             maxLeft - in pixels maximum 
 *
 * wmp.bindStatusbar(statusbarObj);         -- bind statusbar to display status of playback
 *                                             (playing, stopped, buffering etc)
 *                                             statusbarObj - object (div)
 *
 * wmp.bindVolumeBar(volumebarObj);         -- *** volume in percents (100% by default)
 *
 * wmp.play();                              -- start playback
 *
 * wmp.stop();                              -- stop palyback
 *
 */

/**
 * Determine browser and its version
 * This function taken from BrainJar
 */

function Browser()
{
    var ua, i;

    this.isIE    = false;
    this.isNS    = false;
    this.version = null;

    ua = navigator.userAgent;

    if ((i = ua.indexOf('MSIE')) >= 0) {
        this.isIE = true;
        this.version = parseFloat(ua.substr(i + 'MSIE'.length));
        return;
    }

    if ((i = ua.indexOf('Netscape6/')) >= 0) {
        this.isNS = true;
        this.version = parseFloat(ua.substr(i + 'Netscape6/'.length));
        return;
    }

    /* Treat any other "Gecko" browser as NS 6.1. */
    if ((i = ua.indexOf('Gecko')) >= 0) {
        this.isNS = true;
        this.version = 6.1;
        return;
    }
}

window.browser = new Browser();

/*
 * WMP Event object
 */
var WmpEvent = {};
WmpEvent.attachWmpEvent = function (event, eventType, eventHandler) {
    //return false;
    if (window.browser.isIE) {
        document.attachEvent('on' + eventType, eventHandler);
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }

    if (window.browser.isNS) {
        document.addEventListener(eventType, eventHandler, true);
        event.preventDefault();
    }
}
WmpEvent.detachWmpEvent = function (eventType, eventHandler) {
    if (window.browser.isIE) {
        document.detachEvent('on' + eventType, eventHandler);
    } else if (window.browser.isNS) {
        document.removeEventListener(eventType, eventHandler, true);
    }
}


// This object represents a Windows Media Player object
// with ability to bind events on an HTML page to its controls

function MediaPlayer(mediaUrl)
{
    /* URL: "private" property and method */
    var getUrl = function () { return mediaUrl; }

    /* Player type */
    var isActiveX = function () { return null != window.ActiveXObject; }
    var isOpera = function () { return -1 != navigator.userAgent.indexOf('Opera'); }
    var isWmp11 = function () {
        /*
        return null != navigator.mimeTypes &&
               null != navigator.mimeTypes['application/x-ms-wmp'] &&
               null != navigator.mimeTypes['application/x-ms-wmp'].description &&
               navigator.mimeTypes['application/x-ms-wmp'].description == 'np-mswmp' &&
               -1 == navigator.userAgent.indexOf('Opera');
        */
        if (isActiveX()) {
            return false;
        }

        if (!!navigator.plugins) {
            for (var i in navigator.plugins) {
                if ('np-mswmp' == navigator.plugins[i].description) {
                    return true;
                }
            }
        }

        return false;
    }

    /* HTML code for player */
    var getPlayerHtml = function (autostart) {
        var html = '';
        autostart = !!autostart ? 1 : 0;

        if (isWmp11() && !isOpera()) {
            html =  '<object id="wmplayer" type="application/x-ms-wmp" data="' + getUrl() + '" width="0" height="0">';
            html += '<param name="URL" value="' + getUrl() + '" />';
            html += '<param name="uiMode" value="minimal" />';
            html += '<param name="EnablePositionControls" value="true" />';
            html += '<param name="ShowControls" value="1" />';
            html += '<param name="ShowDisplay" value="0" />';
            html += '<param name="ShowStatusBar" value="0" />';
            html += '</object>';
        } else if (isActiveX()) {
            /* no object code needed */
        } else {
            html  = '<embed id="wmplayer" name="wmplayer" type="application/x-mplayer2"';
            html += ' pluginspage="http://www.microsoft.com/Windows/Downloads/Contents/Products/MediaPlayer/" ';
            /*html += ' filename="' + getUrl() + '" ';*/
            html += ' src="' + getUrl() + '" ';
            html += ' EnablePositionControls="1" ';
            html += ' ShowControls="1" ShowDisplay="0" ShowStatusBar="0" AutoStart="' + autostart + '" width="0" height="0" />';
        }

        return html;
    }

    var volume = 0;
    var playing = true;
    var wmpControl = null;
    
    /* initialization */
    var playerContainer = null;
    var initPlayer = function () {
        playerContainer = document.createElement('div');
        playerContainer.style.position = 'absolute';
        playerContainer.style.width  = '1px';
        playerContainer.style.height = '1px';
        playerContainer.setAttribute('id', 'player_container');
        document.body.appendChild(playerContainer);
        playerContainer.innerHTML = getPlayerHtml(true);
        
        if (isActiveX()) {
            wmpControl = new ActiveXObject('WMPlayer.OCX.7');
            wmpControl.URL = getUrl();
        } else if (isWmp11()) {
            wmpControl = document.getElementById('wmplayer');
        }
        
        wmpControl && wmpControl.settings  && (wmpControl.settings.volume = 100);
    }
    initPlayer();

    /* String variables, set methods */
    var statusbarText = null;
    this.setStatusbarText = function (text) { statusbarText = text; }

    /* detecting play state changes */
    var checkPlayState = function (st) {
        var newState = wmpControl && wmpControl.playState || st;

        if (null == newState) {
            if (browser.isIE) {
                newState = 0;
            } else {
                return false;
            }
        }
        
        var status = '';
        var volumebarDisplay = 'none';

        if (10 == newState) {
            status = 'Готово';
        } else if (11 == newState) {
            status = 'Соединение';
        } else if (6 == newState) {
            status = 'Буферизация';
        } else if (7 == newState) {
            status = 'Ожидание';
        } else if (9 == newState) {
            status = 'Передача данных';
        } else if (1 == newState) {
            status = 'Остановлено';
        } else { /* 3 == playState */
            status = null != statusbarText ? statusbarText : 'Громкость';
            volumebarDisplay = 'block';
        }

        /*try {document.getElementById('main_info').innerHTML = '**' + status + '**' + statusbar.firstChild.nodeValue} catch (e) {alert('Bad!')};*/
        statusbar && (status != statusbar.firstChild.nodeValue) && (statusbar.innerHTML = status);
        volumebar && (volumebar.style.display = volumebarDisplay);
    }
    var statusbar;
    var volumebar;
    wmpControl && setInterval(checkPlayState, 200);

    /* volume */
    var volumeSlider = null;
    window.volumeSliderInfo = {}; /* make it temp global */

    /* private event handlers */
    var volumeDragStart = function (ev) {
        var x, y;
        volumeSliderInfo.zIndex = 0;

        ev = ev || window.event;

        if (null == volumeSlider) {
            if (browser.isIE) {
                volumeSlider = ev.srcElement;
            } else if (browser.isNS) {
                volumeSlider = ev.target;
            } else {
                /* no support for Opera yet, coming soon */
                return false;
            }

            /* do we really need it? */
            if (3 == volumeSlider.nodeType) {
                volumeSlider = volumeSlider.parentNode;
            }
        }

        volumeSliderInfo.mouseX = ev.clientX;

        WmpEvent.attachWmpEvent(ev, 'mousemove', volumeDragDo);
        WmpEvent.attachWmpEvent(ev, 'mouseup', volumeDragEnd);
    }
    var volumeDragDo = function (event) {
        var mouseX = event.clientX;
        volumeSliderInfo.marginLeftCur = volumeSliderInfo.marginLeftCur - (volumeSliderInfo.mouseX - mouseX);
        volumeSliderInfo.mouseX = mouseX;

        if (volumeSliderInfo.marginLeftCur < volumeSliderInfo.marginLeftMin) {
            volumeSliderInfo.marginLeftCur = volumeSliderInfo.marginLeftMin;
        } else if (volumeSliderInfo.marginLeftCur > volumeSliderInfo.marginLeftMax) {
            volumeSliderInfo.marginLeftCur = volumeSliderInfo.marginLeftMax;
        }
        
        volumeSlider.style.marginLeft = volumeSliderInfo.marginLeftCur + 'px';

        if (browser.isIE) {
            window.event.cancelBubble = true;
            window.event.returnValue = false;
        } else if (browser.isNS) {
            event.preventDefault();
        }
        
        /* seeting volume */
        var volume = parseInt(100 * (volumeSliderInfo.marginLeftCur - volumeSliderInfo.marginLeftMin) / (volumeSliderInfo.marginLeftMax - volumeSliderInfo.marginLeftMin));
        wmpControl && wmpControl.settings  && (wmpControl.settings.volume = volume);
        volumebar && (volumebar.innerHTML = volume + '%');
    }
    var volumeDragEnd = function (event) {
        WmpEvent.detachWmpEvent('mousemove', volumeDragDo);
        WmpEvent.detachWmpEvent('mouseup', volumeDragEnd);
    }

    /* controls */
    this.play = function () {
        if (false == playing) {
            playing = true;
            
            if (wmpControl && wmpControl.controls) {
                wmpControl.controls.play();
            } else {
                playerContainer.innerHTML = getPlayerHtml(true);/*  */
                checkPlayState(3);
            }
        }
    }
    this.stop = function () {
        if (true == playing) {
            playing = false;
            
            if (wmpControl && wmpControl.controls) {
                wmpControl.controls.stop();
            } else {
                playerContainer.innerHTML = getPlayerHtml(false);/*  */
                checkPlayState(1);
            }
        }
    }
    this.setUrl = function (newUrl) {
        mediaUrl = newUrl;
        wmpControl && (wmpControl.URL = newUrl);
        
        if (!wmpControl) {
            playerContainer.innerHTML = getPlayerHtml(true);
            checkPlayState(3);
        }
    }

    /* Binding methods to DOM elements of the player */
    this.bindPlayButton = function (buttonPlay) { buttonPlay && (buttonPlay.onclick = this.play) }
    this.bindStopButton = function (buttonStop) { buttonStop && (buttonStop.onclick = this.stop) }
    this.bindVolumeSlider = function (volumeSliderElement, maxLeft, maxRight, marginLeft) {
        if (null == volumeSliderElement || 0 == parseInt(maxLeft) || 0 == parseInt(maxRight) || 0 == parseInt(marginLeft)) {
            return false;
        }

        volumeSlider = volumeSliderElement;
        volumeSlider.style.marginLeft = parseInt(marginLeft) + 'px';
        volumeSlider.onmousedown = volumeDragStart;
        //WmpEvent.attachWmpEvent('mousedown', volumeDragStart);

        window.volumeSliderInfo.marginLeftOrig = parseInt(marginLeft);
        window.volumeSliderInfo.marginLeftCur  = parseInt(marginLeft);
        window.volumeSliderInfo.marginLeftMin  = parseInt(marginLeft) - maxLeft;
        window.volumeSliderInfo.marginLeftMax  = parseInt(marginLeft) + maxRight;
    }
    this.bindStatusBar = function (elem) {
        statusbar = elem;
    }
    this.bindVolumeBar = function (elem) {
        volumebar = elem;
    }
}

