diff --git a/projects/activex/test.html b/projects/activex/test.html
index 4d05ba6c8973446eb4c8881c054f7a7418b8b388..7849f6d0931578c68a8582abed6a861c3549aaab 100644
--- a/projects/activex/test.html
+++ b/projects/activex/test.html
@@ -1,695 +1,996 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<TITLE>VLC Plugin test page</TITLE>
-
-<SCRIPT language="JavaScript"><!--
-function init()
-{
-    if( navigator.appName.indexOf("Microsoft Internet")==-1 )
-    {
-        onVLCPluginReady()
-    }
-    else if( document.readyState == 'complete' )
-    {
-        onVLCPluginReady();
-    }
-    else
-    {
-        /* Explorer loads plugins asynchronously */
-        document.onreadystatechange=function()
-        {
-            if( document.readyState == 'complete' )
-            {
-                onVLCPluginReady();
-            }
-        }
-    }
-}
-
-function getVLC(name)
-{
-    if (window.document[name])
-    {
-        return window.document[name];
-    }
-    if (navigator.appName.indexOf("Microsoft Internet")==-1)
-    {
-        if (document.embeds && document.embeds[name])
-            return document.embeds[name];
-    }
-    else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
-    {
-        return document.getElementById(name);
-    }
-}
-
-function onVLCPluginReady()
-{
-    updateVolume(0);
-}
-
-//--></SCRIPT>
-
-<BODY onLoad="init();">
-<TABLE>
-<TR><TD colspan="2">
-MRL:
-<INPUT size="90" id="targetTextField" value="">
-<INPUT type=submit value="Go" onClick="doGo(document.getElementById('targetTextField').value);">
-<INPUT type=submit value="Add" onClick="doAdd(document.getElementById('targetTextField').value);">
-</TD></TR>
-<TR><TD align="center" colspan="2">
-<!--
-Insert VideoLAN.VLCPlugin.2
--->
-<OBJECT classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921"
-        width="640"
-        height="480"
-        id="vlc"
-        events="True">
-<param name="MRL" value="" />
-<param name="ShowDisplay" value="True" />
-<param name="AutoLoop" value="False" />
-<param name="AutoPlay" value="False" />
-<param name="Volume" value="50" />
-<param name="toolbar" value="true" />
-<param name="StartTime" value="0" />
-<EMBED pluginspage="http://www.videolan.org"
-       type="application/x-vlc-plugin"
-       version="VideoLAN.VLCPlugin.2"
-       width="640"
-       height="480"
-       toolbar="true"
-       text="Waiting for video"
-       name="vlc">
-</EMBED>
-</OBJECT>
-</TD></TR>
-<TR><TD colspan="2">
-<TABLE><TR>
-<TD valign="top" width="550">
-<!--
-Insert Slider widget
--->
-</TD><TD width="15%">
-<DIV id="info" style="text-align:center">-:--:--/-:--:--</DIV>
-<DIV id="state" style="text-align:center">Stopped...</DIV>
-</TD></TR></TABLE>
-</TD></TR>
-<TR><TD>
-<INPUT type=button id="PlayOrPause" value=" Play " onClick='doPlayOrPause();'>
-<INPUT type=button value="Stop" onClick='doStop();'>
-&nbsp;
-<INPUT type=button value=" << " onClick='doPlaySlower();'>
-<INPUT type=button value="Reverse" onClick='doReverse();'>
-<INPUT type=button value=" >> " onClick='doPlayFaster();'>
-&nbsp;
-<INPUT type=button value="Fullscreen" onClick='getVLC("vlc").video.toggleFullscreen();'>
-<INPUT type=button value="Version" onClick='alert("vlc " + getVLC("vlc").VersionInfo);'>
-<INPUT type=button value=" State " onClick='alert("state: " + getVLC("vlc").input.state);'>
-</TD><TD align="right">
-<SPAN style="text-align:center">Volume:</SPAN>
-<INPUT type=button value=" - " onClick='updateVolume(-10)'>
-<SPAN id="volumeTextField" style="text-align:center">--</SPAN>
-<INPUT type=button value=" + " onClick='updateVolume(+10)'>
-<INPUT type=button value="Mute" onClick='getVLC("vlc").audio.toggleMute();'>
-</TD>
-</TR>
-<TR><TD>Playlist:
-<INPUT type=button value="Prev" onClick='getVLC("vlc").playlist.prev();'>
-<INPUT type=button value="Next" onClick='getVLC("vlc").playlist.next();'>
-<INPUT type=button value="Clear All" onClick='doPlaylistClearAll();'>
-    Aspect Ratio:
-    <SELECT readonly onChange='doAspectRatio(this.value)'>
-      <OPTION value="default">Default</OPTION>
-      <OPTION value="1:1">1:1</OPTION>
-      <OPTION value="4:3">4:3</OPTION>
-      <OPTION value="16:9">16:9</OPTION>
-      <OPTION value="221:100">221:100</OPTION>
-      <OPTION value="5:4">5:4</OPTION>
-    </SELECT>
-</TD><TD align="right">
-<INPUT type=button id="itemCount" value=" Items 0 " onClick='doItemCount();'>
-<INPUT size=4 value="" id="removeid"><INPUT type=submit value="Delete" onClick="doRemoveItem(document.getElementById('removeid').value);">
-</TD>
-</TR>
-<TR><TD>Audio Channel:
-  <SELECT readonly onClick='doAudioChannel(this.value);'>
-    <OPTION value=1>Stereo</OPTION>
-    <OPTION value=2>Reverse Stereo</OPTION>
-    <OPTION value=3>Left</OPTION>
-    <OPTION value=4>Right</OPTION>
-    <OPTION value=5>Dolby</OPTION>
-  </SELECT>
-</TD>
-<TD>
-<INPUT type=button value="current channel" onClick='alert(getVLC("vlc").audio.channel);'>
-</TD>
-</TR>
-<TR><TD> Audio Track:
-<INPUT type=button value=" + " onClick='doAudioTrack(1);'>
-<SPAN id="trackTextField" style="text-align:center">--</SPAN>
-<INPUT type=button value=" - " onClick='doAudioTrack(-1);'>
-<INPUT type=button value="current track" onClick='alert(getVLC("vlc").audio.description(vlc.audio.track));'>
-<INPUT type=button value="number of track" onClick='alert(getVLC("vlc").audio.count);'>
-</TD>
-<TD>
-<INPUT type=button value="set slider" onClick='doSetSlider();'>
-<INPUT type=button value="get position" onClick='doGetPosition();'>
-</TD>
-</TR>
-<TR>
-<TD>Video Subtitle:
-    <INPUT type=button value=" + " onClick='doSubtitle(1);'>
-    <SPAN id="spuTextField" style="text-align:center">--</SPAN>
-    <INPUT type=button value=" - " onClick='doSubtitle(-1);'>
-    <INPUT type=button value="current subtitle" onClick='alert(getVLC("vlc").subtitle.description(vlc.subtitle.track));'>
-    <INPUT type=button value="number of subtitle" onClick='alert(getVLC("vlc").subtitle.count);'>
-</TD>
-</TR>
-<TR>
-<TD>Deinterlacing:
-    <INPUT type=button value="BLEND" onClick='getVLC("vlc").video.deinterlace.enable("blend");'>
-    <INPUT type=button value="  X  " onClick='getVLC("vlc").video.deinterlace.enable("x");'>
-    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.deinterlace.disable();'>
-</TD>
-</TR>
-<TR>
-<TD>Marquee video filter:
-    <INPUT type=button value="Enable" onClick='getVLC("vlc").video.marquee.enable();'>
-    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.marquee.disable();'>
-    <INPUT size=4 value="" id="marqueeIntValue">
-    <SELECT readonly onClick="doMarqueeOption(this.value,document.getElementById('marqueeIntValue').value);">
-        <OPTION value=1>Color</OPTION>
-        <OPTION value=2>Opacity</OPTION>
-        <OPTION value=3>Position</OPTION>
-        <OPTION value=4>Refresh</OPTION>
-        <OPTION value=5>Size</OPTION>
-        <OPTION value=6>Text</OPTION>
-        <OPTION value=7>Timeout</OPTION>
-        <OPTION value=8>X</OPTION>
-        <OPTION value=9>Y</OPTION>
-    </SELECT>
-</TD>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<TITLE>VLC Plugin test page</TITLE>
+<STYLE>
+  .inputTrackerInput {
+        height:20;
+        width:30;
+        font-family : Arial, Helvetica, sans-serif;
+        font-size : 12px;
+  }
+</STYLE>
+
+<SCRIPT type="text/javascript" src="blueshoes-4.5/javascript/lib/LibCrossBrowser.js"></SCRIPT>
+<SCRIPT type="text/javascript" src="blueshoes-4.5/javascript/lib/EventHandler.js"></SCRIPT>
+<SCRIPT type="text/javascript" src="blueshoes-4.5/javascript/core/form/Bs_FormUtil.lib.js"></SCRIPT>
+<SCRIPT type="text/javascript" src="blueshoes-4.5/javascript/components/slider/Bs_Slider.class.js"></SCRIPT>
+
+<SCRIPT language="JavaScript"><!--
+function init()
+{
+    inputTracker = new Bs_Slider();
+    if (inputTracker)
+    {
+        inputTracker.attachOnChange(onInputTrackerChange);
+        inputTracker.attachOnSlideStart(onInputTrackerScrollStart);
+        inputTracker.attachOnSlideEnd(onInputTrackerScrollEnd);
+        inputTracker.width         = 530;
+        inputTracker.height        = 15;
+        inputTracker.minVal        = 0;
+        inputTracker.maxVal        = 1.0;
+        inputTracker.valueDefault  = 0;
+        inputTracker.valueInterval = 1/530;
+        inputTracker.setDisabled(true);
+        inputTracker.imgDir   = 'blueshoes-4.5/javascript/components/slider/img/';
+        inputTracker.setBackgroundImage('aluminumalloyvolcanic/horizontal_background.gif', 'repeat');
+        inputTracker.setArrowIconLeft('aluminumalloyvolcanic/horizontal_backgroundLeft.gif', 2, 19);
+        inputTracker.setArrowIconRight('aluminumalloyvolcanic/horizontal_backgroundRight.gif', 2, 19);
+        inputTracker.setSliderIcon('aluminumalloyvolcanic/horizontal_knob.gif', 15, 19);
+        inputTracker.useInputField = 0;
+        inputTracker.draw('inputTrackerDiv');
+    }
+
+    if( navigator.appName.indexOf("Microsoft Internet")==-1 )
+    {
+        onVLCPluginReady()
+    }
+    else if( document.readyState == 'complete' )
+    {
+        onVLCPluginReady();
+    }
+    else
+    {
+        /* Explorer loads plugins asynchronously */
+        document.onreadystatechange=function()
+        {
+            if( document.readyState == 'complete' )
+            {
+                onVLCPluginReady();
+            }
+        }
+    }
+}
+
+function getVLC(name)
+{
+    if (window.document[name])
+    {
+        return window.document[name];
+    }
+    if (navigator.appName.indexOf("Microsoft Internet")==-1)
+    {
+        if (document.embeds && document.embeds[name])
+            return document.embeds[name];
+    }
+    else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
+    {
+        return document.getElementById(name);
+    }
+}
+
+function registerVLCEvent(event, handler)
+{
+    var vlc = getVLC("vlc");
+
+    if (vlc) {
+        if (vlc.attachEvent) {
+            // Microsoft
+            vlc.attachEvent (event, handler);
+        } else if (vlc.addEventListener) {
+            // Mozilla: DOM level 2
+            vlc.addEventListener (event, handler, true);
+        } else {
+            // DOM level 0
+            eval("vlc.on" + event + " = handler");
+        }
+    }
+}
+
+function unregisterVLCEvent(event, handler)
+{
+    var vlc = getVLC("vlc");
+
+    if (vlc) {
+        if (vlc.detachEvent) {
+            // Microsoft
+            vlc.detachEvent (event, handler);
+        } else if (vlc.removeEventListener) {
+            // Mozilla: DOM level 2
+            vlc.removeEventListener (event, handler, true);
+        } else {
+            // DOM level 0
+            eval("vlc.on" + event + " = null");
+        }
+    }
+}
+
+// JS VLC API callbacks
+function handleMediaPlayerMediaChanged()
+{
+    document.getElementById("info").innerHTML = "Media Changed";
+}
+
+function handle_MediaPlayerNothingSpecial()
+{
+    document.getElementById("state").innerHTML = "Idle...";
+}
+
+function handle_MediaPlayerOpening()
+{
+    onOpen();
+}
+
+function handle_MediaPlayerBuffering(val)
+{
+    document.getElementById("info").innerHTML = val + "%";
+}
+
+function handle_MediaPlayerPlaying()
+{
+    onPlay();
+}
+
+function handle_MediaPlayerPaused()
+{
+    onPause();
+}
+
+function handle_MediaPlayerStopped()
+{
+    onStop();
+}
+
+function handle_MediaPlayerForward()
+{
+    document.getElementById("state").innerHTML = "Forward...";
+}
+
+function handle_MediaPlayerBackward()
+{
+    document.getElementById("state").innerHTML = "Backward...";
+}
+
+function handle_MediaPlayerEndReached()
+{
+    onEnd();
+}
+
+function handle_MediaPlayerEncounteredError()
+{
+    onError();
+}
+
+function handle_MediaPlayerTimeChanged(time)
+{
+    var vlc = getVLC("vlc");
+    var info = document.getElementById("info");
+    if( vlc )
+    {
+        var mediaLen = vlc.input.length;
+        if( mediaLen > 0 )
+        {
+            // seekable media
+            info.innerHTML = formatTime(time)+"/"+formatTime(mediaLen);
+        }
+    }
+}
+
+function handle_MediaPlayerPositionChanged(val)
+{
+    // set javascript slider to correct position
+}
+
+function handle_MediaPlayerSeekableChanged(val)
+{
+    setSeekable(val);
+}
+
+function handle_MediaPlayerPausableChanged(val)
+{
+    setPauseable(val);
+}
+
+function handle_MediaPlayerTitleChanged(val)
+{
+    //setTitle(val);
+    document.getElementById("info").innerHTML = "Title: " + val;
+}
+
+function handle_MediaPlayerLengthChanged(val)
+{
+    //setMediaLength(val);
+}
+
+// VLC Plugin
+function onVLCPluginReady()
+{
+    registerVLCEvent("MediaPlayerMediaChanged", handleMediaPlayerMediaChanged);
+    registerVLCEvent("MediaPlayerNothingSpecial", handle_MediaPlayerNothingSpecial);
+    registerVLCEvent("MediaPlayerOpening", handle_MediaPlayerOpening);
+    registerVLCEvent("MediaPlayerBuffering", handle_MediaPlayerBuffering);
+    registerVLCEvent("MediaPlayerPlaying", handle_MediaPlayerPlaying);
+    registerVLCEvent("MediaPlayerPaused", handle_MediaPlayerPaused);
+    registerVLCEvent("MediaPlayerStopped", handle_MediaPlayerStopped);
+    registerVLCEvent("MediaPlayerForward", handle_MediaPlayerForward);
+    registerVLCEvent("MediaPlayerBackward", handle_MediaPlayerBackward);
+    registerVLCEvent("MediaPlayerEndReached", handle_MediaPlayerEndReached);
+    registerVLCEvent("MediaPlayerEncounteredError", handle_MediaPlayerEncounteredError);
+    registerVLCEvent("MediaPlayerTimeChanged", handle_MediaPlayerTimeChanged);
+    registerVLCEvent("MediaPlayerPositionChanged", handle_MediaPlayerPositionChanged);
+    registerVLCEvent("MediaPlayerSeekableChanged", handle_MediaPlayerSeekableChanged);
+    registerVLCEvent("MediaPlayerPausableChanged", handle_MediaPlayerPausableChanged);
+    registerVLCEvent("MediaPlayerTitleChanged", handle_MediaPlayerTitleChanged);
+    registerVLCEvent("MediaPlayerLengthChanged", handle_MediaPlayerLengthChanged);
+}
+
+function close()
+{
+    unregisterVLCEvent('MediaPlayerMouseGrab', handleMouseGrab);
+    unregisterVLCEvent('MediaPlayerMouseRelease', handleMouseRelease);
+    unregisterVLCEvent('MediaPlayerMouseClick', handleMouseClick);
+
+    unregisterVLCEvent("MediaPlayerMediaChanged", handleMediaPlayerMediaChanged);
+    unregisterVLCEvent("MediaPlayerNothingSpecial", handle_MediaPlayerNothingSpecial);
+    unregisterVLCEvent("MediaPlayerOpening", handle_MediaPlayerOpening);
+    unregisterVLCEvent("MediaPlayerBuffering", handle_MediaPlayerBuffering);
+    unregisterVLCEvent("MediaPlayerPlaying", handle_MediaPlayerPlaying);
+    unregisterVLCEvent("MediaPlayerPaused", handle_MediaPlayerPaused);
+    unregisterVLCEvent("MediaPlayerStopped", handle_MediaPlayerStopped);
+    unregisterVLCEvent("MediaPlayerForward", handle_MediaPlayerForward);
+    unregisterVLCEvent("MediaPlayerBackward", handle_MediaPlayerBackward);
+    unregisterVLCEvent("MediaPlayerEndReached", handle_MediaPlayerEndReached);
+    unregisterVLCEvent("MediaPlayerEncounteredError", handle_MediaPlayerEncounteredError);
+    unregisterVLCEvent("MediaPlayerTimeChanged", handle_MediaPlayerTimeChanged);
+    unregisterVLCEvent("MediaPlayerPositionChanged", handle_MediaPlayerPositionChanged);
+    unregisterVLCEvent("MediaPlayerSeekableChanged", handle_MediaPlayerSeekableChanged);
+    unregisterVLCEvent("MediaPlayerPausableChanged", handle_MediaPlayerPausableChanged);
+    unregisterVLCEvent("MediaPlayerTitleChanged", handle_MediaPlayerTitleChanged);
+    unregisterVLCEvent("MediaPlayerLengthChanged", handle_MediaPlayerLengthChanged);
+}
+
+//--></SCRIPT>
+
+<BODY onLoad="init();" onClose="close();>
+<TABLE>
+<TR><TD colspan="2">
+MRL:
+<INPUT size="90" id="targetTextField" value="">
+<INPUT type=submit value="Go" onClick="doGo(document.getElementById('targetTextField').value);">
+<INPUT type=submit value="Add" onClick="doAdd(document.getElementById('targetTextField').value);">
+</TD></TR>
+<TR><TD align="center" colspan="2">
+<!--
+Insert VideoLAN.VLCPlugin.2
+-->
+<OBJECT classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921"
+        width="640"
+        height="480"
+        id="vlc"
+        events="True">
+<param name="MRL" value="" />
+<param name="ShowDisplay" value="True" />
+<param name="AutoLoop" value="False" />
+<param name="AutoPlay" value="False" />
+<param name="Volume" value="50" />
+<param name="toolbar" value="true" />
+<param name="StartTime" value="0" />
+<EMBED pluginspage="http://www.videolan.org"
+       type="application/x-vlc-plugin"
+       version="VideoLAN.VLCPlugin.2"
+       width="640"
+       height="480"
+       toolbar="true"
+       text="Waiting for video"
+       name="vlc">
+</EMBED>
+</OBJECT>
+</TD></TR>
+<TR><TD colspan="2">
+<TABLE><TR>
+<TD valign="top" width="550">
+<!--
+Insert Slider widget
+-->
+<DIV id="inputTrackerDiv"</DIV>
+</TD><TD width="15%">
+<DIV id="info" style="text-align:center">-:--:--/-:--:--</DIV>
+<DIV id="state" style="text-align:center">Stopped...</DIV>
+</TD></TR></TABLE>
+</TD></TR>
+<TR><TD>
+<INPUT type=button id="PlayOrPause" value=" Play " onClick='doPlayOrPause();'>
+<INPUT type=button value="Stop" onClick='doStop();'>
+&nbsp;
+<INPUT type=button value=" << " onClick='doPlaySlower();'>
+<INPUT type=button value="Reverse" onClick='doReverse();'>
+<INPUT type=button value=" >> " onClick='doPlayFaster();'>
+&nbsp;
+<INPUT type=button value="Fullscreen" onClick='getVLC("vlc").video.toggleFullscreen();'>
+<INPUT type=button value="Version" onClick='alert("vlc " + getVLC("vlc").VersionInfo);'>
+<INPUT type=button value=" State " onClick='alert("state: " + getVLC("vlc").input.state);'>
+</TD><TD align="right">
+<SPAN style="text-align:center">Volume:</SPAN>
+<INPUT type=button value=" - " onClick='updateVolume(-10)'>
+<SPAN id="volumeTextField" style="text-align:center">--</SPAN>
+<INPUT type=button value=" + " onClick='updateVolume(+10)'>
+<INPUT type=button value="Mute" onClick='getVLC("vlc").audio.toggleMute();'>
+</TD>
+</TR>
+<TR><TD>Playlist:
+<INPUT type=button value="Prev" onClick='getVLC("vlc").playlist.prev();'>
+<INPUT type=button value="Next" onClick='getVLC("vlc").playlist.next();'>
+<INPUT type=button value="Clear All" onClick='doPlaylistClearAll();'>
+    Aspect Ratio:
+    <SELECT readonly onChange='doAspectRatio(this.value)'>
+      <OPTION value="default">Default</OPTION>
+      <OPTION value="1:1">1:1</OPTION>
+      <OPTION value="4:3">4:3</OPTION>
+      <OPTION value="16:9">16:9</OPTION>
+      <OPTION value="221:100">221:100</OPTION>
+      <OPTION value="5:4">5:4</OPTION>
+    </SELECT>
+</TD><TD align="right">
+<INPUT type=button id="itemCount" value=" Items 0 " onClick='doItemCount();'>
+<INPUT size=4 value="" id="removeid"><INPUT type=submit value="Delete" onClick="doRemoveItem(document.getElementById('removeid').value);">
+</TD>
+</TR>
+<TR><TD>Audio Channel:
+  <SELECT readonly onClick='doAudioChannel(this.value);'>
+    <OPTION value=1>Stereo</OPTION>
+    <OPTION value=2>Reverse Stereo</OPTION>
+    <OPTION value=3>Left</OPTION>
+    <OPTION value=4>Right</OPTION>
+    <OPTION value=5>Dolby</OPTION>
+  </SELECT>
+</TD>
+<TD>
+<INPUT type=button value="current channel" onClick='alert(getVLC("vlc").audio.channel);'>
+</TD>
+</TR>
+<TR><TD> Audio Track:
+<INPUT type=button value=" + " onClick='doAudioTrack(1);'>
+<SPAN id="trackTextField" style="text-align:center">--</SPAN>
+<INPUT type=button value=" - " onClick='doAudioTrack(-1);'>
+<INPUT type=button value="current track" onClick='alert(getVLC("vlc").audio.description(vlc.audio.track));'>
+<INPUT type=button value="number of track" onClick='alert(getVLC("vlc").audio.count);'>
+</TD>
+<TD>
+<INPUT type=button value="set slider" onClick='doSetSlider();'>
+<INPUT type=button value="get position" onClick='doGetPosition();'>
+</TD>
+</TR>
+<TR>
+<TD>Video Subtitle:
+    <INPUT type=button value=" + " onClick='doSubtitle(1);'>
+    <SPAN id="spuTextField" style="text-align:center">--</SPAN>
+    <INPUT type=button value=" - " onClick='doSubtitle(-1);'>
+    <INPUT type=button value="current subtitle" onClick='alert(getVLC("vlc").subtitle.description(vlc.subtitle.track));'>
+    <INPUT type=button value="number of subtitle" onClick='alert(getVLC("vlc").subtitle.count);'>
+</TD>
+</TR>
+<TR>
+<TD>Deinterlacing:
+    <INPUT type=button value="BLEND" onClick='getVLC("vlc").video.deinterlace.enable("blend");'>
+    <INPUT type=button value="  X  " onClick='getVLC("vlc").video.deinterlace.enable("x");'>
+    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.deinterlace.disable();'>
+</TD>
+</TR>
+<TR>
+<TD>Marquee video filter:
+    <INPUT type=button value="Enable" onClick='getVLC("vlc").video.marquee.enable();'>
+    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.marquee.disable();'>
+    <INPUT size=4 value="" id="marqueeIntValue">
+    <SELECT readonly onClick="doMarqueeOption(this.value,document.getElementById('marqueeIntValue').value);">
+        <OPTION value=1>Color</OPTION>
+        <OPTION value=2>Opacity</OPTION>
+        <OPTION value=3>Position</OPTION>
+        <OPTION value=4>Refresh</OPTION>
+        <OPTION value=5>Size</OPTION>
+        <OPTION value=6>Text</OPTION>
+        <OPTION value=7>Timeout</OPTION>
+        <OPTION value=8>X</OPTION>
+        <OPTION value=9>Y</OPTION>
+    </SELECT>
+</TD>
 </TR>
