/**
* @author Ivan Kravets aka X-MAN <Admin@relax-info.com>
* @copyright IA Cursor 2005
* @package Calendar
* @version 3.1
* @desc Calendar class
*/
var calendar = new Object();
calendar =
{
	/**
	* @var object current_date
	* @desc Get current date
	*/
	current_date: new Date(),
	
	/**
	* @var integer current_day
	* @desc Get current day
	*/
	current_day: 0,
	
	/**
	* @var integer current_month
	* @desc Get current month
	*/
	current_month: 0,
	
	/**
	* @var integer current_year
	* @desc Get current year
	*/
	current_year: 0,
	
	/**
	* @var integer sel_month
	* @desc Selected Month
	*/
	sel_month: 0,
	
	/**
	* @var integer sel_year
	* @desc Selected Year
	*/
	sel_year: 0,
	
	/**
	* @var array data_arr
	* @desc Data array
	* [0] - day in month
	* [1] - check exist new data
	* [2] - url new page
	*/
	data_arr: new Array(),
	
	/**
	* @var array data_new_arr
	* @desc New data array
	* [0] - day in month
	* [1] - url new page
	*/
	data_new_arr: new Array(),
	
	/**
	* @var array day_week_arr
	* @desc Name day week array 
	*/
	day_week_arr: new Array(),
	
	/**
	* @var array style_class
	* @desc Style class
	*/
	style_class: new Array(),
	
	/**
	* @var array cache_arr
	* @desc Cache array
	*/
	cache_arr: new Array(),
	
	/**
	* @var object script
	* @desc Create element SCRIPT
	*/
	script: document.createElement("SCRIPT"),
	
	/**
	* @var object main_part
	* @desc Calendar's main part
	*/
	main_part: null,
	
	/**
	* @param integer month
	* @param integer year
	* @desc Constructor Calendar's class
	* - forming calendar
	*/
	__construct: function(month, year)
	{
		this.main_part = document.getElementById("calendar_body");
		
		//set current date params
		this.current_day = this.get_current_day();
		this.current_month = this.get_current_month();
		this.current_year = this.get_current_year();
		
		this.correct_selected_date(month, year);
		
		this.prepare_data();
		
		// Display calendar
		this.form_style_class();
		body = this.display();
		// Set cache
		this.set_cache(body);
		// clear temporary data
		this.data_new_arr = new Array();
		this.main_part.innerHTML = body;
	
	},
	
	/**
	* @return void
	* @desc Forming style class (CSS)
	*/
	form_style_class: function()
	{
		this.style_class['text'] = "block_head_1";		
		this.style_class['day'] = "calendar_date";		
		this.style_class['day_red'] = "calendar_date";		
		this.style_class['week'] = "calendar_date_dayweek";		
		this.style_class['week_day'] = "calendar_date_dayweek";		
		this.style_class['week_day_red'] = "calendar_date_dayweek";		
		this.style_class['today'] = "calendar_today";		
	}, 
	
	/**
	* @return integer
	* @desc Get current day
	*/
	get_current_day: function()
	{
		return this.current_date.getDate();	
	},
	
	/**
	* @return integer
	* @desc Get current month
	*/
	get_current_month: function()
	{
		var month = this.current_date.getMonth() + 1;
		return month;	
	},
	
	/**
	* @return integer
	* @desc Get current day
	*/
	get_current_year: function()
	{
		return this.current_date.getFullYear();	
	},
	
	/**
	* @return void
	* @param integer month
	* @param integer year
	* @desc Correct selected date
	*/
	correct_selected_date: function(month, year)
	{
		if(parseInt(month)>0) this.sel_month = month;
		else this.sel_month = this.current_month;
		
		if(parseInt(year)>0) this.sel_year = year;
		else this.sel_year = this.current_year;
	},
	
	/**
	* @return integer
	* @desc Get total day in month
	*/
	get_total_day: function()
	{
		var day_offset = 32;
		var tmp_date = new Date(this.sel_year, this.sel_month - 1, day_offset);
		var total_day = day_offset - tmp_date.getDate();
		
		return total_day;
	},
	
	/**
	* @return integer
	* @param string type
	* @desc Get week day in month by type
	* first - fisrt week day in month (default 1 date)
	* last - last week day in month
	* default - current_week day in month
	*/
	get_week_day: function( type )
	{
		var week_day = 0;
		var tmp_date = null;
		var west_week_day = 0;
		
		switch (type)
		{
			case "first":
							tmp_date = new Date(this.sel_year, this.sel_month - 1, 1);
							break;
							
			case "last":
							var last_day = this.get_total_day();
							tmp_date = new Date(this.sel_year, this.sel_month - 1, last_day);
							break;
			default:
							tmp_date = new Date(this.sel_year, this.sel_month - 1, this.current_day);
							break;
							
		}
		
		west_week_day = tmp_date.getDay();
		(west_week_day == 0)? week_day = 7 : week_day = west_week_day;
		
		return week_day;	
	},
	
	/**
	* @return void
	* @desc Prepare data, combine new data with old data
	*/
	prepare_data: function()
	{
		var tmp_arr = new Array();
		var total_day = this.get_total_day();
		this.data_arr = new Array(total_day);

		for (var i = 0; i<total_day; i++)
		{
			tmp_arr = new Array(i+1, false, null);
			this.data_arr[i] = tmp_arr;
		}
		
		var total_new_day = this.data_new_arr.length;
		for (var j = 0; j<total_new_day; j++)
		{
			this.data_arr[this.data_new_arr[j][0]-1][1] = true;
			this.data_arr[this.data_new_arr[j][0]-1][2] = this.data_new_arr[j][1];
		}
	},
	
	/**
	* @return void
	* @desc Display calendar in html look
	*/
	display: function()
	{
		var body = "";
		
		body = "<TABLE border=0 celpadding=0 cellspacing=1 width=100% class=" + this.style_class['text'] + ">";
		
		body += this.form_week_day();
		body += this.form_main_part()
		
		body+="</TABLE>";
		
		return body;
	},
	
	/**
	* @return string
	* @desc Forming week day (HTML)
	*/
	form_week_day: function()
	{
		var total_day_week = this.day_week_arr.length;
		var body = "<TR>";		
		
		for (var i = 0; i<total_day_week; i++)
		{
			(i>4)? body += "<TD align=center class=" + this.style_class['week_day_red'] + ">" + this.day_week_arr[i].toUpperCase() + "</TD>" : body += "<TD align=center class=" + this.style_class['week_day'] + ">" + this.day_week_arr[i].toUpperCase() + "</TD>";
		}
		
		body += "</TR>";
		
		return body;	
	},
	
	/**
	* @return string
	* @desc
	*/
	form_main_part: function()
	{
		var body = "<TR bgcolor=#FFFFFF>";
		var first_week_day = this.get_week_day("first");
		var last_week_day = this.get_week_day("last");
		var total_data_day = this.data_arr.length;
		
		for (var i = 1; i<=first_week_day; i++)
		{
			if (i == first_week_day) break;
			else body += "<TD></TD>";
		}
		
		for (var j = 0; j<total_data_day; j++)
		{
			if (i == 8)
			{
				body += "</TR><TR bgcolor=#FFFFFF>";
				i = 1;
			}
			
			body += this.form_day(this.data_arr[j], i);
			
			i++;
		}
		
		last_week_day = 7 - last_week_day;
		for (var i = 0; i<last_week_day; i++)
		body += "<TD></TD>";
		
		body += "</TR>";
		
		return body;
	},
	
	/**
	* @return string
	* @param array data_arr
	* @param integer week_day
	* @desc Form day with needed style class
	*/
	form_day: function(data_arr, week_day)
	{
		var td = "<TD align=center ";
		var link = "<A href=" + data_arr[2] + ">" + data_arr[0] + "</A>"
		
		if (data_arr[0] == this.current_day && this.sel_month == this.current_month && this.sel_year == this.current_year)
		{
			td += "class=" + this.style_class['today'] + ">";
			
			(data_arr[1])? td += link  : td += data_arr[0];
		}
		else
		{
			(week_day == 6 || week_day ==7)? td += "class=" + this.style_class['day_red'] + ">" : td += "class=" + this.style_class['day'] + ">";
			
			(data_arr[1])? td += link : td += data_arr[0];			
		}

		td += "</TD>";
		
		return td;
	
	},
	
	/**
	* @return void
	* @param string body
	* @desc Set Cache
	*/
	set_cache: function(body)
	{
		this.cache_arr[this.cache_arr.length] = new Array(this.sel_month, this.sel_year, body);
	},
	
	/**
	* @return void
	* @desc Reload Calendar, check on chaching month
	*/
	reload: function()
	{
		var d = document;
		var month = d.all.calendar_month.value;
		var year = d.all.calendar_year.value;
		var check_cache = false;
		var main_part_height = this.main_part.offsetHeight;
		var cache_body = "<TABLE border=0 cellpadding=0 cellspacing=0 width=100% height=" +main_part_height + " class=" + this.style_class['text'] + "><TR><TD align=center valign=middle>Loading...</TR></TR></TABLE>";
		
		for (var i = 0; i<this.cache_arr.length; i++)
		{
			if (this.cache_arr[i][0] == month && this.cache_arr[i][1] == year)
			{
				check_cache = true;
				cache_body = this.cache_arr[i][2];
				break;
			}
			else check_cache = false;
		}
		
		if(check_cache) this.main_part.innerHTML = cache_body;
		else
		{
			this.main_part.innerHTML = cache_body;
			
			this.script.src = SITE_URL+LANG_URL+"calendar/js/"+month+"/"+year;
			this.script.id = "cal_data";
			this.script.name = "cal_data";
			d.body.appendChild(this.script);
		}
	}
}