describe('Keyboard events feature', function() {
  'use strict';

  var $input1,
    $input2,
    $input3,
    $timepicker1,
    $timepicker2,
    $timepicker3,
    tp1,
    tp2,
    tp3;

  beforeEach(function () {
    loadFixtures('timepicker.html');

    $input1 = $('#timepicker1');
    $timepicker1 = $input1.timepicker();
    tp1 = $timepicker1.data('timepicker');

    $input2 = $('#timepicker2');
    $timepicker2 = $input2.timepicker({
      template: 'modal',
      showSeconds: true,
      minuteStep: 30,
      secondStep: 30,
      defaultTime: false
    });
    tp2 = $timepicker2.data('timepicker');

    $input3 = $('#timepicker3');
    $timepicker3 = $input3.timepicker({
      defaultTime: '23:15:20',
      showMeridian: false,
      showSeconds: true,
      template: false
    });
    tp3 = $timepicker3.data('timepicker');
  });

  afterEach(function () {
    $input1.data('timepicker').remove();
    $input2.data('timepicker').remove();
    $input3.data('timepicker').remove();
    $input1.remove();
    $input2.remove();
    $input3.remove();
  });

  it('should be able to control element by the arrow keys', function() {
    tp1.setTime('11:30 AM');
    tp1.update();

    $input1.trigger('focus');

    if (tp1.highlightedUnit !== 'hour') {
      tp1.highlightHour();
    }

    expect(tp1.highlightedUnit).toBe('hour', 'hour should be highlighted by default');
    // hours
    $input1.trigger({
      'type': 'keydown',
      'keyCode': 38 //up
    });
    expect(tp1.getTime()).toBe('12:30 PM', '1');
    $input1.trigger({
      'type': 'keydown',
      'keyCode': 40 //down
    });
    expect(tp1.getTime()).toBe('11:30 AM', '2');
    expect(tp1.highlightedUnit).toBe('hour', 'hour should be highlighted');

    $input1.trigger({
      'type': 'keydown',
      'keyCode': 39 //right
    });
    expect(tp1.highlightedUnit).toBe('minute', 'minute should be highlighted');

    //minutes
    $input1.trigger({
      'type': 'keydown',
      'keyCode': 38 //up
    });
    expect(tp1.getTime()).toBe('11:45 AM', '3');
    expect(tp1.highlightedUnit).toBe('minute', 'minute should be highlighted 1');

    $input1.trigger({
      'type': 'keydown',
      'keyCode': 40 //down
    });
    expect(tp1.getTime()).toBe('11:30 AM', '4');
    expect(tp1.highlightedUnit).toBe('minute', 'minute should be highlighted 2');

    $input1.trigger({
      'type': 'keydown',
      'keyCode': 39 //right
    });
    expect(tp1.highlightedUnit).toBe('meridian', 'meridian should be highlighted');

    //meridian
    $input1.trigger({
      'type': 'keydown',
      'keyCode': 38 //up
    });
    expect(tp1.getTime()).toBe('11:30 PM', '5');
    expect(tp1.highlightedUnit).toBe('meridian', 'meridian should be highlighted');

    $input1.trigger({
      'type': 'keydown',
      'keyCode': 40 //down
    });
    expect(tp1.getTime()).toBe('11:30 AM', '6');
    expect(tp1.highlightedUnit).toBe('meridian', 'meridian should be highlighted');

    $input1.trigger({
      'type': 'keydown',
      'keyCode': 37 //left
    });
    expect(tp1.highlightedUnit).toBe('minute', 'minutes should be highlighted');

    // minutes
    $input1.trigger({
      'type': 'keydown',
      'keyCode': 40 //down
    });
    expect(tp1.getTime()).toBe('11:15 AM', '7');

    $input1.trigger({
      'type': 'keydown',
      'keyCode': 37 //left
    });
    expect(tp1.highlightedUnit).toBe('hour', 'hours should be highlighted');

    // hours
    $input1.trigger({
      'type': 'keydown',
      'keyCode': 40 //down
    });
    expect(tp1.getTime()).toBe('10:15 AM', '8');

    $input1.trigger({
      'type': 'keydown',
      'keyCode': 37 //left
    });
    expect(tp1.highlightedUnit).toBe('meridian', 'meridian should be highlighted');

    // meridian
    $input1.trigger({
      'type': 'keydown',
      'keyCode': 40 //down
    });
    expect(tp1.getTime()).toBe('10:15 PM', '9');
  });

  it('should be able to change time via widget inputs in a dropdown', function() {
    var $hourInput = tp1.$widget.find('input.bootstrap-timepicker-hour'),
        $minuteInput = tp1.$widget.find('input.bootstrap-timepicker-minute'),
        $meridianInput = tp1.$widget.find('input.bootstrap-timepicker-meridian'),
        eventCount = 0,
        time;


    tp1.setTime('9:30 AM');
    tp1.update();
    $input1.parents('div').find('.add-on').click();

    $input1.timepicker().on('changeTime.timepicker', function(e) {
      eventCount++;
      time = e.time.value;
    });

    expect(tp1.isOpen).toBe(true);

    $hourInput.trigger('focus');
    $hourInput.autotype('{{back}}{{back}}11{{tab}}');

    expect(tp1.hour).toBe(11);
    expect(eventCount).toBe(1, 'incorrect update events thrown');
    expect(time).toBe('11:30 AM');

    $minuteInput.autotype('{{back}}{{back}}45{{tab}}');

    expect(tp1.minute).toBe(45);
    expect(eventCount).toBe(2, 'incorrect update events thrown');
    expect(time).toBe('11:45 AM');

    $meridianInput.autotype('{{back}}{{back}}pm{{tab}}');

    expect(tp1.meridian).toBe('PM');
    expect(eventCount).toBe(3, 'incorrect update events thrown');
    expect(time).toBe('11:45 PM');
  });

  it('should still be empty if input is empty', function() {
		$input1.autotype('{{back}}{{back}}{{back}}{{back}}{{back}}{{back}}{{back}}{{back}}{{tab}}');

		expect($input1.val()).toBe('');
	});
  it('should allow time to be changed via widget inputs in a modal', function() {
    //tp2.setTime('9:30 AM');
    //tp2.update();
    //$input2.parents('div').find('.add-on').click();

    //var $hourInput = $('body').find('input.bootstrap-timepicker-hour'),
        //$minuteInput = $('body').find('input.bootstrap-timepicker-minute'),
        //$secondInput = $('body').find('input.bootstrap-timepicker-second'),
        //$meridianInput = $('body').find('input.bootstrap-timepicker-meridian');

    //$hourInput.autotype('{{back}}{{back}}2');
    //$hourInput.trigger({
      //'type': 'keydown',
      //'keyCode': 9 //tab
    //});

    //expect(tp2.getTime()).toBe('02:30:00 AM');


    //$minuteInput.autotype('{{back}}{{back}}0');
    //$minuteInput.trigger({
      //'type': 'keydown',
      //'keyCode': 9 //tab
    //});

    //expect(tp2.getTime()).toBe('02:00:00 AM');

    //$secondInput.autotype('{{back}}{{back}}30');
    //$secondInput.trigger({
      //'type': 'keydown',
      //'keyCode': 9 //tab
    //});

    //expect(tp2.getTime()).toBe('02:00:30 AM');

    //$meridianInput.autotype('{{back}}{{back}}p');
    //$meridianInput.trigger({
      //'type': 'keydown',
      //'keyCode': 9 //tab
    //});

    //expect(tp2.getTime()).toBe('02:00:30 PM');
  });

  it('should be 12:00 AM if 00:00 AM is entered', function() {
    //$input1.autotype('{{back}}{{back}}{{back}}{{back}}{{back}}{{back}}{{back}}{{back}}0:0 AM');
    //$input1.trigger({
      //'type': 'keydown',
      //'keyCode': 9 //tab
    //});

    //expect(tp1.getTime()).toBe('12:00 AM');
  });

  it('should validate input', function() {
    //var $hourInput = tp1.$widget.find('input.bootstrap-timepicker-hour'),
        //$minuteInput = tp1.$widget.find('input.bootstrap-timepicker-minute'),
        //$meridianInput = tp1.$widget.find('input.bootstrap-timepicker-meridian'),
        //$input3 = tp3.$element;

        //tp1.setTime('11:30 AM');
        //tp1.update();

        //$hourInput.autotype('{{back}}{{back}}13');
        //tp1.updateFromWidgetInputs();
        //expect(tp1.getTime()).toBe('12:30 AM');

        //$minuteInput.autotype('{{back}}{{back}}60');
        //tp1.updateFromWidgetInputs();
        //expect(tp1.getTime()).toBe('12:59 AM');

        //$meridianInput.autotype('{{back}}{{back}}dk');
        //tp1.updateFromWidgetInputs();
        //expect(tp1.getTime()).toBe('12:59 AM');

        //$meridianInput.autotype('{{back}}{{back}}p');
        //tp1.updateFromWidgetInputs();
        //expect(tp1.getTime()).toBe('12:59 PM');

        //$input3.autotype('{{back}}{{back}}{{back}}{{back}}{{back}}{{back}}{{back}}{{back}}25:60:60');
        //tp3.updateFromElementVal();
        //expect(tp3.getTime()).toBe('23:59:59');
  });
});
