jQuery.fn.categorySuggest = function(idF, idB, params, idR) {
  var thisField = $(this);
  $('<ul id="suggestList"></ul>').prependTo('body');
  var idButton = idB;
  var idField = idF;
  var idRule = idR;
  var params = params?params:'';
  var txtField = $(this);
  var oldValue = $(this).val();
  var doCheck = false;
  var prevValue = '';
  var suggestTimer = null;
  var suggestList = $("#suggestList");
  txtField.css({"background-repeat":"no-repeat"});
  txtField.css({"background-position":"right"});
  $(this).bind("focus", function(event){ 
    prevValue = '';
    txtField.val('');
    doCheck = true;
    check();
    txtField.addClass('selected');
    return false;
  });
  $(this).bind("keydown", function(event){
    txtField.removeClass('empty');
    key = event.keyCode;
    event.stopPropagation(); 
    if (key==38 || key==40 || key==13 || key==27) {
      checkList(key);
      return false;
    }
  });
  $(this).bind("blur", function(event){
    setTimeout(function(){
      txtField.removeClass('selected');
      if (idField.val()<1) txtField.addClass('empty');
      suggestList.hide();
      txtField.val(oldValue);
      doCheck = false;
    }, 200);
    return false;
  });
  function check() {
    if (!doCheck) return false;
    if (prevValue!=txtField.val()) {
      prevValue = txtField.val();
      suggestList.hide();
      clearTimeout(suggestTimer);
      if (prevValue.length>1) suggestTimer = setTimeout(typeList, 500);
    }
    setTimeout(check, 10);
  }
  function typeList() {
    txtField.css({"background-image":"url('http://g.miplo.pl/s.gif')"});
    suggestList.load("/c/category-suggest.php?s="+encodeURIComponent(prevValue)+params, function(){
      $(this).show();
      var p = thisField.offset();
      $(this).css({'top':p.top+thisField.innerHeight()+'px','left':p.left+'px'});
      $('li', this).mouseover(function(){
        $('#suggestList li').removeClass('selected');
        $(this).addClass('selected');
      });      
      $('li', this).mouseout(function(){
        $(this).removeClass('selected');
      });      
      $('li', this).click(function(){
        doCheck = false;
        suggestList.hide();
        oldValue = $(this).attr('rel');
        if ($(this).attr('name')=='0') txtField.addClass('empty');
        txtField.val(oldValue);
        idField.val($(this).attr('name'));
        idRule.text($(this).attr('title')+':');
      });      
      txtField.css({"background-image":"none"});
    });
  }
  function checkList(key) {
    sel = $('#suggestList li.selected').attr('id');
    if (key==13) {
      if (sel>0) {
        doCheck = false;
        oldValue = $('#'+sel).text();
        txtField.val(oldValue);
        idField.val($('#'+sel).attr('name'));
        idRule.text($('#'+sel).attr('title')+':');
        txtField.blur();
        if (!idButton.attr('disabled')) idButton.focus();
      }
      else {
        doCheck = false;
        oldValue = '';
        txtField.val('');
        idField.val('0');
        txtField.blur();
        if (!idButton.attr('disabled')) idButton.focus();
      }
      return false;
    }
    if (key==27) {
      doCheck = false;
      txtField.blur();
      if (!idButton.attr('disabled')) idButton.focus();
    }
    if (key==38) {
      if (sel) {
        sel--;
        $('#suggestList li').removeClass('selected');
        $('#'+sel).addClass('selected');
      } 
      else $('#suggestList li:last').addClass('selected');
      return false;
    }
    if (key==40) {
      if (sel) {
        sel++;
        $('#suggestList li').removeClass('selected');
        $('#'+sel).addClass('selected');
      }
      else $('#suggestList li:first').addClass('selected');
      return false;
    }
  }
};

IconSelector = function (AppenTo, Category, Callback) {
  this.Category = Category;
  this.Callback = Callback;
  this.prevSearchValue = '1';
  this.timer = null;
  this.selectedIcon;
  $("#iconSelectorWin").remove();
  this.iconSelectorWin = $("<div class=\"suggestSelectorWin\" id=\"iconSelectorWin\"><img src=\"http://g.miplo.pl/close.gif\" class=\"close\" /><input type=\"text\" id=\"iconSelectorSearch\" /><div class=\"results\"></div><!--[if lte IE 6.5]><iframe></iframe><![endif]--></div>").appendTo(AppenTo);
  $("#iconSelectorWin img.close").click(this.stop);
};

