var CategorySelectObjects = new Array();

function CategorySelect(name, url, size, show, initial, className, values, selecteds, value, disabled)
{
  if(name == undefined)
  {
    alert('Exception: "name" is not defined');
    return;
  }
  if(url == undefined)
  {
    alert('Exception: "url" is not defined');
    return;
  }

  CategorySelectObjects[name] = this;
  this.name = name;
  this.url = url;
  if(size == undefined)
  {
    this.size = 10;
  } else {
    this.size = size;
  }  
  if(show == undefined)
  {
    this.show = 3;
  } else {
    this.show = show;
  }
  if(initial == undefined)
  {
    this.initial = 1;
  } else {
    this.initial = initial;
  }
  if(className == undefined)
  {
    this.className = '';
  } else {
    this.className = className;
  }
  if(values == undefined)
  {
    this.values = null;
  } else {
    this.values = values;
  }
  if(selecteds == undefined)
  {
    this.selecteds = null;
  } else {
    this.selecteds = selecteds;
  }
  if(value == undefined)
  {
    this.value = null;
  } else {
    this.value = value;
  }
  if(disabled == undefined)
  {
    this.disabled = null;
  } else {
    this.disabled = disabled;
  }
}

CategorySelect.prototype.clicked = false;

CategorySelect.prototype.lastVisible = 0;

CategorySelect.prototype.render = function()
{
  var values = null;
  var selected = null;
  
  for(var i = 0 ; i < this.initial ; i++)
  {
	  if(this.values != null)
	  {
		  values = this.values[i];
	  }	  
	  if(this.selecteds != null)
	  {
		  selected = this.selecteds[i];
	  }
	  $(this.name + '_id').appendChild(this.createSelect(i + 1, values, selected));
	  if(i < (this.initial - this.show))
	  {
		  $(this.name + '_' + (i + 1)).hide(); 
	  }
  }

  if(this.initial < this.show)
  {
	  for(i = 0 ; i < (this.show - this.initial) ; i++)
	  {
		  $(this.name + '_id').appendChild(this.createSelect(this.initial + i + 1, null, null));
    }
	}
  try
  {
	$(this.name + '_1').focus(); //IE HACK
  } catch (e) {}
  var info = document.createElement('div');
  info.setAttribute('id', this.name + '_info');
  if (this.disabled)
  {
    info.appendChild(document.createTextNode('Wybrana branża:'))
  }
  else
  {
    info.appendChild(document.createTextNode(''))
  }
  $(this.name + '_id').appendChild(info);
  this.lastVisible = this.initial;
  if(this.values != null)
  {
	  $(this.name + '_info').update(this.getBreadcrumb(this.values.length));
  }
  Event.observe(window, 'load', function() { try{document.body.scrollTop = '220px';}catch(e){};try{document.documentElement.scrollTop = '500px';}catch(e){};});
}

CategorySelect.prototype.createSelect = function(nr, values, selected)
{ 
  var select = document.createElement('select');
  if(this.disabled)
  {
    select.setAttribute('disabled', 'disabled');
  }


  var s = '';
  var i;
  var option;
  
  select.setAttribute('id', this.name + '_' + nr);
  select.setAttribute('size', this.size);
  if(this.className != null)
  {
	  select.setAttribute('class', this.className);
  }
  select.onchange = this.clickHandler;
  select.onclick = this.clickHandler;
  if(values != null)
  {
	  for(i = 0 ; i < values.length ; i++)
	  {
		option = document.createElement('option');
		option.value = values[i][0];
	    if(selected != null && selected == values[i][0])
	    {
	     	option.setAttribute('selected', 'selected');
	    }
	    option.appendChild(document.createTextNode(values[i][1]));
	    select.appendChild(option);
	  }
  }
  option = document.createElement('option');
  option.value = '-';
  option.appendChild(document.createTextNode('----------'));
  select.appendChild(option);
  
  return select;
}

CategorySelect.getInstance = function(str)
{
  return CategorySelectObjects[str.substr(0, str.lastIndexOf('_'))];
}

CategorySelect.getNumber = function(str)
{  
  return parseInt(str.substr(str.lastIndexOf('_')+1));
}

