/**
 * This file defines the JavaScript functions that are used to implement range
 * selection and highlighting.
 *
 * @author Travis Brown <travis.brown@mail.utexas.edu>
 * @license http://www.gnu.org/licenses/agpl-3.0.html GNU Affero GPLv3
 * @version 0.9
 * @package ecomma
 * @subpackage scripting
 */

function ec_max(a)
{
  var b = 0;
  var c = 0;
  while(c < a.length)
  {
    if (!isNaN(a[c]))
    {
      b = Math.max(b, a[c]);
    }
    c++;
  }
  return b;
}

/* Highlight form. */
function ec_fh(form_id)
{
  $('#ec-f' + form_id).toggleClass('ec-hi');
  $('.ec-f' + form_id).toggleClass('ec-hi');
}

/* Highlight tag. */
function ec_th(form_id)
{
  $('#ec-t' + form_id).toggleClass('ec-hi');
  if ($('#ec-t' + form_id).hasClass('ec-hi'))
  {
    ec_tag_select(form_id);
  }
  else
  {
    ec_tag_unselect(form_id);
  }
  ec_token_color(ec_tag_token_list, ec_max_tag_token_count, 172, 26, 47);
}

/* Highlight range. */
function ec_rh(beg, end)
{
  ec_range_color(beg, end, '#e0edf6');
  window.location.hash = 'top';
}

/* Comment response. */
function ec_cr(note_id)
{
  $('#ec-comment-response-form' + note_id).css('display', 'block');
  $('#ec-comment-response-link' + note_id).css('display', 'none'); 
}

/* Show tag. */
function ec_ts(tag_id, beg, end)
{
  $('#ec-tag-e' + tag_id).css('background-color', '#ccff99');
  for (var i = beg; i < end; i++)
  {
    $('#ec-p' + i).css('background-color', '#ccff99');
    $('#ec-p' + i).css('background-color', '#ccff99');
  }
}

/* Hide tag. */
function ec_tu(tag_id, beg, end)
{
  $('#ec-tag-e' + tag_id).css('background-color', '#e3e1d1');
  ec_token_color(ec_tag_token_list, ec_max_tag_token_count, 172, 26, 47);
}

/* Highlight tag form. */
function ec_tf(form_id)
{
  $('#ec-t' + form_id).addClass('ec-hi');
}

function ec_range_color(beg, end, color)
{
  for (var i = ec_stanza_beg; i < ec_stanza_end; i++)
  {
    var token_css;
    if (i >= beg && i < end)
    {
      token_css =
      {
        'font-size'        : '1.2em',
        'margin'           : null,
        'margin'           : '0px -2px 0px -1px',
        'padding'          : '4px 2px',
        'background-color' : color
      };
    }
    else
    {
      token_css =
      {
        'font-size'        : null,
        'margin'           : null,
        'padding'          : null,
        'background-color' : null
      };
    }

    $('#ec-p' + i).css(token_css);
  }
}

function ec_token_color(token_list, max_count, r, g, b)
{
  for (var i = ec_stanza_beg; i < ec_stanza_end; i++)
  {
    var weight = 0;
    var token_css;
    if ((i in token_list) && token_list[i] > 0)
    {
      weight = Math.min(7, Math.ceil(token_list[i] * 8 / max_count));
      nr = 256 - Math.ceil((256 - r)  * (0.125 + weight / 32));
      ng = 256 - Math.ceil((256 - g)  * (0.125 + weight / 32));
      nb = 256 - Math.ceil((256 - b)  * (0.125 + weight / 32));
      token_css =
      {
        'font-size'        : 1 + (weight / 16) + 'em',
        'margin'           : '0px -2px 0px -1px',
        'padding'          : '4px 2px 4px 2px', 
        'background-color' : 'rgb(' + nr + ',' + ng + ',' + nb + ')'
      };
    }
    else
    {
      token_css =
      {
        'font-size'        : null,
        'margin'           : null,
        'padding'          : null,
        'background-color' : null
      };
    }
    $('#ec-p' + i).css(token_css);
  }
}

function ec_tag_select(form_id)
{
  for (var tag_id in ec_tag_list)
  {
    if (ec_tag_list[tag_id]['form_id'] == form_id)
    {
      var tag = ec_tag_list[tag_id];
      var beg = parseInt(tag.beg);
      var end = parseInt(tag.end);
      for (var i = beg; i < end; i++)
      {
        if (i in ec_tag_token_list)
        {
          ec_tag_token_list[i]++;
        }
        else
        {
          ec_tag_token_list[i] = 1;
        }
      }

      $("#ec-tag-e" + tag_id).show();
    }
  }
}

function ec_tag_unselect(form_id)
{
  for (var tag_id in ec_tag_list)
  {
    if (ec_tag_list[tag_id]['form_id'] == form_id)
    {
      var beg = parseInt(ec_tag_list[tag_id]['beg']);
      var end = parseInt(ec_tag_list[tag_id]['end']);
      for (var i = beg; i < end; i++)
      {
        if (i in ec_tag_token_list)
        {
          ec_tag_token_list[i]--;
        }
      }

      $("#ec-tag-e" + tag_id).hide();
    }
  }
}

function ec_max_tag_token_count(tag_list)
{
  var token_list = Array();
  for (var tag_id in tag_list)
  {
    var beg = parseInt(tag_list[tag_id].beg);
    var end = parseInt(tag_list[tag_id].end);
    for (var i = beg; i < end; i++)
    {
      if (i in token_list)
      {
        token_list[i]++;
      }
      else
      {
        token_list[i] = 1;
      }
    }
  }
  return ec_max(token_list);
}

