 function loadDefaults() {
   var ret=new Array();
   ret["1.1.2008"]="Новый год";
   ret["7.1.2008"]="Православное Рождество Христово";
   ret["11.1.2008"]="День заповедников и национальных парков";
   ret["12.1.2008"]="День работника прокуратуры РФ";
   ret["13.1.2008"]="День российской печати<br>Cтарый Новый год";
   ret["14.1.2008"]="День трубопроводных войск";
   ret["19.1.2008"]="Крещение Господне (Святое Богоявление)";
   ret["21.1.2008"]="День инженерных войск";
   ret["25.1.2008"]="День студентов (Татьянин день)<br>День штурмана ВМФ";
   ret["27.1.2008"]="День воинской славы России (День снятия блокады Ленинграда)<br>День памяти жертв Холокоста<br>Всемирный День Таможенника";
   ret["31.1.2008"]="День брокера";
   
   ret["2.2.2008"]="День воинской славы России";
   ret["8.2.2008"]="День российской науки";
   ret["9.2.2008"]="Международный день стоматолога";
   ret["10.2.2008"]="День дипломатического работника<br>День Аэрофлота<br>День памяти А.С. Пушкина";
   ret["14.2.2008"]="День святого Валентина (День всех влюбленных)";
   ret["15.2.2008"]="День памяти воинов-интернационалистов";
   ret["18.2.2008"]="День транспортной милиции";
   ret["23.2.2008"]="День защитника отечества";
   ret["24.2.2008"]="День рождения лотереи";
   
   ret["1.3.2008"]="Первый День весны (День прихода весны)<br>Всемирный день кошек<br>Всемирный день гражданской обороны";
   ret["3.3.2008"]="Всемирный день писателя<br>Масленица";
   ret["8.3.2008"]="Международный женский день";
   ret["9.3.2008"]="День работников геодезии и картографии<br>Международный день ди-джея<br>Прощеное воскресенье";
   ret["10.3.2008"]="День архивов";
   ret["12.3.2008"]="День работников уголовно-исполнительной системы Минюста России";
   ret["15.3.2008"]="Всемирный день защиты прав потребителей";
   ret["16.3.2008"]="День работников торговли, бытового обслуживания населения и коммунального хозяйства";
   ret["17.3.2008"]="День Святого Патрика";
   ret["18.3.2008"]="День налоговой полиции";
   ret["19.3.2008"]="День подводника-моряка";
   ret["21.3.2008"]="Всемирный день поэзии";
   ret["22.3.2008"]="Всемирный день воды";
   ret["23.3.2008"]="Всемирный день метеоролога (метеорологии)";
   ret["25.3.2008"]="День работников культуры";
   ret["27.3.2008"]="День внутренних войск ВВ МВД России";
   ret["29.3.2008"]="День военного юриста";
   ret["30.3.2008"]="День защиты Земли";

   ret["1.4.2008"]="День смеха (День дурака)<br>День математика";
   ret["2.4.2008"]="День Белорусии и России";
   ret["4.4.2008"]="День Святого Исидора Севильского (покровитель Интернета и компьютеров)<br>Международный день настройщика пианино и фортепиано";
   ret["6.4.2008"]="День следственных органов<br>День геолога";
   ret["7.4.2008"]="Благовещение Пресвятой Богородицы<br>Всемирный (международный) день здоровья";
   ret["8.4.2008"]="День военкомата (военного комиссара)";
   ret["12.4.2008"]="День космонавтики и авиации<br>День Рождения Рок-н-ролла";
   ret["13.4.2008"]="День ПВО (войск противовоздушной обороны)";
   ret["15.4.2008"]="День специалиста по радиоэлектронной борьбе (РЭБ)";
   ret["18.4.2008"]="Ледовое побоище (Александр Невская битва) - Дни воинской славы России<br>Международный день памятников и исторических мест";
   ret["22.4.2008"]="День защиты (охраны) окружающей среды";
   ret["26.4.2008"]="День защиты интеллектуальной собственности<br>День защиты смежных и авторских прав";
   ret["27.4.2008"]="Православная Пасха (Паска)";
   ret["28.4.2008"]="День охраны труда";
   ret["29.4.2008"]="День Мамы (Матери)<br>Международный день танца";
   ret["30.4.2008"]="День пожарной охраны (день пожарника)";
   
   ret["1.5.2008"]="День весны и труда";
   ret["5.5.2008"]="День водолаза<br>День шифровальщика (кодировщика)";
   ret["7.5.2008"]="День радио<br>День вооруженных сил (ВС РФ)";
   ret["9.5.2008"]="День Победы";
   ret["12.5.2008"]="День медсестер (медицинских сестер)";
   ret["13.5.2008"]="День Черноморского флота";
   ret["15.5.2008"]="Международный день семьи";
   ret["17.5.2008"]="Международный день электросвязи";
   ret["18.5.2008"]="Международный день музеев<br>День Балтийского флота";
   ret["20.5.2008"]="День памяти умерших от СПИДа";
   ret["21.5.2008"]="День Тихоокеанского флота<br>Международный день космоса и космонавта<br>День защиты от безработицы (службы занятости населения)";
   ret["24.5.2008"]="День кадровика (работника отделов кадров)<br>День славянской письменности и культуры";
   ret["25.5.2008"]="День химика (химии)<br>День филолога (филологии)<br>Последний звонок (прощай школа)";
   ret["26.5.2008"]="День предпринимателя (российского предпринимательства)";
   ret["27.5.2008"]="День библиотек и библиотекаря";
   ret["28.5.2008"]="День пограничника";
   ret["29.5.2008"]="День автомобилиста (автомобильных войск)";
   ret["31.5.2008"]="День адвокатуры (адвоката)<br>День культуры";
   
   ret["1.6.2008"]="День защиты детей";
   ret["3.6.2008"]="День мелиоратора (мелиорации)";
   ret["5.6.2008"]="День охраны окружающей среды";
   ret["6.6.2008"]="Пушкинские дни (День рождения А.С. Пушкина)";
   ret["8.6.2008"]="День социального работника<br>День легкой промышленности";
   ret["9.6.2008"]="День друзей (День рождения друга)";
   ret["12.6.2008"]="День независимости России";
   ret["13.6.2008"]="День Святого Антония, покровителя влюбленных, животных и всех отчаявшихся.";
   ret["14.6.2008"]="День миграционной службы (ФМС и паспортно-визовой службы)<br>День пива и пивовара";
   ret["15.6.2008"]="День медработника (медицинского работника)";
   ret["16.6.2008"]="День ВВЦ - Всероссийский Выставочный Центр (День ВДНХ)";
   ret["17.6.2008"]="День решения проблем с опустыниванием и засухой";
   ret["21.6.2008"]="День кинологической службы ФСКН (Дени кинолога и кинологии)";
   ret["22.6.2008"]="День памяти и скорби (начало Великой Отечественной войны (Второй Мировой войны)<br>День летнего солнцестояния (самый длинный день в году)<br>День воздушного флота (авиации ВМФ)";
   ret["25.6.2008"]="День дружбы, единения славян<br>Выпускной бал (вечер)";
   ret["27.6.2008"]="Всемирный день молодежи<br>День рыбака";
   ret["28.6.2008"]="День изобретателя и рационализатора";
   ret["29.6.2008"]="Нобелевская Премия Альфреда Нобеля";
   
   
   ret["1.7.2008"]="День архитектора и всемирный день архитектуры";
   ret["3.7.2008"]="День ГАИ (День ГИБДД)";
   ret["6.7.2008"]="День работников морского и речного флота<br>День независимости США";
   ret["10.7.2008"]="Полтавская битва (Бои под Полтавой)";
   ret["11.7.2008"]="День народонаселения";
   ret["13.7.2008"]="День почты России (День почтальона)<br>День рыбака ";
   ret["14.7.2008"]="День взятия Бастилии";
   ret["16.7.2008"]="День моря";
   ret["20.7.2008"]="День металлурга<br>День шахмат";
   ret["21.7.2008"]="Человек ступил на Луну";
   ret["23.7.2008"]="Олимпийский день";
   ret["25.7.2008"]="День системного администратора (Сисадмина)";
   ret["27.7.2008"]="День торговли<br>День Военно-морского флота (ВМФ) / День Нептуна";
   ret["28.7.2008"]="День Пиарщика (PR-специалиста) / День работников рекламы";
  
   ret["1.8.2008"]="День инкассатора и инкассации<br>День Тыла Вооруженных Сил РФ";
   ret["2.8.2008"]="День ВДВ Воздушно-десантных войск (День десантника)";
   ret["3.8.2008"]="День железнодорожника";
   ret["6.8.2008"]="День железнодорожных войск";
   ret["9.8.2008"]="День физкультурника<br>Всемирный день коренных народов мира";
   ret["10.8.2008"]="День строителя";
   ret["12.8.2008"]="День ВВС (Военно-воздушных сил)";
   ret["15.8.2008"]="День археолога (археологии)";
   ret["17.8.2008"]="День Воздушного флота (День гражданской авиации)";
   ret["22.8.2008"]="День Российского Государственного флага (День флага России)";
   ret["23.8.2008"]="Курская битва (сражение Курская Дуга)";
   ret["24.8.2008"]="День Байкала<br>День независимости Украины";
   ret["27.8.2008"]="День кино";
   ret["31.8.2008"]="День шахтера";
   
   ret["1.9.2008"]="День знаний";
   ret["2.9.2008"]="День гвардии ";
   ret["3.9.2008"]="День борьбы с терроризмом";
   ret["4.9.2008"]="День специалиста по ядерному обеспечению";
   ret["7.9.2008"]="Бородинское сражение (битва на Бородинском поле)<br>День энергетика (День нефтяника и газовщика)";
   ret["8.9.2008"]="День финансиста-экономиста (день банкира)";
   ret["9.9.2008"]="День тестировщика (дебаггера)<br>День красоты";
   ret["11.9.2008"]="День воинской славы России (битва у мыса Тендра)<br>День заместителя по воспитательной работе (День замполита и политрука)";
   ret["14.9.2008"]="День памяти жертв фашизма<br>День танкиста ";
   ret["19.9.2008"]="День секретаря ";
   ret["21.9.2008"]="Куликовская битва<br>День лесника (работника леса)<br>Международный день мира";
   ret["24.9.2008"]="День моря";
   ret["27.9.2008"]="День воспитателя и всех дошкольных работников (сотрудников)<br>День туризма (День туриста)";
   ret["28.9.2008"]="День атомной промышленности<br>День машиностроителя (машиностроения) ";
   ret["30.9.2008"]="День Интернета России";
   
   ret["1.10.2008"]="День пожилых людей<br>День сухопутных войск РФ";
   ret["2.10.2008"]="День жилья (Хабитат) - День архитектора";
   ret["3.10.2008"]="День Трезвости и борьбы с алкоголизмом (алкогольной зависимости)";
   ret["4.10.2008"]="День космических войск (День военно-космических сил России)<br>День гражданской обороны МЧС (ГО РСЧС)";
   ret["5.10.2008"]="День учителя<br>День уголовного розыска (День МУРа)";
   ret["6.10.2008"]="День страховщика";
   ret["7.10.2008"]="День штабных подразделений ГУВД ";
   ret["9.10.2008"]="День почты и почтальонов";
   ret["10.10.2008"]="День психического здоровья (День психолога и психологии)";
   ret["12.10.2008"]="День кадрового работника (День кадровика)<br>День сельского хозяйства и перерабатывающей промышленности";
   ret["13.10.2008"]="День уступок (Фиджи)";
   ret["16.10.2008"]="Всемирный день анестезиолога<br>Всемирный день продовольствия";
   ret["19.10.2008"]="День работников пищевой промышленности<br>День работников дорожного хозяйства";
   ret["20.10.2008"]="День войск связи (День связи)<br>День моряков-надводников (День военноморского флота)<br>День связиста (День военного связиста) ";
   ret["22.10.2008"]="День Белых Журавлей";
   ret["23.10.2008"]="День работников рекламы (День рекламиста и рекламщика)";
   ret["24.10.2008"]="День подразделений специального назначения (День СПЕЦНАЗа)<br>День ООН (Организации Объединенных Наций)";
   ret["25.10.2008"]="День таможенника (День таможни)";
   ret["26.10.2008"]="День автомобилиста (День водителя)";
   ret["28.10.2008"]="День авиации (Военного лётчика) ";
   ret["29.10.2008"]="День ВОХР (службы вневедомственной охраны МВД) ";
   ret["30.10.2008"]="День инженера-механика<br>День памяти жертв политических репрессий";
   ret["31.10.2008"]="День переводчика<br>День СИЗО, работников тюрем и ИУ<br>Хэллоуин";
   
   ret["1.11.2008"]="День мужчин (мужской день) ";
   ret["4.11.2008"]="День народного единства (День примирения и согласия)";
   ret["5.11.2008"]="День разведчика (День разведки) ";
   ret["6.11.2008"]="День судебного пристава";
   ret["7.11.2008"]="Великая Октябрьская революция";
   ret["8.11.2008"]="День КВН ";
   ret["10.11.2008"]="День милиции";
   ret["11.11.2008"]="День памяти (Окончание Первой мировой войны) ";
   ret["12.11.2008"]="День Сбербанка (День банкира - День банковского работника)<br>День сотрудника (работника) безопасности";
   ret["13.11.2008"]="День РХБЗ - войск радиационной, химической и биологической защиты<br>Всемирный день качества";
   ret["14.11.2008"]="День социолога";
   ret["15.11.2008"]="День призывника<br>День подразделений по борьбе с организованной преступностью (ОБОП, УБОП, РУБОП)";
   ret["16.11.2008"]="День морской пехоты (День Морпеха)<br>Всемирный день толерантности (терпимости)";
   ret["17.11.2008"]="День участкового";
   ret["18.11.2008"]="День рождения Деда Мороза ";
   ret["19.11.2008"]="День стекольной промышленности (День стекольщика)<br>День ракетных войск (День артиллерии)";
   ret["20.11.2008"]="Всемирный день ребенка<br>День отказа от курения";
   ret["21.11.2008"]="День налоговых органов и инспекций (День налогового инспектора, День налоговика)<br>День приветствий (День привета)<br>День бухгалтера<br>Всемирный день телевидения (День ТВ)";
   ret["26.11.2008"]="День Информации";
   ret["27.11.2008"]="День оценщика";
   ret["30.11.2008"]="День матери России<br>День домашних животных";

   ret["1.12.2008"]="Битва (сражение) у мыса Синоп<br>Всемирный день борьбы со СПИДом ";
   ret["2.12.2008"]="День банковского работника (День банкира)";
   ret["4.12.2008"]="День информатики<br>День заказов подарков Деду Морозу и написание писем";
   ret["5.12.2008"]="Битва под Москвой 1941 года<br>День волонтера (Международный день добровольцев во имя экономического и социального развития)";
   ret["7.12.2008"]="День маркетинга и маркетолога-сетевика<br>День гражданской авиации (День Аэрофлота)";
   ret["8.12.2008"]="День казначейства";
   ret["9.12.2008"]="День героев Отечества";
   ret["12.12.2008"]="День Конституции РФ";
   ret["14.12.2008"]="Всемирный день детского телевидения и радиовещания";
   ret["15.12.2008"]="День памяти журналистов, погибших при исполнении профессиональных обязанностей";
   ret["17.12.2008"]="День РВСН - ракетных войск стратегического назначения<br>День Государственной фельдъегерской службы (День фельдъегеря)";
   ret["18.12.2008"]="День подразделений собственной безопасности органов внутренних дел РФ";
   ret["20.12.2008"]="День ФСБ - работника Федеральной Службы Безопасности<br>День риэлтора ";
   ret["22.12.2008"]="День энергетика";
   ret["23.12.2008"]="День дальней авиации ВВС России ";
   ret["24.12.2008"]="День воинской славы России (Измаил)";
   ret["25.12.2008"]="Католическое Рождество";
   ret["26.12.2008"]="День святого Стефана / День подарков";
   ret["27.12.2008"]="День спасателя Российской Федерации ";
   ret["31.12.2008"]="Новый год";

   return ret;
}




