/*
wwww.tigir.com (дата последней модификации - 30.11.2007)
Библиотека linkedselect.js из статьи "Javascript SELECT - динамические списки" - http://www.tigir.com/linked_select.htm

syncList - "класс" связанных списков
*/
function syncList(){} //Определяем функцию конструктор

//Определяем методы

//Метод sync() - принимает список из значений атрибутов id элементов SELECT, образующих связанный список и запускает их синхронизацию
syncList.prototype.sync = function()
{
	//Перебираем аргументы (id элементов SELECT) и назначаем событиям onChange селектов, с соответствующими id, функцию-обработчик. 
	//В качестве обработчика выступает второй метод объекта syncList - _sync (напрямую его вызывать не нужно) 
	//Обработчик назначается всем элементам SELECT кроме последнего в списке аргументов, т.к. последний не влияет ни на какой другой элемент SELECT и с ним не нужно синхронизироваться.
	for (var i=0; i < arguments.length-1; i++)	document.getElementById(arguments[i]).onchange = (function (o,id1,id2){return function(){o._sync(id1,id2);};})(this, arguments[i], arguments[i+1]);
	document.getElementById(arguments[0]).onchange();//запускаем обработчик onchange первого селекта, чтобы при загрузке страницы заполнить дочерние селекты значениями.
}
//служебный метод _sync - срабатывает при смене выбранного элемента в текущем (старшем) элементе SELECT (по его событию onChange) и изменяет содержимое зависимого селекта на основании значения выбранного в старшем селекте.

syncList.prototype._sync = function (firstSelectId, secondSelectId)
{
	var firstSelect = document.getElementById(firstSelectId);
	var secondSelect = document.getElementById(secondSelectId);

	secondSelect.length = 0; //обнуляем второй (подчиненный) SELECT
	
	if (firstSelect.length>0)//если первый (старший) SELECT не пуст
	{
		//из свойства dataList, с данными для заполнения подчиненных селектов, берем ту часть данных, которая соответствует именно значению элемента, 
		//выбранного в первом селекте, и определяет содержимое подчиненного элемента SELECT.
		var optionData = this.dataList[ firstSelect.options[firstSelect.selectedIndex==-1 ? 0 : firstSelect.selectedIndex].value ];
		//заполняем второй (подчиненный) селект значениями (создаем элементы option)
		for (var key in optionData || null) secondSelect.options[secondSelect.length] = new Option(optionData[key], key);
		
		//если в старшем SELECT-е нет выделенного пункта, выделяем первый
		if (firstSelect.selectedIndex == -1) setTimeout( function(){ firstSelect.options[0].selected = true;}, 1 );
		//если во втором списке нет выделенного пункта, выделяем первый его пункт
		if (secondSelect.length>0) setTimeout( function(){ secondSelect.options[0].selected = true;}, 1 );
	}
	//если второй (подчиненный) селект имеет в свою очередь свои подчиненные селекты (те, для которых он главный), 
	//то запускаем его обработчик onchange, чтобы изменить его подчиненные селекты
	secondSelect.onchange && secondSelect.onchange();
	//secondSelect.onchange;
};

// Создаем новый объект связанных списков
var syncList1 = new syncList;

// Определяем значения подчиненных списков 
syncList1.dataList = {

/* Определяем элементы второго списка в зависимости 
от выбранного значения в первом списке */

  'cfo':{
      '2K':'г. Москва',
      'E':'Белгородская область',
      'F':'Брянская область',
      'G':'Владимирская область',
      'H':'Воронежская область',
      'I':'Ивановская область',
      '6':'Калужская область',
      'J':'Костромская область',
      'K':'Курская область',
      'L':'Липецкая область',
      'D':'Московская область',
      'M':'Орловская область',
      '4':'Рязанская область',
      'N':'Смоленская область',
      'O':'Тамбовская область',
      'P':'Тверская область',
      '5':'Тульская область',
      'Q':'Ярославская область'

  },
  
  'szfo':{
      '2L':'г.Санкт-Петербург',
	  'R':'Республика Карелия',
	  'S':'Республика Коми',
	  '7':'Архангельская область',
	  'A':'Вологодская область',
	  '9':'Калининградская область',
	  'T':'Ленинградская область',
	  'U':'Мурманская область',
	  'W':'Новгородская область',
	  '8':'Псковская область',
	  'V':'Ненецкий автономный округ'
  },
  'ufo':{
      'X':'Республика Адыгея',
	  '11':'Республика Калмыкия',
	  '15':'Краснодарский край',
	  '17':'Астраханская область',
	  '18':'Волгоградская область',
	  '19':'Ростовская область'
  },
  'pfo':{
      '1G':'Республика Башкортостан',
	  '1H':'Республика Марий Эл',
	  '1I':'Республика Мордовия',
	  '1J':'Республика Татарстан',
	  '1K':'Удмуртская Республика',
	  '1L':'Чувашская Республика',
	  '1M':'Кировская область',
	  '1N':'Нижегородская область',
	  '1O':'Оренбургская область',
	  '1P':'Пензенская область',
	  '1Q':'Пермский край',
	  '1R':'Самарская область',
	  '1S':'Саратовская область',
	  '1T':'Ульяновская область'
  },
  'yfo':{
      '1A':'Курганская область',
	  '1B':'Свердловская область',
	  '1C':'Тюменская область',
	  '1D':'Челябинская область',
	  '1E':'Ханты-Мансийский автономный округ',
	  '1F':'Ямало-Ненецкий автономный округ'
  },
  'sfo':{
      '1V':'Республика Алтай',
	  '1W':'Республика Бурятия',
	  '1X':'Республика Тыва',
	  '1Y':'Республика Хакасия',
	  '1Z':'Алтайский край',	  '29':'Забайкальский край',
	  '20':'Красноярский край',
	  '21':'Иркутская область',
	  '22':'Кемеровская область',
	  '23':'Новосибирская область',
	  '24':'Омская область',
	  '25':'Томская область'
  },
  'dfo':{
      'C':'Республика Саха (Якутия)',
	  '2B':'Приморский край',
	  '2C':'Хабаровский край',
	  '2D':'Амурская область',
	  '2E':'Камчатский край',
	  '2F':'Магаданская область',
	  '2G':'Сахалинская область',
	  '2J':'Чукотский автономный округ',
	  '2H':'Еврейская автономная область'
  },
  'skfo':{
      'Y':'Республика Дагестан',
      'Z':'Республика Ингушетия',
      '10':'Кабардино-Балкарская Республика',
      '12':'Карачаево-Черкесская',
      '13':'Республика Северная Осетия-Алания',
      '14':'Чеченская Республика',
      '16':'Ставропольский край'
  }

};

// Включаем синхронизацию связанных списков
//syncList1.sync("tip_fo","tip_ato");
