/*
 * Copyright (c) 2008, Aleajecta
 * All rights reserved.
 * 
 * The Service and any necessary software used in connection with the 
 * Service ("Software") contain proprietary and confidential information 
 * that is protected by applicable intellectual property and other laws.
 * You agree not to modify, rent, lease, loan, sell, distribute or create
 * derivative works based on the Service or the Software, in whole or in part.
 */
/**
 * @author Greenseed
 */
function Video(){}(function()
{
    var StreamName = "stream.ts";
    Video.elePlay = null;
    Video.elePause = null;
    Video.eleStop = null;
    Video.eleFast = null;
    Video.eleSlow = null;
    Video.eleVUp = null;
    Video.eleVDown = null;
    Video.eleVDisplay = null;
    Video.eleDisplay = null;
    Video.eleSliderButton = null;
    Video.eleLiveMode = null;
    Video.sliderWidth = 430;

    Video.vlc = null;
    Video.fileSize = 0;
    Video.fileFinderTimerId = null;
    Video.liveBuffer = 2000000; //Bytes Value
    Video.volumeButtonTimerId = null;
    Video.lastState = -1;
    Video.configVSD = null;
    Video.lastUpdate = 0;

    Video.vOut_Up = function() 
    {
        if(!Video.volumeButtonTimerId)
            return;
        
        clearInterval(Video.volumeButtonTimerId);
        Video.volumeButtonTimerId = null;
    };   
    Video.vUp = function(deltaVol)
    {
        var deltaVol = (typeof(deltaVol) == "undefined" ? 1 : deltaVol)*2;
		if (Video.vlc.audio.volume+deltaVol <= 198) 
		{
			Video.vlc.audio.volume = Video.vlc.audio.volume+deltaVol;
			Video.eleVDisplay.innerHTML = Video.vlc.audio.volume < 20 ? "0"+String(Video.vlc.audio.volume/2) : String(Video.vlc.audio.volume/2);
		}
        if(!Video.volumeButtonTimerId)
            Video.volumeButtonTimerId = setInterval('Video.vUp()',75);
    };
    Video.vDown = function(deltaVol)
    {
		var deltaVol = (typeof(deltaVol) == "undefined" ? 1 : deltaVol)*2;
		if (Video.vlc.audio.volume-deltaVol >= 0)
		{
			Video.vlc.audio.volume = Video.vlc.audio.volume-deltaVol;
			Video.eleVDisplay.innerHTML = Video.vlc.audio.volume < 20 ? "0"+String(Video.vlc.audio.volume/2) : String(Video.vlc.audio.volume/2);
		}
        if(!Video.volumeButtonTimerId)
            Video.volumeButtonTimerId = setInterval('Video.vDown()',75);
    };
    Video.open = function(targetURL)
    {
        return Video.vlc.playlist.add(targetURL, "Aleajecta Stream",':ftp-caching=2000 :ffmpeg-pp-q=1');
    };
    Video.seek = function(value)
    {
        if(!Video.vlc.playlist.isPlaying)
            return;
        Video.vlc.input.position = value;
    };
    Video.clearPlayList = function()
    {
        Video.vlc.playlist.clear();
		var _loop = 0;
        while(Video.vlc.playlist.itemCount && ++_loop < 500000);
    };
    Video.stop = function()
    {
		Video.vlc.playlist.stop();
		var _loop = 0;
        while(Video.vlc.status && ++_loop < 500000);
    };
    Video.slower = function()
    {
	   if(Live) return;
       Video.vlc.input.rate = Video.vlc.input.rate*0.8;
    },
    Video.faster = function()
    {
	    if(Live) return;
        Video.vlc.input.rate = Video.vlc.input.rate*1.2;
    };
    Video.play = function()
    {
        Video.elePlay.onmouseup = null;
        setTimeout(function(){Video.elePlay.onmouseup=Video.play},3000);
        if( Video.vlc.input.state == 3)
        {
            if(Video.vlc.input.rate != 1.0)
                Video.vlc.input.rate = 1.0;
            return;
        }
        if(Live)
        {
            if(Video.vlc.input.state == 3 || Video.vlc.input.state == 4)
       		    Video.stop();
            
            var _loop = 0;
            while(Video.vlc.input.state && ++_loop < 1000000);

            Video.clearPlayList();

            Video.vlc.log.verbosity = 3;
            Video.open('ftp://habs:live@maya.aleajecta.com:21/'+StreamName);
            var _loop = 0;
            while(Video.vlc.input.state && ++_loop < 1000000);
            Video.findFileSize(function()
            {
                Video.goLive();
            }, Video.liveBuffer);
            if(!Video.vlc.playlist.itemCount) 
            {
                Chat.add(0,"VideoDebug",0,"Live Stream Seem Not Accesible, Maybe MaxUser!",0,0);
            }
            else
                Video.vlc.playlist.play();
        }
        else 
        {
            if(!Video.vlc.playlist.itemCount)
            {
                Chat.add(0,"VideoDebug",0,"PlayList is Empty I can't Play!",0,0);
            }
            else
                Video.vlc.playlist.play();
        }
    };
    Video.goLive = function()
    {
        if(!Video.vlc.playlist.itemCount)
            return;
        setTimeout('Video.vlc.input.position = 1-(Video.liveBuffer/Video.fileSize)',2000);
		Video.eleSlow.className = "vlcButton vlcButtonDisabled";
		Video.eleFast.className = "vlcButton vlcButtonDisabled";
    };
    Video.pause = function()
    {
        if(!Video.vlc.playlist.itemCount)
        {
            Chat.add(0,"VideoDebug",0,"PlayList is Empty I can't Pause!",0,0);
            Chat.refreshDisplay();
            return;
        }
        if(Live)
            Video.stop();
        else
            Video.vlc.playlist.togglePause();
    };
    Video.update = function()
    {
        //(IDLE/CLOSE=0, OPENING=1, BUFFERING=2, PLAYING=3, PAUSED=4, STOPPING=5, ERROR=6)
        switch(Video.vlc.input.state)
        {
            case 0:
            {
                if(Video.eleDisplay.innerHTML != "Stopped")
                    Video.eleDisplay.innerHTML = "Stopped";
            }break;
            case 1:
            {
                if(Video.eleDisplay.innerHTML != "Opening...")
                    Video.eleDisplay.innerHTML = "Opening...";
            }break;
            case 2:
            {
                if(Video.eleDisplay.innerHTML != "Buffering...")
                Video.eleDisplay.innerHTML = "Buffering...";
                
            }break;
            case 3:
            {
                if (Video.vlc.input.rate < 1) 
                {
                    if(Video.eleDisplay.innerHTML != "Slow " + Video.vlc.input.rate.toPrecision(2) + "x")
                        Video.eleDisplay.innerHTML = "Slow " + Video.vlc.input.rate.toPrecision(2) + "x";
                }
                else if (Video.vlc.input.rate > 1) 
                {
                    if(Video.eleDisplay.innerHTML != "Fast " + Video.vlc.input.rate.toPrecision(2) + "x")
                        Video.eleDisplay.innerHTML = "Fast " + Video.vlc.input.rate.toPrecision(2) + "x";
                }
                else 
                {
                    if(Video.eleDisplay.innerHTML != (Live ? "En Direct..." : "Playing..."))
                        Video.eleDisplay.innerHTML = (Live ? "En Direct..." : "Playing...");
                }
            }break;
            case 4:
            {
                if(Video.eleDisplay.innerHTML != "Paused")
                    Video.eleDisplay.innerHTML = "Paused";
                
            }break;
            case 5:
            {
                if(Video.eleDisplay.innerHTML != "Stopped")
                    Video.eleDisplay.innerHTML = "Stopped";
                
            }break;
            case 6:
            {
                if(Video.eleDisplay.innerHTML != "ERROR")
                    Video.eleDisplay.innerHTML = "ERROR";
            }break;
            default:
            {
                if(Video.eleDisplay.innerHTML != "Working")
                    Video.eleDisplay.innerHTML = "Working";
            }break;
        }    
    };
    Video.updateSlider = function()
    {
        if(Video.vlc.input.state != 3 || Video.sliderClickTimerId
           || Video.vlc.input.position <= 0 || Video.vlc.input.position > 1)
            return;

        Video.eleSliderButton.style.left = Math.ceil(Video.vlc.input.position * Video.sliderWidth)+"px";
        Video.eleSliderButton.innerHTML = Math.ceil(Video.vlc.input.position * 100);
    };
    Video.sliderClick = function()
    {
        if(Live)
	        return;

        Video.eleSliderButton.style.backgroundColor = "#250bd7";
        var _left = GetElementById("mainWrapper").offsetLeft+30;
        var _right = Video.sliderWidth+GetElementById("mainWrapper").offsetLeft+30;
        var _pos = 0;
        if(Mouse.coord['x'] <= _left)
        {
            Video.eleSliderButton.style.left = "0px";
        }
        else if(Mouse.coord['x'] >= _right)
        {
            Video.eleSliderButton.style.left = Video.sliderWidth+"px";   
        }
        else
        {
            _pos = (Mouse.coord['x'] - _left);
            Video.eleSliderButton.style.left = _pos + "px";   
        }
        Video.eleSliderButton.innerHTML = Math.round(_pos/Video.sliderWidth*100) ? Math.round(_pos/Video.sliderWidth*100) : "";
        Video.sliderClickTimerId = setTimeout('Video.sliderClick()',10);    
    };
    Video.findFileSize = function(onFound,minSize,recall)
    {
        var recall = (typeof recall == "undefined" ? 0 : ++recall);
        if(Video.fileFinderTimerId && !recall) 
            return;

        if(recall > 4) //Timeout is 2 second, so gave 1 minute max for open
        {
            Chat.add(0,"ERROR",0,"Get File Detail Timeout!",0,0);
            Video.fileFinderTimerId = 0;
            Video.vlc.log.verbosity = 0;
            Video.vlc.log.messages.clear();
            return;
        }
        
        Video.fileSize = 0;

        var value = '';
        var itr = Video.vlc.log.messages.iterator();
        while(itr.hasNext)
        {
            value = itr.next();
            //Chat.add(0,String(value.type),String(value.severity),value.message,0,0);
            if (value.severity == 3 && value.type == 'access' && value.message.indexOf("transfer starting for")> -1) 
            {
                var fsize = value.message.match(/transfer starting for [^\(]+\(([0-9]+)/);
                //Chat.add(0,"FileSizeZZZZZ",String(value.severity),fsize,0,0);
            }
            else if (/*value.severity == 3 &&*/ value.type == 'access' && value.message.indexOf("answer=550") > -1) 
            {
                Chat.add(0, "ERROR", 0, "File Not Found!", 0, 0);
                Video.fileFinderTimerId = 0;
                Video.vlc.log.verbosity = 0;
                Video.vlc.log.messages.clear();
                return;
            }
            else if (value.message.indexOf("p_view is NULL and should not!") > -1) 
            {
                Chat.add(0, "ERROR", 0, "p_view is NULL and should Not!(FIXME)", 0, 0);
                Video.fileFinderTimerId = 0;
                Video.vlc.log.verbosity = 0;
                Video.vlc.log.messages.clear();
                return;
            }
            if(fsize && fsize.length > 1 )
            {
                Video.fileSize = Number(fsize[1]);
                //Chat.add(0,"FileSize",0,Video.fileSize,0,0);
                Video.vlc.log.verbosity = 0;
                Video.vlc.log.messages.clear();
                Video.fileFinderTimerId = 0;
                if (Video.fileSize >= minSize) 
                {
                    onFound();
                }
                return;
            }
        }
        if(!Video.fileSize)
            Video.fileFinderTimerId = setTimeout("Video.findFileSize("+onFound+","+minSize+","+recall+")",2000);
    };
    Video.vsdClick = function()
    {
        if (Live) 
        {
            alert("You can't use this feature When in Live Mode");
            return;
        }

        if(Video.vlc.input.state != 0)
       		Video.stop();

        //if(!moronIE) //hack for VLC hasVout
           // wait(100);
        var _loop = 0;
        while(Video.vlc.input.state && ++_loop < 500000);

        Video.clearPlayList();
        //Video.vlc.log.verbosity = 3;

        if(!Video.open('ftp://habs:live@maya.aleajecta.com:21/'+this.vsdFileName))
            return;

        _loop = 0;
        while(Video.vlc.input.state && ++_loop < 500000);

        _loop = 0;
        while(Video.vlc.input.state && ++_loop < 500000);
        if (Video.vlc.playlist.items.count) 
        {
            Video.vlc.playlist.play();
        }
        Tab.mouseup(GetElementById('tabChat'));
    };
	Video.updateVSD = function(newVSD)
    {	
        if(Video.configVSD && (newVSD.toSource() == Video.configVSD.toSource()))
            return;
        
        Video.configVSD = newVSD;
        //Live Mode Update
        
		if(Live != Video.configVSD.Live)
		{
            if (Video.configVSD.Live)
			{

                if(Video.vlc.input.state == 3 || Video.vlc.input.state == 4)
       		        Video.stop();
                
                while(Video.vlc.input.state);
                Video.clearPlayList();

                //Video.vlc.log.verbosity = 3;
                Video.open('ftp://habs:live@maya.aleajecta.com:21/'+StreamName);
                Video.findFileSize(function()
		        {
		            Video.goLive();
		        },Video.liveBuffer);
		        while(Video.vlc.input.state);
		        Video.vlc.playlist.play();
                Video.eleLiveMode.style.color = "red";
                Video.eleLiveMode.innerHTML = "Mode...";
                setTimeout('Video.eleLiveMode.innerHTML = "L"',5000);
                setTimeout('Video.eleLiveMode.innerHTML = "LI"',6000);
                setTimeout('Video.eleLiveMode.innerHTML = "LIV"',7000);
                setTimeout('Video.eleLiveMode.innerHTML = "LIVE"',8000);
		        setTimeout('Video.eleLiveMode.innerHTML = "LIVE!"',9000);
                setTimeout('Video.eleLiveMode.style.color = ""',13000);
			}
            else
            {
                Video.eleLiveMode.style.color = "red";
                Video.eleLiveMode.innerHTML = "Mode...";
                setTimeout('Video.eleLiveMode.innerHTML = "V"',5000);
                setTimeout('Video.eleLiveMode.innerHTML = "VS"',6000);
                setTimeout('Video.eleLiveMode.innerHTML = "VSD"',7000);
                setTimeout('Video.eleLiveMode.style.color = ""',11000);
            }
            Live = Video.configVSD.Live;
		}

        //Video Sur Demande Update
        while(Video.eleVSD.childNodes && Video.eleVSD.childNodes.length) 
        {
            var _first = Video.eleVSD.removeChild(Video.eleVSD.childNodes[0]);
            while (_first.childNodes && _first.childNodes.length) 
            {
                var _second = _first.removeChild(_first.childNodes[0]);
                _second = null;
            }
            _first = null;
        }
        var _lastChild,_split;
        for(var itr in Video.configVSD.file)
        {
            if(typeof(String(Video.configVSD.file[itr])) == "undefined")
                continue;

            Video.eleVSD.appendChild(CreateElement('div'))
            _lastChild = Video.eleVSD.lastChild;
            _lastChild.align="center";
            _split = Video.configVSD.file[itr].split("|");
            _lastChild.vsdFileName = _split[0];
            _lastChild.innerHTML = _split[1];
            _lastChild.onmouseup = Video.vsdClick;

        }
    };
})();
Mouse.onMouseUp.push(function()
{
    if(!Video.sliderClickTimerId)
        return;
        
    clearTimeout(Video.sliderClickTimerId);
    Video.sliderClickTimerId = null;
    Video.eleSliderButton.style.backgroundColor = "";
    if(Video.vlc.input.state == 3 || Video.vlc.input.state == 4)
   	    Video.vlc.input.position = Video.eleSliderButton.offsetLeft/450;
       
});
commonInit.push(function()
{
    Video.elePlay = GetElementById("play");
    Video.elePause = GetElementById("pause");
    Video.eleStop = GetElementById("stop");
    Video.eleFast = GetElementById("faster");
    Video.eleSlow = GetElementById("slower");
    Video.eleVUp = GetElementById("volumeUp");
    Video.eleVDown = GetElementById("volumeDown");
    Video.eleVDisplay = GetElementById("volumeDisplay");
    Video.eleDisplay = GetElementById("vlcMessage");
    Video.eleVSD = GetElementById("vsdBox");
	Video.eleSliderButton = GetElementById("sliderButton");
    Video.eleSlider = GetElementById("sliderBar");
    Video.eleLiveMode = GetElementById("titleStatus");
    
    //Video.eleVSD.onmouseover = Scroll.setScrollMe;
   // Video.eleVSD.onmouseout = Scroll.unSetScrollMe;
    
    Video.eleVUp.onmouseup = Video.eleVDown.onmouseup = Video.eleVUp.onmouseout = Video.eleVDown.onmouseout = Video.vOut_Up;
    
    if(moronIE)
        Video.vlc = vlc;
    else
        Video.vlc = GetElementById("vlc");
    
    if(!Video.vlc.input) //Don't have VLC installed
        return;

	Video.eleVDisplay.innerHTML = Video.vlc.audio.volume < 20 ? "0"+String(Video.vlc.audio.volume/2) : String(Video.vlc.audio.volume/2);;
	
    Video.intervalId = setInterval('Video.update()',50);
   // setInterval(Video.updateVSD,6000); //Should go into Chat Update
    setInterval(Video.updateSlider,1000);
  /*  setInterval(function()
    {
        var value = '';
        var itr = Video.vlc.log.messages.iterator();
        while(itr.hasNext)
        {
            value = itr.next();
            Chat.add(0,value.severity,0,value.type+" : "+value.message)
        }
        Video.vlc.log.messages.clear();
        Chat.refreshDisplay();
    },1000);*/
    
});