/**
 * @author Alexey
**/
creocal = Class.create();

creocal.prototype = {
	/*
	 * Root element
	*/
	root : null,
	/*
	 * Tbody of table for dates
	 */
	calendarTableBody: null,
	/*
	 * Current Date
	 */
	currentDate: new Date(),
	/*
	 * Control Elements
	 */
	curDateElements: new Array(),
	/*
	 * Events array
	 * [year][month][day] = array(...data...)
	 */
	eventsData : new Array(),
	/*
	 * Constructor
	 */
   	initialize : function(el) {
   	  this.root = el;

	  var cc = $$('table.calendarData');
	  for(var i = 0; i < cc.length; i++)
	  {
		var tbody = cc[i];
			if(tbody.descendantOf(this.root))
			{
				this.calendarTableBody = tbody;
				break;
			}
	  }
	  
	  /****Curent date will put into .innerHTML****/ 
	  var cc = $$('.curDate');
	  for(var i = 0; i < cc.length; i++)
	  {
		var el = cc[i];
			if(el.descendantOf(this.root))
				this.curDateElements.push(el);
	  }
	  
	  /****Buttons****/
	  var cc = $$('.nextYearNav');
	  for(var i = 0; i < cc.length; i++)
	  {
		var el = cc[i];
			if(el.descendantOf(this.root))
            	Event.observe(el, 'click', this.nextYear.bindAsEventListener(el, this));
	  }

	  /****Buttons****/
	  var cc = $$('.nextMonthNav');
	  for(var i = 0; i < cc.length; i++)
	  {
		var el = cc[i];
			if(el.descendantOf(this.root))
				Event.observe(el, 'click', this.nextMonth.bindAsEventListener(el, this.root));
	  }

	  /****Buttons****/
	  var cc = $$('.previosMonthNav');
	  for(var i = 0; i < cc.length; i++)
	  {
		var el = cc[i];
			if(el.descendantOf(this.root))
				Event.observe(el, 'click', this.prevMonth.bindAsEventListener(el, this.root));
	  } 

	  /****Buttons****/
	  var cc = $$('.previosYearNav');
	  for(var i = 0; i < cc.length; i++)
	  {
		var el = cc[i];
			if(el.descendantOf(this.root))
				Event.observe(el, 'click', this.prevYear.bindAsEventListener(el, this));
	  }
	  
	  
	  this.root.url = this.root.getAttribute('url');
	  this.showMonthData();
	  if(this.root.url)
	  	this.loadEvents(this.root.url);

		//Error check
	  if(!this.calendarTableBody)
	  	alert('Can not found tbody.calendarData for dates');
	  
//	  this.rowTemplateElement.hide();
   	},
	detectStartEndDate : function()
	{
		var st = this.currentDate.firstDayOfMonth();
		var en = this.currentDate.lastDayOfMonth();
		if(st.getDay() == 0)
			st = st.subtractWeeks(1);
		if(en.getDay() == 0)
			en = en.subtractWeeks(1);			
		st = st.subtractDays(st.getDay()-1);
		en = en.addDays(7 - en.getDay());
		return {'start': st, 'end': en};
	},
	showMonthData : function()
	{
		this.clearCalendar();
		this.showCurDate();
		var dt = this.currentDate;
		var range = this.detectStartEndDate();

		for(var i = range.start; i <= range.end; i = i.addWeeks(1))
		{
			this.addRow(this.getWeekData(i), i);
		}
	},
	clearCalendar : function()
	{
      var rows = (this.calendarTableBody.tHead && this.calendarTableBody.tHead.rows.length > 0) ?
      $A(this.calendarTableBody.tBodies[0].rows) : $A(this.calendarTableBody.rows).without(this.calendarTableBody.rows[0]);

	  for(var i = 0; i < rows.length; i++)
         this.calendarTableBody.deleteRow(rows[i].rowIndex);
	},
	getWeekData : function(dt)
	{
		var data = {};

		for(var i=0;i<7; i++, dt=dt.addDays(1))
		{
			data = this.getDayData(dt, data);
			if(dt.getDay() == SUNDAY)
				break;
		}

		return data;
	},
	getDayData : function(dt, data)
	{
		var ev;
		var str = dt.getDate();
/*
		skip = true;
		try
		{
			ev = this.eventsData[dt.getFullYear()];
			ev = ev[dt.getMonth()+1];
			ev = ev[dt.getDate()];
		}
		catch(e)
		{
			skip = false;
		}

		if(skip && ev)
		{
			for(var i = 0; i < ev.length; i++)
				if(ev[0]['title'] && ev[0]['text'])
					str = str + '<br>' + "<a href=# onclick=\"creocal_showEvent('"+dt.format('%YYYY-%MM-%DD')+"', this);\">" + ev[0]['title'] + '</a>'; 
		}
*/
		data[dt.getDayAbbreviation()] = str;
		return data;
	},
	addRow : function(data, dt)
	{
		var row = this.calendarTableBody.insertRow(-1);
		this.setDataIntoRow(row, data, dt);
	},
	setDataIntoRow : function(row, data, dt)
	{
		//ToDo: set data into el Tree
		this.calendarTableBody.tBodies[0].appendChild(row);
		for(var i = 0; i<7; i++,dt=dt.addDays(1))
		{
			var cell = row.insertCell(-1);
			this.seCellStyle(dt, cell);
//			cell.onlick = creocal_showEvent;
			cell.width = '33';
            Event.observe(cell, 'click', creocal_showEvent.bindAsEventListener(cell, dt));			
			cell.innerHTML = data[dt.getDayAbbreviation()];
		}			
	},
	nextMonth : function()
	{
		var ob = getRootElByChild(this);
		ob = ob.creocal;
		ob.currentDate = ob.currentDate.addMonths(1);
		ob.showMonthData();
	},
	nextYear : function()
	{
		var ob = getRootElByChild(this);
		ob = ob.creocal;		
		ob.currentDate = ob.currentDate.addYears(1);
		ob.showMonthData();		
	},
	prevMonth : function()
	{
		var ob = getRootElByChild(this);
		ob = ob.creocal;			
		ob.currentDate = ob.currentDate.addMonths(-1);
		ob.showMonthData();		
	},
	prevYear : function()
	{
		var ob = getRootElByChild(this);
		ob = ob.creocal;		
		ob.currentDate = ob.currentDate.addYears(-1);
		ob.showMonthData(); 
	},
	showCurDate : function()
	{		
		for(var i=0; i < this.curDateElements.length; i++)
		{
			this.curDateElements[i].innerHTML = this.currentDate.format('%MMMM %YYYY');
		}
	},
	seCellStyle : function(dt, cell)
	{		
		skip = true;
		try
		{
			ev = this.eventsData[dt.getFullYear()];
			ev = ev[parseInt(dt.getMonth())+1];
			ev = ev[parseInt(dt.getDate())];
		}
		catch(e)
		{
			skip = false;
		}

		if(skip && ev){
//			if(ev.length > 1)
//				Element.addClassName(cell, 'withevent');
			for(var i = 0; i < ev.length; i++)
				if(ev[i]['style'])
				{
					Element.addClassName(cell, ev[i]['style'].unescapeHTML().strip());
					break;
				}
		}
		else
		if((Now()).format('%YYYY-%MM-%DD') == dt.format('%YYYY-%MM-%DD'))	//Today
			Element.addClassName(cell, 'todayDate');
		else
		if(this.currentDate.getMonth() > dt.getMonth())						//Previos Month
			Element.addClassName(cell, 'previosMonth');
		else if(this.currentDate.getMonth() < dt.getMonth())				//Next month
			Element.addClassName(cell, 'nextMonth');
		else																//Current Month
			Element.addClassName(cell, 'currentMonth');
	},
	
	loadEvents : function(url)
	{
		window.to = this;
		new Ajax.Request(url, 
			{   method: 'get',   
			onSuccess: function(transport) {
					 if (200 == transport.status) {
	                  var xml = transport.responseXML;					  
	                  if (typeof(DOMParser) != "undefined") {
	                   // Mozilla, Firefox, and related browsers   
	                    xml = (new DOMParser()).parseFromString(transport.responseText, "application/xml");
	                  }					  
	                  else if (typeof(ActiveXObject) != "undefined") {   
	                   // Internet Explorer.
	                     
	                    var doc = new ActiveXObject("Microsoft.XMLDOM");  // Create an empty document
	                    doc.loadXML(transport.responseText);            // Parse text into it   
	                    xml = doc;                   // Return it   
	                  }
	                  window.to.parseEvents(xml);
					}
				}
			}); 
	},
	parseEvents : function(xml)
	{
		var events = xml.getElementsByTagName('event');

		for(var i = 0; i < events.length; i++)
			this.parseEvent(events[i]);
		
		this.showMonthData();
	},
	parseEvent : function(event)
	{
//		month
		var month = event.getElementsByTagName('month');
		month = parseInt(month[0].firstChild.nodeValue);
//		day
		var day = event.getElementsByTagName('day');
		day = parseInt(day[0].firstChild.nodeValue);
//		year
		var year = event.getElementsByTagName('year');
		year = year[0].firstChild.nodeValue;
		
		if(day && month && year)
		{
			if(!this.eventsData[year])
				this.eventsData[year] = new Array();			
			if(!this.eventsData[year][month])
				this.eventsData[year][month] = new Array();			
			if(!this.eventsData[year][month][day])
				this.eventsData[year][month][day] = new Array();
			var ev = new Array();
//		title
			var d = event.getElementsByTagName('title');
			if(d.length) ev['title'] = d[0].firstChild.nodeValue;
//		text
			var d = event.getElementsByTagName('text');
			if(d.length) ev['text'] = d[0].firstChild.nodeValue;

//		popuplink
//			var d = event.getElementsByTagName('popuplink');
//			if(d.length) ev['popuplink'] = d[0].firstChild.nodeValue;
//		style
			var d = event.getElementsByTagName('style');
			if(d.length) ev['style'] = d[0].firstChild.nodeValue;
//		tooltip
//			var d = event.getElementsByTagName('tooltip');
//			if(d.length) ev['tooltip'] = d[0].firstChild.nodeValue;
//		script
//			var d = event.getElementsByTagName('script');
//			if(d.length) ev['script'] = d[0].firstChild.nodeValue;
//
			var tmp
			try{
				tmp = this.eventsData[year][month][day].length;
			}
			catch(e)
			{
				tmp = 0;
			}
			this.eventsData[year][month][day][tmp] =ev;
			
		}
	}
};

