/*
 * tripedia.org
 * 
 * (c) Jan Poeschko
 * 
 */

// Bug in scriptaculous: Don't use string[index] method (doesn't work in IE) but rather string.charAt(index) instead!
function getFirstDifferencePos(newS, oldS) {
  var boundary = Math.min(newS.length, oldS.length);
  for (var index = 0; index < boundary; ++index)
    if (newS.charAt(index) != oldS.charAt(index))
      return index;
  return boundary;
};

Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = getFirstDifferencePos;

function AUTOCOMPLETER_OPTIONS() {
  //var ac = eval(ac);
  return {
    tokens: ['\n', '\r', ' ', ':', '(', ')', '.', ','],
    onShow: function(element, update) {
      Effect.Appear(update,{duration:0.15});
    },
    updateElement: function(selectedElement) {
      var value = '';
      //alert(ac);
      if (ac.options.select) {
        var nodes = $(selectedElement).select('.' + ac.options.select) || [];
        if(nodes.length>0) value = Element.collectTextNodes(nodes[0], ac.options.select);
      } else
        value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
      
      var bounds = ac.getTokenBounds();
      if (bounds[0] != -1) {
        var scroll = ac.element.scrollTop;
  
        if (!ac.element.selectionStart && !ac.element.selectionEnd) {  // IE              
          var range = document.selection.createRange();
          
          function copyRange(r) {
            var n = document.selection.createRange();
            n.setEndPoint('StartToStart', r);
            n.setEndPoint('EndToEnd', r);
            return n;
          }
          
          range.moveStart('word', -1);
          var containsLinebreak = false;
          while (true) {
            var newRange = copyRange(range);
            if (newRange.moveEnd('character', +1) == 0)
              break;
            if (newRange.text == '')
              break;
            if (newRange.text.search(/[\n]/) >= 0) {
              containsLinebreak = true;
              break;
            }
            if (newRange.text.search(/[\s\r:().,]/) >= 0)
              break;
            range = copyRange(newRange);
          }
          
          var newRange = copyRange(range);
          while (newRange.text == range.text)
            newRange.moveEnd('character', +1);
          var linebreaks = 0;
          for (var i = 0; i < newRange.text.length; ++i)
            if (newRange.text.charAt(i) == '\n')
              ++linebreaks;
          
          if (linebreaks) {
            if (!newRange.text.charAt(newRange.text.length-1).match(/\s/)) {
              range.text = value + '\n'.times(linebreaks);
              range.moveEnd('character', -linebreaks);
              range.select();
            } else {
              range.text = value;
            }
          } else
            range.text = value;
        } else {                                               // FF & Opera
          var newValue = ac.element.value.substr(0, bounds[0]);
          var whitespace = ac.element.value.substr(bounds[0]).match(/^\s+/);
          if (whitespace)
            newValue += whitespace[0];
          
          //var after = ac.element.value.substr(bounds[1]);
          //var newElementValue = newValue + value + after;
        
          // Opera: prints linebreak when hitting return key -> remove it if so
          var oldAfter = ac.oldElementValue.substring(bounds[1]);
          /*alert('oldAfter: "' + oldAfter + '" -> after: "' + after + '"');
          if ((after.charAt(0) == '\n' || after.charAt(0) == '\r') && after != oldAfter) {
            alert('correct');
            after = after.substring(2);
            newElementValue = newValue + value + after;
          }*/
          newElementValue = newValue + value + oldAfter;
          
          ac.element.value = newElementValue;
          ac.element.selectionStart = bounds[0] + value.length;
          ac.element.selectionEnd = bounds[0] + value.length;
        }
        
        ac.element.scrollTop = scroll;
      } else {
        ac.element.value = value;
      }
      ac.oldElementValue = ac.element.value;
      ac.element.focus();
    }
  };
}
