/*
wwww.tigir.com - 17.05.2006
Biblioteka linkedselect.js iz stat'i "Javascript SELECT - dinamicheskie spiski" - http://www.tigir.com/linked_select.htm

syncList - "klass" svyazannyh spiskov
Dlya vklyucheniya sinhronizacii svyazannyh spiskov
var syncList1 = new syncList;

// Opredelyaem znacheniya podchinennyh spiskov (2 i 3 selektov)
syncList1.dataList = {

// Opredelyaem elementy vtorogo spiska v zavisimosti 
//ot vybrannogo znacheniya v pervom spiske 

  'ie':{
      'ie_win':'Windows',
      'ie_mac':'Mac'
  },
  
  'safari':{
      'safari_mac':'Mac'
  },

// Opredelyaem elementy tret'ego spiska v zavisimosti 
//ot vybrannogo znacheniya vo vtorom spiske 

  'ie_win':{
      'ie_win_5':'versiya 5',
      'ie_win_6':'versiya 6'
  },
  
  'ie_mac':{
      'ie_mac_5':'versiya 5'
  },
  
  'safari_mac':{
      'safari_mac_1':'versiya 1',
      'safari_mac_2':'versiya 2'
  }
};

syncList1.sync("List1","List2","List3");

*/

function syncList(){} //Opredelyaem funkciyu konstruktor

//Opredelyaem metody

//Metod sync() - prinimaet spisok iz znachenii atributov id elementov SELECT, obrazuyuschih svyazannyi spisok i zapuskaet ih sinhronizaciyu
syncList.prototype.sync = function()
{
	//Perebiraem argumenty (id elementov SELECT) i naznachaem sobytiyam onChange selektov, s sootvetstvuyuschimi id, funkciyu-obrabotchik. 
	//V kachestve obrabotchika vystupaet vtoroi metod obekta syncList - _sync (napryamuyu ego vyzyvat' ne nujno) 
	//Obrabotchik naznachaetsya vsem elementam SELECT krome poslednego v spiske argumentov, t.k. poslednii ne vliyaet ni na kakoi drugoi element SELECT i s nim ne nujno sinhronizirovat'sya.
	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();//zapuskaem obrabotchik onchange pervogo selekta, chtoby pri zagruzke stranicy zapolnit' dochernie selekty znacheniyami.
}
//slujebnyi metod _sync - srabatyvaet pri smene vybrannogo elementa v tekuschem (starshem) elemente SELECT (po ego sobytiyu onChange) i izmenyaet soderjimoe zavisimogo selekta na osnovanii znacheniya vybrannogo v starshem selekte.
syncList.prototype._sync = function (firstSelectId, secondSelectId)
{
	var firstSelect = document.getElementById(firstSelectId);
	var secondSelect = document.getElementById(secondSelectId);

	secondSelect.length = 0; //obnulyaem vtoroi (podchinennyi) SELECT
	
	if (firstSelect.length>0)//esli pervyi (starshii) SELECT ne pust
	{
		//iz svoistva dataList, s dannymi dlya zapolneniya podchinennyh selektov, berem tu chast' dannyh, kotoraya sootvetstvuet imenno znacheniyu elementa, 
		//vybrannogo v pervom selekte, i opredelyaet soderjimoe podchinennogo elementa SELECT.
		var optionData = this.dataList[ firstSelect.options[firstSelect.selectedIndex==-1 ? 0 : firstSelect.selectedIndex].value ];
		//zapolnyaem vtoroi (podchinennyi) selekt znacheniyami (sozdaem elementy option)
		for (var key in optionData || null) secondSelect.options[secondSelect.length] = new Option(optionData[key], key);
		
		//esli v starshem SELECT-e net vydelennogo punkta, vydelyaem pervyi
		if (firstSelect.selectedIndex == -1) setTimeout( function(){ firstSelect.options[0].selected = true;}, 1 );
		//esli vo vtorom spiske net vydelennogo punkta, vydelyaem pervyi ego punkt
		if (secondSelect.length>0) setTimeout( function(){ secondSelect.options[0].selected = true;}, 1 );

		//esli vtoroi (podchinennyi) selekt imeet v svoyu ochered' svoi podchinennye selekty (te, dlya kotoryh on glavnyi), 
		//to zapuskaem ego obrabotchik onchange, chtoby izmenit' ego podchinennye selekty
		secondSelect.onchange && secondSelect.onchange();
	}
};