-<TR>
-<TD>Logo video filter:
-    <INPUT type=button value="Enable" onClick='getVLC("vlc").video.logo.enable();'>
-    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.logo.disable();'>
-    <INPUT size=4 value="" id="logoIntValue">
-    <SELECT readonly onClick="doLogoOption(this.value,document.getElementById('logoIntValue').value);">
-        <OPTION value=1>File</OPTION>
-        <OPTION value=2>Position</OPTION>
-        <OPTION value=3>Opacity</OPTION>
-        <OPTION value=4>Repeat</OPTION>
-        <OPTION value=5>Delay</OPTION>
-        <OPTION value=6>X</OPTION>
+<TR>
+<TD>Logo video filter:
+    <INPUT type=button value="Enable" onClick='getVLC("vlc").video.logo.enable();'>
+    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.logo.disable();'>
+    <INPUT size=4 value="" id="logoIntValue">
+    <SELECT readonly onClick="doLogoOption(this.value,document.getElementById('logoIntValue').value);">
+        <OPTION value=1>File</OPTION>
+        <OPTION value=2>Position</OPTION>
+        <OPTION value=3>Opacity</OPTION>
+        <OPTION value=4>Repeat</OPTION>
+        <OPTION value=5>Delay</OPTION>
+        <OPTION value=6>X</OPTION>
         <OPTION value=7>Y</OPTION>
