/**
 * Этот файл содержит фунции по работе с виджетами телефонов
 */

//{{{ focusNextField - перскакивание курсора на следующий input
/**
 * @param object el элемент провоцирующий действие
 * @param event ev действие
 */
function focusNextField( el, ev )
{
	var keyCode = undefined == ev.which ? ev.keyCode : ev.which;
	var cityCode = parseInt(el.value+String.fromCharCode(keyCode) );
	codes=[495,499,812,903,909,901,926,928,910,912,916,905,906,917];
	var checkCode;
	for ( i=0; i<codes.length; i++ )
	{
		if ( cityCode == codes[i] )
		{
			checkCode = true;
			break;
		}
	}
	if ( checkCode )
	{
		el.value=cityCode;
		if ( is_ie ) {
			ev.returnValue = false;
		}
		else {
			ev.preventDefault();
		}
		if ( !(nextel = nextSibling(el,'INPUT')) )
		{
			nextel = new All(findParent(el,'TR'));
			nextel = nextel['number'];
		}
		nextel.focus();
		nextel.select();
	}
}
//---------------------------------------------------------------------------}}}
//{{{ onlyDigits
/**
 * Обработчик onKeyPress, который позволяет ввод только цифр
 * @param Event ev событие
 */
function onlyDigits( ev )
{
	var keyCode = undefined == ev.which ? ev.keyCode : ev.which;
	if (	isNaN(parseInt( String.fromCharCode(keyCode) ))
		&& keyCode != 0 && keyCode != 8 && keyCode != 13 )
	{
		if ( is_ie ) {
			ev.returnValue = false;
		}
		else {
			ev.preventDefault();
		}
	}
}
//---------------------------------------------------------------------------}}}
//{{{ phoneHotKeys
/**
 * Обработчик горячих клавиш для работы со списком телефонов
 * @param string prefix преффикс списка 
 * @param Event ev событие
 */
function phoneHotKeys( prefix, ev )
{
	var keyCode = undefined == ev.which ? ev.keyCode : ev.which;
	var target = undefined == ev.target ? ev.srcElement : ev.target;
	if (	((ev.ctrlKey == true || ev.altKey == true )
		&&	(keyCode == 10 || keyCode == 13 ))
		|| ( target.id == 'comment' && keyCode == 9 && ev.shiftKey == false && ev.ctrlKey == false) )
	{
		tr = addPhone(prefix);
		tr = new All(tr);
		tr['region_code'].focus();
	}
}
//---------------------------------------------------------------------------}}}
//{{{ showPhoneTypes
/**
 * Показать список для выбора типа телефона
 * @param string prefix преффикс списка
 * @param Element el элемент провоцирующий действие
 */
function showPhoneTypes( prefix, el )
{
	var tr = findParent(el, 'TR');
	var els = new All( tr );
	var list = els['phone_type_list'];
	if ( !layerIsShown(list) )
	{
		addClass(el, 'active');
		var types = list.getElementsByTagName('A');
		for( i = 0; i < types.length; i++ )
		{
			if( els['phone_type'].getAttribute('phoneType') == types[i].getAttribute('phoneType') ) {
				addClass(types[i], 'selected');
			}
			else {
				removeClass(types[i], 'selected');
			}
		} 
		var r = getAbsPos(el, true);
		list.style.left = r.x;
		list.style.top = r.y + el.offsetHeight;
		layerShow(list, el, onHideTypes, 750);
	}
}
//---------------------------------------------------------------------------}}}
//{{{ onHideTypes
/**
 * Обработчик закрывания списка типов телефонов
 * @param Element el элемент списка
 */
function onHideTypes(el)
{
	el = new All( findParent(el, 'TR') );
	removeClass(el['phone_type'], 'active');
}
//---------------------------------------------------------------------------}}}
//{{{ assignPhoneType
/**
 * Выбрать тип телефона
 * @param object el элемент провоцирующий действие
 * @param string type вырбанный тип
 */
