/*
    MooG v0.1
    (c) Marcin Baszczewski <http://baszczewski.pl>
    MIT-style license.
*/
var MooG = new Class(
{
    Implements: [Events, Options],
    options: 
    {
	fps:50,
	speed: 1,
	gear:10,
	tips:false,
	scroolArea:1, 
	autoScroll:false,
	debug:'',
	slider:false,
	thumbnails:false,
	thumbnailScale:0.1,
	sliderHeight:15
    },

    updateThumbnail:function()
    {
	var parent = this;

	var thumb_step = parent.thumbnails.getCoordinates().left;
	if  (parent.element.getCoordinates().width==parent.div_slider.getCoordinates().width)
	{
	    var thumb_left = parent.horizontal.getStyle('left').toInt();
	    var thumb_prog = thumb_left / (parent.element.getCoordinates().width-parent.horizontal.getCoordinates().width);
	    thumb_step = thumb_left*(parent.thumbnails.getCoordinates().width/parent.horizontal.getCoordinates().width) + (thumb_prog*(parent.div_slider.getCoordinates().width-parent.div_knob.getCoordinates().width));
	}
	if (parent.thumbnails.getCoordinates().left != thumb_step)
	    parent.thumbnails.set('styles',{left: thumb_step});
    },

    updateSlider:function()
    {
	var parent = this;
	var m_left = parent.horizontal.getStyle('left').toInt();
	parent.slider.set(Math.abs(m_left));
    },

    autoUpdate:function()
    {
	var parent = this;

	setTimeout(function(){parent.autoUpdate();},1000/parent.options.fps);
	if (parent.enabled==false)
	    return;

	var m_left = parent.speed+parent.horizontal.getStyle('left').toInt();

	var limit_left = 0;
	var limit_right = parent.element.getCoordinates().width-parent.horizontal.getCoordinates().width;

	if (m_left > limit_left) m_left = limit_left;
	if (m_left < limit_right) m_left = limit_right;

	if (parent.horizontal.getStyle('left').toInt() != m_left)
	    parent.horizontal.set('styles',{left:m_left});


	if (parent.options.thumbnails==true)
	    parent.updateThumbnail();

	if (parent.options.slider==true)
	    parent.updateSlider();
    },

    autoScrool:function()
    {
	var parent = this;

	if (parent.options.debug!='')
	    $(parent.options.debug).set('html','<br/>[AUTO SCROOLING]');

	var m_left = 0;
	var m_duration = 0;

	if (parent.forward==true)
	{
	    m_left = parent.element.getCoordinates().width-parent.horizontal.getCoordinates().width;
	    m_duration = m_left - parent.horizontal.getStyle('left').toInt();
	}
	else
	{
	    m_left = 0;
	    m_duration = parent.horizontal.getStyle('left').toInt();
	}
	m_duration = Math.sqrt(m_duration*m_duration)/parent.element.getCoordinates().width*17000/parent.options.speed;

	parent.horizontal.set('morph',
	{
	    fps:parent.options.fps,
	    duration:m_duration,
	    transition:Fx.Transitions.linear,
	    onComplete:function()
	    {
		parent.forward = !parent.forward;
		parent.autoScrool();
	    }
	}).morph({left: m_left});
    },

    prepareThumbnails:function()
    {
	var parent = this;

	var m_width = 0;
	images.each(function(item,index)
	{
	    m_width += Math.floor(item.width * parent.options.thumbnailScale);
	});

	var m_left = 0;
	if (m_width < parent.element.getCoordinates().width)
	    m_left = parent.element.getCoordinates().width/2 - m_width/2;
      

	var thumbnails = new Element('div',{'class':'thumbnails','styles':{'position':'relative',left:m_left,width:m_width, height: parent.options.sliderHeight,top:-parent.options.sliderHeight}}).inject(parent.element);
	thumbnails.setOpacity(0);
	parent.thumbnails = thumbnails;

	parent.images.each(function(item,index)
	{
	    var m_div = new Element('div',{'class':'img','styles':{float:'left', width:Math.floor(item.width * parent.options.thumbnailScale), height: Math.floor(item.height * parent.options.thumbnailScale)}}).inject(thumbnails);
    
	    var m_src = parent.options.dir+parent.options.thumbnailPrefix+item.src; 
	    if(window.opera)
		new Element('img',{'src':m_src}).inject(m_div);
	    else
	    {
		new Asset.images(m_src,
		{
		    onComplete:function()
		    {
			new Element('img',{'src':m_src}).inject(m_div);
		    }
		});
	    }
	});
    },

    prepareSlider:function()
    {
	var parent = this;



	var m_top = -parent.options.sliderHeight;
	if (parent.options.thumbnails)
	    m_top = -parent.options.sliderHeight*2;

	var m_width = 0;
	images.each(function(item,index)
	{
	    m_width += Math.floor(item.width * parent.options.thumbnailScale);
	});

	var m_left = 0;
	if (m_width < parent.element.getCoordinates().width)
	    m_left = parent.element.getCoordinates().width/2 - m_width/2;
	else
	    m_width = parent.element.getCoordinates().width;
	var div_slider = new Element('div',{'class':'slider','styles':{'position':'relative',left:m_left,width:m_width,height:parent.options.sliderHeight,top:m_top}}).inject(parent.element);

	if (parent.options.thumbnails)
	{
	    var m_thumbnails_height = Math.floor(parent.element.getCoordinates().height * parent.options.thumbnailScale)
	    div_slider.addEvents(
	    {
		'mouseenter':function()
		{
		    parent.thumbnails.set('morph',{duration:100,transition:Fx.Transitions.linear}).morph({height:m_thumbnails_height,top:-(m_thumbnails_height)});
		    div_slider.set('morph',{duration:100,transition:Fx.Transitions.linear}).morph({height:m_thumbnails_height,top:-(m_thumbnails_height*2)});
		},
		'mouseleave':function()
		{
		    if (parent.enabled==true)
		    {
			parent.thumbnails.set('morph',{duration:100,transition:Fx.Transitions.linear}).morph({height:parent.options.sliderHeight,top:-(parent.options.sliderHeight)});
			div_slider.set('morph',{duration:100,transition:Fx.Transitions.linear}).morph({height:parent.options.sliderHeight,top:-(parent.options.sliderHeight*2)});
		    }
		}
	    });
	}
	parent.div_slider = div_slider;
	div_slider.setOpacity(0.5);

	if (parent.options.thumbnails==true)
	div_slider.addEvents(
	{
	    'mouseenter':function()
	    {
		parent.thumbnails.fade(1);
		parent.mouseSlider = true;
	    },
	    'mouseleave':function()
	    {
		if (parent.enabled==true)
		parent.thumbnails.fade(0);
		parent.mouseSlider = false;
	    }
	});

	var knob_width = parent.element.getCoordinates().width* parent.options.thumbnailScale;
	var div_knob = new Element('div',{'class':'knob','styles':{width:knob_width,height:'100%'}}).inject(div_slider);
	parent.div_knob = div_knob;
	var m_range = parent.element.getCoordinates().width-parent.horizontal.getCoordinates().width;
	m_range = Math.sqrt(m_range*m_range);
	parent.last_value = 0;
	var slider = new Slider(div_slider, div_knob, 
	{
	    range:[0,m_range],
	    onChange: function(value)
	    {
		if (parent.last_value < value)
		    parent.forward = true;
		if (parent.last_value > value)
		    parent.forward = false;

		
		if (parent.horizontal.getStyle('left').toInt() != -value)
		{
		    parent.horizontal.set('styles',{left:-value});
		    if ((parent.options.autoScroll==true) && (parent.enabled==true)) parent.autoScrool();
		    if (parent.options.thumbnails==true)
			parent.updateThumbnail();
		}
		parent.last_value = value;
	    }
	});
	parent.slider = slider; 
	slider.drag.addEvents(
	{
	    'start':function()
	    {
		if (parent.options.autoScroll==true) parent.horizontal.set('morph');
		    parent.enabled = false;

		if (parent.options.thumbnails==true) parent.thumbnails.fade(1);
	    },
	    'complete':function()
	    {
		parent.enabled = true;
		if (parent.options.autoScroll==true) 
		{
		    parent.autoScrool();
		    if (!parent.mouseSlider)
		    {
			parent.thumbnails.set('morph',{duration:100,transition:Fx.Transitions.linear}).morph({height:parent.options.sliderHeight,top:-(parent.options.sliderHeight)});
			div_slider.set('morph',{duration:100,transition:Fx.Transitions.linear}).morph({height:parent.options.sliderHeight,top:-(parent.options.sliderHeight*2)});
			parent.thumbnails.fade(0);
		    }
		}
		if ((parent.options.thumbnails==true) && (!parent.enabled)) parent.thumbnails.fade(0);
	    }
	});
    },

    initialize: function(element,images,options)
    {
	var parent = this;
	parent.images = images;
	parent.speed = 0;
	parent.forward = true;
	parent.element = element;
	parent.enabled = true;
	parent.setOptions(options);
	
	element.addClass('moog');
	
	var m_width = 0;
	var m_scroolBarWidth = 0;
	var m_height = element.getCoordinates().height;
	
	var horizontal = new Element('div',{'styles':{overflow:'hidden', position:'relative', left:0, top:0}}).inject(element);
	parent.horizontal = horizontal;
	
	images.each(function(item,index)
	{
	    m_width += item.width;
	    m_scroolBarWidth += Math.floor(item.width * parent.options.thumbnailScale);
	    var m_div = new Element('div',{'class':'img','styles':{float:'left', width:item.width, height: item.height}}).inject(horizontal);
	    
	    if (parent.options.tips==true)
	    {
		m_div.set('rel',item.text);
		m_div.set('title',item.title);
		var m_tip = new Tips({'className':'moog'});
		m_tip.attach(m_div);
	    }
	    var temp_images = [parent.options.dir+item.src];

	    if(window.opera)
	    {
		new Element('img',{'src':temp_images[0]}).inject(m_div);
	    }
	    else
	    {
		new Asset.images(temp_images,
		{
		    onComplete:function()
		    {
			new Element('img',{'src':temp_images[0]}).inject(m_div);
		    }
		});
	    }
	});
	horizontal.set('styles',{width:m_width, height:m_height});

	var m_thumbnail_width = m_scroolBarWidth;
	if (m_scroolBarWidth>element.getCoordinates().width)
	    m_scroolBarWidth = element.getCoordinates().width;
	
	if (parent.options.autoScroll==true)
	    parent.autoScrool();

	horizontal.addEvents(
	{
	    'mouseenter':function()
	    {
		//turn off autoScrool
		if ((parent.options.autoScroll==true) && (parent.enabled==true)) parent.horizontal.set('morph');
	    },
	    'mouseleave':function()
	    {
		//turn on autoScrool
		if ((parent.options.autoScroll==true) && (parent.enabled==true)) parent.autoScrool();
		parent.speed = 0;
	    }
	});
	setTimeout(function(){parent.autoUpdate();},1000/parent.options.fps);

	if (parent.options.scroolArea!=0)
	horizontal.addEvent('mousemove', function(e)
	{
	    var m_speed = element.getCoordinates().width/10;
	    var m_left = e.client.x - element.getCoordinates().left;
	    var m_right = e.client.y - element.getCoordinates().top;
	    var m_width = element.getCoordinates().width;
	    var m_height = element.getCoordinates().height;

	    var gear = parent.options.gear;
	    var part = m_width/2*parent.options.scroolArea/gear;
	    var temp = m_width-m_width/2*parent.options.scroolArea;

	    var speed = 0;
	    for (i=1;i<=gear;i++)
	    {
		if ( (m_left-temp >= (part*(i-1))) && (m_left-temp < (part*(i))) )
		{
		    speed = -m_speed*parent.options.speed*((i/gear));
		    parent.speed = speed;
		    parent.forward = true;
		    break;
		}
		else if ( (m_left >= (part*(i-1))) && (m_left < (part*(i))) )
		{
		    speed = m_speed*parent.options.speed*(((gear+1-i)/gear));
		    parent.speed = speed;
		    parent.forward = false;
		    break;
		}
	    }
	    if (speed==0) 
		parent.speed = 0;
	    
	    if (parent.options.debug!='')
		$(parent.options.debug).set('html','<br/>[MOUSE MOVE]<br/>POS X:'+m_left+'<br/>POS Y:'+m_right+'<br/>[SPEED]<br/>'+parent.speed);
	});

	var m_slider_left = 0;
	if (m_thumbnail_width < parent.element.getCoordinates().width)
	    m_slider_left = parent.element.getCoordinates().width/2 - m_thumbnail_width/2;

	var m_slider_height = 15;
	var m_thumbnails_height = parent.element.getCoordinates().height*parent.options.thumbnailScale;
	
	if (parent.options.thumbnails==true)
	    parent.prepareThumbnails();
	
	if (parent.options.slider==true)
	    parent.prepareSlider();
    }
});