-    </SELECT>
-</TD>
-</TR>

-<TR>
-<TD>
-    <INPUT type=button id="telx" value="Teletext off" onClick='doToggleTeletext();'>
-    Teletext page:
-    <INPUT size=4 value="100" id="telxPage" onClick='doTelxPage(document.getElementById("telxPage").value);'>
-</TD>
-</TR>
-</TABLE>
-<SCRIPT language="javascript">
-<!--
-
-var rate = 0;
-var prevState = 0;
-var telxState = false;
-
-function doSetSlider()
-{
-    var vlc = getVLC("vlc");
-
-    // set slider to new position
-    if( vlc )
-        vlc.input.time = (vlc.input.length/2);
-}
-
-function doGetPosition()
-{
-    var vlc = getVLC("vlc");
-
-    // set slider to new position
-    if (vlc)
-        alert( "position is " + vlc.input.time);
-}
-
-function doReverse(rate)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.input.rate = -1.0 * vlc.input.rate;
-}
-
-function doAudioChannel(value)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.audio.channel = parseInt(value);
-}
-
-function doAudioTrack(value)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        vlc.audio.track = vlc.audio.track + value;
-        document.getElementById("trackTextField").innerHTML = vlc.audio.track;
-    }
-}
-
-function doAspectRatio(value)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.video.aspectRatio = value;
-}
-
-function doSubtitle(value)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        vlc.subtitle.track = vlc.subtitle.track + value;
-        document.getElementById("spuTextField").innerHTML = vlc.subtitle.track;
-    }
-}
-
-function doTelxPage(value)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.video.teletext = parseInt(value);
-}
-
-function doToggleTeletext()
-{
-    var vlc = getVLC("vlc");
-
-    if( vlc )
-    {
-        vlc.video.toggleTeletext();
-        if (telxState)
-        {
-            document.getElementById("telx").innerHTML = "Teletext on";
-            telxState = true;
-        }
-        else
-        {
-            document.getElementById("telx").innerHTML = "Teletext off";
-            telxState = false;
-        }
-    }
-}
-
-function doItemCount()
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        var count = vlc.playlist.items.count;
-        document.getElementById("itemCount").value = " Items " + count + " ";
-    }
-}
-
-function doRemoveItem(item)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.playlist.items.remove(item);
-}
-
-function doPlaylistClearAll()
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        vlc.playlist.items.clear();
-        while( vlc.playlist.items.count > 0)
-        {
-            // wait till playlist empties.
-        }
-        doItemCount();
-    }
-}
-
-function updateVolume(deltaVol)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        vlc.audio.volume += deltaVol;
-        document.getElementById("volumeTextField").innerHTML = vlc.audio.volume+"%";
-    }
-}
-
-function formatTime(timeVal)
-{
-    if( typeof timeVal != 'number' )
-        return "-:--:--";
-
-    var timeHour = Math.round(timeVal / 1000);
-    var timeSec = timeHour % 60;
-    if( timeSec < 10 )
-        timeSec = '0'+timeSec;
-    timeHour = (timeHour - timeSec)/60;
-    var timeMin = timeHour % 60;
-    if( timeMin < 10 )
-        timeMin = '0'+timeMin;
-    timeHour = (timeHour - timeMin)/60;
-    if( timeHour > 0 )
-        return timeHour+":"+timeMin+":"+timeSec;
-    else
-        return timeMin+":"+timeSec;
-}
-
-function doState()
-{
-    var vlc = getVLC("vlc");
-    var newState = 0;
-
-    if( vlc )
-        newState = vlc.input.state;
-
-    if( newState == 0 )
-    {
-        // current media has stopped
-        onEnd();
-    }
-    else if( newState == 1 )
-    {
-        // current media is openning/connecting
-        onOpen();
-    }
-    else if( newState == 2 )
-    {
-        // current media is buffering data
-        onBuffer();
-    }
-    else if( newState == 3 )
-    {
-        // current media is now playing
-        onPlay();
-    }
-    else if( newState == 4 )
-    {
-        // current media is now paused
-        onPause();
-    }
-    else if( newState == 5 )
-    {
-        // current media has stopped
-        onStop();
-    }
-    else if( newState == 6 )
-    {
-        // current media has ended
-        onEnd();
-    }
-    else if( newState == 7 )
-    {
-        // current media encountered error
-        onError();
-    }
-}
-
-function monitor()
-{
-    var vlc = getVLC("vlc");
-    var newState = 0;
-
-    if( vlc )
-    {
-        newState = vlc.input.state;
-    }
-
-    if( prevState != newState )
-    {
-        if( newState == 0 )
-        {
-            // current media has stopped
-            onEnd();
-        }
-        else if( newState == 1 )
-        {
-            // current media is openning/connecting
-            onOpen();
-        }
-        else if( newState == 2 )
-        {
-            // current media is buffering data
-            onBuffer();
-        }
-        else if( newState == 3 )
-        {
-            // current media is now playing
-            onPlay();
-        }
-        else if( newState == 4 )
-        {
-            // current media is now paused
-            onPause();
-        }
-        else if( newState == 5 )
-        {
-            // current media has stopped
-                onStop();
-        }
-        else if( newState == 6 )
-        {
-            // current media has ended
-            onEnd();
-        }
-        else if( newState == 7 )
-        {
-            // current media encountered error
-            onError();
-        }
-        prevState = newState;
-    }
-    else if( newState == 3 )
-    {
-        // current media is playing
-        onPlaying();
-    }
-};
-
-/* actions */
-
-function doGo(targetURL)
-{
-    var vlc = getVLC("vlc");
-
-    if( vlc )
-    {
-        vlc.playlist.items.clear();
-        while( vlc.playlist.items.count > 0 )
-        {
-            // clear() may return before the playlist has actually been cleared
-            // just wait for it to finish its job
-        }
-        var options = [":rtsp-tcp"];
-        var itemId = vlc.playlist.add(targetURL,"",options);
-        options = [];
-        if( itemId != -1 )
-        {
-            // play MRL
-            vlc.playlist.playItem(itemId);
-            monitor();
-        }
-        else
-        {
-            alert("cannot play at the moment !");
-        }
-        doItemCount();
-    }
-}
-
-function doAdd(targetURL)
-{
-    var vlc = getVLC("vlc");
-    var options = [":vout-filter=deinterlace", ":deinterlace-mode=linear"];
-    if( vlc )
-    {
-        vlc.playlist.add(targetURL, "", options);
-        options = [];
-        doItemCount();
-    }
-}
-
-function doPlayOrPause()
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        if( vlc.playlist.isPlaying )
-        {
-            vlc.playlist.togglePause();
-            monitor();
-        }
-        else if( vlc.playlist.items.count > 0 )
-        {
-            vlc.playlist.play();
-            monitor();
-        }
-        else
-        {
-            alert('nothing to play !');
-        }
-    }
-}
-
-function doStop()
-{
-    var vlc = getVLC("vlc");
-
-    if( vlc )
-        vlc.playlist.stop();
-
-    onStop();
-}
-
-function doPlaySlower()
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.input.rate = vlc.input.rate / 2;
-}
-
-function doPlayFaster()
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.input.rate = vlc.input.rate * 2;
-}
-
-/* events */
-
-function onOpen()
-{
-    document.getElementById("state").innerHTML = "Opening...";
-    document.getElementById("PlayOrPause").value = "Pause";
-}
-
-function onBuffer()
-{
-    document.getElementById("state").innerHTML = "Buffering...";
-    document.getElementById("PlayOrPause").value = "Pause";
-}
-
-function onPlay()
-{
-    document.getElementById("state").innerHTML = "Playing...";
-    document.getElementById("PlayOrPause").value = "Pause";
-    onPlaying();
-}
-
-function onEnd()
-{
-    document.getElementById("state").innerHTML = "End...";
-    doStop();
-}
-
-var liveFeedText = ["Live", "((Live))", "(( Live ))", "((  Live  ))"];
-var liveFeedRoll = 0;
-
-function onPlaying()
-{
-        var vlc = getVLC("vlc");
-        var info = document.getElementById("info");
-        if( vlc )
-        {
-            var mediaLen = vlc.input.length;
-            if( mediaLen > 0 )
-            {
-                info.innerHTML = formatTime(vlc.input.time)+"/"+formatTime(mediaLen);
-            }
-            else
-            {
-                // non-seekable "live" media
-                liveFeedRoll = liveFeedRoll & 3;
-                info.innerHTML = liveFeedText[liveFeedRoll++];
-            }
-        }
-    }
-}
-
-function onPause()
-{
-    document.getElementById("state").innerHTML = "Paused...";
-    document.getElementById("PlayOrPause").value = " Play ";
-}
-
-function onStop()
-{
-    document.getElementById("info").innerHTML = "-:--:--/-:--:--";
-    document.getElementById("state").innerHTML = "Stopped...";
-    document.getElementById("PlayOrPause").value = " Play ";
-}
-
-function onError()
-{
-    document.getElementById("state").innerHTML = "Error...";
-}
-
-function doMarqueeOption(option, value)
-{
-    var vlc = getVLC("vlc");
-    val = parseInt(value);
-    if( vlc )
-    {
-        if (option == 1)
-            vlc.video.marquee.color = val;
-        if (option == 2)
-            vlc.video.marquee.opacity = val;
-        if (option == 3)
-            vlc.video.marquee.position = value;
-        if (option == 4)
-            vlc.video.marquee.refresh = val;
-        if (option == 5)
-            vlc.video.marquee.size = val;
-        if (option == 6)
-            vlc.video.marquee.text = value;
-        if (option == 7)
-            vlc.video.marquee.timeout = val;
-        if (option == 8)
-            vlc.video.marquee.x = val;
-        if (option == 9)
-            vlc.video.marquee.y = val;
-    }
-}
-
-function doLogoOption(option, value)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        if (option == 1)
-            vlc.video.logo.file(value);
-        if (option == 2)
-            vlc.video.logo.position = value;
-        val = parseInt(value);
-        if (option == 3)
-            vlc.video.logo.opacity = val;
-        if (option == 4)
-            vlc.video.logo.repeat = val;
-        if (option == 5)
-            vlc.video.logo.delay = val;
-        if (option == 6)
-            vlc.video.logo.x = val;
-        if (option == 7)
-            vlc.video.logo.y = val;
-    }
-}
-
-//-->
-</SCRIPT>
-</BODY>
-</HTML>
+    </SELECT>
+</TD>
+</TR>
+<TR>
+<TD>
+    <INPUT type=button id="telx" value="Teletext off" onClick='doToggleTeletext();'>
+    Teletext page:
+    <INPUT size=4 value="100" id="telxPage" onClick='doTelxPage(document.getElementById("telxPage").value);'>
+</TD>
+</TR>
+</TABLE>
+<SCRIPT language="javascript">
+<!--
+
+var rate = 0;
+var prevState = 0;
+var monitorTimerId = 0;
+var inputTracker;
+var inputTrackerScrolling = false;
+var inputTrackerIgnoreChange = false;
+var telxState = false;
+var canPause = true;
+var canSeek = true;
+
+function setPauseable(val)
+{
+    canPause = val;
+}
+
+function setSeekable(val)
+{
+    canSeek = val;
+}
+
+function doSetSlider()
+{
+    var vlc = getVLC("vlc");
+
+    // set slider to new position
+    if( vlc )
+        vlc.input.time = (vlc.input.length/2);
+}
+
+function doGetPosition()
+{
+    var vlc = getVLC("vlc");
+
+    // set slider to new position
+    if (vlc)
+        alert( "position is " + vlc.input.time);
+}
+
+function doReverse(rate)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.input.rate = -1.0 * vlc.input.rate;
+}
+
+function doAudioChannel(value)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.audio.channel = parseInt(value);
+}
+
+function doAudioTrack(value)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        vlc.audio.track = vlc.audio.track + value;
+        document.getElementById("trackTextField").innerHTML = vlc.audio.track;
+    }
+}
+
+function doAspectRatio(value)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.video.aspectRatio = value;
+}
+
+function doSubtitle(value)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        vlc.subtitle.track = vlc.subtitle.track + value;
+        document.getElementById("spuTextField").innerHTML = vlc.subtitle.track;
+    }
+}
+
+function doTelxPage(value)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.video.teletext = parseInt(value);
+}
+
+function doToggleTeletext()
+{
+    var vlc = getVLC("vlc");
+
+    if( vlc )
+    {
+        vlc.video.toggleTeletext();
+        if (telxState)
+        {
+            document.getElementById("telx").innerHTML = "Teletext on";
+            telxState = true;
+        }
+        else
+        {
+            document.getElementById("telx").innerHTML = "Teletext off";
+            telxState = false;
+        }
+    }
+}
+
+function doItemCount()
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        var count = vlc.playlist.items.count;
+        document.getElementById("itemCount").value = " Items " + count + " ";
+    }
+}
+
+function doRemoveItem(item)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.playlist.items.remove(item);
+}
+
+function doPlaylistClearAll()
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        vlc.playlist.items.clear();
+        while( vlc.playlist.items.count > 0)
+        {
+            // wait till playlist empties.
+        }
+        doItemCount();
+    }
+}
+
+function updateVolume(deltaVol)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        vlc.audio.volume += deltaVol;
+        document.getElementById("volumeTextField").innerHTML = vlc.audio.volume+"%";
+    }
+}
+
+function formatTime(timeVal)
+{
+    if( typeof timeVal != 'number' )
+        return "-:--:--";
+
+    var timeHour = Math.round(timeVal / 1000);
+    var timeSec = timeHour % 60;
+    if( timeSec < 10 )
+        timeSec = '0'+timeSec;
+    timeHour = (timeHour - timeSec)/60;
+    var timeMin = timeHour % 60;
+    if( timeMin < 10 )
+        timeMin = '0'+timeMin;
+    timeHour = (timeHour - timeMin)/60;
+    if( timeHour > 0 )
+        return timeHour+":"+timeMin+":"+timeSec;
+    else
+        return timeMin+":"+timeSec;
+}
+
+function doState()
+{
+    var vlc = getVLC("vlc");
+    var newState = 0;
+
+    if( vlc )
+        newState = vlc.input.state;
+
+    if( newState == 0 )
+    {
+        // current media has stopped
+        onEnd();
+    }
+    else if( newState == 1 )
+    {
+        // current media is openning/connecting
+        onOpen();
+    }
+    else if( newState == 2 )
+    {
+        // current media is buffering data
+        onBuffer();
+    }
+    else if( newState == 3 )
+    {
+        // current media is now playing
+        onPlay();
+    }
+    else if( newState == 4 )
+    {
+        // current media is now paused
+        onPause();
+    }
+    else if( newState == 5 )
+    {
+        // current media has stopped
+        onStop();
+    }
+    else if( newState == 6 )
+    {
+        // current media has ended
+        onEnd();
+    }
+    else if( newState == 7 )
+    {
+        // current media encountered error
+        onError();
+    }
+}
+
+function monitor()
+{
+    var vlc = getVLC("vlc");
+    var newState = 0;
+
+    if( vlc )
+    {
+        newState = vlc.input.state;
+    }
+
+    if( prevState != newState )
+    {
+        if( newState == 0 )
+        {
+            // current media has stopped
+            onEnd();
+        }
+        else if( newState == 1 )
+        {
+            // current media is openning/connecting
+            onOpen();
+        }
+        else if( newState == 2 )
+        {
+            // current media is buffering data
+            onBuffer();
+        }
+        else if( newState == 3 )
+        {
+            // current media is now playing
+            onPlay();
+        }
+        else if( newState == 4 )
+        {
+            // current media is now paused
+            onPause();
+        }
+        else if( newState == 5 )
+        {
+            // current media has stopped
+            onStop();
+        }
+        else if( newState == 6 )
+        {
+            // current media has ended
+            onEnd();
+        }
+        else if( newState == 7 )
+        {
+            // current media encountered error
+            onError();
+        }
+        prevState = newState;
+    }
+    else if( newState == 3 )
+    {
+        // current media is playing
+        onPlaying();
+    }
+    if( monitorTimerId == 0 )
+    {
+        monitorTimerId = setInterval("monitor()", 1000);
+    }
+};
+
+/* actions */
+
+function doGo(targetURL)
+{
+    var vlc = getVLC("vlc");
+
+    if( vlc )
+    {
+        vlc.playlist.items.clear();
+        while( vlc.playlist.items.count > 0 )
+        {
+            // clear() may return before the playlist has actually been cleared
+            // just wait for it to finish its job
+        }
+        var options = [":rtsp-tcp"];
+        var itemId = vlc.playlist.add(targetURL,"",options);
+        options = [];
+        if( itemId != -1 )
+        {
+            // play MRL
+            vlc.playlist.playItem(itemId);
+            if( monitorTimerId == 0 )
+            {
+                monitor();
+            }
+        }
+        else
+        {
+            alert("cannot play at the moment !");
+        }
+        doItemCount();
+    }
+}
+
+function doAdd(targetURL)
+{
+    var vlc = getVLC("vlc");
+    var options = [":vout-filter=deinterlace", ":deinterlace-mode=linear"];
+    if( vlc )
+    {
+        vlc.playlist.add(targetURL, "", options);
+        options = [];
+        doItemCount();
+    }
+}
+
+function doPlayOrPause()
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        if( vlc.playlist.isPlaying && canPause )
+        {
+            vlc.playlist.togglePause();
+            //monitor();
+        }
+        else if( vlc.playlist.items.count > 0 )
+        {
+            vlc.playlist.play();
+            //monitor();
+        }
+        else
+        {
+            alert('nothing to play !');
+        }
+    }
+}
+
+function doStop()
+{
+    var vlc = getVLC("vlc");
+
+    if( vlc )
+        vlc.playlist.stop();
+
+    if( monitorTimerId != 0 )
+    {
+        clearInterval(monitorTimerId);
+        monitorTimerId = 0;
+    }
+    onStop();
+}
+
+function doPlaySlower()
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.input.rate = vlc.input.rate / 2;
+}
+
+function doPlayFaster()
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.input.rate = vlc.input.rate * 2;
+}
+
+function doMarqueeOption(option, value)
+{
+    var vlc = getVLC("vlc");
+    val = parseInt(value);
+    if( vlc )
+    {
+        if (option == 1)
+            vlc.video.marquee.color = val;
+        if (option == 2)
+            vlc.video.marquee.opacity = val;
+        if (option == 3)
+            vlc.video.marquee.position = value;
+        if (option == 4)
+            vlc.video.marquee.refresh = val;
+        if (option == 5)
+            vlc.video.marquee.size = val;
+        if (option == 6)
+            vlc.video.marquee.text = value;
+        if (option == 7)
+            vlc.video.marquee.timeout = val;
+        if (option == 8)
+            vlc.video.marquee.x = val;
+        if (option == 9)
+            vlc.video.marquee.y = val;
+    }
+}
+
+function doLogoOption(option, value)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        if (option == 1)
+            vlc.video.logo.file(value);
+        if (option == 2)
+            vlc.video.logo.position = value;
+        val = parseInt(value);
+        if (option == 3)
+            vlc.video.logo.opacity = val;
+        if (option == 4)
+            vlc.video.logo.repeat = val;
+        if (option == 5)
+            vlc.video.logo.delay = val;
+        if (option == 6)
+            vlc.video.logo.x = val;
+        if (option == 7)
+            vlc.video.logo.y = val;
+    }
+}
+
+/* events */
+
+function onOpen()
+{
+    document.getElementById("state").innerHTML = "Opening...";
+    document.getElementById("PlayOrPause").value = "Pause";
+}
+
+function onBuffer()
+{
+    document.getElementById("state").innerHTML = "Buffering...";
+    document.getElementById("PlayOrPause").value = "Pause";
+}
+
+function onPlay()
+{
+    document.getElementById("state").innerHTML = "Playing...";
+    document.getElementById("PlayOrPause").value = "Pause";
+    onPlaying();
+}
+
+function onEnd()
+{
+    document.getElementById("state").innerHTML = "End...";
+}
+
+var liveFeedText = ["Live", "((Live))", "(( Live ))", "((  Live  ))"];
+var liveFeedRoll = 0;
+
+function onPlaying()
+{
+    if( !inputTrackerScrolling )
+    {
+        var vlc = getVLC("vlc");
+        var info = document.getElementById("info");
+        if( vlc )
+        {
+            var mediaLen = vlc.input.length;
+            inputTrackerIgnoreChange = true;
+            if( mediaLen > 0 )
+            {
+                // seekable media
+                if( inputTracker )
+                {
+                    if( inputTracker.maxVal == 1.0 )
+                    {
+                        inputTracker.setDisabled(false);
+                        inputTracker.maxVal = 1.0;
+                    }
+                    inputTracker.setValue(vlc.input.position);
+                }
+                info.innerHTML = formatTime(vlc.input.time)+"/"+formatTime(mediaLen);
+            }
+            else
+            {
+                // non-seekable "live" media
+                if( inputTracker )
+                {
+                    if( inputTracker.maxVal != 0.0 )
+                    {
+                        inputTracker.maxVal = 0.0;
+                        inputTracker.setValue(0.0);
+                        inputTracker.setDisabled(true);
+                    }
+                }
+                liveFeedRoll = liveFeedRoll & 3;
+                info.innerHTML = liveFeedText[liveFeedRoll++];
+            }
+            inputTrackerIgnoreChange  = false;
+        }
+    }
+}
+
+function onPause()
+{
+    document.getElementById("state").innerHTML = "Paused...";
+    document.getElementById("PlayOrPause").value = " Play ";
+}
+
+function onStop()
+{
+    var vlc = getVLC("vlc");
+
+    if( inputTracker )
+    {
+        if( !inputTracker.disabled )
+        {
+            inputTracker.setValue(inputTracker.minVal);
+            inputTracker.setDisabled(true);
+        }
+    }
+
+    document.getElementById("info").innerHTML = "-:--:--/-:--:--";
+    document.getElementById("state").innerHTML = "Stopped...";
+    document.getElementById("PlayOrPause").value = " Play ";
+}
+
+function onError()
+{
+    var vlc = getVLC("vlc");
+
+    document.getElementById("state").innerHTML = "Error...";
+}
+
+function onInputTrackerScrollStart()
+{
+    inputTrackerScrolling = true;
+}
+
+function onInputTrackerScrollEnd(inputTracker, value, pos)
+{
+    inputTrackerScrolling = false;
+}
+
+function onInputTrackerChange(inputTracker, value, pos)
+{
+    if( !inputTrackerIgnoreChange )
+    {
+        var vlc = getVLC("vlc");
+        if( vlc )
+        {
+            if( (vlc.input.state == 3) && (vlc.input.position != value) )
+            {
+                var info = document.getElementById("info");
+                vlc.input.position = value;
+                info.innerHTML = formatTime(vlc.input.time)+"/"+formatTime(vlc.input.length);
+            }
+        }
+    }
+}
+
+//-->
+</SCRIPT>
+</BODY>
+</HTML>
diff --git a/projects/mozilla/test.html b/projects/mozilla/test.html
index 2c614202705481792078ae25028c3d0686ddff6a..0980d29497d0f094ce357d357ddda9546ba57aec 100644
--- a/projects/mozilla/test.html
+++ b/projects/mozilla/test.html
@@ -1,810 +1,996 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<TITLE>VLC Plugin test page</TITLE>
-<STYLE>
-  .inputTrackerInput {
-        height:20;
-        width:30;
-        font-family : Arial, Helvetica, sans-serif;
-        font-size : 12px;
-  }
-</STYLE>
-
-<SCRIPT type="text/javascript" src="blueshoes-4.5/javascript/lib/LibCrossBrowser.js"></SCRIPT>
-<SCRIPT type="text/javascript" src="blueshoes-4.5/javascript/lib/EventHandler.js"></SCRIPT>
-<SCRIPT type="text/javascript" src="blueshoes-4.5/javascript/core/form/Bs_FormUtil.lib.js"></SCRIPT>
-<SCRIPT type="text/javascript" src="blueshoes-4.5/javascript/components/slider/Bs_Slider.class.js"></SCRIPT>
-
-<SCRIPT language="JavaScript"><!--
-function init()
-{
-    inputTracker = new Bs_Slider();
-    if (inputTracker)
-    {
-        inputTracker.attachOnChange(onInputTrackerChange);
-        inputTracker.attachOnSlideStart(onInputTrackerScrollStart);
-        inputTracker.attachOnSlideEnd(onInputTrackerScrollEnd);
-        inputTracker.width         = 530 ;
-        inputTracker.height        = 15;
-        inputTracker.minVal        = 0;
-        inputTracker.maxVal        = 1.0;
-        inputTracker.valueDefault  = 0;
-        inputTracker.valueInterval = 1/530;
-        inputTracker.setDisabled(true);
-        inputTracker.imgDir   = 'blueshoes-4.5/javascript/components/slider/img/';
-        inputTracker.setBackgroundImage('aluminumalloyvolcanic/horizontal_background.gif', 'repeat');
-        inputTracker.setArrowIconLeft('aluminumalloyvolcanic/horizontal_backgroundLeft.gif', 2, 19);
-        inputTracker.setArrowIconRight('aluminumalloyvolcanic/horizontal_backgroundRight.gif', 2, 19);
-        inputTracker.setSliderIcon('aluminumalloyvolcanic/horizontal_knob.gif', 15, 19);
-        inputTracker.useInputField = 0;
-        inputTracker.draw('inputTrackerDiv');
-    }
-
-    if( navigator.appName.indexOf("Microsoft Internet")==-1 )
-    {
-        onVLCPluginReady()
-    }
-    else if( document.readyState == 'complete' )
-    {
-        onVLCPluginReady();
-    }
-    else
-    {
-        /* Explorer loads plugins asynchronously */
-        document.onreadystatechange=function()
-        {
-            if( document.readyState == 'complete' )
-            {
-                onVLCPluginReady();
-            }
-        }
-    }
-}
-
-function getVLC(name)
-{
-    if (window.document[name])
-    {
-        return window.document[name];
-    }
-    if (navigator.appName.indexOf("Microsoft Internet")==-1)
-    {
-        if (document.embeds && document.embeds[name])
-            return document.embeds[name];
-    }
-    else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
-    {
-        return document.getElementById(name);
-    }
-}
-
-function onVLCPluginReady()
-{
-    updateVolume(0);
-}
-
-//--></SCRIPT>
-
-<BODY onLoad="init();">
-<TABLE>
-<TR><TD colspan="2">
-MRL:
-<INPUT size="90" id="targetTextField" value="">
-<INPUT type=submit value="Go" onClick="doGo(document.getElementById('targetTextField').value);">
-<INPUT type=submit value="Add" onClick="doAdd(document.getElementById('targetTextField').value);">
-</TD></TR>
-<TR><TD align="center" colspan="2">
-<!--
-Insert VideoLAN.VLCPlugin.2
--->
-<OBJECT classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921"
-        width="640"
-        height="480"
-        id="vlc"
-        events="True">
-<param name="MRL" value="" />
-<param name="ShowDisplay" value="True" />
-<param name="AutoLoop" value="False" />
-<param name="AutoPlay" value="False" />
-<param name="Volume" value="50" />
-<param name="toolbar" value="true" />
-<param name="StartTime" value="0" />
-<EMBED pluginspage="http://www.videolan.org"
-       type="application/x-vlc-plugin"
-       version="VideoLAN.VLCPlugin.2"
-       width="640"
-       height="480"
-       toolbar="true"
-       text="Waiting for video"
-       name="vlc">
-</EMBED>
-</OBJECT>
-</TD></TR>
-<TR><TD colspan="2">
-<TABLE><TR>
-<TD valign="top" width="550">
-<!--
-Insert Slider widget
--->
-<DIV id="inputTrackerDiv"</DIV>
-</TD><TD width="15%">
-<DIV id="info" style="text-align:center">-:--:--/-:--:--</DIV>
-<DIV id="state" style="text-align:center">Stopped...</DIV>
-</TD></TR></TABLE>
-</TD></TR>
-<TR><TD>
-<INPUT type=button id="PlayOrPause" value=" Play " onClick='doPlayOrPause();'>
-<INPUT type=button value="Stop" onClick='doStop();'>
-&nbsp;
-<INPUT type=button value=" << " onClick='doPlaySlower();'>
-<INPUT type=button value="Reverse" onClick='doReverse();'>
-<INPUT type=button value=" >> " onClick='doPlayFaster();'>
-&nbsp;
-<INPUT type=button value="Fullscreen" onClick='getVLC("vlc").video.toggleFullscreen();'>
-<INPUT type=button value="Version" onClick='alert("vlc " + getVLC("vlc").VersionInfo);'>
-<INPUT type=button value=" State " onClick='alert("state: " + getVLC("vlc").input.state);'>
-</TD><TD align="right">
-<SPAN style="text-align:center">Volume:</SPAN>
-<INPUT type=button value=" - " onClick='updateVolume(-10)'>
-<SPAN id="volumeTextField" style="text-align:center">--</SPAN>
-<INPUT type=button value=" + " onClick='updateVolume(+10)'>
-<INPUT type=button value="Mute" onClick='getVLC("vlc").audio.toggleMute();'>
-</TD>
-</TR>
-<TR><TD>Playlist:
-<INPUT type=button value="Prev" onClick='getVLC("vlc").playlist.prev();'>
-<INPUT type=button value="Next" onClick='getVLC("vlc").playlist.next();'>
-<INPUT type=button value="Clear All" onClick='doPlaylistClearAll();'>
-    Aspect Ratio:
-    <SELECT readonly onChange='doAspectRatio(this.value)'>
-      <OPTION value="default">Default</OPTION>
-      <OPTION value="1:1">1:1</OPTION>
-      <OPTION value="4:3">4:3</OPTION>
-      <OPTION value="16:9">16:9</OPTION>
-      <OPTION value="221:100">221:100</OPTION>
-      <OPTION value="5:4">5:4</OPTION>
-    </SELECT>
-</TD><TD align="right">
-<INPUT type=button id="itemCount" value=" Items 0 " onClick='doItemCount();'>
-<INPUT size=4 value="" id="removeid"><INPUT type=submit value="Delete" onClick="doRemoveItem(document.getElementById('removeid').value);">
-</TD>
-</TR>
-<TR><TD>Audio Channel:
-  <SELECT readonly onClick='doAudioChannel(this.value);'>
-    <OPTION value=1>Stereo</OPTION>
-    <OPTION value=2>Reverse Stereo</OPTION>
-    <OPTION value=3>Left</OPTION>
-    <OPTION value=4>Right</OPTION>
-    <OPTION value=5>Dolby</OPTION>
-  </SELECT>
-</TD>
-<TD>
-<INPUT type=button value="current channel" onClick='alert(getVLC("vlc").audio.channel);'>
-</TD>
-</TR>
-<TR><TD> Audio Track:
-<INPUT type=button value=" + " onClick='doAudioTrack(1);'>
-<SPAN id="trackTextField" style="text-align:center">--</SPAN>
-<INPUT type=button value=" - " onClick='doAudioTrack(-1);'>
-<INPUT type=button value="current track" onClick='alert(getVLC("vlc").audio.description(vlc.audio.track));'>
-<INPUT type=button value="number of track" onClick='alert(getVLC("vlc").audio.count);'>
-</TD>
-<TD>
-<INPUT type=button value="set slider" onClick='doSetSlider();'>
-<INPUT type=button value="get position" onClick='doGetPosition();'>
-</TD>
-</TR>
-<TR>
-<TD>Video Subtitle:
-    <INPUT type=button value=" + " onClick='doSubtitle(1);'>
-    <SPAN id="spuTextField" style="text-align:center">--</SPAN>
-    <INPUT type=button value=" - " onClick='doSubtitle(-1);'>
-    <INPUT type=button value="current subtitle" onClick='alert(getVLC("vlc").subtitle.description(vlc.subtitle.track));'>
-    <INPUT type=button value="number of subtitle" onClick='alert(getVLC("vlc").subtitle.count);'>
-</TD>
-</TR>
-<TR>
-<TD>Deinterlacing:
-    <INPUT type=button value="BLEND" onClick='getVLC("vlc").video.deinterlace.enable("blend");'>
-    <INPUT type=button value="  X  " onClick='getVLC("vlc").video.deinterlace.enable("x");'>
-    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.deinterlace.disable();'>
-</TD>
-</TR>
-<TR>
-<TD>Marquee video filter:
-    <INPUT type=button value="Enable" onClick='getVLC("vlc").video.marquee.enable();'>
-    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.marquee.disable();'>
-    <INPUT size=4 value="" id="marqueeIntValue">
-    <SELECT readonly onClick="doMarqueeOption(this.value,document.getElementById('marqueeIntValue').value);">
-        <OPTION value=1>Color</OPTION>
-        <OPTION value=2>Opacity</OPTION>
-        <OPTION value=3>Position</OPTION>
-        <OPTION value=4>Refresh</OPTION>
-        <OPTION value=5>Size</OPTION>
-        <OPTION value=6>Text</OPTION>
-        <OPTION value=7>Timeout</OPTION>
-        <OPTION value=8>X</OPTION>
-        <OPTION value=9>Y</OPTION>
-    </SELECT>
-</TD>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<TITLE>VLC Plugin test page</TITLE>
+<STYLE>
+  .inputTrackerInput {
+        height:20;
+        width:30;
+        font-family : Arial, Helvetica, sans-serif;
+        font-size : 12px;
+  }
+</STYLE>
+
+<SCRIPT type="text/javascript" src="blueshoes-4.5/javascript/lib/LibCrossBrowser.js"></SCRIPT>
+<SCRIPT type="text/javascript" src="blueshoes-4.5/javascript/lib/EventHandler.js"></SCRIPT>
+<SCRIPT type="text/javascript" src="blueshoes-4.5/javascript/core/form/Bs_FormUtil.lib.js"></SCRIPT>
+<SCRIPT type="text/javascript" src="blueshoes-4.5/javascript/components/slider/Bs_Slider.class.js"></SCRIPT>
+
+<SCRIPT language="JavaScript"><!--
+function init()
+{
+    inputTracker = new Bs_Slider();
+    if (inputTracker)
+    {
+        inputTracker.attachOnChange(onInputTrackerChange);
+        inputTracker.attachOnSlideStart(onInputTrackerScrollStart);
+        inputTracker.attachOnSlideEnd(onInputTrackerScrollEnd);
+        inputTracker.width         = 530;
+        inputTracker.height        = 15;
+        inputTracker.minVal        = 0;
+        inputTracker.maxVal        = 1.0;
+        inputTracker.valueDefault  = 0;
+        inputTracker.valueInterval = 1/530;
+        inputTracker.setDisabled(true);
+        inputTracker.imgDir   = 'blueshoes-4.5/javascript/components/slider/img/';
+        inputTracker.setBackgroundImage('aluminumalloyvolcanic/horizontal_background.gif', 'repeat');
+        inputTracker.setArrowIconLeft('aluminumalloyvolcanic/horizontal_backgroundLeft.gif', 2, 19);
+        inputTracker.setArrowIconRight('aluminumalloyvolcanic/horizontal_backgroundRight.gif', 2, 19);
+        inputTracker.setSliderIcon('aluminumalloyvolcanic/horizontal_knob.gif', 15, 19);
+        inputTracker.useInputField = 0;
+        inputTracker.draw('inputTrackerDiv');
+    }
+
+    if( navigator.appName.indexOf("Microsoft Internet")==-1 )
+    {
+        onVLCPluginReady()
+    }
+    else if( document.readyState == 'complete' )
+    {
+        onVLCPluginReady();
+    }
+    else
+    {
+        /* Explorer loads plugins asynchronously */
+        document.onreadystatechange=function()
+        {
+            if( document.readyState == 'complete' )
+            {
+                onVLCPluginReady();
+            }
+        }
+    }
+}
+
+function getVLC(name)
+{
+    if (window.document[name])
+    {
+        return window.document[name];
+    }
+    if (navigator.appName.indexOf("Microsoft Internet")==-1)
+    {
+        if (document.embeds && document.embeds[name])
+            return document.embeds[name];
+    }
+    else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
+    {
+        return document.getElementById(name);
+    }
+}
+
+function registerVLCEvent(event, handler)
+{
+    var vlc = getVLC("vlc");
+
+    if (vlc) {
+        if (vlc.attachEvent) {
+            // Microsoft
+            vlc.attachEvent (event, handler);
+        } else if (vlc.addEventListener) {
+            // Mozilla: DOM level 2
+            vlc.addEventListener (event, handler, true);
+        } else {
+            // DOM level 0
+            eval("vlc.on" + event + " = handler");
+        }
+    }
+}
+
+function unregisterVLCEvent(event, handler)
+{
+    var vlc = getVLC("vlc");
+
+    if (vlc) {
+        if (vlc.detachEvent) {
+            // Microsoft
+            vlc.detachEvent (event, handler);
+        } else if (vlc.removeEventListener) {
+            // Mozilla: DOM level 2
+            vlc.removeEventListener (event, handler, true);
+        } else {
+            // DOM level 0
+            eval("vlc.on" + event + " = null");
+        }
+    }
+}
+
+// JS VLC API callbacks
+function handleMediaPlayerMediaChanged()
+{
+    document.getElementById("info").innerHTML = "Media Changed";
+}
+
+function handle_MediaPlayerNothingSpecial()
+{
+    document.getElementById("state").innerHTML = "Idle...";
+}
+
+function handle_MediaPlayerOpening()
+{
+    onOpen();
+}
+
+function handle_MediaPlayerBuffering(val)
+{
+    document.getElementById("info").innerHTML = val + "%";
+}
+
+function handle_MediaPlayerPlaying()
+{
+    onPlay();
+}
+
+function handle_MediaPlayerPaused()
+{
+    onPause();
+}
+
+function handle_MediaPlayerStopped()
+{
+    onStop();
+}
+
+function handle_MediaPlayerForward()
+{
+    document.getElementById("state").innerHTML = "Forward...";
+}
+
+function handle_MediaPlayerBackward()
+{
+    document.getElementById("state").innerHTML = "Backward...";
+}
+
+function handle_MediaPlayerEndReached()
+{
+    onEnd();
+}
+
+function handle_MediaPlayerEncounteredError()
+{
+    onError();
+}
+
+function handle_MediaPlayerTimeChanged(time)
+{
+    var vlc = getVLC("vlc");
+    var info = document.getElementById("info");
+    if( vlc )
+    {
+        var mediaLen = vlc.input.length;
+        if( mediaLen > 0 )
+        {
+            // seekable media
+            info.innerHTML = formatTime(time)+"/"+formatTime(mediaLen);
+        }
+    }
+}
+
+function handle_MediaPlayerPositionChanged(val)
+{
+    // set javascript slider to correct position
+}
+
+function handle_MediaPlayerSeekableChanged(val)
+{
+    setSeekable(val);
+}
+
+function handle_MediaPlayerPausableChanged(val)
+{
+    setPauseable(val);
+}
+
+function handle_MediaPlayerTitleChanged(val)
+{
+    //setTitle(val);
+    document.getElementById("info").innerHTML = "Title: " + val;
+}
+
+function handle_MediaPlayerLengthChanged(val)
+{
+    //setMediaLength(val);
+}
+
+// VLC Plugin
+function onVLCPluginReady()
+{
+    registerVLCEvent("MediaPlayerMediaChanged", handleMediaPlayerMediaChanged);
+    registerVLCEvent("MediaPlayerNothingSpecial", handle_MediaPlayerNothingSpecial);
+    registerVLCEvent("MediaPlayerOpening", handle_MediaPlayerOpening);
+    registerVLCEvent("MediaPlayerBuffering", handle_MediaPlayerBuffering);
+    registerVLCEvent("MediaPlayerPlaying", handle_MediaPlayerPlaying);
+    registerVLCEvent("MediaPlayerPaused", handle_MediaPlayerPaused);
+    registerVLCEvent("MediaPlayerStopped", handle_MediaPlayerStopped);
+    registerVLCEvent("MediaPlayerForward", handle_MediaPlayerForward);
+    registerVLCEvent("MediaPlayerBackward", handle_MediaPlayerBackward);
+    registerVLCEvent("MediaPlayerEndReached", handle_MediaPlayerEndReached);
+    registerVLCEvent("MediaPlayerEncounteredError", handle_MediaPlayerEncounteredError);
+    registerVLCEvent("MediaPlayerTimeChanged", handle_MediaPlayerTimeChanged);
+    registerVLCEvent("MediaPlayerPositionChanged", handle_MediaPlayerPositionChanged);
+    registerVLCEvent("MediaPlayerSeekableChanged", handle_MediaPlayerSeekableChanged);
+    registerVLCEvent("MediaPlayerPausableChanged", handle_MediaPlayerPausableChanged);
+    registerVLCEvent("MediaPlayerTitleChanged", handle_MediaPlayerTitleChanged);
+    registerVLCEvent("MediaPlayerLengthChanged", handle_MediaPlayerLengthChanged);
+}
+
+function close()
+{
+    unregisterVLCEvent('MediaPlayerMouseGrab', handleMouseGrab);
+    unregisterVLCEvent('MediaPlayerMouseRelease', handleMouseRelease);
+    unregisterVLCEvent('MediaPlayerMouseClick', handleMouseClick);
+
+    unregisterVLCEvent("MediaPlayerMediaChanged", handleMediaPlayerMediaChanged);
+    unregisterVLCEvent("MediaPlayerNothingSpecial", handle_MediaPlayerNothingSpecial);
+    unregisterVLCEvent("MediaPlayerOpening", handle_MediaPlayerOpening);
+    unregisterVLCEvent("MediaPlayerBuffering", handle_MediaPlayerBuffering);
+    unregisterVLCEvent("MediaPlayerPlaying", handle_MediaPlayerPlaying);
+    unregisterVLCEvent("MediaPlayerPaused", handle_MediaPlayerPaused);
+    unregisterVLCEvent("MediaPlayerStopped", handle_MediaPlayerStopped);
+    unregisterVLCEvent("MediaPlayerForward", handle_MediaPlayerForward);
+    unregisterVLCEvent("MediaPlayerBackward", handle_MediaPlayerBackward);
+    unregisterVLCEvent("MediaPlayerEndReached", handle_MediaPlayerEndReached);
+    unregisterVLCEvent("MediaPlayerEncounteredError", handle_MediaPlayerEncounteredError);
+    unregisterVLCEvent("MediaPlayerTimeChanged", handle_MediaPlayerTimeChanged);
+    unregisterVLCEvent("MediaPlayerPositionChanged", handle_MediaPlayerPositionChanged);
+    unregisterVLCEvent("MediaPlayerSeekableChanged", handle_MediaPlayerSeekableChanged);
+    unregisterVLCEvent("MediaPlayerPausableChanged", handle_MediaPlayerPausableChanged);
+    unregisterVLCEvent("MediaPlayerTitleChanged", handle_MediaPlayerTitleChanged);
+    unregisterVLCEvent("MediaPlayerLengthChanged", handle_MediaPlayerLengthChanged);
+}
+
+//--></SCRIPT>
+
+<BODY onLoad="init();" onClose="close();">
+<TABLE>
+<TR><TD colspan="2">
+MRL:
+<INPUT size="90" id="targetTextField" value="">
+<INPUT type=submit value="Go" onClick="doGo(document.getElementById('targetTextField').value);">
+<INPUT type=submit value="Add" onClick="doAdd(document.getElementById('targetTextField').value);">
+</TD></TR>
+<TR><TD align="center" colspan="2">
+<!--
+Insert VideoLAN.VLCPlugin.2
+-->
+<OBJECT classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921"
+        width="640"
+        height="480"
+        id="vlc"
+        events="True">
+<param name="MRL" value="" />
+<param name="ShowDisplay" value="True" />
+<param name="AutoLoop" value="False" />
+<param name="AutoPlay" value="False" />
+<param name="Volume" value="50" />
+<param name="toolbar" value="true" />
+<param name="StartTime" value="0" />
+<EMBED pluginspage="http://www.videolan.org"
+       type="application/x-vlc-plugin"
+       version="VideoLAN.VLCPlugin.2"
+       width="640"
+       height="480"
+       toolbar="true"
+       text="Waiting for video"
+       name="vlc">
+</EMBED>
+</OBJECT>
+</TD></TR>
+<TR><TD colspan="2">
+<TABLE><TR>
+<TD valign="top" width="550">
+<!--
+Insert Slider widget
+-->
+<DIV id="inputTrackerDiv"</DIV>
+</TD><TD width="15%">
+<DIV id="info" style="text-align:center">-:--:--/-:--:--</DIV>
+<DIV id="state" style="text-align:center">Stopped...</DIV>
+</TD></TR></TABLE>
+</TD></TR>
+<TR><TD>
+<INPUT type=button id="PlayOrPause" value=" Play " onClick='doPlayOrPause();'>
+<INPUT type=button value="Stop" onClick='doStop();'>
+&nbsp;
+<INPUT type=button value=" << " onClick='doPlaySlower();'>
+<INPUT type=button value="Reverse" onClick='doReverse();'>
+<INPUT type=button value=" >> " onClick='doPlayFaster();'>
+&nbsp;
+<INPUT type=button value="Fullscreen" onClick='getVLC("vlc").video.toggleFullscreen();'>
+<INPUT type=button value="Version" onClick='alert("vlc " + getVLC("vlc").VersionInfo);'>
+<INPUT type=button value=" State " onClick='alert("state: " + getVLC("vlc").input.state);'>
+</TD><TD align="right">
+<SPAN style="text-align:center">Volume:</SPAN>
+<INPUT type=button value=" - " onClick='updateVolume(-10)'>
+<SPAN id="volumeTextField" style="text-align:center">--</SPAN>
+<INPUT type=button value=" + " onClick='updateVolume(+10)'>
+<INPUT type=button value="Mute" onClick='getVLC("vlc").audio.toggleMute();'>
+</TD>
+</TR>
+<TR><TD>Playlist:
+<INPUT type=button value="Prev" onClick='getVLC("vlc").playlist.prev();'>
+<INPUT type=button value="Next" onClick='getVLC("vlc").playlist.next();'>
+<INPUT type=button value="Clear All" onClick='doPlaylistClearAll();'>
+    Aspect Ratio:
+    <SELECT readonly onChange='doAspectRatio(this.value)'>
+      <OPTION value="default">Default</OPTION>
+      <OPTION value="1:1">1:1</OPTION>
+      <OPTION value="4:3">4:3</OPTION>
+      <OPTION value="16:9">16:9</OPTION>
+      <OPTION value="221:100">221:100</OPTION>
+      <OPTION value="5:4">5:4</OPTION>
+    </SELECT>
+</TD><TD align="right">
+<INPUT type=button id="itemCount" value=" Items 0 " onClick='doItemCount();'>
+<INPUT size=4 value="" id="removeid"><INPUT type=submit value="Delete" onClick="doRemoveItem(document.getElementById('removeid').value);">
+</TD>
+</TR>
+<TR><TD>Audio Channel:
+  <SELECT readonly onClick='doAudioChannel(this.value);'>
+    <OPTION value=1>Stereo</OPTION>
+    <OPTION value=2>Reverse Stereo</OPTION>
+    <OPTION value=3>Left</OPTION>
+    <OPTION value=4>Right</OPTION>
+    <OPTION value=5>Dolby</OPTION>
+  </SELECT>
+</TD>
+<TD>
+<INPUT type=button value="current channel" onClick='alert(getVLC("vlc").audio.channel);'>
+</TD>
+</TR>
+<TR><TD> Audio Track:
+<INPUT type=button value=" + " onClick='doAudioTrack(1);'>
+<SPAN id="trackTextField" style="text-align:center">--</SPAN>
+<INPUT type=button value=" - " onClick='doAudioTrack(-1);'>
+<INPUT type=button value="current track" onClick='alert(getVLC("vlc").audio.description(vlc.audio.track));'>
+<INPUT type=button value="number of track" onClick='alert(getVLC("vlc").audio.count);'>
+</TD>
+<TD>
+<INPUT type=button value="set slider" onClick='doSetSlider();'>
+<INPUT type=button value="get position" onClick='doGetPosition();'>
+</TD>
+</TR>
+<TR>
+<TD>Video Subtitle:
+    <INPUT type=button value=" + " onClick='doSubtitle(1);'>
+    <SPAN id="spuTextField" style="text-align:center">--</SPAN>
+    <INPUT type=button value=" - " onClick='doSubtitle(-1);'>
+    <INPUT type=button value="current subtitle" onClick='alert(getVLC("vlc").subtitle.description(vlc.subtitle.track));'>
+    <INPUT type=button value="number of subtitle" onClick='alert(getVLC("vlc").subtitle.count);'>
+</TD>
+</TR>
+<TR>
+<TD>Deinterlacing:
+    <INPUT type=button value="BLEND" onClick='getVLC("vlc").video.deinterlace.enable("blend");'>
+    <INPUT type=button value="  X  " onClick='getVLC("vlc").video.deinterlace.enable("x");'>
+    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.deinterlace.disable();'>
+</TD>
+</TR>
+<TR>
+<TD>Marquee video filter:
+    <INPUT type=button value="Enable" onClick='getVLC("vlc").video.marquee.enable();'>
+    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.marquee.disable();'>
+    <INPUT size=4 value="" id="marqueeIntValue">
+    <SELECT readonly onClick="doMarqueeOption(this.value,document.getElementById('marqueeIntValue').value);">
+        <OPTION value=1>Color</OPTION>
+        <OPTION value=2>Opacity</OPTION>
+        <OPTION value=3>Position</OPTION>
+        <OPTION value=4>Refresh</OPTION>
+        <OPTION value=5>Size</OPTION>
+        <OPTION value=6>Text</OPTION>
+        <OPTION value=7>Timeout</OPTION>
+        <OPTION value=8>X</OPTION>
+        <OPTION value=9>Y</OPTION>
+    </SELECT>
+</TD>
 </TR>
