//_______________________________________________________________________
//   |       |
//   | knipp |           Knipp Medien und Kommunikation GmbH
//    -------
//
//
//    Project: Pöppelmann Relaunch 2010
//
//    Copyright (C) 2011 by Knipp Medien und Kommunikation GmbH
//
//    initial autor:   Björn Mönikes
//    version:         $Revision: 1636 $
//                     $Date: 2012-01-31 17:17:08 +0100 (Di, 31 Jan 2012) $
//                     $Author: igor.lubimov $
//


(function($){

  $.fn.extend({
    selectbox : function(options)
    {
      if (!$.event._sbCleanup) $.event._sbCleanup = [];

      // set defaults for event timeout, animation duration and padding
      options = $.extend(
      {
        onSelectCallback : null,
        padding : 0
      }
      , options
      );

      return this.each( function() {
        if (!this._sbController) {
          this._sbController = new Selectbox (this);
          $.event._sbCleanup[$.event.guid] = this._sbController;
          $.event._sbCleanup[$.event.guid++].init (options);
        }
      })
    },



    sbGetSelectedText : function()
    {
      if (this[0]._sbController)
        return this[0]._sbController.getSelectedText ();
      return false;
    },

    sbGetSelectedValue : function()
    {
      if (this[0] != undefined && this[0]._sbController)
        return this[0]._sbController.getSelectedValue ();
      return false;
    },

    sbGetId : function()
    {
      if (this[0]._sbController)
        return this[0]._sbController.getId ();
      return false;
    },

    sbGetSelectedReference : function()
    {
      if (this[0]._sbController)
        return this[0]._sbController.getSelectedReference ();
      return false;
    },
    sbSetSelectionByValue : function(value, ignoreCallback)
    {
//      C.log("wrapper: sbSetSelectionByValue");
//      C.log(this);
//      C.log(this[0]);
//      C.log("------");
      if (this && this[0] != undefined && this[0]._sbController)
        return this[0]._sbController.setSelectionByValue (value, ignoreCallback);
      return false;
    },
    sbSetSelected : function()
    {
      return "";
      return _eachCall.call(this, 'start_animating');
    },
    sbSetState : function()
    {
      return "";
      return _eachCall.call(this, 'start_animating');
    },

    sbShowBox : function()
    {
      return _eachCall.call(this, 'start_animating');
    },

    sbAddItem : function(item)
    {
      return _eachCall.call(this, 'addItem', item);
    },

    sbClearItems : function()
    {
      return _eachCall.call(this, 'clearItems');
    },

    sbReset : function()
    {
      return _eachCall.call(this, 'reset');
    },

    // call to repopulate a selectbox
    // data = [ { ref:"", uid:"1", value:"Hallo"} ]
    // sbRepopulate({ ref:"", uid:"1", value:"Hallo"});
    sbRepopulate : function(data, initial) {
      if (this[0]._sbController)
        return this[0]._sbController.repopulate(data, initial);
      return false;
//      return _eachCall.call(this, 'repopulate',data, initial);
    },

    _sbDestroy : function()
    {
      return _eachCall.call(this, 'cleanup');
    }
  });


  var _eachCall = function (f, a1, a2, a3)
  {
    return this.each (function () {
      if (this._tabController)
        this._tabController[f](a1, a2, a3);
    });
  };



  function Selectbox(ele)
  {
    // states
    this.CLOSED = 1;
    this.OPEN = 2;

    // mode
    this.NORMAL = 1;
    this.MULTILEVEL = 2;

    // basic setup
    this.ele = ele;
    this.$ele = $(this.ele);

    this.$ele.addClass("knipp-select-box-anchor");

    // save initial settings
    this.initialText = ""+$(".currentValue", this.$ele).text();
  };

  $.extend(
    Selectbox.prototype,
    {
      bindToObj: function(fn) {
        var self = this;
        return function() {
          return fn.apply(self, arguments)
        };
      },




      init : function(s)
      {
        this.onSelectCallback = s.onSelectCallback;
        // get some setup paramter
        this.padding = s.padding;

        this.state = this.CLOSED;


        this.$text = $("div.text", this.$ele);
        this.$close = $("div.close", this.$ele);

        var $items = this.$ele.children("ul").clone();
        $items.show();

        if ($("li.selected",this.$ele).length > 0)
        {
          this.setCurValue();
        }

        $("div.currentValue",this.$ele).bind("click", this.bindToObj(this.toggleVisibility));
        $("div.close",this.$ele).bind("click", this.bindToObj(this.toggleVisibility));
        //$("div.close",this.$ele).bind("blur", this.bindToObj(this.toggleVisibility));


        this.mode = this.NORMAL;
        if (this.$ele.hasClass("multilevel"))
          this.mode = this.MULTILEVEL;

        switch (this.mode)
        {
          case this.NORMAL:
            $("ul:first li", this.$ele).bind("click", this.bindToObj(this.liClick));
            $("ul:first li", this.$ele).bind("mouseover", this.bindToObj(this.liMouseOver));
            break;
          case this.MULTILEVEL:
            $(".selectbox-row-container", this.$ele).bind("mouseover", this.bindToObj(this.liMouseOver));
            $(".selectbox-switch", this.$ele).bind("click",this.bindToObj(function(evt){
              var $tgt = $(evt.target);
              if ($tgt.parent().siblings("ul:first").is(":hidden")) {
                $tgt.css("background-color","red");
                $tgt.parent().siblings("ul").show();
              }
              else {
                $tgt.parent().siblings("ul").hide();
                $tgt.css("background-color","blue");
              }
            }));
            break;
        }
      },


      // $("#search-teku-product .selectbox.search-plugin").sbRepopulate([{ ref:"", uid:"1", value:"Hallo"}]);
      // $("#search-teku-product .selectbox.search-plugin").sbRepopulate([{ ref:"", uid:"1", value:"Hallo"}],"Bitte auswählen");
      repopulate : function(data, initial) {
        var $ul = $("ul", this.$ele);
//        C.log($ul);
//        C.log(initial);
//        C.log(this.initialText);
        $ul.empty();
        if ($.isArray(data)) {
          var app = "";
          for (var j = 0; j<data.length; j++)
            app += "<li val='"+data[j].uid+"' ref='"+data[j].ref+"' class=''>"+data[j].value+"</li>";
        }
//          C.log(app);
        $ul.append(app);
        $(".currentValue", this.$ele).removeAttr("ref");
        $(".currentValue", this.$ele).removeAttr("val");
        if (initial == undefined)
          $(".currentValue", this.$ele).text(this.initialText);
        else if (initial.value)
          $(".currentValue", this.$ele).text(initial.value);
        else
          $(".currentValue", this.$ele).text(initial);


        //rebind for mode normal
        $("ul:first li", this.$ele).bind("click", this.bindToObj(this.liClick));
        $("ul:first li", this.$ele).bind("mouseover", this.bindToObj(this.liMouseOver));
      },

      setCurValue : function () {
        var $curValueCtrl = $("div.text", this.$ele);
        var $liSelected = $("li.selected",this.$ele);
        var val = $liSelected.attr("val");
        var ref = $liSelected.attr("ref");
        var $formValueCtrl = $curValueCtrl.siblings('input[type="hidden"]');

        C.enable();
        C.log($liSelected.text());

        $curValueCtrl.text($liSelected.text());
        $curValueCtrl.val(val);
        $curValueCtrl.attr("ref", ref);
        $formValueCtrl.val(val).change();
      },

      setSelectionByValue : function(value, ignoreCallback) {
        $("li", this.$ele).removeClass("selected");
//        alert(value);
        var $tgt = $("li[val="+value+"]",this.$ele);
        if ($tgt.length == 0)
          return;
        $tgt.addClass("selected");
        if (!ignoreCallback && this.onSelectCallback != null && jQuery.isFunction(this.onSelectCallback))
          this.onSelectCallback($tgt,value, $tgt.attr("ref"),this.$ele);
        this.setCurValue();
      },

      reset : function () {
        $(".selectbox-row-container", this.$ele).removeClass("mouseover");
        $("ul", this.$ele).hide();
        $("ul:first", this.$ele).show();
        $(".selectbox-switch",this.$ele).css("background-color","blue");
      },

      getId : function () {
        var $obj = this.$ele.parents("div:first").attr("id");
        return $obj;
      },

      liClick : function (evt) {
        $("li", this.$ele).removeClass("selected");
        $(evt.target).addClass("selected");


        if (this.onSelectCallback != null && jQuery.isFunction(this.onSelectCallback))
          this.onSelectCallback($(evt.target),$(evt.target).attr("val"),$(evt.target).attr("ref"), this.$ele);


        this.setCurValue();
        this.toggleVisibility();
      },

      liMouseOver : function (evt) {
        if (!$(evt.target).hasClass("selectbox-row-container"))
          return;
        //C.log(evt.target);
        $(".selectbox-row-container", this.$ele).removeClass("mouseover");
        $(evt.target).addClass("mouseover");
      },


      setSelectedText : function(newTxt) {
        $("li.selected",this.$ele).attr("text", newTxt);
      },

      getSelectedText : function() {
        return $("li.selected",this.$ele).attr("text");
      },

      getSelectedValue : function() {
        return $("li.selected",this.$ele).attr("val");
      },

      getSelectedReference : function() {
        return $("li.selected",this.$ele).attr("ref");
      },


      toggleVisibility : function () {
        if (this.state == this.CLOSED)
        {
          // close other select boxes if open
          var closeOtherBoxes = function(idx, $obj){
            var $container = $(".selectbox-items-container ul:first", $obj);
            if ($container.is(":visible"))
              $("div.close", $obj).click();
          };
          $(".knipp-select-box-anchor").each(closeOtherBoxes);
          this.reset();
          $('ul', this.$ele).show();
          this.state = this.OPEN;
        }
        else
        {
          $('ul', this.$ele).hide();
          this.state = this.CLOSED;
        }
      },


      cleanup : function()
      {
        $(window).unbind("click", this.bindToObj(this.startAnim));
      },





      getPageScroll : function () {
        var xScroll, yScroll;
        if (self.pageYOffset) {
          yScroll = self.pageYOffset;
          xScroll = self.pageXOffset;
        }
        else if (document.documentElement && document.documentElement.scrollTop) {
          yScroll = document.documentElement.scrollTop;
          xScroll = document.documentElement.scrollLeft;
        }
        else if (document.body) {// all other Explorers
          yScroll = document.body.scrollTop;
          xScroll = document.body.scrollLeft;
        }
        return new Array(xScroll,yScroll)
      }
    }
    );


  function _getController(ele)
  {
    if (ele._sbId) return $.event._sbCache[ele._sbId];
    return false;
  };

  // make it so that no error is thrown if bgIfrude plugin isn't included (allows you to use conditional
  // comments to only include bgIfrude where it is needed in IE without breaking this plugin).
  if ($.fn.bgIfrude == undefined) {
    $.fn.bgIfrude = function() {
      return this;
    };
  };


  // clean-up
  $(window).bind('unload', function() {
    var els = $.event._sbCache || [];
    for (var i in els) {
      $(els[i].ele)._sbDestroy();
    }
  });
})(jQuery);

