function element_class()
{
	// Замена всех элементов
	load: function()
	{
		var list = document.getElementsByTagName('input');
		if (list.length) 
		  for(var i; i<list.length; i++) {
			  if(get_attribute (list[i], 'ns'))
				  this.element_select(list[i]);
		  }
		
		add_event(document, 'click', this.document_click);
	}
	// Клик по документу
	document_click: function(e)
	{
		var target = (window.event) ? window.event.srcElement : e.target;
	
		if(document.nsselect_expanded)
		{
			//принадлежит ли соответствующий li списку заменителю select
			if((target.srIndex || target.srIndex === 0)
				//принадлежит ли наш li открытому в данный момент списку
				&& document.nsselect_expanded == target.parentNode	)
				document.nsselect_expanded.srCollapse(target);
			else
				document.nsselect_expanded.srCollapse();
		}
		else
		{
			if(target.srIndex || target.srIndex === 0)
				target.parentNode.srExpand();
		}
	}
	
	// Элемент Select
	element_select: function(sel)
	{
		//а вдруг мы на осле :)
		var ie6 = (navigator.userAgent.search('MSIE 6.0') != -1);
		
		var ul = document.createElement('ul');
		//список заменяющий select, свернутый, не в фокусе
		ul.className = 'nsselect_list nsselect_collapsed nsselect_blur';
		
		//связь между ul и select
		ul.srSelect = sel;
		sel.srReplacement = ul;
		
		//устанавливаем для элемента select
		//класс показывающий, что он замещен
		sel.className += ' nsselect_replaced';
		
		//меняем класс элемента ul
		//при получении и потере фокуса
		//элементом select
		sel.onfocus = function() { this.srReplacement.className = this.srReplacement.className.replace(/[\s]?nsselect_blur/, ' nsselect_focus'); }
		
		sel.onblur = function() {
			//this.srReplacement.srCollapse();
			this.srReplacement.className = this.srReplacement.className.replace(/[\s]?nsselect_focus/, ' nsselect_blur');
		}
		
		//каждый браузер болеет по своему
		//поэтому обрабатываем и onchange и onkeypress
		sel.onchange = function()
		{
			var ul = this.srReplacement;
			ul.srSelectLi(ul.childNodes[this.selectedIndex]);
		}
		
		sel.onkeypress = function(e)
		{
			var i = this.selectedIndex;
			var ul = this.srReplacement;
			switch (e.keyCode) {
				case 9:
					this.srReplacement.srCollapse();
				break;
		
				case 37: // влево
				case 38: // вверх
					if (i - 1 >= 0)
						ul.srSelectLi(ul.childNodes[i - 1]);
				break;
		
				case 40: // вниз
					if(e.altKey)
					{
						//ul.srExpand();
						//break;
					}
				case 39: // вправо
		
					if (i + 1 < ul.childNodes.length)
						ul.srSelectLi(ul.childNodes[i + 1]);
				break;
		
				case 33: // Page Up
				case 36: // Home
					ul.srSelectLi(ul.firstChild);
				break;
		
				case 34: // Page Down
				case 35: // End
					ul.srSelectLi(ul.lastChild);
				break;
			}
		}
		
		//меняем класс элемента ul
		//при наведении на него мышки
		ul.onmouseover = function() { this.className += ' nsselect_hover'; }
		
		ul.onmouseout = function() { this.className = this.className.replace(/[\s]?nsselect_hover/, ''); }
		
		ul.srSelectLi = function(li)
		{
			var ul = li.parentNode;
		
			//если уже есть выбранный элемент
			//то назначаем снимаем выделение
			if(ul.srSelectesIndex != null)
				ul.childNodes[ul.srSelectesIndex].className = '';
		
			//запоминаем индекс выбранного элемента
			ul.srSelectesIndex = li.srIndex;
		
			//устанавливаем для выбранного элемента
			//класс srSelectedLi
			ul.childNodes[li.srIndex].className = 'srSelectedLi';
			return li.srIndex;
		}
		
		ul.srExpand = function()
		{
			if(!this.nsselect_expanded)
			{
				if(document.nsselect_expanded)
					document.nsselect_expanded.srCollapse();
		
				document.nsselect_expanded = this;
		
				//разворачиваем список
				this.className  = this.className.replace(/[\s]?nsselect_collapsed/, ' nsselect_expanded');
				this.nsselect_expanded = true;
				
				//при раскрытии элемента передаем фокус
				//соответствующему select
				this.srSelect.focus();
		
				//для особо одаренного браузера
				//разворачиваем список особенным способом
				if(ie6) 
				{
					var node = this.firstChild;
					var offset = 0;
					var height = node.clientHeight;
					while(node)
					{
						node.style.position = 'absolute';
						node.style.top = offset;
						offset += height; 
						node = node.nextSibling;
					}
				}
			}
		}
		
		ul.srCollapse = function(li)
		{	
			if(this.nsselect_expanded)
			{
				document.nsselect_expanded = null;
		
				//выбираем элемент списка на который кликнул пользователь
				//и устанавливаем соответсвующий индекс выбранного элемента
				//для спрятанного элемента select
				if(li)
					this.srSelect.selectedIndex = this.srSelectLi(li);
				
				//при клике на элементы списка
				//соответствующий спрятанный select
				//теряет фокус нужно вернуть на место
				this.srSelect.focus();
		
				//сворачиваем список
				this.className = this.className.replace(/[\s]?nsselect_expanded/, ' nsselect_collapsed');
				this.nsselect_expanded = false;
		
				//для особо одаренного браузера
				//сворачивам список особенным способом
				if(ie6)
				{
					var node = this.firstChild;
					while(node)
					{
						node.style.position = '';
						node = node.nextSibling;
					}
				}
			}
		}
		
		
		var options = sel.options;
		var len = options.length;
		
		for(var i = 0; i < len; i++)
		{
			//для каждого элемента option
			//создаем соответствущий li
			var li = document.createElement('li');
			li.appendChild(document.createTextNode(options[i].text));
		
			//в каждом элементе списка
			//храним индекс соответствующего
			//элемента option
			li.srIndex = i;
		
			//псевдо класс hover в IE работает только для ссылок
			//поэтому будем менять класс при наведении мышки
			li.onmouseover = function() { this.className += ' srHoverLi'; }
		
			li.onmouseout = function() { this.className = this.className.replace(/[\s]?srHoverLi/, ''); }
		
			ul.appendChild(li);
		}
		
		//если по умолчанию не выбран никакой элемент
		//выбираем первый
		if(sel.selectedIndex == null)
			sel.selectedIndex = 0;
		
		//устанавливаем элемент выбранный по умолчанию
		ul.srSelectLi(ul.childNodes[sel.selectedIndex]);
		
		//вставляем созданный список
		//перед заменяемым select
		sel.parentNode.insertBefore(ul, sel);
	}
}