function creocal_showEvent(ev, dt)
{
	if(!$('eventsBox'))
		return;
	var ob = getRootElByChild(this);
	ob = ob.getAttribute('creocal');

	var year = dt.getFullYear();
	var month = dt.getMonth() + 1;
	var day = dt.getDate();
	skip = true;
//alert( ob.eventsData + ' = ' + year + ' = ' + month + ' = ' + day );
	try
	{
		ev = ob.eventsData[parseInt(year)];
		ev = ev[parseInt(month)];
		ev = ev[parseInt(day)];
	}
	catch(e)
	{
		skip = false;
	}
//	alert( skip );
	var str = month+'-'+day+'-'+year + '<br>';
	if(skip && ev)
	{
		for(var i = 0; i < ev.length; i++)
			if(ev[i]['text'])
				str += ev[i]['text'] + '<br>---------------<br>'; 
	}

	$('eventsBox').innerHTML = str;
}


function getRootElByChild(el)
{
	if(Element.hasClassName(el, 'creocal'))
		return el;
		else return getRootElByChild(el.parentNode);
}
var initff = function(){
	setTimeout('initf2()', 300);
}

var initf2 = function(){
	var c;
	$$('span.creocal').each(function(cal){
		if(!cal.creocal)
		{
			c = new creocal(cal);
			cal.setAttribute('creocal', c);
		}
	});
}
/*Event.observe(window,'load',initff,false);
*/
if(window.FastInit)
	FastInit.addOnLoad(initff);
	else Event.observe(window,'load',initff,false);