function assignPhoneType( prefix, el )
{
	var tr = findParent(el, 'TR');
	var els = new All( tr );
	var type = els['phone_type'];
	setPhoneType( type, el.getAttribute('phoneType'), el.innerHTML );
	showPhoneTypes( prefix, type );
	layerClose( els['phone_type_list'] );
	assemblePhone( prefix );
}
//---------------------------------------------------------------------------}}}
//{{{ setPhoneType
/**
 * Установить тип телефона в заданное значение
 * @param Element el элемент, представляющий тип
 * @param string type тип телефона
 */
function setPhoneType( el, type )
{
	var typeName = '';
	var tr = findParent(el, 'TR');
	var els = new All( tr );
	var list = els['phone_type_list'];
	
	// Работает с кодом города
	if ( els['region_code'].value = els['region_code'].getAttribute( 'inlineHint' ) ) {
		els['region_code'].value = '';
	}
	els['region_code'].setAttribute( 'inlineHint', RegionCodes ? RegionCodes[type] : '' );
	inlineHintUpdate(els['region_code']);
	
	var types = list.getElementsByTagName('A');
	for ( i = 0; i < types.length; i++ )
	{
		if ( types[i].getAttribute('phoneType') == type )
		{
			typeName = types[i].innerHTML;
			break;
		}
	}
	removeClass( el, 'phoneType'+el.getAttribute('phoneType') );
	el.setAttribute('phoneType', type );
	addClass( el, 'phoneType'+type );
	findChild(el,'SPAN').innerHTML = typeName;
}
//---------------------------------------------------------------------------}}}
//{{{ assemblePhone
/**
 * Формирует скрытое строковое представление введённых телефонов
 * @param object el элемент провоцирующий действие
 * @param string preffix преффикс списка
 */
function assemblePhone( preffix )
{
	phones = document.getElementsByName(preffix+'phone_string[]');
	for ( i=0; i<phones.length; i++ )
	{
		var phone_line = phones[i];
		while (phone_line.tagName != 'TR') {
			phone_line = phone_line.parentNode;
		}
		var inputs = new All( phone_line );
		inputs[preffix+'phone_string'].value = 
			inputs['phone_type'].getAttribute('phoneType')
			+ '+' + inputs['country_code'].value
			+ '-' + inputs['region_code'].value
			+ '-' + inputs['number'].value
			+ '*' + inputs['internal_number'].value
			+ "\n"+ inputs['comment'].value + "\n";
	}
}
//---------------------------------------------------------------------------}}}
//{{{ addPhone
/**
 * Добавить телефон к списку
 * @param string prefix преффикс списка
 * @param object btn элемент провоцирующий действие
 * @return Element строка нового телефона
 */
function addPhone(prefix)
{
	var phones = document.getElementById(prefix+'phone_list').rows;
	var tr = phones[phones.length-1];
	tr = tr.parentNode.appendChild(tr.cloneNode(true));
	var t = new All( tr );
	t[prefix+'phone_string'].value = '';

	var next_phone_type = { 'H' : 'M', 'M' : 'H', 'W' : 'H', 'O' : 'M', 'F' : 'M' };
	var next_type = next_phone_type[t['phone_type'].getAttribute('phoneType')];
	setPhoneType( t['phone_type'], next_type );
	t['country_code'].value	= '';
	t['region_code'].value = '';
	t['number'].value = '';
	t['internal_number'].value	= '';
	t['comment'].value	= '';

	
	var buttons = document.getElementsByName(prefix+'addP');
	for (var i=0; i < buttons.length-1; i++) {
		buttons[i].disabled = true;
	}

	if ( blockFieldsRegister ) {
		blockFieldsRegister(tr);
	}
	if ( removeClass ) {
		removeClass(t['country_code'].parentNode, 'change');
		var D = t['country_code'].parentNode.getElementsByTagName( 'div' );
		if ( D.innerHTML ) 
		{
			D[0].innerHTML = '+' + t['country_code'].getAttribute( 'inlineHint' );
			removeClass(t['comment'].parentNode, 'change');
			var D = t['comment'].parentNode.getElementsByTagName( 'div' );
			if ( D.innerHTML )
			{
				D[0].innerHTML = t['comment'].getAttribute( 'inlineHint' );
			}
		}
	}
	return tr;
}
//---------------------------------------------------------------------------}}}
//{{{ dropPhone - удалить телефон из списка
/**
 * @param string prefix преффикс списка
 * @param object btn элемент провоцирующий действие
 */
