/*
* Скрипт реализующий горизонтальный скроллер бар
* обрататывает события перемещения скроллера мышью,
* клик по линнии скролла
* прокрутка колесом мыши.
* Автоподгон ширины скроллера
*/

Scroll = function (scroller, scroller_bar, menu)
{
    this.canDrag = false;
    this.prepared = false;

    this.shift_x;
    this.delta;

    this.scroller = scroller;
    this.scrollerBar = scroller_bar;
    this.menu = menu;

    this.scrollerStartShift;
    this.menuStartShift;

    this.scrollerTrackWidth = 350;
    this.menuTrackWidth;

    this.scrollerWidth;
    this.menuWidth = 350;

    this.step;

    this.dontmove = false;

    this.a = false;

    this.prepare = function()
    {
        if($(this.scroller) && $(this.menu))
        {
            
        	this.scroller = $(this.scroller);
            this.scrollerBar = $(this.scroller_bar);
            this.menu = $(this.menu);
            
            this.scrollerStartShift = parseInt(this.scroller.style.left);
            this.menuStartShift = parseInt(this.menu.style.marginLeft);
            
            this.menuTrackWidth = this.menu.offsetWidth + this.menuStartShift;
            
            this.scrollerWidth = Math.round( (this.menuWidth * this.scrollerTrackWidth) / this.menuTrackWidth );
            
            // 8 px - ширина стрелки => минимальная ширина скроллера 16px        
            this.scrollerWidth = (this.scrollerWidth < 16) ?  16 : this.scrollerWidth;
            
            // максимальная ширина скроллера - ширина трэка
            this.scrollerWidth = (this.scrollerWidth > this.scrollerTrackWidth) ?  this.scrollerTrackWidth : this.scrollerWidth;
            
            // устанавливаем ширину скроллера 
            this.scroller.style.paddingRight = this.scrollerWidth - 8 + "px";
            
            // теперь принимаем за скроллер точку (его левую границу), все расчеты будем производить относительно нее
            // задаем ширину трэка скроллера и меню
            this.scrollerTrackWidth -= this.scrollerWidth;
            this.menuTrackWidth -= this.menuWidth;
            
            // рассчитываем коэффициэнт
            this.delta = this.menuTrackWidth / this.scrollerTrackWidth;
            this.prepared = true;
        }
        return false;
    }

    this.fixForBrowsers = function(event)
    {
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        if(event.stopPropagation) event.stopPropagation();
        else event.cancelBubble = true;
        if(event.preventDefault) event.preventDefault();
        else event.returnValue = false;
    }

    this.setStep = function()
    {
        //step = Math.round(scrollerWidth / 3 * 2);
        this.step = Math.round(this.menu.getElementsByTagName("td")['0'].offsetWidth * this.scrollerTrackWidth / this.menuTrackWidth);    
    }

    this.setPosition = function(newPosition)
    {
        if(newPosition <= this.scrollerTrackWidth + this.scrollerStartShift && newPosition >= this.scrollerStartShift)
        {
            this.scroller.style.left = newPosition + "px";
        }
        else
        {
            if(newPosition >= this.scrollerTrackWidth + this.scrollerStartShift)
            {        
                this.scroller.style.left = this.scrollerTrackWidth + this.scrollerStartShift + "px";
            }
            if(newPosition < this.scrollerStartShift)
            {
                this.scroller.style.left = this.scrollerStartShift + "px";
            }
        }
        //console.log("this.scroller.style.left: " + parseInt(this.scroller.style.left) + " \nthis.scrollerStartShift: " + this.scrollerStartShift + " \nthis.delta: " + this.delta + " \nthis.menuStartShift: " + this.menuStartShift)
        this.menu.style.marginLeft = Math.round( (parseInt(this.scroller.style.left) - this.scrollerStartShift) * this.delta * (-1) ) + this.menuStartShift + "px";
        return false;
    }

    this.drag = function(event)
    {
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        if (this.prepared)
        {
            this.canDrag = true;
            this.shift_x = event.clientX - parseInt(this.scroller.style.left);
            this.fixForBrowsers(event);
        }    
        return false;
    }

    this.movescroller = function(event)
    {
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        if (this.prepared && !this.dontmove)
        {
            this.setStep();
            var clickX = event.layerX ? event.layerX : event.offsetX;
            var currentPosition = parseInt(this.scroller.style.left);               
            var i = (clickX > currentPosition) ? 1 : -1;
            var newPosition = 2*i*this.step + parseInt(this.scroller.style.left); 
            this.setPosition(newPosition);
            this.fixForBrowsers(event);
        }
        else
        {
            this.dontmove = false;
        }
        return false;
    }

    this.move = function(event)
    {
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        if (this.prepared && this.canDrag)
        {
            this.setPosition(event.clientX-this.shift_x);
            this.fixForBrowsers(event);
        }
        return false;
    }

    this.drop = function()
    {
        this.canDrag=false; 
    }
    
    this.scrollerClickHandler = function()
    {
        this.dontmove=true;    
    }    

    this.handle = function(delta, event) 
    {
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        var i = (delta < 0) ? 1 : -1;
        this.setStep()
        var currentPosition = parseInt(this.scroller.style.left);               
        var newPosition = i*this.step + currentPosition; 
        this.setPosition(newPosition);        
        this.fixForBrowsers(event);        
    }

    this.cancelWheelAction = function(event)
    {
        /*
        Отменяем действие колеса
        */
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        if (event.preventDefault)
        {
            event.preventDefault();
        }
        event.returnValue = false;
    }

    this.wheel = function(event)
    {
        var delta = 0;
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        if (event.wheelDelta) 
        {
            // IE/Opera.
            delta = event.wheelDelta/120;
            
            // В Opera 9, значение delta не отличается по знаку от значения в IE.
            if (window.opera)
            {
                delta = delta;
            }
        } 
        else if (event.detail) 
        {
            /* 
            Заточка под Mozilla
            В Mozilla, значение delta отличается по знаку от значения в IE.
            Обычно, delta умножается на 3.
            */    
            delta = -event.detail/3;
        }
        /*
        Если delta отлична от 0 - юзаем ее
        Если скроллить вверх, то delta > 0
        Если скролить вниз - delta < 0
        */
        if (delta)
        {
            this.handle(delta, event);
            this.cancelWheelAction(event);
            this.fixForBrowsers(event);
            return false;
        }
    }
}

