/******************************************************************************
 Вспомогательные функции и переменные
******************************************************************************/

function get_pos(obj) {
// get_pos - Возвращает координаты и размеры объекта
// res=get_pos(obj)
//   res.left 
//   res.top
//   res.width
//   res.height
	var o=obj
	var x=0;
	var y=0;
	while (o) {
		x += o.offsetLeft;
		y += o.offsetTop;
		o = o.offsetParent;
	}
	if (navigator.userAgent.indexOf('Mac') != -1 &&
		typeof document.body.leftMargin != 'undefined') {
		x += document.body.leftMargin;
		y += document.body.topMargin;
	}
	return { left:x, top:y, width:obj.offsetWidth, height:obj.offsetHeight }
}

function get_pos_mouse() {
	var e=window.event;
	if (e.pageX || e.pageY) {
		return {
			left:e.pageX,
			top:e.pageY } }
	else {
		return { left:e.clientX + document.body.scrollLeft,	top:e.clientY + document.body.scrollTop } }
}

function get_parent_id_re(obj,re) {
	do {
		if (obj.id) {
			var res=re.exec(obj.id)
			if (res) {
				return { obj:obj,re:res }
			}
		}
		obj=obj.parentElement
	} while (obj)
	return
}

function alert_props (obj){
	var txt=''
	for (var i in obj)
		txt=txt+i+'=\''+eval('obj.'+i)+'\'   '
	alert(txt)
}

/******************************************************************************
 Управление Всплывающими подсказками
******************************************************************************/

var linkhelp_state={
	n_stop: 0 }

function linkhelp_over(obj,name) {
	var e=window.event
	if (!linkhelp_state.obj) {
		if (linkhelp_state.n_stop) return
		var id=name		
		if (!id) id=obj.name
		if (!id) id=obj.id
		if (!id) return
		linkhelp_state.obj=document.all('linkhelp_panel_'+id)
		if (!linkhelp_state.obj) return
		linkhelp_state.obj.style.display=''
	}
	var pos=get_pos_mouse()
	linkhelp_state.obj.style.top=pos.top-10
	linkhelp_state.obj.style.left=pos.left+20
}

function linkhelp_out(name) {
	if (linkhelp_state.obj) {
		linkhelp_stop()
		linkhelp_state.obj=null
	}	
}

function linkhelp_stop() {
	if (linkhelp_state.obj) {
		linkhelp_state.obj.style.display='none'
	}	
}

/******************************************************************************
 Управление COMBOBOX
******************************************************************************/

var combo_state={}

function combo_show(name) {	
	combo_close()
	combo_state.obj=document.all('combo_panel_'+name)
	if (combo_state.obj) {
		linkhelp_state.n_stop++
		linkhelp_stop()
		combo_state.edit=document.all(name)
		var pos=get_pos(combo_state.edit)
		combo_state.obj.selectedIndex=-1
		combo_state.obj.style.display=''
		combo_state.obj.style.top=pos.top+pos.height+2
		combo_state.obj.style.left=pos.left+2
		combo_state.obj.style.width=pos.width
		combo_state.obj.focus()
	}
}

function combo_close() {
	if (combo_state.obj) {
		combo_state.obj.style.display='none'
		if (combo_state.edit) combo_state.edit.focus()
		combo_state.obj=null
		linkhelp_state.n_stop-- }
}

function combo_click() {
	if (combo_state.obj.selectedIndex>=0) {
		var option=combo_state.obj.options[combo_state.obj.selectedIndex]
		if (option.value=='')  option=option.text
		else option=option.value
		combo_state.edit.value=option }
	combo_close()
}

function combo_key() {
	var e=window.event
	var c=e.keyCode
	if (c==27) combo_close()
	else if (c==13) combo_click()
}

function combo_input_key(obj) {
	var e=window.event
	var c=e.keyCode
	if (c==40) {
		var id=obj.name
		if (!id) id=obj.id
		if (!id) return
		combo_show(id) }
}

/******************************************************************************
 Управление CALENDAR
******************************************************************************/

var calendar_state={}