function dropPhone(prefix, btn)
{
	var tr = findParent(btn, 'TR', true);
	var buttons = document.getElementsByName(prefix+'dropP');

	if (buttons.length > 1) {
		tr.parentNode.removeChild(tr);
	}
	else
	{
		var t = new All( tr );
		t[prefix+'phone_string'].value = ''; 
		setPhoneType( t['phone_type'], 'M' );
		t['country_code'].value	= '';
		t['region_code'].value = RegionCodes ? RegionCodes['M'] : '(...)';
		t['number'].value = '';
		t['internal_number'].value	= '';
		t['comment'].value	= '';
		if ( blockFieldsUpdate ) {
			blockFieldsUpdate(tr);
		}
		if ( removeClass ) {
			removeClass(t['country_code'].parentNode, 'change');
			var D = t['country_code'].parentNode.getElementsByTagName( 'div' );
			if ( D.innerHTML ) 
			{
				D[0].innerHTML = '+' + t['country_code'].getAttribute( 'inlineHint' );
				removeClass(t['comment'].parentNode, 'change');
				var D = t['comment'].parentNode.getElementsByTagName( 'div' );
				if ( D.innerHTML )
				{
					D[0].innerHTML = t['comment'].getAttribute( 'inlineHint' );
				}
			}
		}
	}
	var buttons = document.getElementsByName(prefix+'addP');
	if ( buttons.length ) {
		buttons[buttons.length - 1].disabled = false;
	}
}
//---------------------------------------------------------------------------}}}
//{{{ clearPhones
/**
 * Очищает список телефонов
 * @param string prefix преффикс списка
 */
function clearPhones(prefix)
{
	var list = document.getElementById(prefix+'phone_list').rows;
	var i;
	for ( i = list.length-1; i >= 0; i-- ) {
		dropPhone(prefix, list[i]);
	}
}
//---------------------------------------------------------------------------}}}
//{{{ copyPhones
/**
 * Копирует список телефонов из одного виджета в другой
 * @param string from префикс виджета-источника
 * @param string to префикс виджета-приёмника
 */
function copyPhones( from, to )
{
	var props = ['phone_type', 'country_code', 'region_code', 'number', 'internal_number', 'comment'];
	var i, j;
	var trFrom;
	clearPhones(to);
	var list = document.getElementById(from+'phone_list').rows;
	var trTo = document.getElementById(to+'phone_list').rows[0];
	for ( i = 0; i < list.length; i++ )
	{
		if ( i > 0 ) {
			trTo = addPhone(to);
		}
		trFrom = new All( list[i] );
		trTo = new All( trTo );
		for ( j in props ) {
			trTo[props[j]].value = trFrom[props[j]].value;
		}
		trTo[to+'phone_string'].value = trFrom[from+'phone_string'].value;
		setPhoneType( trTo['phone_type'], trFrom['phone_type'].getAttribute('phoneType') );
	}
}
//---------------------------------------------------------------------------}}}
// changeCountryCode
/**
 * Обработчик раскрывания +7
 */
function changeCountryCode( el )
{
	var x = new All(el.parentNode);
	if ( !x['country_code'].disabled )
	{
		addClass(el.parentNode, 'change');
		x['country_code'].focus();
	}
}
//---------------------------------------------------------------------------}}}
// changeComment
/**
 * Обработчик раскрывания комментарий...
 */
function changeComment( el )
{
	var x = new All(el.parentNode);
	if ( !x['comment'].disabled )
	{
		addClass(el.parentNode, 'change');
		x['comment'].focus();
	}
}
//---------------------------------------------------------------------------}}}
/*============================================================================*
 * vim: set expandtab tabstop=3 shiftwidth=3 foldmethod=marker:               *
 *   END OF FILE                                                              *
 *============================================================================*/