function handleOnMouseUp(event){first.drop(event);}
function handleOnMouseMove(event){first.move(event);}
function handleOnClickBarFirst(event) {first.movescroller(event);}
function handleOnMouseDownFirst(event){first.drag(event);}
function handleOnClickFirst(event) {first.scrollerClickHandler(event);}
function handleOnMouseWheelFirst(event){first.wheel(event);}


function bakeScroll(){
	document.onmousemove = handleOnMouseMove;
	window.onmouseup = handleOnMouseUp;
	$('scroller_bar').onclick = handleOnClickBarFirst;    
	$('scroller').onmousedown = handleOnMouseDownFirst;
	$('scroller').onmouseup = handleOnMouseUp;
	$('scroller').onclick = handleOnClickFirst;    
	
	/* Инициализация обработчика колеса мыши */
	if ($('scrollme').addEventListener) $('scrollme').addEventListener('DOMMouseScroll', handleOnMouseWheelFirst, false);
	$('scrollme').onmousewheel = handleOnMouseWheelFirst;

	first = new Scroll('scroller', 'scroller_bar', 'movemenu');
    $("scroller").style.left = 0;
	$("movemenu").style.marginLeft = 0;
	
	first.prepare();			
}

function makeAfisha(){
	
	function substr( f_string, f_start, f_length ) {
	    f_string += '';
	    if(f_start < 0) f_start += f_string.length;
	    if(f_length == undefined) f_length = f_string.length;
	    else if(f_length < 0) f_length += f_string.length;
	    else f_length += f_start;
	    if(f_length < f_start) f_length = f_start;
	    return f_string.substring(f_start, f_length);
	}	
	
	function str_replace(search, replace, subject) {
	    // *     example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
	    // *     returns 1: 'Kevin.van.Zonneveld'
	    // *     example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');
	    // *     returns 2: 'hemmo, mars'
	 
	    var s = subject;
	    var ra = r instanceof Array, sa = s instanceof Array;
	    var f = [].concat(search);
	    var r = [].concat(replace);
	    var i = (s = [].concat(s)).length;
	    var j = 0;
	    
	    while (j = 0, i--) { if (s[i]) { while (s[i] = (s[i]+'').split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){};}}
	    return sa ? s : s[0];
	}	
	
	function ajaxLib(){
		var req = null;
		var READY_STATE_COMPLETE = 4;
		
		function initRequest()	{
			var xRequest = null;
			if (window.XMLHttpRequest) xRequest = new XMLHttpRequest();
			else if (window.ActiveXObject) xRequest = new ActiveXObject("Microsoft.XMLHTTP");
			return xRequest;
		}
	
		function prepearContetnt(data){
			if (typeof(data)!='object')	return false;
			var _length = data.length;
			var html = '';
			for (i = 0; i < _length; i++) {
				if (typeof(data[i])=='object')	{
					var __length = data[i].length;
					for (j = 0; j < __length; j++) {
						data[i][j] = str_replace(['&nbsp;','&amp;','&raquo;'],'',data[i][j])
					}					
					
					html += "<td><a href='" + data[i][3] + "' title='" + data[i][0] + "'><img src='http://img.afisha.tut.ua/75x57/events/" + data[i][6]+ "'><\/a><\/td>";
					html += "<td><div style='width: 80px; padding: 0 5px;'><small>";
					html += "<a href='" + data[i][3] + "' title='" + data[i][0] + "'><b>" + substr(data[i][0],0,23)+ "<\/b><\/a><br>";
					html += "<i>" + substr(data[i][2],-5)+ "<\/i><br>";
					html += "<a href='" + data[i][5] + "' title='" + data[i][4] + "'>" + substr(data[i][4],0,10)+ "</a><br>";
					html += "<\/small><\/div><\/td>\n";
					/* var __length = data[i].length;
					for (j = 0; j < __length; j++) {
						console.log(j + ". " + data[i][j]);
					}*/
				}
			}
			return html;
		}
		
		function onReadyState()	{
			var ready = req.readyState;
			if (ready == READY_STATE_COMPLETE){
				var out = req.responseText;
				words = eval('(' + out + ')');
	
				var cinema = prepearContetnt(words['cinema']);
				var theatre = prepearContetnt(words['theatre']);
				var club = prepearContetnt(words['club']);

				$('scrollme').innerHTML = "<table style='margin-left: 0px;' id='movemenu'><tr>" + cinema + theatre + club + '<\/tr><\/table><div class="scrolling_line" id="scroller_bar"><img id="scroller" alt="" width="8" src="http://lib.tut.ua/img/toddler_l.gif"><\/div>';
				setTimeout("bakeScroll()",500);
				$('afisha_data').style.background = '';
			}
		}
		
		this.sendRequest = function(url,params,HttpMethod){
			if (!HttpMethod)HttpMethod = "GET";
			
			req = initRequest();
			if (req) {
				req.onreadystatechange = onReadyState;
				req.open(HttpMethod,url,true);
				req.setRequestHeader("Content-Type","text/xml");
				req.send(params);
			}
		}
	}
	
	request = new ajaxLib()
	request.sendRequest("/json/afisha/");
}