/*
Class: DblSelects
Два связанных селекта.

Очень часто встречается конструкция: два селекта, при выборе чего-то в одном
меняется содержимое второго. Этот класс эту фигню и реализует.

Первый селект называется primary, второго (в котором меняются данные)  secondary.

Есть два способа организации: когда первый селект уже заполнен и к нему надо подцепить 
второй, либо когда надо сгенерить оба селекта исходя из исходных данных. Если primary пуст,
то он заполняется (второй случай), иначе первый случай.

Зависит от:
 - prototype.js
 - utils.js

Возможные события:
 - primchanged - Изменен первый селект (и с ним уже сделано все, что надо)
 	NB: primchanged != onchange. Это событие проиходит только тогда, когда
		мы поменяли данные в первом селекте.
 - secchanged - Изменен второй селект и с ним уже все сделано то, что надо.
 	NB: secchanged != onchange. Это событие проиходит только тогда, когда
		мы поменяли данные во втором селекте.
*/
var DblSelects = Class.create(Eventer,{
/*
Constructor: initialize

Parameters:
	primary - Имя (id) первого селекта. Если в primary текущий выбранный элемент имеет значение 0,
		то мы считаем, что это приветствие и secondary будет задисэйблен.
		Так же может быть хэш вида
		- name - Имя (id) первого селекта
		- welcome_msg - Сообщение по умолчанию. После того, как мы сменим пункт, это сообщение будет удалено. 
		- default - Значение по умолчанию
		- leave_welcome - Оставить welcome_msg после того, как с него ушли. по умолчанию 0.
	secondary - Описание второго селекта. Содержит поля
		- name - Имя (id) второго селекта
		- default - Текущее выбранное значение (для отображение по умолчанию)
		- welcome_msg - Сообщение по умолчанию. После того, как мы сменили выбранный пункт в primary 
			и заменили информацию в secondary, мы можем в secondary первым пунктом добавить приветствие
				(наример: 'Выберите подпункт'), а можем и не добавлять и тогда по умолчанию будет 
				отображаться первый 'нормальный элемент'. Если указан welcome_msg, то мы считаем,
				что это приветствие и его надо показывать. Его значением будет всегда 0.
		- leave_welcome - Оставить welcome_msg после того, как с него ушли. по умолчанию 0.
	data - Данные для secondary. Содержит поля	
		- prim_id - Имя поля с id для primary select'a 
		- sec_id - Имя поля с id для второго select'a
		- prim_name - Имя поля в названием пункта (может быть не указано в случае режима 2)
		- sec_name - Имя поля в названием подпункта
		- content - Массив с данными.
*/
initialize: function($super,p,s,d){
	$super();
	this.prim = $(p.name);this.sec = $(s.name);this.prim_msg=(p.welcome_msg || '');
	this.lv_sec = (s.leave_welcome || 0);
	this.lv_prim = (p.leave_welcome || 0);
	this.sec_msg = (s.welcome_msg || '');
	// понимаем, в каком режиме мы находимся
	var mode = (this.prim.options.length ? 0 : 1);
	/*Преобразуем данные в нормальный вид*/
	this.data = {};
	var pdata = [];
	var cpid = 0;
	for(var i=0;i<d.content.length;i++){
		if (mode && cpid != d.content[i][d.prim_id]){
			pdata.push({id:d.content[i][d.prim_id],name:d.content[i][d.prim_name]});
			cpid = d.content[i][d.prim_id];
		}
		if (! this.data[d.content[i][d.prim_id]]){
			this.data[d.content[i][d.prim_id]] = [];
		}
		this.data[d.content[i][d.prim_id]].push({id:d.content[i][d.sec_id],
											 name:d.content[i][d.sec_name]});	
	}
	if (mode){
		this._setPrimaryDefault(pdata,(p['default'] || 0),this.prim_msg);
	}
	this.primaryChanged((s['default'] || 0));
	this.prim.onchange = this.primaryChanged.bindAsEventListener(this);
	if (this.sec_msg){
		this.secondaryChanged();
		this.sec.onchange = this.secondaryChanged.bindAsEventListener(this);
	}
},
_setPrimaryDefault: function(d,def,msg){
	var add = 0;
	if (msg){
		this.prim.options[0] = new Option(msg,0);
		add = 1;
	}
	for(var i=0;i<d.length;i++){
		this.prim.options[i+add] = new Option(d[i].name,d[i].id);	
		if (def && d[i].id == def){
			this.prim.selectedIndex = i+add;
		}
	}
},
primaryChanged: function(def){
	this.sec.options.length = 0;
	if ($F(this.prim) == 0){
		this.sec.disable();
		if (this.sec_msg){
			this.sec.options[0] = new Option(this.sec_msg,0);	
		}
		this.fire('primchanged');
		this.fire('secchanged');
		return true;
	}	
	this.sec.enable();
	var fire = 0;
	if (this.prim.options[0].value == 0 && !this.lv_prim){
		this.prim.options[0] = null;	
		fire = 1;
	}
	var add = 0;
	if (this.sec_msg){
		this.sec.options[0] = new Option(this.sec_msg,0);
		add = 1;
	}
	var d = this.data[$F(this.prim)];
	if (!d) {
		if (fire)
			this.fire('primchanged');
		this.fire('secchanged');
		return true;
	}
	for(var i=0;i<d.length;i++){
		this.sec.options[i+add] = new Option(d[i].name,d[i].id);	
		if (def && d[i].id == def){
			this.sec.selectedIndex = i+add;
		}
	}
	if (fire)
		this.fire('primchanged');
	this.fire('secchanged');
	return true;
},
secondaryChanged: function(){
	if (!this.sec.options[0])
		return true;
	if (this.sec.options[0].value == 0 && $F(this.sec) != 0 && ! this.lv_sec){
		this.sec.options[0] = null;
		this.fire('secchanged');
	}
	return true;
},
/**
Method:fullName
Возвращает выбранные имена

Parameters:
	pid - Id из primary
	sid - Id из secondary. Если не уазано, то и не возвращется.
*/
fullName: function (p,s){
	var cur = this.data[p];
	if (cur == undefined)
		return '';
	var name = '';
	for(var i=0;i<this.prim.options.length;i++){
		if (this.prim.options[i].value == p){
			name=this.prim.options[i].text;
			break;	
		}
	}
	if (s == undefined || s == 0)
		return name;
	for(var i=0;i<cur.length;i++){
		if (cur[i].id == s){
			name+=' '+cur[i].name;
			break;	
		}
	}
	return name;
},
/**
Method: selected
Возвращает выбранные id из селектов

Parameters:
	select - primary/secondary
*/
selected: function (mode){
	if (mode == 'primary'){
		return this.prim._getValue();
	}else{
		return this.sec._getValue();
	}
}
});
