var EventsList = new Class({
	
	Implements: [Options, Events],
	
	options:{
		titleEventProperty		: "title",
		contentEventProperty	: "text",
		imageEventProperty		: "image",
		
		timestampEventProperty	: "timestamp",
		
		eventClass				: "event",
		eventListClass			: "eventList",
		contentClass			: "text",
		
		onDayMouseEnter			: $empty,
		onDayMouseLeave			: $empty
	},

	events:{},
	
	initialize:function(container, options)
	{
		this.setOptions(options);
		this.container = $(container);
		
		this.mainList = new Element("ul", {"class":this.options.eventListClass});
		this.searchBus = new SearchBus();
		this.searchBus.registerCallback(this.highlight.bind(this)		, "dayHover");
		this.searchBus.registerCallback(this.unHighlight.bind(this)		, "dayOut");
		
		this.searchBus.registerCallback(this.eventHover.bind(this)		, "eventHover");
		this.searchBus.registerCallback(this.eventOut.bind(this)		, "eventOut");
		
		this.searchBus.registerCallback(this.eventsRecived.bind(this)	, "eventsRecived");
		this.searchBus.registerCallback(this.daySelection.bind(this)	, "daySelection");
		this.searchBus.registerCallback(this.dayUnSelection.bind(this)	, "dayUnSelection");
		
		this.searchBus.registerCallback(this.onInitSelection.bind(this)	, "onInitSelection");
		this.searchBus.registerCallback(this.rangeSelection.bind(this)	, "rangeSelection");
	},
	
	rangeSelection: function(range)
	{
		this.scrollingFlag = true;
	},
	
	daySelection: function(timestamp)
	{
		if(!$defined(this.events[timestamp]))
		{
			return false;
		}
		this.events[timestamp].addClass("selected");
	},
	
	dayUnSelection: function(timestamp)
	{
		if(!$defined(this.events[timestamp]))
		{
			return false;
		}
		this.events[timestamp].removeClass("selected");
	},
	
	eventHover: function(params)
	{
		var timestamp 	= params.timestamp;
		var cssClass	= params.cssClass;	
		
		if($defined(this.events[timestamp]))
		{
			this.events[timestamp].addClass(cssClass);
		}
	},
	
	eventOut: function(params)
	{
		var timestamp 	= params.timestamp;
		var cssClass	= params.cssClass;
		if($defined(this.events[timestamp]))
		{
			this.events[timestamp].removeClass(cssClass);
		}
	},
	
	eventsRecived: function(events)
	{
		this.reset();
		this.createHTML(events);
		this.scroll = new DaneMooScroll(this.container);
	},
	
	reset: function()
	{
		this.mainList.set("html", "");
		this.mainList = this.mainList.dispose();
	},
	
	createHTML: function(eventsObject)
	{
		$H(eventsObject).each(this.createHTMLDay.bind(this));
		this.mainList.inject(this.container);
	},
	
	createHTMLDay: function(dayEvents, date)
	{
		var realDate		= this.getDateString(date);
		var container 		= new Element("li", {"html":"<h1>"+realDate+"</h1>"}).inject(this.mainList);
		this.events[date]	= container;
		var eventsList		= new Element("ul").inject(container);
		
		container.addEvent("mouseenter", this.eventMouseEnter.bindWithEvent(this, [date]));
		container.addEvent("mouseleave", this.eventMouseLeave.bindWithEvent(this, [date]));
		
		if($type(dayEvents) == "object")
		{
			dayEvents = $H(dayEvents);
		}
		
		dayEvents.each(this.createHTMLEvent.bindWithEvent(this, [eventsList, date]));
	},
	
	createHTMLEvent: function(event, dayContainer, date)
	{
		var date 	= new Date(event.timestamp*1000);
		var hours 	= date.getHours().toString();
		var minutes = date.getMinutes().toString();
		if(hours.length == 1) hours = "0"+hours;
		if(minutes.length == 1) minutes = "0"+minutes;
		var time = hours+":"+minutes;
		
		var eventContainer  = new Element("li", {"class":this.options.eventClass}).inject(dayContainer);
		var title			= new Element("h2", {"html": "<span>"+time+"</span> "}).inject(eventContainer);
		var content			= new Element("div", {"class": this.options.contentClass, text:event[this.options.titleEventProperty]}).inject(eventContainer);
	},
	
	
	eventMouseEnter: function(e, date)
	{
		this.searchBus.trigger("eventHover", {timestamp:date, cssClass:"highlighted"});
	},
	
	eventMouseLeave : function(e, date)
	{
		this.searchBus.trigger("eventOut", {timestamp:date, cssClass:"highlighted"});
	},
	
	onInitSelection: function(timestamp)
	{
		if($defined(this.events[timestamp]))
		{
			this.scrollToEvent(this.events[timestamp]);
			this.scrollingFlag = false;
		}
	},
	
	highlight: function(params)
	{
		var timestamp 	= params.timestamp;
		var cssClass	= params.cssClass;	
		
		if($defined(this.events[timestamp]))
		{
			this.events[timestamp].addClass(cssClass);
			this.events[timestamp].hover = true;
			this.scrollToEvent.delay(1000, this, [this.events[timestamp]]);
			
		}
	},
	
	unHighlight: function(params)
	{
		var timestamp 	= params.timestamp;
		var cssClass	= params.cssClass;
		if($defined(this.events[timestamp]))
		{
			this.events[timestamp].hover = false;
			this.events[timestamp].removeClass(cssClass);
		}
	},
	
	scrollToEvent: function(element)
	{
		if(element.hover == false || this.scrollingFlag == false)
		{
			return false;
		}
		
		this.scroll.smoothMooScroll.cancel();
		this.scroll.smoothMooScroll.toElement(element);
	},
	
	dayMouseEnter: function(e, date)
	{
		this.searchBus.trigger("dayHover", {timestamp:date, cssClass:"highlighted"});
		this.fireEvent("onDayMouseEnter", [e, date]);
	},
	
	dayMouseLeave: function(e, date)
	{
		this.searchBus.trigger("dayOut", {timestamp:date, cssClass:"highlighted"});
		this.fireEvent("onDayMouseLeave", [e, date]);
	},
	
	getDateString: function(date){
		var milliseconds=date*1000;
		var realDate=new Date(milliseconds);
		var dateString="";
		dateString=dateString+realDate.getDate()+"/";
		dateString=dateString+(realDate.getMonth()+1)+"/";
		dateString=dateString+realDate.getFullYear();
		return dateString;
		
	}
});