var Locations = function(){};
Locations.prototype = {
	
	data : null,		// data
	objects : null,		// selects	
	dontHide : false,	// dont hide selects
	useDefaultOption : false,
	
	updateCallback : null,
	
	// ------------------------ //
		
	setData : function(d)
	{
		this.data = d;
	},
	
	setUpdateCallback : function(v)
	{
		this.updateCallback = v;
	},
	
	setObjects : function(d)
	{
		this.objects = new Array();
		for(var i = 0, length = d.length; i < length; i++)
		{
			this.objects.push(document.getElementById(d[i]));
			$(this.objects[i]).change(this.update.prototypeBind(this, i + 1));
		}
	},
	
	getDataForSelectedItem: function(level)
	{
		var d = null;
		if(this.data[level] !== undefined && this.data[level][this.objects[level-1].value] !== undefined && this.data[level][this.objects[level-1].value][this.objects[level].selectedIndex] !== undefined)
		{
			d = this.data[level][this.objects[level-1].value][this.objects[level].selectedIndex];
		}
		return d;
	},
		
	handle : function()
	{
		if (this.data == undefined || this.data == null)
		{
			return;
		}
		this.fill(0, 1);	
		this.update(1);
	},
	
	update : function(fromLevel)
	{
		var hide = false;
		for(var i = fromLevel; i < this.objects.length; i++)
		{
			if(hide)
			{
				this.objects[i].style.display = 'none';
				continue;
			}
			var si = this.objects[i-1].selectedIndex;

			if(si >= 0)
			{
				this.objects[i].style.display = '';
				this.fill(i, this.objects[i-1].options[si].value);
			}
			else
			{
				hide = true;
				this.objects[i].style.display = 'none';
			}
			
			if (this.updateCallback)
			{
				this.updateCallback(i, this.objects[i]);
			}
		}
	},
	
	select : function(d)
	{
		for(var i = 0, length = d.length; i < length; i++)
		{
			var s = this.objects[i];
			for(var k=0; k < s.options.length; k++)
			{
				if (s.options[k].selected)
				{
					s.options[k].removeAttribute('selected');
					break;
				}
			}
			
			for(var k=0; k < s.options.length; k++)
			{
				if (s.options[k].value == d[i])
				{
					s.options[k].setAttribute('selected', "selected");
					s.selectedIndex = k;
					this.update(i+1);
					break;
				}
			}
		}
	},
	
	/**
	 * sid - select_id
	 * id  - selected_item
	 */
	fill : function(sid, id)
	{
		$(this.objects[sid]).empty();
		
		var index = 0;
				
		if (this.useDefaultOption)
		{
			var option = document.createElement('option');
			option.innerHTML = this.objects[sid].getAttribute('default_value') ? this.objects[sid].getAttribute('default_value') : '----------';
			option.value = 0;
			this.objects[sid].appendChild(option);
			index++;	
		}

		if(this.data[sid] && this.data[sid][id])
		{
			for(var i in this.data[sid][id])
			{
				var item = this.data[sid][id][i];
				var option = document.createElement('option');
				option.innerHTML = item.title;
				option.value = item.id;
				
				if (item.attributes)
				{
					for (var k in item.attributes)
					{
						option.setAttribute(k, item.attributes[k]);
					}
				}

				this.objects[sid].appendChild(option);
				if (this.data[sid][id][i].selected)
				{
					option.setAttribute('selected', "selected");
					this.objects[sid].selectedIndex = index;
				}
				index++;
			}
		}
		else
		{
			if (!this.dontHide)
			{			
				this.objects[sid].style.display = 'none';
			}
		}
	}	
};