function Cal(date) {
		this.date=new Date(date);
		this.DAY="D";
		this.MONTH="M";
		this.YEAR="Y";
		this.WEEK="W";
		this.toString=function () {
			return this.date;
		}			
		this.add=function (type, add) {
			var _type=type;
			var _add=add;
			switch(_type) {
			 case this.MONTH:
				var newMonth = this.date.getMonth() + _add;
				var years = 0;
				if (newMonth < 0) {
					while (newMonth < 0) {
						newMonth += 12;
						years -= 1;
					}
				} else if (newMonth > 11) {
					while (newMonth > 11) {
						newMonth -= 12;
						years += 1;
					}
				}
				this.date.setMonth(newMonth);
				this.date.setFullYear(this.date.getFullYear() + years);
				break;
			case this.DAY:
				this.date.setDate(this.date.getDate() + _add);
				break;
			case this.YEAR:
				this.date.setFullYear(this.date.getFullYear() + _add);
				break;
			case this.WEEK:
				this.date.setDate(this.date.getDate() + (_add * 7));
				break;
			}
		}
		this.getTime=function() {
			return this.date;
		}
		this.getFirstDayInMonthView=function(firstDay) {
			var cdate=this.date;
			cdate.setDate(1);
			var ccal=new Cal(cdate);
			var incd=cdate.getDay()<firstDay?cdate.getDay()+7:cdate.getDay();
			ccal.add(ccal.DAY,-incd+firstDay);
			return ccal.getTime();
		}
		this.setToFirstDayInMonthView=function(firstDay) {
			this.date=this.getFirstDayInMonthView(firstDay);
		}
		this.equals=function(date1,date2) {
			return date1.getDate()==date2.getDate()
				&& date1.getMonth()==date2.getMonth()
				&& date1.getYear()==date2.getYear();
		}
	}
	
	function DateFormat(format) {
		this._format=format;
		this.format=function(date) {
			return date.getDate()+'.'+date.getMonth()+'.'+date.getFullYear();
		}
	}
	
	//------ Calendar ----------------
	/** Options */
	function Calendar_Options() {
		this.NAVTYPE_LINE=0;
		this.NAVTYPE_CUSTOM=1;	
		this.MONTH_NAME_WIDE="WIDE";
		this.MONTH_NAME_SHORT="SHORT";
		this.NOTES_WIN_LEFT="LEFT";
		this.NOTES_WIN_RIGHT="RIGHT";
		
		this.navType=this.NAVTYPE_LINE;
		this.setNavigationType=function (navType) {
			this.navType=navType;
		}
		this.navMonName=this.MONTH_NAME_SHORT;
		this.setNavigationMonthNamesType=function (navMonName) {
			this.navMonName=navMonName;
		}
		this.notesWinType=this.NOTES_WIN_LEFT;
		this.setNotesWindowAlign=function (notesWinType) {
			this.notesWinType=notesWinType;
		}
	}
	
	/** Memory */
	function Calendar_Memory() {
		this.key="cal_notes_all";
		this.saveNotes=function(notes) {
			var value=notes.save();
			setCookie(this.key,value);
		}
		this.loadNotes=function(notes) {
			notes.loadDefaults();
			var c=getCookie(this.key);
			if (c) {
				notes.load(c);
			}
		}
	}
	
	/** Selection */
	function Calendar_Selection() {
		this.SELECTION_MULTI=1;
		this.SELECTION_SINGLE=0;
		this.selType=this.SELECTION_SINGLE;
		this.selectedDays=new Array();
		this.lastSelectedDay=null;
		this.setSelectionType=function(selType) {
			this.selType=selType;
		}
		this.getSelectedDayElement=function (date) {
			return this.selectedDays[date];
		}
		this.selectDay=function(e,date) {
			if (this.selType==this.SELECTION_SINGLE) {
				this.selectedDays=new Array();
			}
			if (this.selectedDays[date]) {
				if (this.lastSelectedDay==date) {
					this.lastSelectedDay=null;
				}
				this.selectedDays[date]=null;
			} else {
				this.selectedDays[date]=e;
				this.lastSelectedDay=date;
			}
		}
		this.getLastSelectedDay=function() {
			return this.lastSelectedDay;
		}
	}
	
	/** Notes */
	function Calendar_Notes(calendar) {
		this.notE=null;
		this.offX=10;
		this.offY=10;
		this.width=150;
		this.notesTypes=new Array ("birthday","meeting","notice");

		this.calendar=calendar;
		this.tdays=new Array();
		this.addTargetDate=function(type,date,text) {
			var key=this.getKey(date);
			this.tdays[key]=new Array();
			this.tdays[key]["type"]=type;
			this.tdays[key]["text"]=text;
		}
		this.removeTargetDate=function(date) {
			var key=this.getKey(date);
			this.tdays[key]=null;
		}
		this.getTargetDate=function(date) {
			return this.tdays[this.getKey(date)];
		}

		
		this.getKey=function (date) {
			return date.getDate()+"."+(date.getMonth()+1)+"."+date.getFullYear();
		}
		this.getTargetDateText=function (date) {
			var ret=this.getTargetDate(date);
			return ret?ret["text"]:"";
		}
				
		this.getTargetDateTitle=function (date) {
			return this.getKey(date);
		}
		this.getTargetDateType=function(date) {
			var ret=this.getTargetDate(date);
			return ret?ret["type"]:null;
		}
		
		this.showNotes=function(ev,date) {
			var text=this.getTargetDateText(date);
			if (text && text.length>0) {
				if (!this.notE) {
					var bodyE=document.getElementsByTagName("body")[0];
					this.notE=document.createElement("div");
					this.notE.id="cal_notes";
					this.notE.style.position="absolute";
					this.notE.style.zIndex=999;
					this.notE.style.visibility="hidden";
					bodyE.appendChild(this.notE);
				}
				var title=this.getTargetDateTitle(date);
				var type="notes_"+this.getTargetDateType(date);
				var html="<table class='"+type+"' width='"+this.width+"'><tr><th>"+title;
				html+="</th></tr><tr><td>"+text;
				html+="</td></tr></table>";
				this.notE.innerHTML=html;
				dx=this.offX;
				dy=this.offY;
				if (this.calendar.options.notesWinType==this.calendar.options.NOTES_WIN_LEFT) {
					dx=-this.width;
				}
				if(document.layers) {
				    this.notE.style.left=(ev.pageX+dx)+"px";
				    this.notE.style.top=(ev.pageY+dy)+"px";
			    }else if(window.opera){
				    this.notE.style.left=(ev.clientX+dx)+"px";
				    this.notE.style.top=(ev.clientY+dy)+"px";
				}else if(document.all) {
				    this.notE.style.left=(ev.x + document.body.scrollLeft+dx)+"px";
				    this.notE.style.top=(ev.y + document.body.scrollTop+dy)+"px";
				}else if(document.getElementById) {
				    this.notE.style.left=(ev.pageX+dx)+"px";
				    this.notE.style.top=(ev.pageY+dy)+"px";
				}
				
				this.notE.style.visibility="visible";
			}
		}
		this.hideNotes=function() {
			if (this.notE) {
				this.notE.style.visibility="hidden";
			}
		}
		this.showAddDialog=function (element,date) {
			element.innerHTML=this.getAddDialogHTML(date);
			var _this=this;
			var _date=date;
			document.getElementById("cal_notes_add_btn").onclick=function() {
				var eSelect=document.getElementById("cal_notes_add_select");
				var eText=document.getElementById("cal_notes_add_text");
				_this.addNotes(eSelect.options[eSelect.selectedIndex].value,eText.value,_date);
			};
		}
		this.addNotes=function(type,text,date) {
			this.addTargetDate(type,date,text);
			this.calendar.refresh();
		}
		this.getAddDialogHTML=function(date) {
			var ret="";
			var _title=new DateFormat("").format(date);
			var _text=this.getTargetDateText(date);
			var _type=this.getTargetDateType(date);

			ret+="<table id='cal_notes_add' width='100%' border=0><tr><th>"+_title+"</th></tr>";
			ret+="<tr><td align='center'><select id='cal_notes_add_select' names='notesType'>";
			for(var i=0;i<this.notesTypes.length;i++) {
				ret+="<option value='"+this.notesTypes[i]+"' "+(_type&&_type==this.notesTypes[i]?'selected ':'')+">"+this.calendar.i18.getNotesType(this.notesTypes[i])+"</option>";
			}
			ret+="</select></td></tr>";
			ret+="<tr><td align='center'><textArea id='cal_notes_add_text'>"+_text+"</textArea></td></tr>";
			ret+="<tr><td align='center'><div id='cal_notes_add_btn'>"+this.calendar.i18.getButton("add")+"</div></td></tr>";
			ret+="</table>";
			return ret;
		}
		this.load=function(str) {
			var notes=str.split(";");
			for(var i=0;i<notes.length;i++) {
				var args=notes[i].split(",");
				var key=args[0];
				if (key&&key.length>0) {
					var type=unescape(args[1]);
					var text=unescape(args[2]);
					this.tdays[key]=new Array();
					this.tdays[key]["type"]=type;
					this.tdays[key]["text"]=text;
				}
			}
			
		}
		this.loadDefaults=function() {
			var defs=loadDefaults();
		
			for(var key in defs) {
			  this.tdays[key]=new Array();
			  this.tdays[key]["text"]=defs[key];
			  this.tdays[key]["type"]="default";
			}
		}
		this.save=function() {
			var ret="";
			var cm="";
			for(var key in this.tdays) {
				if (this.tdays[key] && this.tdays[key]["type"] && this.tdays[key]["type"]!="default") {
					ret+=cm+key+','+escape(this.tdays[key]["type"])+','+escape(this.tdays[key]["text"]);
					cm=";";
				}
			}
			return ret;
		}
	}
	
	/** Calendar */
	function Calendar(elementId,locale,date,options) {
			this.element_id=elementId;
			this.element=document.getElementById(elementId);
			this.date=new Cal(date?date:new Date());
			this.options=options?options:new Calendar_Options();
			this.i18=new Calendar_I18(locale?locale:"EN");
			this.memory=new Calendar_Memory();
			this.currentDayElement=null;

			
			this.selection=new Calendar_Selection();
			this.setSelection=function (selection) {
				this.selection=selection;
			}
			this.notes=new Calendar_Notes(this);
			
			this.memory.loadNotes(this.notes);
			
			
			/** public */
			this.getFullMonthTitle=function () {
				return this.getMonthTitle()+" "+this.getYearTitle();
			}
			
			this.getMonthTitle=function () {
				return this.i18.getMonthName(this.date.getTime().getMonth(),this.options.navMonName);
			}
			
			this.getYearTitle=function () {
				return this.date.getTime().getFullYear();
			}

			/** -- */			
			this.getDayStatus=function (date, thisMonth) {
				var td=this.notes.getTargetDateType(date);
				if (td && td!="default") {
					return td;
				} else if (new Cal().equals(date,new Date())) {
					return "currentDay";
				} else if (date.getDay()==6 || date.getDay()==0) {
					return (thisMonth!=date.getMonth()+0+date.getFullYear()*12)?"nweekend":"weekend";
				}
				return (thisMonth!=date.getMonth()+date.getFullYear()*12)?"nday":"day";
			}
			this.prevYear=function(cal) {
				this.date.add(this.date.YEAR,-1);
				this.refresh();
			}
			this.prevMonth=function(cal) {
				this.date.add(this.date.MONTH,-1);
				this.refresh();			
			}
			this.nextMonth=function(cal) {
				this.date.add(this.date.MONTH,1);
				this.refresh();			
			}
			this.nextYear=function(cal) {			
				this.date.add(this.date.YEAR,1);
				this.refresh();			
			}
			this.selectMonth=function(cal,month) {
				this.date.getTime().setMonth(month);
				this.refresh();			
			}
			
			/** private */
			this.dayEvents=new Array();
			this.clearDayEvents=function() {
				this.dayEvents=new Array();
			}
			this.addDayEvent=function(eId,date) {
				this.dayEvents[eId]=date;
			}
			this.initEvents=function() {
				var _date=this.date;
				var _this=this;
				document.getElementById("cal_prevYear").onclick=function () {_this.prevYear(_date)};
				document.getElementById("cal_prevMonth").onclick=function () {_this.prevMonth(_date)};
				document.getElementById("cal_nextMonth").onclick=function () {_this.nextMonth(_date)};
				document.getElementById("cal_nextYear").onclick=function () {_this.nextYear(_date)};						
				if (this.options.navType==this.options.NAVTYPE_CUSTOM) {
					document.getElementById("cal_selectMonth").onchange=function () {_this.selectMonth(_date,document.getElementById("cal_selectMonth").selectedIndex)};						
				}
				document.getElementById("cal_btn_add").onclick=function () {_this.addNote()};						
				document.getElementById("cal_btn_remove").onclick=function () {_this.removeNote()};									
				for(var eid in this.dayEvents) {
					var _date=this.dayEvents[eid];
					if (new Cal().equals(_date,this.date.getTime())) {
						this.currentDayElement=eid;
					}
					var e=document.getElementById(eid);
					e._date=_date;
					e.onclick=function() {_this.selectDay(this,this._date)};
					e.onmouseover=function(ev) {_this.showNotes(ev?ev:window.event,this._date)};
					e.onmouseout=function() {_this.hideNotes();};
				}
			}
			this.addNote=function() {
			    var date=this.selection.getLastSelectedDay();
				if (date) {
					this.notes.showAddDialog(this.element,date);
				}
			}		
			this.removeNote=function() {
			    var date=this.selection.getLastSelectedDay();
			    if (date) {
			    	this.notes.removeTargetDate(date);
			    	this.refresh();
			    }
			}
			this.showNotes=function(ev,date) {
				this.notes.showNotes(ev,date);
			}
			this.hideNotes=function() {
				this.notes.hideNotes();
			}
			this.selectDay=function(e,date) {
				this.selection.selectDay(e,date);
				this.refresh();
			}
			this.viewAddNotesDialog=function(date) {
				this.element.innerHTML=this.notes.getAddDialogHTML(date);
			}
			this.refresh=function() {
				this.element.innerHTML=this.getHTML();
				this.initEvents();
				this.memory.saveNotes(this.notes);
			}
			this.getHTML_title=function() {
				var ret="";
				ret+="<table cellpadding=0 cellspacing=0 width='100%'>"
				if (this.options.navType==this.options.NAVTYPE_LINE) {
					ret+="<td valign='center' align='left' id='cal_prevMonth'></td>";			
					ret+="<td valign='center' align='center' id='cal_title_date'><nobr>"+this.getFullMonthTitle()+"</nobr></td>";	
					ret+="<td valign='center' align='center'><table cellpadding=0 cellspacing=0><tr><td id='cal_nextYear'></td></tr>";
					ret+="<tr><td id='cal_prevYear'></td></tr></table></td>";		
					ret+="<td valign='center' align='right' id='cal_nextMonth'></td>";						
				} else if (this.options.navType==this.options.NAVTYPE_CUSTOM) {
					ret+="<tr><td valign='center' align='left' id='cal_prevMonth'></td>";
					ret+="<td valign='center' align='center'><select id='cal_selectMonth' name='month_select'>"
					for(var i=0;i<12;i++) {
						ret+="<option "+(i==this.date.getTime().getMonth()?"selected ":"")+"value='"+i+"'>"+this.i18.getMonthName(i,this.options.navMonName)+"</option>";
					}
					ret+="</select></td>";
					ret+="<td valign='center' align='center' id='cal_title_date'>"+this.getYearTitle()+"</td>";
					ret+="<td valign='center' align='center'><table cellpadding=0 cellspacing=0><tr><td id='cal_nextYear'></td></tr>";
					ret+="<tr><td id='cal_prevYear'></td></tr></table></td>";
					ret+="<td valign='center' align='right' id='cal_nextMonth' ></td>";
				}
				ret+="</table>"			
				return ret;
			}
			this.getHTML_main=function() {

				var ret="";
				ret+="<table cellpadding=0 cellspacing=0 width='100%'><tr>";
				var fd=this.i18.getFirstDay();
				for(var i=0;i<7;i++) {
					var day=(i+fd)>=7?i-7+fd:i+fd;
					ret+="<td class="+(day==0||day==6?'weekendName':'weekdayName')+">"+this.i18.getWeekDay(day)+"</td>";
				}
				ret+="</tr><tr>";
				var cal=new Cal(this.date.getTime());
				cal.setToFirstDayInMonthView(fd);
				var thisMonth=this.date.getTime().getMonth()+this.date.getTime().getFullYear()*12;
	
				var eidx=0;
				do {
					ret+="<tr>";
					for(var i=0;i<7;i++) {
						var isSelected=this.selection.getSelectedDayElement(cal.getTime());
						ret+="<td valign='center' align='center' class='"+this.getDayStatus(cal.getTime(),thisMonth)+"'";
						var eid=this.element_id+"_"+(eidx++);
						ret+=" id='"+eid+"'";
						ret+="><div"+(isSelected?" id='selected_day'":" id='unselected_day'")+">";
						ret+=cal.getTime().getDate();
						ret+="</div></td>";
						this.addDayEvent(eid,new Date(cal.getTime()));
						cal.add(cal.DAY,1);
					}
					ret+="</tr>"
				} while(cal.getTime().getMonth()+cal.getTime().getFullYear()*12<=thisMonth);
				ret+="</table>"
				//alert(ret);
				return ret;
			}
			this.getHTML_status=function() {
				var ret="";
				ret+="<table cellpadding=0 cellspacing=0 width='100%'>";
				ret+="<tr><td align='center' valign='top' id='cal_btn_add'>"+this.i18.getButton("add")+"</td>";
				ret+="<td>&nbsp;</td><td align='center' valign='top' id='cal_btn_remove'>"+this.i18.getButton("remove")+"</td>";
				ret+="</table>";
				return ret;
			}
			this.getHTML=function() {
				this.clearDayEvents();
				var ret="";
				ret+="<table id='cal_table' cellpadding=0 cellspacing=0>";
				ret+="<tr><td id='cal_title'>";
				ret+=this.getHTML_title();
				ret+="</td></tr>";
				ret+="<tr><td valign='center' align='center' id='cal_main'>";
				ret+=this.getHTML_main();
				ret+="</td></tr>";			
				ret+="<tr><td id='cal_status'>";
				ret+=this.getHTML_status();
				ret+="</td></tr>";			
				ret+="</table>";
				//alert(ret);
				return ret;
			}
			
			this.selectCurrentDay=function () {
				this.selectDay(document.getElementById(this.currentDayElement),this.date.getTime());
			}

	}