-<TR>
-<TD>Logo video filter:
-    <INPUT type=button value="Enable" onClick='getVLC("vlc").video.logo.enable();'>
-    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.logo.disable();'>
-    <INPUT size=4 value="" id="logoIntValue">
-    <SELECT readonly onClick="doLogoOption(this.value,document.getElementById('logoIntValue').value);">
-        <OPTION value=1>File</OPTION>
-        <OPTION value=2>Position</OPTION>
-        <OPTION value=3>Opacity</OPTION>
-        <OPTION value=4>Repeat</OPTION>
-        <OPTION value=5>Delay</OPTION>
-        <OPTION value=6>X</OPTION>
+<TR>
+<TD>Logo video filter:
+    <INPUT type=button value="Enable" onClick='getVLC("vlc").video.logo.enable();'>
+    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.logo.disable();'>
+    <INPUT size=4 value="" id="logoIntValue">
+    <SELECT readonly onClick="doLogoOption(this.value,document.getElementById('logoIntValue').value);">
+        <OPTION value=1>File</OPTION>
+        <OPTION value=2>Position</OPTION>
+        <OPTION value=3>Opacity</OPTION>
+        <OPTION value=4>Repeat</OPTION>
+        <OPTION value=5>Delay</OPTION>
+        <OPTION value=6>X</OPTION>
         <OPTION value=7>Y</OPTION>