function ec_selection_string(stanza, beg, end)
{
  var string = '';
  var state = null;
  var inside = false;
  var first = true;

  for (var i = 0; i < stanza.childNodes.length; i++)
  {
    var line = stanza.childNodes[i];
    if (line.nodeType == 1 && line.tagName.toLowerCase() == 'div')
    {
      if (!first)
      {
        if (inside) { string += ' / '; }
      }
      else
      {
        first = false;
      }

      for (var j = 0; j < line.childNodes.length; j++)
      {
        var span = line.childNodes[j];
        if (span.nodeType == 1 && span.tagName.toLowerCase() == 'span')
        {
          if (span.className == 'ec-sc' || span.className == 'ec-em')
          {
            if (inside) { string += '<span class="' + span.className + '">'; }
            for (var k = 0; k < span.childNodes.length; k++)
            {
              var inspan = span.childNodes[k];
              if (inspan.nodeType == 1)
              {
                if (inside)
                {
                  string += inspan.innerHTML;
                  if (inspan == end)
                  {
                    string += '</span>';
                    inside = false;
                    return string;
                  }
                }
                else
                {
                  if (inspan == beg)
                  {
                    string += '<span class="' + span.className + '">';
                    string += inspan.innerHTML;
                    inside = true;
                    if (inspan == end)
                    {
                      string += '</span>';
                      inside = false;
                      return string;
                    }
                  }
                }
              }
              else if (inspan.nodeType == 3)
              {
                if (inside) { string += inspan.data; }
              }          
            }
            if (inside) { string += '</span>'; }
          }
          else
          {
            if (inside)
            {
              string += span.innerHTML;
              if (span == end)
              {
                inside = false;
                return string;
              }
            }
            else
            {
              if (span == beg)
              {
                string += span.innerHTML;
                inside = true;
                if (span == end)
                {
                  inside = false;
                  return string;
                }
              }
            }
          }
        }
        else if (span.nodeType == 3)
        {
          if (inside) { string += span.data; }
        }
      }
    }
  }
  return string;
}

function ec_select()
{
  var sel   = null;
  var range = null;
  if (window.getSelection)
  {
    sel = window.getSelection();
  }
  else
  {
    // IE.
    sel = document.selection.createRange();
  }

  var ie = false;
  if (sel.getRangeAt)
  {
    range = sel.getRangeAt(0);
  }
  else if (document.createRange)
  {
    // Safari.
    range = document.createRange();
    range.setStart(sel.anchorNode, sel.anchorOffset);
    range.setEnd(sel.focusNode, sel.focusOffset);
  }
  else
  {
    ie = true;
  }

  var beg    = null;
  var end    = null;
  var beg_id = null;
  var end_id = null;

  if (ie)
  {
    var beg_string = sel.htmlText.substring(sel.htmlText.indexOf('ec-p') + 4);
    var end_string = sel.htmlText.substring(sel.htmlText.lastIndexOf('ec-p') + 4);

    beg_id = parseInt(beg_string.substring(0, beg_string.search(/[^0-9]/)));
    end_id = parseInt(end_string.substring(0, end_string.search(/[^0-9]/)));

    beg = document.getElementById('ec-p' + beg_id);
    end = document.getElementById('ec-p' + end_id);
  }
  else
  {
    beg = range.startContainer;
    end = range.endContainer;

    if (beg.parentNode.tagName == 'div')
    {
      beg = beg.nextSibling ? beg.nextSibling : beg.previousSibling;
    }
    else
    {
      beg = beg.parentNode;
    }

    if (end.parentNode.tagName == 'div')
    {
      end = end.previousSibling ? end.previousSibling : end.nextSibling;
    }
    else
    {
      end = end.parentNode;
    }

    if (beg.id.substring(0, 4) == 'ec-p')
    {
      beg_id = parseInt(beg.id.substring(4));
    }

    if (end.id.substring(0, 4) == 'ec-p')
    {
      end_id = parseInt(end.id.substring(4));
    }
  }

  if (beg_id == null || isNaN(beg_id))
  {
    beg = document.getElementById('ec-p' + ec_stanza_beg);
    beg_id = ec_stanza_beg;
  }

  if (end_id == null || isNaN(end_id))
  {
    end = document.getElementById('ec-p' + ec_stanza_end);
    end_id = ec_stanza_end - 1;
  }

  var stanza = beg.parentNode.parentNode;
  if (beg.parentNode.tagName.toLowerCase() == 'span')
  {
    stanza = stanza.parentNode;
  }

  var selection = ec_selection_string(stanza, beg, end);

  $('#ec-tag-selection-box').css('display', 'block');
  $('#ec-comment-selection-box').css('display', 'block');

  // Doing this manually because of apparent JQuery bug in older Safari (the
  // JQuery line below crashes the browser).
  // $('#ec-selection-text').text(selection);
  document.getElementById('ec-tag-selection-text').innerHTML = selection;
  document.getElementById('ec-comment-selection-text').innerHTML = selection;

  //beg_id = Math.max(beg_id, ec_stanza_beg);
  //end_id = Math.min(end_id, ec_stanza_end);

  $('#ec-tag-add-beg').attr('value', beg_id);
  $('#ec-tag-add-end').attr('value', end_id + 1);

  $('#ec-comment-add-beg').attr('value', beg_id);
  $('#ec-comment-add-end').attr('value', end_id + 1);
}

function external_a()
{
  var warning = 'Leaving the eComma application via external links is disabled for this computer.';
  /*if ($('#ec-message').length == 0)
  {
    $('#ec-left-column').prepend('<div class="white-box"><div class="inside"><div class="ec-message" id="ec-message">' + warning + '</div></div></div>');
  }
  else
  {
    $('#ec-message').text(warning);
  }
  $('#ec-message').animate({ scrollTop: $('#ec-message').offset().top }, 3000);*/
  alert(warning);
  return false;
}

