// keyboard functions

function setSelectionRange(input, selectionStart, selectionEnd) {
  if (input.setSelectionRange) {
    input.focus();
    input.setSelectionRange(selectionStart, selectionEnd);
  }
  else if (input.createTextRange) {
    var range = input.createTextRange();
    range.collapse(true);
    range.moveEnd('character', selectionEnd);
    range.moveStart('character', selectionStart);
    range.select();
  }
}

function setCaretToEnd (input) {
  setSelectionRange(input, input.value.length, input.value.length);
}

function setCaretToBegin (input) {
  setSelectionRange(input, 0, 0);
}

function setCaretToPos (input, pos) {
  setSelectionRange(input, pos, pos);
}

function my_getSelection(input,blueonly) { // note: in FF gets called from browser code if named getSelection
  if(input) {
    if(document.selection) { // blue selection...
      var range = document.selection.createRange();
      if (range.parentNode == input) { // ... in our textbox
        //alert('@@@get-blue: '+range.text);
        return range.text;
      }
    }
    if(input.setSelectionRange) { // mozilla
      var selectionStart=input.selectionStart;
      var selectionEnd=input.selectionEnd;
      //alert('@@@get-mozilla: '+input.value.substring(selectionStart,selectionEnd));
      return input.value.substring(selectionStart,selectionEnd);
    }
    if(blueonly) return '';
    if(input.createTextRange) { // IE
      var range=input.createTextRange();
      if(range) {
        //alert('@@@get-IE');
        return range.text;
      }
    }
  }
  return '';
}

function replaceSelection(input, replaceString) {

  if(document.selection) { // blue selection...
    var range = document.selection.createRange();
    if (range.parentNode == input) { // ... in our textbox
      //alert('@@@blue');
      //var isCollapsed = (range.text == '');
      range.text = replaceString;
      //if (!isCollapsed)  {
        //range.moveStart('character', -replaceString.length);
        //range.select();
      //}
      return;
    }
  }

  if (input.setSelectionRange) { // mozilla
    //alert('@@@mozilla');
    var selectionStart = input.selectionStart;
    var selectionEnd = input.selectionEnd;
    input.value = input.value.substring(0, selectionStart)
                  + replaceString
                  + input.value.substring(selectionEnd);
    if (selectionStart != selectionEnd) // restore selection
      input.setSelectionRange(selectionStart, selectionStart + replaceString.length);
    else // set caret
      setCaretToPos(input, selectionStart + replaceString.length);
    return;
  }

  if (input.createTextRange) { // IE
    var range = input.createTextRange();
    if(range) {
      //alert('@@@IE');
      range.text += replaceString;
      //range.collapse(true);
      //range.select();
      return;
    }
  }

  // poor man's choice: append to the end no matter where the caret is
  //alert('@@@poor');
  input.value += replaceString;

}

function typekey(value,id) {
  if(id==null) id='search';
  var input=document.getElementById(id);
  if(input) {
    //if(input.createTextRange && !document.selection) { // IE
    //  input.insertAdjacentText('beforeEnd',value);
    //} else {
      replaceSelection(input,value);
      //input.setActive();
    //}
  }
}
function typekeyInSearch(value) {
  var id='search';
  return typekey(value,id);
}

function showkeyboard(onoff,id) {
  if(id==null) id='keyboard';
  var div=document.getElementById(id);
  if(div) {
    var newvalue=(onoff)?'block':'none';
    div.style.display=newvalue;
  }
}
function showkeyboardInSearch(onoff) {
  var id='keyboard';
  return showkeyboard(onoff,id);
}

function google(text) {
  window.open(encodeURI("http://www.google.com/search?hl=en&q="+text));
}

function yahoo(text) {
  window.open(encodeURI("http://search.yahoo.com/search?ei=UTF-8&fr=sfp&p="+text));
}

function yandex(text) {
  window.open(encodeURI("http://www.yandex.ru/yandsearch?stype=&nl=0&text="+text));
}

function rambler(text) {
  window.open(encodeURI("http://www.rambler.ru/srch?set=www&words="+text));
}

function allfour(text) {
  rambler(text);
  yandex(text);
  yahoo(text);
  google(text);
}

function editClear(name) {
  var e=document.getElementById(name);
  if(e==null) return;
  // replaceSelection(e,'');
  e.value='';
  e.focus();
}

function editCopy(name) {
  var e=document.getElementById(name);
  if(e==null) return;
  var sel=my_getSelection(e,true);
  clipboardData.setData("Text",sel);
  e.focus();
}

function editPaste(name) {
  var e=document.getElementById(name);
  if(e==null) return;
  replaceSelection(e,clipboardData.getData("Text"));
  e.focus();
}

function editInsert(name,value) {
  var e=document.getElementById(name);
  if(e==null) return;
  replaceSelection(e,value);
  e.focus();
}

function editTitle(name) {
  var e=document.getElementById(name);
  if(e==null) return;
  var sel=my_getSelection(e,true);
  if(sel=='' || sel.indexOf('#',0)>=0) sel=prompt('Введите заголовок\nили сначала выделите заголовок в тексте','');
  if(sel==null) {e.focus();return;} // cancel
  sel=sel.replace(/#/g,'');
  replaceSelection(e,'#t '+sel+"\n");
  e.focus();
}

function editAuthor(name) {
  var e=document.getElementById(name);
  if(e==null) return;
  var sel=my_getSelection(e,true);
  if(sel=='' || sel.indexOf('#',0)>=0) sel=prompt('Введите имя автора (используется для копируемых материалов)\nили сначала выделите имя автора в тексте','');
  if(sel==null) {e.focus();return;} // cancel
  sel=sel.replace(/#/g,'');
  replaceSelection(e,'#a '+sel+"\n");
  e.focus();
}

function editCopyright(name) {
  var e=document.getElementById(name);
  if(e==null) return;
  var sel=my_getSelection(e,true);
  if(sel=='' || sel.indexOf('#',0)>=0) sel=prompt('Введите источник (откуда взят материал, например "kp.ru")\nили сначала выделите его в тексте','');
  if(sel==null) {e.focus();return;} // cancel
  sel=sel.replace(/#/g,'');
  replaceSelection(e,'#c '+sel+"\n");
  e.focus();
}

function editLink(name) {
  var e=document.getElementById(name);
  if(e==null) return;
  var sel=my_getSelection(e,true);
  var url='';
  var text='';
  if(sel=='' || sel.indexOf('#',0)>=0) {
    url=prompt('Введите URL\nили сначала выделите текст, например "google.com Visit Google"',"http://");
    if(url==null) {e.focus();return;} // cancel
    // TODO @@@ url can contain #
    text=prompt('Введите текст','');
    if(text==null) {e.focus();return;} // cancel
    text=text.replace(/#/g,'');
  } else {
    var p=sel.indexOf(' ',2);
    if(p<0) {
      var q=sel.indexOf('.',3);
      if(q<0) {
        text=sel;
        url=prompt('Введите URL',"http://");
        if(url==null) {e.focus();return;} // cancel
        // TODO @@@ url can contain #
      } else {
        url=sel;
        text=prompt('Введите текст','');
        if(text==null) {e.focus();return;} // cancel
        text=text.replace(/#/g,'');
      }
    } else {
      url=sel.substring(0,p);
      text=sel.substring(p+1);
    }
  }
  if(url.substring(0,7)=='http://') url=url.substring(7);
  url=escape(url);
  url="http://"+url;
  replaceSelection(e,' #l '+url+' '+text+'##');
  e.focus();
}

var w; // global popup reference