// Cross Browser selectionStart/selectionEnd
// Version 0.1
// Copyright (c) 2005 KOSEKI Kengo
// 
// This script is distributed under the MIT licence.
// http://www.opensource.org/licenses/mit-license.php

function Selection(textareaElement) {
    this.element = textareaElement;
}

Selection.prototype.create = function() {
    if (document.selection != null && this.element.selectionStart == null) {
        return this._ieGetSelection();
    } else {
        return this._mozillaGetSelection();
    }
}

Selection.prototype._mozillaGetSelection = function() {
    return { 
        start: this.element.selectionStart, 
        end: this.element.selectionEnd 
    };
}

Selection.prototype._ieGetSelection = function() {
    this.element.focus();

    var range = document.selection.createRange();
    var bookmark = range.getBookmark();

    var contents = this.element.value;
    var originalContents = contents;
    var marker = this._createSelectionMarker();
    while(contents.indexOf(marker) != -1) {
        marker = this._createSelectionMarker();
    }
    // var selection = range.text;

    var parent = range.parentElement();
    if (parent == null || parent.type != "textarea") {
        return { start: 0, end: 0 };
    }
    range.text = marker + range.text + marker;
    contents = this.element.value;
    while(contents.indexOf("\n") != -1) {
      contents = contents.replace("\n", "");
    }

    var result = {};
    result.start = contents.indexOf(marker);
    contents = contents.replace(marker, "");
    result.end = contents.indexOf(marker);

    this.element.value = originalContents;
    range.moveToBookmark(bookmark);
    range.select();

    return result;
}

Selection.prototype._createSelectionMarker = function() {
    return "##SELECTION_MARKER_" + Math.random() + "##";
}


function setSelRange(inputEl, selStart, selEnd) { 
 if (inputEl.setSelectionRange) { 
  inputEl.focus(); 
  inputEl.setSelectionRange(selStart, selEnd); 
 } else if (inputEl.createTextRange) { 
  var range = inputEl.createTextRange(); 
  range.collapse(true); 
  range.moveEnd('character', selEnd); 
  range.moveStart('character', selStart); 
  range.select(); 
 } 
}


function CheckScrollbar(elementid){
  var selection = new Selection(document.getElementById(elementid));
  var s = selection.create();
  // alert("start:" + s.start + ", end:" + s.end);
  
  // need to split long lines by adding \n
  var str = document.getElementById(elementid).value;
  while (str.indexOf('\r') != -1) { str = str.replace('\r', ''); }
  var lines = str.split("\n");
  var allowedCols = document.getElementById(elementid).getAttribute("cols");
  var allowedLines = document.getElementById(elementid).getAttribute("rows");
  
  for (var i=0; i<lines.length; i++) {
    if (i <= allowedLines-1)
    {
      // temporarily removing line length limitation
      // lines[i] = lines[i].substring(0, allowedCols);
      if (i > 0)
      {
        str += '\n' + lines[i];
      }
      else
      {
        str = lines[i];
      }
    }
  }
  
  // add "\n" to equal allowedLines
  for (var i; i<allowedLines; i++) {
    str += "\n";
  }
  
  
  document.getElementById(elementid).value = str;
  
  setSelRange(document.getElementById(elementid), s.start, s.end);
}

function pasting(elementsid) {
  setTimeout("CheckScrollbar('" + elementsid + "')", 1);
}
