describe("indentation button", function(){
  //create a new pad before each test run
  beforeEach(function(cb){
    helper.newPad(cb);
    this.timeout(60000);
  });

 it("indent text with keypress", function(done){
    var inner$ = helper.padInner$;
    var chrome$ = helper.padChrome$;

    //get the first text element out of the inner iframe
    var $firstTextElement = inner$("div").first();

    //select this text element
    $firstTextElement.sendkeys('{selectall}');

    if(inner$(window)[0].bowser.firefox || inner$(window)[0].bowser.modernIE){ // if it's a mozilla or IE
      var evtType = "keypress";
    }else{
      var evtType = "keydown";
    }

    var e = inner$.Event(evtType);
    e.keyCode = 9; // tab :|
    inner$("#innerdocbody").trigger(e);

    helper.waitFor(function(){
      return inner$("div").first().find("ul li").length === 1;
    }).done(done);
  });

  it("indent text with button", function(done){
    var inner$ = helper.padInner$;
    var chrome$ = helper.padChrome$;

    var $indentButton = chrome$(".buttonicon-indent");
    $indentButton.click();

    helper.waitFor(function(){
      return inner$("div").first().find("ul li").length === 1;
    }).done(done);
  });

  it("keeps the indent on enter for the new line", function(done){
    var inner$ = helper.padInner$;
    var chrome$ = helper.padChrome$;

    var $indentButton = chrome$(".buttonicon-indent");
    $indentButton.click();

    //type a bit, make a line break and type again
    var $firstTextElement = inner$("div span").first();
    $firstTextElement.sendkeys('line 1');
    $firstTextElement.sendkeys('{enter}');
    $firstTextElement.sendkeys('line 2');
    $firstTextElement.sendkeys('{enter}');

    helper.waitFor(function(){
      return inner$("div span").first().text().indexOf("line 2") === -1;
    }).done(function(){
      var $newSecondLine = inner$("div").first().next();
      var hasULElement = $newSecondLine.find("ul li").length === 1;

      expect(hasULElement).to.be(true);
      expect($newSecondLine.text()).to.be("line 2");
      done();
    });
  });

  it("indents text with spaces on enter if previous line ends with ':', '[', '(', or '{'", function(done){
    var inner$ = helper.padInner$;
    var chrome$ = helper.padChrome$;

    //type a bit, make a line break and type again
    var $firstTextElement = inner$("div").first();
    $firstTextElement.sendkeys("line with ':'{enter}");
    $firstTextElement.sendkeys("line with '['{enter}");
    $firstTextElement.sendkeys("line with '('{enter}");
    $firstTextElement.sendkeys("line with '{{}'{enter}");

    helper.waitFor(function(){
      // wait for Etherpad to split four lines into separated divs
      var $fourthLine = inner$("div").first().next().next().next();
      return $fourthLine.text().indexOf("line with '{'") === 0;
    }).done(function(){
      // we validate bottom to top for easier implementation

      // curly braces
      var $lineWithCurlyBraces = inner$("div").first().next().next().next();
      $lineWithCurlyBraces.sendkeys('{{}');
      pressEnter(); // cannot use sendkeys('{enter}') here, browser does not read the command properly
      var $lineAfterCurlyBraces = inner$("div").first().next().next().next().next();
      expect($lineAfterCurlyBraces.text()).to.match(/\s{4}/); // tab === 4 spaces

      // parenthesis
      var $lineWithParenthesis = inner$("div").first().next().next();
      $lineWithParenthesis.sendkeys('(');
      pressEnter();
      var $lineAfterParenthesis = inner$("div").first().next().next().next();
      expect($lineAfterParenthesis.text()).to.match(/\s{4}/);

      // bracket
      var $lineWithBracket = inner$("div").first().next();
      $lineWithBracket.sendkeys('[');
      pressEnter();
      var $lineAfterBracket = inner$("div").first().next().next();
      expect($lineAfterBracket.text()).to.match(/\s{4}/);

      // colon
      var $lineWithColon = inner$("div").first();
      $lineWithColon.sendkeys(':');
      pressEnter();
      var $lineAfterColon = inner$("div").first().next();
      expect($lineAfterColon.text()).to.match(/\s{4}/);

      done();
    });
  });

  it("appends indentation to the indent of previous line if previous line ends with ':', '[', '(', or '{'", function(done){
    var inner$ = helper.padInner$;
    var chrome$ = helper.padChrome$;

    //type a bit, make a line break and type again
    var $firstTextElement = inner$("div").first();
    $firstTextElement.sendkeys("  line with some indentation and ':'{enter}");
    $firstTextElement.sendkeys("line 2{enter}");

    helper.waitFor(function(){
      // wait for Etherpad to split two lines into separated divs
      var $secondLine = inner$("div").first().next();
      return $secondLine.text().indexOf("line 2") === 0;
    }).done(function(){
      var $lineWithColon = inner$("div").first();
      $lineWithColon.sendkeys(':');
      pressEnter();
      var $lineAfterColon = inner$("div").first().next();
      expect($lineAfterColon.text()).to.match(/\s{6}/); // previous line indentation + regular tab (4 spaces)

      done();
    });
  });

  /*

  it("makes text indented and outdented", function() {

    //get the inner iframe
    var $inner = testHelper.$getPadInner();

    //get the first text element out of the inner iframe
    var firstTextElement = $inner.find("div").first();

    //select this text element
    testHelper.selectText(firstTextElement[0], $inner);

    //get the indentation button and click it
    var $indentButton = testHelper.$getPadChrome().find(".buttonicon-indent");
    $indentButton.click();

    //ace creates a new dom element when you press a button, so just get the first text element again
    var newFirstTextElement = $inner.find("div").first();

    // is there a list-indent class element now?
    var firstChild = newFirstTextElement.children(":first");
    var isUL = firstChild.is('ul');

    //expect it to be the beginning of a list
    expect(isUL).to.be(true);

    var secondChild = firstChild.children(":first");
    var isLI = secondChild.is('li');
    //expect it to be part of a list
    expect(isLI).to.be(true);

    //indent again
    $indentButton.click();

    var newFirstTextElement = $inner.find("div").first();

    // is there a list-indent class element now?
    var firstChild = newFirstTextElement.children(":first");
    var hasListIndent2 = firstChild.hasClass('list-indent2');

    //expect it to be part of a list
    expect(hasListIndent2).to.be(true);

    //make sure the text hasn't changed
    expect(newFirstTextElement.text()).to.eql(firstTextElement.text());


    // test outdent

    //get the unindentation button and click it twice
    var $outdentButton = testHelper.$getPadChrome().find(".buttonicon-outdent");
    $outdentButton.click();
    $outdentButton.click();

    //ace creates a new dom element when you press a button, so just get the first text element again
    var newFirstTextElement = $inner.find("div").first();

    // is there a list-indent class element now?
    var firstChild = newFirstTextElement.children(":first");
    var isUL = firstChild.is('ul');

    //expect it not to be the beginning of a list
    expect(isUL).to.be(false);

    var secondChild = firstChild.children(":first");
    var isLI = secondChild.is('li');
    //expect it to not be part of a list
    expect(isLI).to.be(false);

    //make sure the text hasn't changed
    expect(newFirstTextElement.text()).to.eql(firstTextElement.text());


    // Next test tests multiple line indentation

    //select this text element
    testHelper.selectText(firstTextElement[0], $inner);

    //indent twice
    $indentButton.click();
    $indentButton.click();

    //get the first text element out of the inner iframe
    var firstTextElement = $inner.find("div").first();

    //select this text element
    testHelper.selectText(firstTextElement[0], $inner);

    /* this test creates the below content, both should have double indentation
    line1
    line2


    firstTextElement.sendkeys('{rightarrow}'); // simulate a keypress of enter
    firstTextElement.sendkeys('{enter}'); // simulate a keypress of enter
    firstTextElement.sendkeys('line 1'); // simulate writing the first line
    firstTextElement.sendkeys('{enter}'); // simulate a keypress of enter
    firstTextElement.sendkeys('line 2'); // simulate writing the second line

    //get the second text element out of the inner iframe
    setTimeout(function(){ // THIS IS REALLY BAD
      var secondTextElement = $('iframe').contents().find('iframe').contents().find('iframe').contents().find('body > div').get(1); // THIS IS UGLY

      // is there a list-indent class element now?
      var firstChild = secondTextElement.children(":first");
      var isUL = firstChild.is('ul');

      //expect it to be the beginning of a list
      expect(isUL).to.be(true);

      var secondChild = secondChild.children(":first");
      var isLI = secondChild.is('li');
      //expect it to be part of a list
      expect(isLI).to.be(true);

      //get the first text element out of the inner iframe
      var thirdTextElement = $('iframe').contents().find('iframe').contents().find('iframe').contents().find('body > div').get(2); // THIS IS UGLY TOO

      // is there a list-indent class element now?
      var firstChild = thirdTextElement.children(":first");
      var isUL = firstChild.is('ul');

      //expect it to be the beginning of a list
      expect(isUL).to.be(true);

      var secondChild = firstChild.children(":first");
      var isLI = secondChild.is('li');

      //expect it to be part of a list
      expect(isLI).to.be(true);
    },1000);
  });*/

});

function pressEnter(){
  var inner$ = helper.padInner$;
  if(inner$(window)[0].bowser.firefox || inner$(window)[0].bowser.modernIE){ // if it's a mozilla or IE
    var evtType = "keypress";
  }else{
    var evtType = "keydown";
  }
  var e = inner$.Event(evtType);
  e.keyCode = 13; // enter :|
  inner$("#innerdocbody").trigger(e);
}