CategorySelect.prototype.clickHandler = function(event)
{
  cs = CategorySelect.getInstance(this.id);
  nr = CategorySelect.getNumber(this.id);
  if(!cs.clicked)
  {
    cs.clicked = true;
    if(this.value != '-')
    {
      new Ajax.Request(cs.url, {
        method:        'post',
        asynchronous:  true,
        evalScripts:   false,
        onSuccess:     CategorySelect.onCategoryLoad,
        parameters:    'name=' + cs.name + '_' + nr + '&level=' + nr + '&id=' + $(cs.name + '_' + nr).value
      });
    } else {
      $(cs.name).value = '';
   	  $(cs.name + '_info').update(cs.getBreadcrumb());
      for(var i = nr + 1 ; i <= cs.lastVisible ; i++)
      {
        $(cs.name + '_' + i).update('<option value="-">----------</option>');               
      }
      if(nr > cs.show)
      {
        for(i = nr - cs.show+1 ; i <= nr ; i++)
        {
          $(cs.name + '_' + i).show();
        }
        for(i = nr + 1 ; i <= cs.lastVisible ; i++)
        {
          $(cs.name + '_' + i).hide();
        }
        cs.lastVisible = nr;
      } else {
    	  for(i = 1 ; i <= cs.show ; i++)
    	  {
    		  $(cs.name + '_' + i).show();
    	  }
    	  for( ; $(cs.name + '_' + i) != null ; i++)
    	  {
    		  $(cs.name + '_' + i).hide();
    	  }
      }
      cs.clicked = false;
    }
  }
}

CategorySelect.prototype.getBreadcrumb = function(nr)
{
	if(nr == undefined || nr == null)
	{
		return 'Wybrana branża:';
	}
	var s = '';
	var i;
	var index;
	for(i = 1 ; i <= nr ; i++)
	{
		if(s == '')
		{
			s = 'Wybrana branża: ';
			index = $(this.name + '_' + i).selectedIndex;
			if (index >= 0)
			{
				s += $(this.name + '_' + i).options[index].text;
			}
		} else {
			s += '&nbsp;&raquo; ';
			index = $(this.name + '_' + i).selectedIndex;
			if (index >= 0)
			{
				s += $(this.name + '_' + i).options[index].text
			}
		}
	}
	
	return s;
}

CategorySelect.onCategoryLoad = function(response, json)
{
  var cs = CategorySelect.getInstance(json['name']);
  var nr = CategorySelect.getNumber(json['name']);
  cs.clicked = false;
  values = json['values'];
  if(values.length == 0)
  {
    $(cs.name + '_info').update(cs.getBreadcrumb(nr));
    $(cs.name).value = json['id'];    
    for(var i = nr + 1 ; i <= cs.lastVisible ; i++)
    {
      $(cs.name + '_' + i).update('<option value="-">----------</option>');               
    }
    if(nr > cs.show)
    {
      for(i = nr - cs.show+1 ; i <= nr ; i++)
      {
        $(cs.name + '_' + i).show();
      }
      for(i = nr + 1 ; i <= cs.lastVisible ; i++)
      {
        $(cs.name + '_' + i).hide();
      }
      cs.lastVisible = nr;
    } else {
  	  for(i = 1 ; i <= cs.show ; i++)
  	  {
  		  $(cs.name + '_' + i).show();
  	  }
  	  for( ; $(cs.name + '_' + i) != null ; i++)
  	  {
  		  $(cs.name + '_' + i).hide();
  	  }
    }
  } else {
    $(cs.name).value = '';
    $(cs.name + '_info').update(cs.getBreadcrumb());
    if($(cs.name + '_' + (nr + 1)) != null)
    {
      var s = '';
      for(var i = 0 ; i < values.length ; i++)
      {
        s += '<option value="' + values[i][0] + '"';
        
        if(this.selecteds != null && this.selecteds[nr -1] == values[i][0])
        {
          s += ' selected="selected"';
        }

        s += '>' + values[i][1] + '</option>';
      }
      s += '<option value="-">----------</option>';
      $(cs.name + '_' + (nr + 1)).update(s);
      $(cs.name + '_' + (nr + 1)).show();     
    } else {
      if($(cs.name + '_info') != null)
      {
    	  $(cs.name + '_id').insertBefore(cs.createSelect(nr + 1, values, null), $(cs.name + '_info'));    	  
      } else {
    	  $(cs.name + '_id').appendChild(cs.createSelect(nr + 1, values, null));
      }
    }
    for(i = nr + 2 ; $(cs.name + '_' + i) != null ; i++)
    {
    	$(cs.name + '_' + i).update('<option value="-">----------</option>');
    }
    cs.lastVisible = nr + 1;
    if(nr + 1 > cs.show)
    {
	    for(i = cs.lastVisible + 1; $(cs.name + '_' + i) != null ; i++)
	    {
	      $(cs.name + '_' + i).hide();  
	    }
	    for(i = cs.lastVisible - cs.show ; i > 0 ; i--)
	    {
	      $(cs.name + '_' + i).hide();
	    }
	    for(i = cs.lastVisible ; i > cs.lastVisible - cs.show ; i--)
	    {
	      $(cs.name + '_' + i).show();
	    }
    } else {
  	  for(i = 1 ; i <= cs.show ; i++)
	  {
		  $(cs.name + '_' + i).show();
	  }
	  for( ; $(cs.name + '_' + i) != null ; i++)
	  {
		  $(cs.name + '_' + i).hide();
	  }    	
    }
  }
}