function calendar_show(name) {	
	calendar_close()
	calendar_state.obj=document.all('calendar_panel_'+name)
	if (calendar_state.obj) {
		var info=calendar_get_state(calendar_state.obj)
		_calendar_redraw(info)
		linkhelp_state.n_stop++
		linkhelp_stop()
		calendar_state.edit=document.all(name)
		var pos=get_pos(calendar_state.edit)
		calendar_state.obj.selectedIndex=-1
		calendar_state.obj.style.display=''
		calendar_state.obj.style.top=pos.top+pos.height+2
		calendar_state.obj.style.left=pos.left+2
		calendar_state.edit.focus()
	}
}
function calendar_close() {
	if (calendar_state.obj) {
		calendar_state.obj.style.display='none'
		if (calendar_state.edit) calendar_state.edit.focus()
		calendar_state.obj=null
		linkhelp_state.n_stop-- }
}
function calendar_click() {
}
function calendar_key() {
	var e=window.event
	var c=e.keyCode
	if (c==27) calendar_close()
	else if (c==13) calendar_click()
}
function calendar_input_key(obj) {
	var e=window.event
	var c=e.keyCode
	if (c==40) {
		var id=obj.name
		if (!id) id=obj.id
		if (!id) return
		calendar_show(id) }
	else if (c==38) {
		calendar_close() }
}
function calendar_get_state(obj) {
	var ans={}
	var parent=get_parent_id_re(obj,/^calendar_panel_(.+)/)
	var name=parent.re[1]
	var obj_data=document.all(name)
	var re=/^(\d\d\d\d)\-(\d\d)\-(\d\d)\b/
	var re_dt=re.exec(obj_data.value)

	ans.obj_panel=parent.obj
	ans.name=parent.re[1]
	ans.obj_edit=document.all(ans.name)
	if (!re_dt) {
		var dt=new Date();
		ans.year=dt.getYear()
		ans.month=dt.getMonth()+1
		ans.day=dt.getDate()
	}
	else {
		ans.year=re_dt[1]*1
		ans.month=re_dt[2]*1
		ans.day=re_dt[3]*1
	}

	return ans
}
function _calendar_redraw(state) {

	var dt=new Date()
	dt.setYear(state.year)
	dt.setMonth(state.month-1)
	var day_last=31
	dt.setDate(day_last)
	if (dt.getDate()!=day_last) {
		day_last-=dt.getDate() }
	dt.setYear(state.year)
	dt.setMonth(state.month-1)
	dt.setDate(1)
	var day_first=dt.getDay()-1
	if (day_first<0) day_first=day_first+7
	if (state.day>day_last) state.day=day_last

	var src=''

	src=src + '<tr><td colspan=7 class=calendarTdEmpty>\n'
	src=src + '\t<select onChange=_calendar_on_month(this)>\n'
	var month=new Array('Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь')
	for (var i=1;i<=month.length;i++) {
		src=src+'\t\t<option value='+i+(i==state.month?' selected':'')+'>'+month[i-1]+'\n'
	}
	src=src + '\t</select>\n'
	src=src + '\t<select onChange=_calendar_on_year(this)>\n'
	var n_year=10
	var max_year=2012
	var y1=state.year-n_year/2
	if (y1<1970) y1=1970
	if (y1+n_year>max_year) y1=max_year-n_year+1	
	for (var i=0;i<n_year;i++) {
		var txt=i+y1
		if (i==0 && txt!=1970) {
			txt='Ранее ...'	}
		else if (i==n_year-1 && txt!=max_year) {
			txt='Позже ...'	}
		src=src+'\t\t<option value='+(i+y1)+((i+y1)==state.year?' selected':'')+'>'+txt+'\n'
	}
	src=src + '\t</select>\n'
	src=src + '\t<input type=button value="&nbsp;x&nbsp;" onClick=calendar_close()>\n'

	src=src+'<tr><td>\n';

	src=src+'<table border=0 cellspacing=0 cellpadding=2>\n';
	src=src+'<tr>\n'
	src=src+'\t<td class=calendarTdHeader>пн\n'
	src=src+'\t<td class=calendarTdHeader>вт\n'
	src=src+'\t<td class=calendarTdHeader>ср\n'
	src=src+'\t<td class=calendarTdHeader>чт\n'
	src=src+'\t<td class=calendarTdHeader>пт\n'
	src=src+'\t<td class=calendarTdHeader>сб\n'
	src=src+'\t<td class=calendarTdHeader>вс\n'
	if (day_first>0) 
		src=src+'<tr>\n\t<td colspan='+day_first+' class=calendarTdEmpty>&nbsp;\n'
	for (var i=1;i<=day_last;i++)	{
		if (day_first==0) {
			src=src+'<tr>\n' }
		if (i==state.day) {
			src=src+'\t<td class=calendarTdActive onMouseOver=this.className=\'calendarTdActiveOver\' onMouseOut=this.className=\'calendarTdActive\' onClick=_calendar_on_day(this)>'+i+'\n' }
		else {
			src=src+'\t<td class=calendarTd onMouseOver=this.className=\'calendarTdOver\' onMouseOut=this.className=\'calendarTd\' onClick=_calendar_on_day(this)>'+i+'\n' }
		day_first++
		if (day_first==7) day_first=0
	}
	if (day_first>0)
		src=src+'\t<td colspan='+(7-day_first)+' class=calendarTdEmpty>&nbsp;\n'
	src=src+'</table>\n';

	src='<table border=0 class=calendarTable cellspacing=0 cellpadding=2>\n'+src+'</table>\n'
	state.obj_panel.innerHTML=src
	
	var val=state.year
	val=val+'-'+(state.month<10?'0':'')+state.month
	val=val+'-'+(state.day<10?'0':'')+state.day	
	state.obj_edit.value=val
	state.obj_edit.focus()
}

function _calendar_on_day(obj) {
	var info=calendar_get_state(obj)
	info.day=obj.innerText-0
	_calendar_redraw(info)
}

function _calendar_on_month(obj) {
	var info=calendar_get_state(obj)
	info.month=obj.value
	_calendar_redraw(info)
}

function _calendar_on_year(obj) {
	var info=calendar_get_state(obj)
	info.year=obj.value
	_calendar_redraw(info)
}


