var TableElementExtender = {
  
  config: {
    idx: { 
      itemsCount: 4,
      daysCount: 5,
      deposit: 3,
      caution: 2,
      pricePerDay: 1,
      name: 0
    }
  },

  translation: {
    'count': 'spočítej',
    'total': 'celkem',
    'currency': 'Kč'
  },

  rentBegin: null,
  rentEnd: null,

  transform: function (rentBegin, rentEnd, translation) {

    this.translation = $extend(this.translation, translation);
    
    var recalculateEvent = (function () { this.recalculate(); }).bind(this);

    this.rentBegin = rentBegin;
    this.rentBegin.addEvent('change', recalculateEvent);

    this.rentEnd = rentEnd;
    this.rentEnd.addEvent('change', recalculateEvent);

    this.getLast().adopt(
      new Element('tr', { 'class' : 'last-row' })
    );

    var lastRow = this.getLast().getLast();
    
    for(var i = 0; i < 5; i++) {
      if (i == 4) {
        var onClickEvent = (function() { this.recalculate(); }).bind(this);
        opt = { colspan: 2 };
        lastRow.adopt(
          new Element('td', { colspan: 2 }).adopt(
            new Element ('input', { type: 'button', value: this.translation.count, events: { click: onClickEvent } })
          )
        );
      }
      else {
       lastRow.adopt(
          new Element('td', {})
        );
      }
    }

    lastRow.getFirst().setText(this.translation.total);
    this._setEvents();
    this.recalculate();
  },

  recalculate: function () {
    var caution = 0;
    var deposit = 0;
    var price = 0;
    
    if (this.rentBegin && this.rentEnd) {
      // den v milisekundach je 86400000
      var daysCount = 
        (this.rentEnd.getDateObject().getTime() - this.rentBegin.getDateObject().getTime()) / 86400000;
      
      daysCount = Math.round(daysCount) + 1;
    } else {
      var daysCount = 0;
    }

    var rows = this.getElements('tr');
    for (var i = 1; i < (rows.length - 1); i++) {
      var fields = rows[i].getElements('td');
      
      /*var daysCount = fields[this.config.idx.daysCount]
        .getElement('input')
        .getProperty('value')
        .toInt();*/

     
      var itemsCount = fields[this.config.idx.itemsCount]
        .getElement('input')
        .getProperty('value')
        .toInt();
      
      if (daysCount >0 && itemsCount > 0) {
        var c = fields[this.config.idx.caution]
          .getText()
          .toInt(); 

        var d = fields[this.config.idx.deposit]
          .getText()
          .toInt();

        var p = fields[this.config.idx.pricePerDay]
          .getText()
          .toInt(); 

        var name = fields[this.config.idx.name].getText();

        caution += c * itemsCount;
        deposit += d * itemsCount;
        price += this._price(p, daysCount, itemsCount, name);

      }
    }

    this._updateResults(deposit, caution, price);
  },

  _price: function(price, daysCount, itemsCount, name) {
	  price = price * daysCount * itemsCount;
	  var nafukovacka = name.contains('PÁLAVA') || name.contains('SCOUT') || name.contains('ORINOCO')
	                  || name.contains('BARAKA') || name.contains('PULSAR') || name.contains('COLORADO');
	  
	  //console.log(price);console.log(daysCount);console.log(nafukovacka);
	  
	  if (1 == daysCount && true == nafukovacka) {
		  price *= 1.5;
	  }
	  
	  return price;
  },
  
  _setEvents: function () {
    var onChangeEvent = (function() { this.recalculate(); }).bind(this);

    var inps = this.getElements('td input');
    for(var i = 1; i < inps.length; i++) {
      var name = inps[i].getProperty('name');
      if (name && (name.test('count') || name.test('days'))) {
        inps[i].addEvent('change', onChangeEvent);
      }
    }
  },

  _updateResults: function (deposit, caution, price) {
    var lastRow = this.getLast().getLast();
    var tds = lastRow.getElements('td');
    tds[this.config.idx.deposit].setText(deposit + ' ' 
      + this.translation.currency);
    tds[this.config.idx.caution].setText(caution + ' ' 
      + this.translation.currency);
    tds[this.config.idx.pricePerDay].setText(price + ' ' 
      + this.translation.currency);
  }

};






var TimeSelector = new Class({

  _selector: null,
  _date: null,
  
  initialize: function (hourSelector, minuteSelector, dateSelector) {
    if (this._initDateSelectors(hourSelector, minuteSelector, dateSelector)) {
      this._updateDateObject();
      
      var chEv = (function () { this._updateDateObject();}).bind(this);
      
      this.addEvent('change', chEv);
    }
  },
  
  _initDateSelectors: function (hourSelector, minuteSelector, dateSelector) {
    var hourSelectorElm = $(hourSelector);
    var minuteSelectorElm = $(minuteSelector);
    var dateSelectorElm = $(dateSelector);

    if ( hourSelectorElm && minuteSelectorElm && dateSelectorElm) {
      this._selector = { 
        'hour': hourSelectorElm,
        'minute': minuteSelectorElm,
        'timestamp': dateSelectorElm
      };
      return true;
    } else {
      return false;  
    }
  },

  _updateDateObject: function () { 
    var d = this._selector.timestamp.getValue().split('-');
   
    if (d.length > 2) {
      var day = d[0].toInt(),
          month = ( d[1].toInt() - 1 ), // fix mesice
          year = d[2].toInt(),
          hour = this._selector.hour.getValue().toInt(),
          minute = this._selector.minute.getValue().toInt();
      
      // this._date = new Date(year, month, day, hour, minute);
      this._date = new Date(year, month, day);
    }
    else {
      this._date = new Date();
    }
  },

  getDateObject: function () {
    return this._date;
  },

  addEvent: function (evName, evFunc) {
    this._selector.hour.addEvent(evName, evFunc);
    this._selector.minute.addEvent(evName, evFunc);
    this._selector.timestamp.addEvent(evName, evFunc);
  }

});

var schovavatko = new Class({
    initialize: function (chck, inp) {
        this.chck  = $(chck);
        this.input = $(inp);
        this.label = $$('label[for=' + inp + ']')[0];
        /*
        console.log('checkbox: ' + this.chck);
        console.log('input: ' + this.input);
        console.log('label: ' + this.label);
        console.log('checked: ' + this.chck.checked);
        */
        this.toggle();
        
        this.chck.addEvent('click', this.toggle.bind(this));
    },
    
    toggle: function() {
        if (false == this.chck.checked) {
            this.input.setStyle('display', 'none');
            this.label.setStyle('display', 'none');
        } else {
            this.input.setStyle('display', 'inline');
            this.label.setStyle('display', 'inline');      
        }
    }
});