-    </SELECT>
-</TD>
-</TR>

-<TR>
-<TD>
-    <INPUT type=button id="telx" value="Teletext off" onClick='doToggleTeletext();'>
-    Teletext page:
-    <INPUT size=4 value="100" id="telxPage" onClick='doTelxPage(document.getElementById("telxPage").value);'>
-</TD>
-</TR>
-</TABLE>
-<SCRIPT language="javascript">
-<!--
-
-var rate = 0;
-var prevState = 0;
-var monitorTimerId = 0;
-var inputTracker;
-var inputTrackerScrolling = false;
-var inputTrackerIgnoreChange = false;
-var telxState = false;
-
-function doSetSlider()
-{
-    var vlc = getVLC("vlc");
-
-    // set slider to new position
-    if( vlc )
-        vlc.input.time = (vlc.input.length/2);
-}
-
-function doGetPosition()
-{
-    var vlc = getVLC("vlc");
-
-    // set slider to new position
-    if (vlc)
-        alert( "position is " + vlc.input.time);
-}
-
-function doReverse(rate)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.input.rate = -1.0 * vlc.input.rate;
-}
-
-function doAudioChannel(value)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.audio.channel = parseInt(value);
-}
-
-function doAudioTrack(value)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        vlc.audio.track = vlc.audio.track + value;
-        document.getElementById("trackTextField").innerHTML = vlc.audio.track;
-    }
-}
-
-function doAspectRatio(value)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.video.aspectRatio = value;
-}
-
-function doSubtitle(value)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        vlc.subtitle.track = vlc.subtitle.track + value;
-        document.getElementById("spuTextField").innerHTML = vlc.subtitle.track;
-    }
-}
-
-function doTelxPage(value)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.video.teletext = parseInt(value);
-}
-
-function doToggleTeletext()
-{
-    var vlc = getVLC("vlc");
-
-    if( vlc )
-    {
-        vlc.video.toggleTeletext();
-        if (telxState)
-        {
-            document.getElementById("telx").innerHTML = "Teletext on";
-            telxState = true;
-        }
-        else
-        {
-            document.getElementById("telx").innerHTML = "Teletext off";
-            telxState = false;
-        }
-    }
-}
-
-function doItemCount()
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        var count = vlc.playlist.items.count;
-        document.getElementById("itemCount").value = " Items " + count + " ";
-    }
-}
-
-function doRemoveItem(item)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.playlist.items.remove(item);
-}
-
-function doPlaylistClearAll()
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        vlc.playlist.items.clear();
-        while( vlc.playlist.items.count > 0)
-        {
-            // wait till playlist empties.
-        }
-        doItemCount();
-    }
-}
-
-function updateVolume(deltaVol)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        vlc.audio.volume += deltaVol;
-        document.getElementById("volumeTextField").innerHTML = vlc.audio.volume+"%";
-    }
-}
-
-function formatTime(timeVal)
-{
-    if( typeof timeVal != 'number' )
-        return "-:--:--";
-
-    var timeHour = Math.round(timeVal / 1000);
-    var timeSec = timeHour % 60;
-    if( timeSec < 10 )
-        timeSec = '0'+timeSec;
-    timeHour = (timeHour - timeSec)/60;
-    var timeMin = timeHour % 60;
-    if( timeMin < 10 )
-        timeMin = '0'+timeMin;
-    timeHour = (timeHour - timeMin)/60;
-    if( timeHour > 0 )
-        return timeHour+":"+timeMin+":"+timeSec;
-    else
-        return timeMin+":"+timeSec;
-}
-
-function doState()
-{
-    var vlc = getVLC("vlc");
-    var newState = 0;
-
-    if( vlc )
-        newState = vlc.input.state;
-
-    if( newState == 0 )
-    {
-        // current media has stopped
-        onEnd();
-    }
-    else if( newState == 1 )
-    {
-        // current media is openning/connecting
-        onOpen();
-    }
-    else if( newState == 2 )
-    {
-        // current media is buffering data
-        onBuffer();
-    }
-    else if( newState == 3 )
-    {
-        // current media is now playing
-        onPlay();
-    }
-    else if( newState == 4 )
-    {
-        // current media is now paused
-        onPause();
-    }
-    else if( newState == 5 )
-    {
-        // current media has stopped
-        onStop();
-    }
-    else if( newState == 6 )
-    {
-        // current media has ended
-        onEnd();
-    }
-    else if( newState == 7 )
-    {
-        // current media encountered error
-        onError();
-    }
-}
-
-function monitor()
-{
-    var vlc = getVLC("vlc");
-    var newState = 0;
-
-    if( vlc )
-    {
-        newState = vlc.input.state;
-    }
-
-    if( prevState != newState )
-    {
-        if( newState == 0 )
-        {
-            // current media has stopped
-            onEnd();
-        }
-        else if( newState == 1 )
-        {
-            // current media is openning/connecting
-            onOpen();
-        }
-        else if( newState == 2 )
-        {
-            // current media is buffering data
-            onBuffer();
-        }
-        else if( newState == 3 )
-        {
-            // current media is now playing
-            onPlay();
-        }
-        else if( newState == 4 )
-        {
-            // current media is now paused
-            onPause();
-        }
-        else if( newState == 5 )
-        {
-            // current media has stopped
-                onStop();
-        }
-        else if( newState == 6 )
-        {
-            // current media has ended
-            onEnd();
-        }
-        else if( newState == 7 )
-        {
-            // current media encountered error
-            onError();
-        }
-        prevState = newState;
-    }
-    else if( newState == 3 )
-    {
-        // current media is playing
-        onPlaying();
-    }
-    if( monitorTimerId == 0 )
-    {
-        monitorTimerId = setInterval("monitor()", 1000);
-    }
-};
-
-/* actions */
-
-function doGo(targetURL)
-{
-    var vlc = getVLC("vlc");
-
-    if( vlc )
-    {
-        vlc.playlist.items.clear();
-        while( vlc.playlist.items.count > 0 )
-        {
-            // clear() may return before the playlist has actually been cleared
-            // just wait for it to finish its job
-        }
-        var options = [":rtsp-tcp"];
-        var itemId = vlc.playlist.add(targetURL,"",options);
-        options = [];
-        if( itemId != -1 )
-        {
-            // play MRL
-            vlc.playlist.playItem(itemId);
-            if( monitorTimerId == 0 )
-            {
-                monitor();
-            }
-        }
-        else
-        {
-            alert("cannot play at the moment !");
-        }
-        doItemCount();
-    }
-}
-
-function doAdd(targetURL)
-{
-    var vlc = getVLC("vlc");
-    var options = [":vout-filter=deinterlace", ":deinterlace-mode=linear"];
-    if( vlc )
-    {
-        vlc.playlist.add(targetURL, "", options);
-        options = [];
-        doItemCount();
-    }
-}
-
-function doPlayOrPause()
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        if( vlc.playlist.isPlaying )
-        {
-            vlc.playlist.togglePause();
-            monitor();
-        }
-        else if( vlc.playlist.items.count > 0 )
-        {
-            vlc.playlist.play();
-            monitor();
-        }
-        else
-        {
-            alert('nothing to play !');
-        }
-    }
-}
-
-function doStop()
-{
-    var vlc = getVLC("vlc");
-
-    if( vlc )
-        vlc.playlist.stop();
-
-    if( monitorTimerId != 0 )
-    {
-        clearInterval(monitorTimerId);
-        monitorTimerId = 0;
-    }
-    onStop();
-}
-
-function doPlaySlower()
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.input.rate = vlc.input.rate / 2;
-}
-
-function doPlayFaster()
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-        vlc.input.rate = vlc.input.rate * 2;
-}
-
-/* events */
-
-function onOpen()
-{
-    document.getElementById("state").innerHTML = "Opening...";
-    document.getElementById("PlayOrPause").value = "Pause";
-}
-
-function onBuffer()
-{
-    document.getElementById("state").innerHTML = "Buffering...";
-    document.getElementById("PlayOrPause").value = "Pause";
-}
-
-function onPlay()
-{
-    document.getElementById("state").innerHTML = "Playing...";
-    document.getElementById("PlayOrPause").value = "Pause";
-    onPlaying();
-}
-
-function onEnd()
-{
-    document.getElementById("state").innerHTML = "End...";
-    doStop();
-}
-
-var liveFeedText = ["Live", "((Live))", "(( Live ))", "((  Live  ))"];
-var liveFeedRoll = 0;
-
-function onPlaying()
-{
-    if( !inputTrackerScrolling )
-    {
-        var vlc = getVLC("vlc");
-        var info = document.getElementById("info");
-        if( vlc )
-        {
-            var mediaLen = vlc.input.length;
-            inputTrackerIgnoreChange = true;
-            if( mediaLen > 0 )
-            {
-                // seekable media
-                if( inputTracker )
-                {
-                    if( inputTracker.maxVal == 1.0 )
-                    {
-                        inputTracker.setDisabled(false);
-                        inputTracker.maxVal = 1.0;
-                    }
-                    inputTracker.setValue(vlc.input.position);
-                }
-                info.innerHTML = formatTime(vlc.input.time)+"/"+formatTime(mediaLen);
-            }
-            else
-            {
-                // non-seekable "live" media
-                if( inputTracker )
-                {
-                    if( inputTracker.maxVal != 0.0 )
-                    {
-                        inputTracker.maxVal = 0.0;
-                        inputTracker.setValue(0.0);
-                        inputTracker.setDisabled(true);
-                    }
-                }
-                liveFeedRoll = liveFeedRoll & 3;
-                info.innerHTML = liveFeedText[liveFeedRoll++];
-            }
-            inputTrackerIgnoreChange  = false;
-        }
-    }
-}
-
-function onPause()
-{
-    document.getElementById("state").innerHTML = "Paused...";
-    document.getElementById("PlayOrPause").value = " Play ";
-}
-
-function onStop()
-{
-    var vlc = getVLC("vlc");
-
-    if( inputTracker )
-    {
-        if( !inputTracker.disabled )
-        {
-            inputTracker.setValue(inputTracker.minVal);
-            inputTracker.setDisabled(true);
-        }
-    }
-
-    document.getElementById("info").innerHTML = "-:--:--/-:--:--";
-    document.getElementById("state").innerHTML = "Stopped...";
-    document.getElementById("PlayOrPause").value = " Play ";
-}
-
-function onError()
-{
-    var vlc = getVLC("vlc");
-
-    document.getElementById("state").innerHTML = "Error...";
-}
-
-function onInputTrackerScrollStart()
-{
-    inputTrackerScrolling = true;
-}
-
-function onInputTrackerScrollEnd(inputTracker, value, pos)
-{
-    inputTrackerScrolling = false;
-}
-
-function onInputTrackerChange(inputTracker, value, pos)
-{
-    if( !inputTrackerIgnoreChange )
-    {
-        var vlc = getVLC("vlc");
-        if( vlc )
-        {
-            if( (vlc.input.state == 3) && (vlc.input.position != value) )
-            {
-                var info = document.getElementById("info");
-                vlc.input.position = value;
-                info.innerHTML = formatTime(vlc.input.time)+"/"+formatTime(vlc.input.length);
-            }
-        }
-    }
-}
-
-function doMarqueeOption(option, value)
-{
-    var vlc = getVLC("vlc");
-    val = parseInt(value);
-    if( vlc )
-    {
-        if (option == 1)
-            vlc.video.marquee.color = val;
-        if (option == 2)
-            vlc.video.marquee.opacity = val;
-        if (option == 3)
-            vlc.video.marquee.position = value;
-        if (option == 4)
-            vlc.video.marquee.refresh = val;
-        if (option == 5)
-            vlc.video.marquee.size = val;
-        if (option == 6)
-            vlc.video.marquee.text = value;
-        if (option == 7)
-            vlc.video.marquee.timeout = val;
-        if (option == 8)
-            vlc.video.marquee.x = val;
-        if (option == 9)
-            vlc.video.marquee.y = val;
-    }
-}
-
-function doLogoOption(option, value)
-{
-    var vlc = getVLC("vlc");
-    if( vlc )
-    {
-        if (option == 1)
-            vlc.video.logo.file(value);
-        if (option == 2)
-            vlc.video.logo.position = value;
-        val = parseInt(value);
-        if (option == 3)
-            vlc.video.logo.opacity = val;
-        if (option == 4)
-            vlc.video.logo.repeat = val;
-        if (option == 5)
-            vlc.video.logo.delay = val;
-        if (option == 6)
-            vlc.video.logo.x = val;
-        if (option == 7)
-            vlc.video.logo.y = val;
-    }
-}
-
-//-->
-</SCRIPT>
-</BODY>
-</HTML>
+    </SELECT>
+</TD>
+</TR>
+<TR>
+<TD>
+    <INPUT type=button id="telx" value="Teletext off" onClick='doToggleTeletext();'>
+    Teletext page:
+    <INPUT size=4 value="100" id="telxPage" onClick='doTelxPage(document.getElementById("telxPage").value);'>
+</TD>
+</TR>
+</TABLE>
+<SCRIPT language="javascript">
+<!--
+
+var rate = 0;
+var prevState = 0;
+var monitorTimerId = 0;
+var inputTracker;
+var inputTrackerScrolling = false;
+var inputTrackerIgnoreChange = false;
+var telxState = false;
+var canPause = true;
+var canSeek = true;
+
+function setPauseable(val)
+{
+    canPause = val;
+}
+
+function setSeekable(val)
+{
+    canSeek = val;
+}
+
+function doSetSlider()
+{
+    var vlc = getVLC("vlc");
+
+    // set slider to new position
+    if( vlc )
+        vlc.input.time = (vlc.input.length/2);
+}
+
+function doGetPosition()
+{
+    var vlc = getVLC("vlc");
+
+    // set slider to new position
+    if (vlc)
+        alert( "position is " + vlc.input.time);
+}
+
+function doReverse(rate)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.input.rate = -1.0 * vlc.input.rate;
+}
+
+function doAudioChannel(value)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.audio.channel = parseInt(value);
+}
+
+function doAudioTrack(value)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        vlc.audio.track = vlc.audio.track + value;
+        document.getElementById("trackTextField").innerHTML = vlc.audio.track;
+    }
+}
+
+function doAspectRatio(value)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.video.aspectRatio = value;
+}
+
+function doSubtitle(value)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        vlc.subtitle.track = vlc.subtitle.track + value;
+        document.getElementById("spuTextField").innerHTML = vlc.subtitle.track;
+    }
+}
+
+function doTelxPage(value)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.video.teletext = parseInt(value);
+}
+
+function doToggleTeletext()
+{
+    var vlc = getVLC("vlc");
+
+    if( vlc )
+    {
+        vlc.video.toggleTeletext();
+        if (telxState)
+        {
+            document.getElementById("telx").innerHTML = "Teletext on";
+            telxState = true;
+        }
+        else
+        {
+            document.getElementById("telx").innerHTML = "Teletext off";
+            telxState = false;
+        }
+    }
+}
+
+function doItemCount()
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        var count = vlc.playlist.items.count;
+        document.getElementById("itemCount").value = " Items " + count + " ";
+    }
+}
+
+function doRemoveItem(item)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.playlist.items.remove(item);
+}
+
+function doPlaylistClearAll()
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        vlc.playlist.items.clear();
+        while( vlc.playlist.items.count > 0)
+        {
+            // wait till playlist empties.
+        }
+        doItemCount();
+    }
+}
+
+function updateVolume(deltaVol)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        vlc.audio.volume += deltaVol;
+        document.getElementById("volumeTextField").innerHTML = vlc.audio.volume+"%";
+    }
+}
+
+function formatTime(timeVal)
+{
+    if( typeof timeVal != 'number' )
+        return "-:--:--";
+
+    var timeHour = Math.round(timeVal / 1000);
+    var timeSec = timeHour % 60;
+    if( timeSec < 10 )
+        timeSec = '0'+timeSec;
+    timeHour = (timeHour - timeSec)/60;
+    var timeMin = timeHour % 60;
+    if( timeMin < 10 )
+        timeMin = '0'+timeMin;
+    timeHour = (timeHour - timeMin)/60;
+    if( timeHour > 0 )
+        return timeHour+":"+timeMin+":"+timeSec;
+    else
+        return timeMin+":"+timeSec;
+}
+
+function doState()
+{
+    var vlc = getVLC("vlc");
+    var newState = 0;
+
+    if( vlc )
+        newState = vlc.input.state;
+
+    if( newState == 0 )
+    {
+        // current media has stopped
+        onEnd();
+    }
+    else if( newState == 1 )
+    {
+        // current media is openning/connecting
+        onOpen();
+    }
+    else if( newState == 2 )
+    {
+        // current media is buffering data
+        onBuffer();
+    }
+    else if( newState == 3 )
+    {
+        // current media is now playing
+        onPlay();
+    }
+    else if( newState == 4 )
+    {
+        // current media is now paused
+        onPause();
+    }
+    else if( newState == 5 )
+    {
+        // current media has stopped
+        onStop();
+    }
+    else if( newState == 6 )
+    {
+        // current media has ended
+        onEnd();
+    }
+    else if( newState == 7 )
+    {
+        // current media encountered error
+        onError();
+    }
+}
+
+function monitor()
+{
+    var vlc = getVLC("vlc");
+    var newState = 0;
+
+    if( vlc )
+    {
+        newState = vlc.input.state;
+    }
+
+    if( prevState != newState )
+    {
+        if( newState == 0 )
+        {
+            // current media has stopped
+            onEnd();
+        }
+        else if( newState == 1 )
+        {
+            // current media is openning/connecting
+            onOpen();
+        }
+        else if( newState == 2 )
+        {
+            // current media is buffering data
+            onBuffer();
+        }
+        else if( newState == 3 )
+        {
+            // current media is now playing
+            onPlay();
+        }
+        else if( newState == 4 )
+        {
+            // current media is now paused
+            onPause();
+        }
+        else if( newState == 5 )
+        {
+            // current media has stopped
+            onStop();
+        }
+        else if( newState == 6 )
+        {
+            // current media has ended
+            onEnd();
+        }
+        else if( newState == 7 )
+        {
+            // current media encountered error
+            onError();
+        }
+        prevState = newState;
+    }
+    else if( newState == 3 )
+    {
+        // current media is playing
+        onPlaying();
+    }
+    if( monitorTimerId == 0 )
+    {
+        monitorTimerId = setInterval("monitor()", 1000);
+    }
+};
+
+/* actions */
+
+function doGo(targetURL)
+{
+    var vlc = getVLC("vlc");
+
+    if( vlc )
+    {
+        vlc.playlist.items.clear();
+        while( vlc.playlist.items.count > 0 )
+        {
+            // clear() may return before the playlist has actually been cleared
+            // just wait for it to finish its job
+        }
+        var options = [":rtsp-tcp"];
+        var itemId = vlc.playlist.add(targetURL,"",options);
+        options = [];
+        if( itemId != -1 )
+        {
+            // play MRL
+            vlc.playlist.playItem(itemId);
+            if( monitorTimerId == 0 )
+            {
+                monitor();
+            }
+        }
+        else
+        {
+            alert("cannot play at the moment !");
+        }
+        doItemCount();
+    }
+}
+
+function doAdd(targetURL)
+{
+    var vlc = getVLC("vlc");
+    var options = [":vout-filter=deinterlace", ":deinterlace-mode=linear"];
+    if( vlc )
+    {
+        vlc.playlist.add(targetURL, "", options);
+        options = [];
+        doItemCount();
+    }
+}
+
+function doPlayOrPause()
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        if( vlc.playlist.isPlaying && canPause )
+        {
+            vlc.playlist.togglePause();
+            //monitor();
+        }
+        else if( vlc.playlist.items.count > 0 )
+        {
+            vlc.playlist.play();
+            //monitor();
+        }
+        else
+        {
+            alert('nothing to play !');
+        }
+    }
+}
+
+function doStop()
+{
+    var vlc = getVLC("vlc");
+
+    if( vlc )
+        vlc.playlist.stop();
+
+    if( monitorTimerId != 0 )
+    {
+        clearInterval(monitorTimerId);
+        monitorTimerId = 0;
+    }
+    onStop();
+}
+
+function doPlaySlower()
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.input.rate = vlc.input.rate / 2;
+}
+
+function doPlayFaster()
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+        vlc.input.rate = vlc.input.rate * 2;
+}
+
+function doMarqueeOption(option, value)
+{
+    var vlc = getVLC("vlc");
+    val = parseInt(value);
+    if( vlc )
+    {
+        if (option == 1)
+            vlc.video.marquee.color = val;
+        if (option == 2)
+            vlc.video.marquee.opacity = val;
+        if (option == 3)
+            vlc.video.marquee.position = value;
+        if (option == 4)
+            vlc.video.marquee.refresh = val;
+        if (option == 5)
+            vlc.video.marquee.size = val;
+        if (option == 6)
+            vlc.video.marquee.text = value;
+        if (option == 7)
+            vlc.video.marquee.timeout = val;
+        if (option == 8)
+            vlc.video.marquee.x = val;
+        if (option == 9)
+            vlc.video.marquee.y = val;
+    }
+}
+
+function doLogoOption(option, value)
+{
+    var vlc = getVLC("vlc");
+    if( vlc )
+    {
+        if (option == 1)
+            vlc.video.logo.file(value);
+        if (option == 2)
+            vlc.video.logo.position = value;
+        val = parseInt(value);
+        if (option == 3)
+            vlc.video.logo.opacity = val;
+        if (option == 4)
+            vlc.video.logo.repeat = val;
+        if (option == 5)
+            vlc.video.logo.delay = val;
+        if (option == 6)
+            vlc.video.logo.x = val;
+        if (option == 7)
+            vlc.video.logo.y = val;
+    }
+}
+
+/* events */
+
+function onOpen()
+{
+    document.getElementById("state").innerHTML = "Opening...";
+    document.getElementById("PlayOrPause").value = "Pause";
+}
+
+function onBuffer()
+{
+    document.getElementById("state").innerHTML = "Buffering...";
+    document.getElementById("PlayOrPause").value = "Pause";
+}
+
+function onPlay()
+{
+    document.getElementById("state").innerHTML = "Playing...";
+    document.getElementById("PlayOrPause").value = "Pause";
+    onPlaying();
+}
+
+function onEnd()
+{
+    document.getElementById("state").innerHTML = "End...";
+}
+
+var liveFeedText = ["Live", "((Live))", "(( Live ))", "((  Live  ))"];
+var liveFeedRoll = 0;
+
+function onPlaying()
+{
+    if( !inputTrackerScrolling )
+    {
+        var vlc = getVLC("vlc");
+        var info = document.getElementById("info");
+        if( vlc )
+        {
+            var mediaLen = vlc.input.length;
+            inputTrackerIgnoreChange = true;
+            if( mediaLen > 0 )
+            {
+                // seekable media
+                if( inputTracker )
+                {
+                    if( inputTracker.maxVal == 1.0 )
+                    {
+                        inputTracker.setDisabled(false);
+                        inputTracker.maxVal = 1.0;
+                    }
+                    inputTracker.setValue(vlc.input.position);
+                }
+                info.innerHTML = formatTime(vlc.input.time)+"/"+formatTime(mediaLen);
+            }
+            else
+            {
+                // non-seekable "live" media
+                if( inputTracker )
+                {
+                    if( inputTracker.maxVal != 0.0 )
+                    {
+                        inputTracker.maxVal = 0.0;
+                        inputTracker.setValue(0.0);
+                        inputTracker.setDisabled(true);
+                    }
+                }
+                liveFeedRoll = liveFeedRoll & 3;
+                info.innerHTML = liveFeedText[liveFeedRoll++];
+            }
+            inputTrackerIgnoreChange  = false;
+        }
+    }
+}
+
+function onPause()
+{
+    document.getElementById("state").innerHTML = "Paused...";
+    document.getElementById("PlayOrPause").value = " Play ";
+}
+
+function onStop()
+{
+    var vlc = getVLC("vlc");
+
+    if( inputTracker )
+    {
+        if( !inputTracker.disabled )
+        {
+            inputTracker.setValue(inputTracker.minVal);
+            inputTracker.setDisabled(true);
+        }
+    }
+
+    document.getElementById("info").innerHTML = "-:--:--/-:--:--";
+    document.getElementById("state").innerHTML = "Stopped...";
+    document.getElementById("PlayOrPause").value = " Play ";
+}
+
+function onError()
+{
+    var vlc = getVLC("vlc");
+
+    document.getElementById("state").innerHTML = "Error...";
+}
+
+function onInputTrackerScrollStart()
+{
+    inputTrackerScrolling = true;
+}
+
+function onInputTrackerScrollEnd(inputTracker, value, pos)
+{
+    inputTrackerScrolling = false;
+}
+
+function onInputTrackerChange(inputTracker, value, pos)
+{
+    if( !inputTrackerIgnoreChange )
+    {
+        var vlc = getVLC("vlc");
+        if( vlc )
+        {
+            if( (vlc.input.state == 3) && (vlc.input.position != value) )
+            {
+                var info = document.getElementById("info");
+                vlc.input.position = value;
+                info.innerHTML = formatTime(vlc.input.time)+"/"+formatTime(vlc.input.length);
+            }
+        }
+    }
+}
+
+//-->
+</SCRIPT>
+</BODY>
+</HTML>