// define widget namespace if not already done...
if (typeof Widget == 'undefined') Widget = {};

Widget.ContentCartHandler = Class.create({
  initialize: function(options)
  {
    this.setOptions(options);

    this.offers = $$('table.offer');

    this.listenLongDescToggle = this.observeLongDescToggle.bindAsEventListener(this);
    this.listenToCartToggle = this.observeToCartToggle.bindAsEventListener(this);
    this.listenToRequestFormToggle = this.observeToRequestFormToggle.bindAsEventListener(this);
    this.listenDeleteCartItemToggle = this.observeDeleteCartItemToggle.bindAsEventListener(this);
    this.listenCartToggle = this.observeCartToggle.bindAsEventListener(this);

    this.bindLongDescToggle();
    this.bindToCartToggle();
    this.bindToRequestFormToggle();
    this.bindDeleteCartItemToggle();
    this.bindCartToggle();
  },

  setOptions: function(options)
  {
    this.options = Object.extend({
      action: {
        toCart: 'index.php?type=3&recs[tt_content][#{id}]=#{amount}'
      },
      // addresses the container of the cart toggle
      cartToggleContainer: '#cart-toggler',
      deleteCartItem: '#cart a[rel=cart].delete'
    }, options || {});
  },

  /**
   * binds our toggle listener to the long description action elements
   * because editors may disable the long description it rejects all undefined elements which will be collected by the invoke('down') method
   */
  bindLongDescToggle: function()
  {
    try
    {
      var toggles = this.offers.invoke('down', 'a[rel=longdesc].action').reject(function(element) { return Object.isUndefined(element); }).invoke('observe', 'click', this.listenLongDescToggle);
    }
    catch (e)
    {
      if (typeof console != 'undefined')
        console.log(e);
    }
  },

  observeLongDescToggle: function(event)
  {
    Event.stop(event);
    Event.element(event).up('tbody').next('tbody').toggle();
    if (Event.element(event).up('tbody').next('tbody').visible())
    {
      Event.element(event).update(this.options.labels.longdescription.hide);
    }
    else
    {
      Event.element(event).update(this.options.labels.longdescription.show);
    }

    /*
      //TSFE:config|config|language has to be `default` if eq `en`
      //{state} has to be `hide` if long description container is hidden and  `show` if its visible
      //T3locallang data languagekey[index={TSFE:config|config|language}] label[index=table.offer.action.longdescripton.{state}]
      new Ajax.Request('http://30117.web.zcom.it/fileadmin/templates/voellanerhof.com/l10n/template.xml', {
        method: 'get',
        onSuccess: function(transport)
        {
          var doc = transport.responseXML;
          var language = doc.getElementssByTagName('languageKey');
          foreach (language )
          console.log(doc.documentElement);
          Element.extend(doc.documentElement);
          var string = $(doc.documentELement).down('data languagekey[index=de] label[index=table.offer.action.longdescripton.hide]');
          console.log(string);
        }
      });
    */
  },

  bindToCartToggle: function()
  {
    try
    {
      var toggles = this.offers.invoke('down', 'a[rel=cart].action').invoke('observe', 'click', this.listenToCartToggle);
    }
    catch (e)
    {
      if (typeof console != 'undefined')
        console.log(e);
    }
  },

  observeToCartToggle: function(event)
  {
    Event.stop(event);
    var target = Event.findElement(event, 'a');
    var recordUid = target.href.replace(window.location.href.split('#')[0] +'#', '');

    var query = 'id=2&type=3&recs[tt_content]['+ recordUid +']=1&profi_contentcart[action]=list&L='+ this.options.language;
    var cHash = Math.round(Math.random() * Math.pow(10, 10));
    query += '&cHash=' + cHash;

    new Ajax.Request('/', {
      parameters: query.toQueryParams(),
      onLoading: function()
      {
        var e = new Element('img', { id: 'toCartLoading', src: 'fileadmin/templates/voellanerhof.com/img/spinner-small.gif' });
        $(target).insert({ top: e });
      },
      onSuccess: function(request, json)
      {
        if ($('cart'))
        {
          $('cart').update(request.responseText);
        }
        else
        {
          var e = new Element('dd', { id: 'cart' }).update(request.responseText);
          $$(this.options.cartToggleContainer).first().insert({ after: e });
        }

        $('toCartLoading').remove();
        var e = new Element('img', { id: 'toCartSuccess', src: 'fileadmin/templates/voellanerhof.com/img/ico-tick.png' });
        $(target).insert({ top: e });

        $('toCartSuccess').fade({
          delay: 2,
          afterFinish: function(effect)
          {
            $(effect.element).remove();
          }
        });

        this.bindDeleteCartItemToggle();

      }.bind(this)
    });
  },

  bindToRequestFormToggle: function() {
    try
    {
      var toggles = this.offers.invoke('down', 'a[rel=request-form].action').invoke('observe', 'click', this.listenToRequestFormToggle);
    }
    catch (e)
    {
      if (typeof console != 'undefined')
        console.log(e);
    }
  },

  observeToRequestFormToggle: function(event) {
    Event.stop(event);
    var target = Event.findElement(event, 'a');
    var recordUid = target.href.replace(window.location.href.split('#')[0] +'#', '');

    var query = 'id=2&type=3&recs[tt_content]['+ recordUid +']=1&profi_contentcart[action]=list&L='+ this.options.language;
    var cHash = Math.round(Math.random() * Math.pow(10, 10));
    query +=  '&cHash='+ cHash;

    new Ajax.Request('/', {
      parameters: query.toQueryParams(),
      onLoading: function()
      {
        var e = new Element('img', { id: 'toCartLoading', src: 'fileadmin/templates/voellanerhof.com/img/spinner-small.gif' });
        $(target).insert({ top: e });
      },
      onSuccess: function(request, json)
      {
        $('toCartLoading').remove();

        window.location.href = this.options.requestformurl;
      }.bind(this)
    });
  },

  bindCartToggle: function()
  {
    try
    {
      var toggle = $$(this.options.cartToggleContainer).first().down('a').observe('click', this.listenCartToggle);
    }
    catch (e)
    {
      if (typeof console != 'undefined')
        console.log(e);
    }
  },

  observeCartToggle: function(event)
  {
    Event.stop(event);
    var target = Event.findElement(event, 'a');

    var sib = target.up('dt').next();
    if (sib.id == 'cart')
      sib.toggle();
  },

  bindDeleteCartItemToggle: function()
  {
    try
    {
      var toggles = $$(this.options.deleteCartItem).invoke('observe', 'click', this.listenDeleteCartItemToggle);
    }
    catch (e)
    {
      if (typeof console != 'undefined')
        console.log(e);
    }
  },

  observeDeleteCartItemToggle: function(event)
  {
    Event.stop(event);

    var target = Event.findElement(event, 'a');
    //var recordUid = target.href.replace(window.location.href.split('#')[0] +'#', '');
    var recordUid = target.href.split('#')[1]

    // remove `c` for internal CE links
    recordUid = recordUid.replace('c', '');

    var query = 'id=2&type=3&recs[tt_content]['+ recordUid +']=0&profi_contentcart[action]=list&L='+ this.options.language;
    var cHash = Math.round(Math.random() * Math.pow(10, 10));
    query += '&cHash=' + cHash;

    new Ajax.Request('/', {
      parameters: query.toQueryParams(),
      onLoading: function()
      {
      },
      onSuccess: function(request, json)
      {
        if ($('cart'))
        {
          $('cart').update(request.responseText);
        }
        else
        {
          var e = new Element('dd', { id: 'cart' }).update(request.responseText);
          $$(this.options.cartToggleContainer).first().insert({ after: e });
        }

        this.bindDeleteCartItemToggle();
      }.bind(this)
    });
  }
});
