// Класс нестандартных элементов
function element_class()
{
	// Замена всех элементов
	this.start = function()
	{
		var list = document.getElementsByTagName('select');
		var i_counter;
		if (list.length) 
		  for(i_counter=0; i_counter<list.length; i_counter++) {
			  if(get_attribute (list[i_counter], 'ns'))
				  this.element_select(list[i_counter]);
		  }
		
		add_event(document, 'click', this.document_click);
	}
	// Клик по документу
	this.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) && document.nsselect_expanded == target.parentNode.parentNode	)
				document.nsselect_expanded.srCollapse(target);
			else {
				document.nsselect_expanded.srCollapse();
			}
		}
		else
		{
			if(target.is_ns==true)
				target.parentNode.srExpand();
		}
	}
	
	// Элемент Select
	this.element_select = function(sel)
	{
		//а вдруг мы на осле :)
		var ie6 = (navigator.userAgent.search('MSIE 6.0') != -1);
		
		var div = document.createElement('div');
		//список заменяющий select, свернутый, не в фокусе
		div.className = 'nsselect_list nsselect_collapsed nsselect_blur';
		
		//связь между ul и select
		div.srSelect = sel;
		sel.srReplacement = div;
		
		//устанавливаем для элемента 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 div = this.srReplacement;
			var ul = div.childNodes[1];
			div.srSelectLi(ul.childNodes[this.selectedIndex]);
		}
		
		sel.onkeypress = function(e)
		{
			var i = this.selectedIndex;
			var div = this.srReplacement;
			var ul = div.childNodes[1];
			switch (e.keyCode) {
				case 9:
					this.srReplacement.srCollapse();
				break;
		
				case 37: // влево
				case 38: // вверх
					if (i - 1 >= 0)
						div.srSelectLi(ul.childNodes[i - 1]);
				break;
		
				case 40: // вниз
					if(e.altKey)
					{
						//ul.srExpand();
						//break;
					}
				case 39: // вправо
		
					if (i + 1 < ul.childNodes.length)
						div.srSelectLi(ul.childNodes[i + 1]);
				break;
		
				case 33: // Page Up
				case 36: // Home
					div.srSelectLi(ul.firstChild);
				break;
		
				case 34: // Page Down
				case 35: // End
					div.srSelectLi(ul.lastChild);
				break;
			}
		}
		
		//меняем класс элемента ul
		//при наведении на него мышки
		div.onmouseover = function() { this.className += ' nsselect_hover'; }
		
		div.onmouseout = function() { this.className = this.className.replace(/[\s]?nsselect_hover/, ''); }
		
		div.srSelectLi = function(li)
		{
			var ul = li.parentNode;
			var div = ul.parentNode;
			var span = ul.previousSibling;
		
			//если уже есть выбранный элемент
			//то назначаем снимаем выделение
			if(div.srSelectesIndex != null)
				ul.childNodes[div.srSelectesIndex].className = '';
		
			//запоминаем индекс выбранного элемента
			div.srSelectesIndex = li.srIndex;
		
			//устанавливаем для выбранного элемента
			//класс srSelectedLi
			ul.childNodes[li.srIndex].className = 'srSelectedLi';
			
			// Ставим выбраный элемент в окошко
			span.removeChild(span.firstChild);
			span.appendChild(document.createTextNode(li.innerHTML));
			return li.srIndex;
		}
		
		div.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;
					}
				}*/
			}
		}
		
		div.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 ul = document.createElement('ul');
		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;
				
		// Добавляем список и выбраный элемент
		var span = document.createElement('span');
		span.is_ns = true;
		div.appendChild(span);
		div.appendChild(ul);
		
		//устанавливаем элемент выбранный по умолчанию
		span.appendChild(document.createTextNode(sel.options[sel.selectedIndex].text));		
		div.srSelectLi(ul.childNodes[sel.selectedIndex]);
		
		//вставляем созданный список
		//перед заменяемым select
		sel.parentNode.insertBefore(div, 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(this.int_to_date(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+"-"+this.int_to_date(month)+"-"+this.int_to_date(year)+" "+this.int_to_date(date['hour'])+":"+this.int_to_date(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";
	}
	// Перевести дату в строку, используя подстановку ноля
	this.int_to_date = function(value)
	{
		value = value.toString();
		if(value.length==1) {
			value = "0"+value;
		}
		return value;
	} 
} 








/*
* Скроллинг
*/
function scroll_class() 
{
	this.parametr = new Array();
	this.scroll_area = undefined;
	this.direction = undefined;
	this.delay = 40;
	
	this.init = function (uid, scroll_to, arrow_left, arrow_right) 
	{
		var elem = select_object(uid);
		var elem_holder = elem.parentNode;
		if(!elem || !elem_holder) 
			return false;	
			
		
		this.scroll_area = elem;
		this.parametr['max_width'] = elem_holder.scrollWidth;
		this.parametr['scroll_width'] = elem_holder.clientWidth;
		
		this.parametr['arrow'] = [select_object(arrow_left), select_object(arrow_right)];
		
		var scroll_to_elem = select_object(scroll_to);
		if(scroll_to_elem) {
			var indent_to_center = Math.round((this.parametr['scroll_width']/2) - (scroll_to_elem.clientWidth/2));
			scroll_offset = scroll_to_elem.offsetLeft - indent_to_center;

			if(scroll_offset<0)
				scroll_offset=0;
		}
		else
			scroll_offset = 0;
				
		if(scroll_offset >= (this.parametr['max_width']-this.parametr['scroll_width']) ) {
			scroll_offset = (this.parametr['max_width']-this.parametr['scroll_width']);
			var end = 1;
		}
		
		if(scroll_offset!=0) 
			select_object(arrow_left).style.display = 'block';	
		if(end!=1) 
			select_object(arrow_right).style.display = 'block';
		
		
		this.parametr['scroll_offset'] = scroll_offset;	
		elem.style.marginLeft = '-'+scroll_offset+'px';
		
		elem.style.visibility = 'visible';
	}
	
	this.clear_scroll = function ()
	{
		this.direction=undefined ;
		if(this.timeout)
			clearTimeout(this.timeout);
	}
	
	this.set_scroll = function (direction)
	{
		if(direction!=-1)
			this.direction = direction;
		else {
			if(this.direction==undefined) 
				return false;
		}		
		if(typeof(this.make_scroll) == 'function')
			this.make_scroll(this.scroll_area, this.direction, 4);
		
		if(this.timeout)
			clearTimeout(this.timeout);
		this.timeout = setTimeout("scroll_widget.set_scroll(-1)", this.delay); //! Нужно без прямого указания
	}
	
	this.make_scroll = function(elem, direction, delta)
	{
		if(!elem)
			return false;

		var modifer = 1;
		var end = 0;
		
		var max_scroll = this.parametr['max_width']-this.parametr['scroll_width'];
		
		if(direction == 0) {
			var space = this.parametr['scroll_offset'];
			modifer = -1;
		}
		else  
			var space = max_scroll-this.parametr['scroll_offset'];
			
		if (delta > space) {
			delta = space;
			end = 1; // Пограничное значение
		}

		this.parametr['scroll_offset'] = this.parametr['scroll_offset'] + (delta*modifer);
		elem.style.marginLeft = '-'+ this.parametr['scroll_offset']+'px';
		// Если было достигнуто пограничное состояние, скрыть одну из кнопок прокрутки
		if(end) {
			var arrow =  this.parametr['arrow'][direction];
			if(arrow)
				arrow.style.display = 'none';
		}
		else {
			if(direction==0)
				direction=1;
			else
				direction=0;
			var arrow = this.parametr['arrow'][direction];
			if(arrow.style.display == 'none')
				arrow.style.display = 'block';		
		}
	}
		
	this.wheel_scroll = function (evt)
	{	
		var event = select_event(evt);
		var elem = event.target || event.srcElement;
	
		for(var i=0; i<9; i++) {
			if(elem==this.scroll_area)
				break;	
			else if(!elem || !elem.parentNode)
				return true;
			else if(i!=8)
				elem = elem.parentNode;
			else
				return true;
		}	
		
		
		if (elem && elem.id != 'scroll_area')
			return true;
		
		var delta; // Направление скролла
		// -1 - скролл вниз
		// 1  - скролл вверх	
	
		// Opera и IE работают со свойством wheelDelta
		if (event.wheelDelta) {
			delta = event.wheelDelta / 120;
		    // В Опере значение wheelDelta такое же, но с противоположным знаком
			if (window.opera) 
				delta = -delta;	// В реализации Gecko получим свойство detail
		} 
		else if (event.detail) {
			delta = -event.detail / 3;
		}
		if(delta<0)
			delta = 0;
		else
			delta = 1;
		// Запрещаем обработку события браузером по умолчанию
		if (event.preventDefault)  event.preventDefault();
			event.returnValue = false; 	
				
		this.make_scroll(this.scroll_area, delta, 10);
		
		return false;
	}	
	
	this.external = function(evt)
	{		
		return scroll_widget.wheel_scroll(evt);
	}
}	
var scroll_widget = new scroll_class();