IconSelector.prototype = {

  /* Sprawdzam czy zmieniło się pole szukaj */
  checkiconSelector: function () {
    var that = this;
    if (this.prevSearchValue!=$("#iconSelectorSearch").val()) {
      $("#iconSelectorSearch").css({"background-image":"url('http://g.miplo.pl/s.gif')"});
      this.prevSearchValue = $("#iconSelectorSearch").val();
      $("div.results").text('');
      clearTimeout(this.timer);
      this.timer = setTimeout(function(){that.rebuildList();}, 500);
    }
    setTimeout(function(){that.checkiconSelector();}, 10);
  },

  /* Tworzę listę */
  rebuildList: function () {
    var that = this;
    $.getJSON("/c/icons.php?c="+this.Category+"&s="+$("#iconSelectorSearch").val(), function(json){
      $("#iconSelectorSearch").css({"background-image":"url('http://g.miplo.pl/s.gif')"});
      $("div.results").text('');
      var nums = json.list.length;
      var c = '';
      for(i=0;i<nums;i++) {
        if (json.list[i].v=='0') c = 'first'; 
        else if (json.list[i].v=='null') c = 'second';
        else c = '';
        if (json.list[i].v==that.selectedIcon) c+= ' selected';
        $("<div id=\""+json.list[i].i+"\" val=\""+json.list[i].v+"\" class=\""+c+"\"><img class=\"i\" src=\"http://i.miplo.pl/"+json.list[i].i+".bmp\" /> "+json.list[i].n+"</div>").appendTo("div.results");
      }
      $("#iconSelectorWin div.results div").hover(function(){
        $(this).addClass("hover");
      },function(){
        $(this).removeClass("hover");
      });
      $("#iconSelectorWin div.results div").click(function(){
        that.iconSelectorWin.hide();
        that.Callback($(this).attr("id"),$(this).attr("val"));
      });
      $("#iconSelectorSearch").css({"background-image":"none"});
    });
  },

  /* Rozpoczynam wybór */
  start: function (i) {
    if (this.selectedIcon!=i) {
      this.selectedIcon = i;
      this.rebuildList();
    }
    this.checkiconSelector();
    $("#iconSelectorWin").show();
    $("#iconSelectorSearch").focus();
  },

  /* Zamykam */
  stop: function () {
    $("#iconSelectorWin").hide();
  }
}

SoundSelector = function (AppenTo, Category, Callback) {
  this.Category = Category;
  this.Callback = Callback;
  this.prevSearchValue = '1';
  this.timer = null;
  this.selectedSound;
  $("#soundSelectorWin").remove();
  this.soundSelectorWin = $("<div class=\"suggestSelectorWin\" id=\"soundSelectorWin\"><img src=\"http://g.miplo.pl/close.gif\" class=\"close\" /><input type=\"text\" id=\"soundSelectorSearch\" /><div class=\"results\"></div><!--[if lte IE 6.5]><iframe></iframe><![endif]--></div>").appendTo(AppenTo);
  $("#soundSelectorWin img.close").click(this.stop);
};

SoundSelector.prototype = {

  /* Sprawdzam czy zmieniło się pole szukaj */
  checksoundSelector: function () {
    var that = this;
    if (this.prevSearchValue!=$("#soundSelectorSearch").val()) {
      $("#soundSelectorSearch").css({"background-image":"url('http://g.miplo.pl/s.gif')"});
      this.prevSearchValue = $("#soundSelectorSearch").val();
      $("div.results").text('');
      clearTimeout(this.timer);
      this.timer = setTimeout(function(){that.rebuildList();}, 500);
    }
    setTimeout(function(){that.checksoundSelector();}, 10);
  },

  /* Tworzę listę */
  rebuildList: function () {
    var that = this;
    $.getJSON("/c/sounds.php?c="+this.Category+"&s="+$("#soundSelectorSearch").val(), function(json){
      $("#soundSelectorSearch").css({"background-image":"url('http://g.miplo.pl/s.gif')"});
      $("div.results").text('');
      var nums = json.list.length;
      var c, s, play;
      for(i=0;i<nums;i++) {
        if (json.list[i].i==0) {
          c = 'second'; 
          s = "<img src=\"http://g.miplo.pl/nosound.gif\" />";
          play = '';
        }
        else {
          c = '';
          s = "<img src=\"http://g.miplo.pl/sound.gif\" />";
          play = "<img class=\"s\" src=\"http://g.miplo.pl/play.gif\" sound=\"/s/"+json.list[i].i+".wav\" />";
        }
        if (json.list[i].i==that.selectedSound) c+= ' selected';
        $("<div id=\""+json.list[i].i+"\" val=\""+json.list[i].v+"\" class=\""+c+"\">"+play+s+" "+json.list[i].n+"</div>").appendTo("div.results");
      }
      $("#soundSelectorWin div.results div").hover(function(){
        $(this).addClass("hover");
      },function(){
        $(this).removeClass("hover");
      });
      $("#soundSelectorWin div.results div").click(function(){
        that.soundSelectorWin.hide();
        that.Callback($(this).attr("id"),$(this).attr("val"));
      });
      $("img.s").play();
      $("#soundSelectorSearch").css({"background-image":"none"});
    });
  },

  /* Rozpoczynam wybór */
  start: function (i) {
    if (this.selectedSound!=i) {
      this.selectedSound = i;
      this.rebuildList();
    }
    this.checksoundSelector();
    $("#soundSelectorWin").show();
    $("#soundSelectorSearch").focus();
  },

  /* Zamykam */
  stop: function () {
    $("#soundSelectorWin").hide();
  }
}