var ns_element = new element_class();







// var class_pointer = new Array();

function date_calendar() {

// field - id поля
// date - дата
this.create = function (field, date, show_time) 
{
	this.field = field;
	this.base_name = 'calendar_'+field;
	//class_pointer[field] = this;
	
	if(show_time)
		this.show_time=true;
	else
		this.show_time=false;
	
	var cur_date = new Date();
	real_date = new Array();
	
	real_date['day'] = cur_date.getDate();
	real_date['month'] = cur_date.getMonth();
	real_date['year'] = cur_date.getFullYear();
	real_date['hour'] = cur_date.getHours();
	real_date['minute'] = cur_date.getMinutes();
	
	this.real_date = real_date;
	
	this.date = this.build_date(date);

	elem = select_object(this.base_name);
	var str = '<div class="calendar_widget" id="'+this.base_name+'">';
	str+= '<div style="float: left" id="'+this.base_name+'_month_holder"></select></div>';
	str+= '<div style="float: right" id="'+this.base_name+'_year_holder"></div>';
	str+= '<div style="clear: both"></div>';
	str+= '<table border="0" cellspacing="0" cellpadding="0">';
	str+= '		<tr id="'+this.base_name+'_insert_point">';
	str+= '			<th>Пн</th>';
	str+= '			<th>Вт</th>';
	str+= '			<th>Ср</th>';
	str+= '			<th>Чт</th>';
	str+= '			<th>Пт</th>';
	str+= '			<th>Сб</th>';
	str+= '			<th>Вс</th>';
	str+= ' 	</tr>';
	str+= '</table>';
	str+=  '</div>';
	elem.innerHTML = str;
	
	this.create_month();
	this.create_year();
	
	date = this.date;
	this.rebuild_day(date['day']);
}

this.build_date = function (date)
{
	real_date = this.real_date;
	real_date['month'] = real_date['month']+1;
	result_date = new Array();

	if(date=="") {
		result_date = real_date;
	}
	else {
		var reg_search = /([\d]+)/g;
		var this_date = new Array();
		var temp_date = new Array();
		
		do {
			temp_date = reg_search.exec(date);
			if(temp_date && temp_date[0])
				this_date[this_date.length] = temp_date[0];
		} while(temp_date!=null);
		var counter =0;
		for(var x in real_date){
			if (this_date[counter]!=undefined)
				result_date[x]=parseInt(this_date[counter], 10);
			else
				result_date[x]=real_date[x];
			counter ++;
		}
	}
	return result_date;
}

this.create_month = function ()
{
	var date = [["январь",1], ["февраль",2], ["март",3], ["апрель",4], ["май",5], ["июнь",6], ["июль",7], ["август",8], ["сентябрь",9], ["октябрь",10], ["ноябрь",11], ["декабрь",12]];
	
	var select_date = this.date;
	select_date = select_date['month'];
	
	this.create_select(date, select_date, "month");
}

this.create_year = function ()
{
	var date = new Array();
	var year = this.real_date;
	year = year['year'];
	
	var count = 0;
	for(var i=year-10; i<year+10; i++) {
		date[count] = new Array();
		date[count][0]=i;
		date[count][1]=i;
		count++;
	}
	var select_date = this.date;
	select_date = select_date['year'];
	
	this.create_select(date, select_date, "year");
}

this.create_select = function (date, select_date, select_name)
{
	var elem_select  = document.createElement('SELECT');
	elem_select.setAttribute ("id", this.base_name+"_"+select_name);
	elem_select.setAttribute ("class", "calendar_widget_"+select_name);
	elem_select.setAttribute ("className", "calendar_widget_"+select_name);
	elem_select.field = this.field;

	if(typeof attachEvent != "undefined")
		elem_select.attachEvent("onchange", function (x) { 
					return function() {x.rebuild_day()}
				}(this)       );
	else
		elem_select.addEventListener("change", function (x) { 
			return function() { x.rebuild_day()}
			}(this), false);
	
	for(var i=0; i < date.length; i++){
		elem_inner = document.createElement('OPTION'); 
		elem_inner.setAttribute ("value", date[i][1]);
		if (select_date == date[i][1])
			elem_inner.setAttribute ("selected", "selected");
		
		elem_text = document.createTextNode(date[i][0]); 
		elem_inner.appendChild(elem_text);
		
		elem_select.appendChild(elem_inner);
	}
	
	var holder = select_object(this.base_name+'_'+select_name+'_holder');
	
	holder.appendChild(elem_select);
}
// Взять выделение месяца и года из выпадашек
this.get_selected_date = function ()
{
	elem_month = select_object(this.base_name+"_month");
	month = elem_month.value;
	elem_year = select_object(this.base_name+"_year");
	year = elem_year.value;
	
	var date = new Array(2);
	date[0] = month;
	date[1] = year;
	
	return date;
}

this.rebuild_day = function (mark_day) 
{
	mark_day = mark_day || 0;
	
	date_select = this.get_selected_date();
	var date = new Date(date_select[1], date_select[0], 0); // Месяц в выпадашках с 1, в JS c 0, нулевая дата - последний день прошлого

	max_day = date.getDate();
	
	date = new Date(date_select[1], date_select[0]-1, 1);
	var first_day = date.getDay();

	first_day = first_day - 1;
	if (first_day < 0)
		first_day = 6;
	
		
	var aMonth = new Array();
	aMonth[0] = new Array(7);
	aMonth[1] = new Array(7);
	aMonth[2] = new Array(7);
	aMonth[3] = new Array(7);
	aMonth[4] = new Array(7);
	aMonth[5] = new Array(7);
	aMonth[6] = new Array(7);
	

	
	// Пошли далее
	var counter = 1;
	for (var i = first_day; i < 7; i++) {
		aMonth[1][i] = counter;
		counter++;
	}
	
	for (w = 2; w < 7; w++) {
		for (d = 0; d < 7; d++) {
			if (counter <= max_day) {
				aMonth[w][d] = counter;
					counter++;
	   		}
	 	}
	}
	this.clear_day();
	
	this.draw_day(aMonth, mark_day);
}

this.clear_day = function () 
{
	var check_elem = this.base_name+'_insert_point';

	elem = select_object(check_elem);

	for(i=0; i<6; i++) {
		
		if (elem.nextSibling) {			
			elem.parentNode.removeChild(elem.nextSibling);
		}
	}
}

this.draw_day = function (day_row, mark_day) 
{
	elem = select_object(this.base_name+'_insert_point');
	elem_parent = elem.parentNode;
	
	var full_name;
	
	for (w = 1; w < 7; w++) {
		var elem_tr  = document.createElement('TR');
		
		for (d = 0; d < 7; d++) {
			var day = day_row[w][d];
			elem_td  = document.createElement('TD');
			if (day!=undefined) {
				elem_a  = document.createElement('A');
				elem_a.setAttribute ("href", "javascript:void(0)");
				if (day==mark_day) {
					elem_a.setAttribute ("class", "day_select");
					elem_a.setAttribute ("className", "day_select");
				}
				full_name = this.base_name+"_"+day;
				elem_a.setAttribute ("id", full_name);
		
				if(typeof attachEvent != "undefined") 
					elem_a.attachEvent("onclick", function(x) {
								return function () { x.set_date()} 
							}(this) );
				else
					elem_a.addEventListener("click", function (x) {  
								return function (evt) {x.set_date(evt)}
							}(this), false);
				a_text  = document.createTextNode(day);	
				elem_a.appendChild(a_text);
					
				elem_td.appendChild(elem_a);
			}
			else {
				a_text  = document.createTextNode("\xA0");	
				elem_td.appendChild(a_text);	
			}
			// Привязать
			elem_tr.appendChild(elem_td);		
		}
		
		elem_parent.appendChild(elem_tr);
	}	
}

this.set_date = function (even) 
{
	elem_month = select_object(this.base_name+"_month");
	month = elem_month.value;
	elem_year = select_object(this.base_name+"_year");
	year = elem_year.value;
	
	var elem = select_object(this.field);
	if (window.event)
		even_elem = window.event.srcElement;
	else
		even_elem = even.target;
	if(this.show_time) {
		date = this.date;
		elem.value = even_elem.innerHTML+"-"+month+"-"+year+" "+date['hour']+":"+date['month'];
	}
	else	
		elem.value = even_elem.innerHTML+"-"+month+"-"+year;
	
	this.clear_mark();
	this.select_mark(even_elem);
}
// Очистить выделение с дней
this.clear_mark = function ()
{
	var check_elem = this.base_name+'_insert_point';

	var elem = select_object(check_elem);
	elem = elem.nextSibling;

	for(i=0; i<6; i++) {
		td_list = elem.childNodes;
		for(var count=0; count < td_list.length; count++) {

			var tmp_child = td_list.item(count).childNodes;
			if ( tmp_child.length &&  tmp_child.item(0).nodeType==1) {	
				tmp_child.item(0).className = "";
			}
		}
		elem = elem.nextSibling;
	}
}
// Поставить выделение на текущий день
this.select_mark = function (select_elem)
{
	select_elem.className = "day_select";
}

} 