(function($){ // create closure

  /**
   * BDS Article Toggler plugin
   *
   * Plugin is used to render some article details on change of article selctbox.
   *
   * @param object  plug-in options
   * @param object  elements to toggle
   * @param object  article data
   * @param object  index of selected article
   * @return  object  this
   */
  $.fn.bdArticleToggler = function(settings,elements,articles,idx){
    // merge default settings with dynamic settings
    var o = $.extend({}, $.fn.bdArticleToggler.defaults, settings);
    var _toggle = function(elements,articles,idx) {
        $(elements).each(function(){
          _render($(this),articles,idx);
        });
        return this;
    };

    /**
     * Renders output
     */
    var _render = function(element, articles, idx){

      // get article by id
      if (idx)
        var article = jQuery.grep(articles, function(n, i){
              return (n.id == idx);
        });

      switch (element.attr('render')) {
        case 'ajax':
          if($(article).attr(element.attr('property')) == true)
          {
            var indicator = new loadIndicator(element.attr('load_text'));
            $.ajax({
              global: true,
              url: element.attr('url'),
              data: { id: $(article).attr('id') },
              beforeSend: function() {
                  indicator.show($('#'+element.attr('id')));
                },
              success: function(data, textStatus, jqXHR) {
                $('#'+element.attr('id')).html(data);
              },
              error: function(jqXHR, textStatus, errorThrown) {
                $('#'+element.attr('id')).html('Es konnten keine Empfehlungen ausgegeben werden.');
              },
              complete: function() {
                  indicator.hide();
                }
            });
          }
          else
          {
            $('#'+element.attr('id')).html('');
          }
          //$('#'+element.attr('id')).text($(article).attr(element.attr('property')));
          break;
        case 'text':
          $('#'+element.attr('id')).text($(article).attr(element.attr('property')));
          break;
        case 'html':
          $('#'+element.attr('id')).html($(article).attr(element.attr('property')));
                  $('#'+element.attr('id')).css('display', $('#'+element.attr('id')).text() != '' ? 'block' : 'none');
                  if(element.attr('id') == 'jqShippingInfo' && $('#jqPdTPrice').text() != '') {
                      $('#jqShippingInfo').css('clear', 'left');
                  }
                  else {
                      $('#jqShippingInfo').css('clear', '');
                  }
                  break;
        case 'link':
          $('#'+element.attr('id')).attr('href', $(article).attr(element.attr('property')));
          break;
        case 'basketbutton':
            var property = element.attr('property');
            $('#'+element.attr('id')).css('display', $(article).attr(property) == true ? 'none' : 'block');
            break;
        case 'showElement':
                    $('#'+element.attr('id')).css('display', ($(article).attr(element.attr('property')) == true ? 'block' : 'none'));
            break;
        case 'stockstatus':
          $('#'+element.attr('id')).html($(article).attr(element.attr('property')));
          // check if item is "not available"
          if( $(article).attr(element.attr('property')).indexOf('unavailable') != -1 ||
              $(article).attr(element.attr('property')).indexOf('lowstock') != -1)
          {
            var title = $('#'+element.attr('id') +' a.state').attr('title');
            if(typeof(title) != 'undefined' && title != '')
            {
                $('#'+element.attr('id') +' a.state').append("<span>&nbsp;</span>"); // add span for icon
                $('#'+element.attr('id') +' a.state').addClass("hasTooltip"); // add class for tooltip js
            }
            init_tooltip(); // TODO wird zweimal aufgerufen, warum?
          }
          break;
        case 'table':
          var rows = element.attr('tablerows');
          var properties = element.attr('property');
          var renderTable = false;
          for(var i=0; i < rows.length; i++) {
            row = $(article).attr(properties[i]);
            if(row) {
              renderTable = true;
              $('#jq_' + properties[i]+' td').html(row);
              $('#jq_' + properties[i]).show();
            }
            else {
              $('#jq_' + properties[i]+' td').html('');
              $('#jq_' + properties[i]).hide();
            }
          }
          $('#'+element.attr('id')).toggle(renderTable);

          break;
          
        case 'accordion':
        
          // queue articled id to activate 
          var delayedActivate = jQuery.Event("delayed_activate");
          delayedActivate.article_id = idx;
          $('#'+element.attr('id')).trigger(delayedActivate);
          
          // trigger activate if in visible tab
          if($('#'+element.attr('id')).parents('div.ui-tabs-panel').is(':visible'))
          {           
              $('#'+element.attr('id')).accordion( "activate" , '#'+element.attr('id') + ' h3[data-id=' + idx + ']');
          }

          break;          
      }
    };

    return this.each(function(){
      $(this).bind(o.event, function(e) {
        var idx = $(this).find('option:selected').attr('value');
        var imgrel = $(this).find('option:selected').attr('rev');
        if (idx)
          _toggle(elements,articles,idx);

        if (imgrel) {
          var event = jQuery.Event('article_toggled');
          event.ref_id = imgrel;
          event.entity_id = idx;
          $('body').trigger(event);
        }

        return this;
      }).bind('click', function(){
        return this;
      });
    });
  };


  $.fn.bdArticleToggler.defaults = {
    event: 'click'
  };

})(jQuery);

