// Cross-Browser Rich Text Editor
// http://www.kevinroth.com/rte/demo.htm
// Written by Kevin Roth (kevin@NOSPAMkevinroth.com - remove NOSPAM)
// Visit the support forums at http://www.kevinroth.com/forums/index.php?c=2

//init variables
var isRichText = false;
var rng;
var currentRTE;
var allRTEs = "";

var isIE;
var isGecko;
var isSafari;
var isKonqueror;

var imagesPath;
var includesPath;
var cssFile;
var generateXHTML;

var lang = "en";
var encoding = "iso-8859-1";

//*******************************************************
// Очищаем форматирование текста в буфере перед вставкой
// Добавлено 11.05.2005 by Vasilev.M.
// ЦКТ Школы 1020.(c) 2005.
//*******************************************************
function OnPaste(e){
  try{
  var paste_text = window.clipboardData.getData("Text");
  window.clipboardData.setData("Text", paste_text);
  }catch(e){
  return false; 
 }
}
//*******************************************************
// Инициализация редактора на странице
//*******************************************************
function initRTE(imgPath, incPath, css) {
 var ua = navigator.userAgent.toLowerCase();
 isIE = ((ua.indexOf("msie") != -1) && (ua.indexOf("opera") == -1) && (ua.indexOf("webtv") == -1)); 
 isGecko = (ua.indexOf("gecko") != -1);
 isSafari = (ua.indexOf("safari") != -1);
 isKonqueror = (ua.indexOf("konqueror") != -1);

 if(document.getElementById && document.designMode && !isSafari && !isKonqueror) {
    isRichText = true;
 }
 imagesPath = imgPath;
 includesPath = incPath;
 cssFile = css;

 if (isRichText) document.writeln('<style type="text/css">@import "' + includesPath + 'rte.css";</style>');
 //isRichText = false;
}

//*****************************************************
// Активизация и отображение окна редактирования
//*****************************************************
function writeRichText(rte, html, width, height, buttons, readOnly, align, style ) {
 if(isRichText){
  if (allRTEs.length > 0) allRTEs += ";";
  allRTEs += rte;

  writeRTE(rte, html, width, height, buttons, readOnly, align, style );	

 }else{
  if (!readOnly){
      document.writeln('<textarea name="' + rte + '" id="' + rte + '" style="width: ' + width + 
                       'px; height: ' + height + 'px;">' + html + '</textarea>');
  }else{
      document.writeln('<textarea name="' + rte + '" id="' + rte + '" style="width: ' + width + 
                       'px; height: ' + height + 'px;" readonly>' + html + '</textarea>');
  }
 }
}

function writeRTE(rte, html, width, height, buttons, readOnly, align, style) {

 if ( readOnly ) buttons = false;
 var tablewidth = 350;

 document.writeln('<div class="rteDiv" align="'+align+'" style=\"position: relative; top: 0px; left: 0px; '+
                  ' border: #000000 0px solid; text-indent: 0px; z-index: 2; ' + style + '\">');
 if (buttons == true) {
 document.writeln('<table class=rteBack cellPadding=0 cellSpacing=0 width="' + tablewidth + 
                  '" style="margin-bottom: 0px;" id="Buttons2_' + rte +'" >');
 document.writeln('<tr>');
 //******************************** Панель форматирования текста ********************************//
 // I. Жырный текст
 document.writeln('<td><img id="bold" class="rteImage" src="' + imagesPath + 
                  'bold.jpg" alt="Жырный" title="Жырный" onClick="rteCommand(\''+rte+
                  '\', \'bold\',   \'\');" onMouseOver=\'this.className = "rteImageRaised";\''+
		  'onMouseOut=\'this.className = "rteImage";\'></td>');
 // II. Курсив
 document.writeln('<td><img id="italic" class="rteImage" src="' + imagesPath +
                  'italic.jpg" alt="Курсив" title="Курсив" onClick="rteCommand(\''+rte+
                  '\', \'italic\', \'\')" onMouseOver=\'this.className = "rteImageRaised";\''+
                  'onMouseOut=\'this.className = "rteImage";\'></td>');
 // III. Подчеркнутый текст
 document.writeln('<td><img id="underline" class="rteImage" src="' + imagesPath + 
                  'underline.jpg" alt="Подчеркнутый" title="Подчеркнутый" '+
                  'onClick="rteCommand(\'' + rte + '\', \'underline\', \'\')" '+
                  'onMouseOver=\'this.className = "rteImageRaised";\''+
                  'onMouseOut=\'this.className = "rteImage";\'></td>');
 // Разделитель
 document.writeln('<td><img class=rteVertSep style="height: 23px;" src="'+imagesPath+'blackdot.jpg"></td>');
 // IV. Выравнивание по левому краю 
 document.writeln('<td style="width: 25;"><img class="rteImage" src="' + imagesPath + 
                  'left_just.jpg" width="23" height="23" alt="По левому краю" title="По левому краю" '+
                  'onClick="rteCommand(\'' + rte + '\', \'justifyleft\', \'\')" '+
                  'onMouseOver=\'this.className = "rteImageRaised";\''+
                  'onMouseOut=\'this.className = "rteImage";\'></td>');
 // V. Выравнивание по центру
 document.writeln('<td style="width: 25;"><img class="rteImage" src="' + imagesPath + 
                  'center.jpg" width="23" height="23" alt="По центру" title="По центру" '+
                  'onClick="rteCommand(\'' + rte + '\', \'justifycenter\', \'\')" '+
                  'onMouseOver=\'this.className = "rteImageRaised";\''+
                  'onMouseOut=\'this.className = "rteImage";\'></td>');
 // VI. Выравнивание по правому краю
 document.writeln('<td style="width: 25;"><img class="rteImage" src="' + imagesPath + 
                  'right_just.jpg" width="23" height="23" alt="По правому краю" title="По правому краю" '+
                  'onClick="rteCommand(\'' + rte + '\', \'justifyright\', \'\')" '+
                  'onMouseOver=\'this.className = "rteImageRaised";\''+
                  'onMouseOut=\'this.className = "rteImage";\'></td>');
 // VII. Выравнивание по ширине
 document.writeln('<td style="width: 25;"><img class="rteImage" src="' + imagesPath + 
                  'justifyfull.jpg" width="23" height="23" alt="По ширене" title="По ширене" '+
                  'onclick="rteCommand(\'' + rte + '\', \'justifyfull\', \'\')" '+
                  'onMouseOver=\'this.className = "rteImageRaised";\''+
                  'onMouseOut=\'this.className = "rteImage";\'></td>');
 // Разделитель
 document.writeln('<td><img class=rteVertSep style="height: 23px;" src="'+imagesPath+'blackdot.jpg"></td>');
 // VIII. Нумерованный список
 document.writeln('<td style="width: 25;"><img class="rteImage" src="' + imagesPath + 
                  'numbered_list.jpg" width="23" height="23" alt="Нумерованный список" '+
                  'title="Нумерованный список" onClick="rteCommand(\'' + rte + 
                  '\', \'insertorderedlist\', \'\')" onMouseOver=\'this.className = "rteImageRaised";\''+
                  'onMouseOut=\'this.className = "rteImage";\'></td>');
 // IX. Маркерованный список
 document.writeln('<td style="width: 25;"><img class="rteImage" src="' + imagesPath + 
                  'list.jpg" width="23" height="23" alt="Маркерованный список" '+
                  'title="Маркерованный список" onClick="rteCommand(\'' + rte + 
                  '\', \'insertunorderedlist\', \'\')" onMouseOver=\'this.className = "rteImageRaised";\''+
                  'onMouseOut=\'this.className = "rteImage";\'></td>');
 // Разделитель
 document.writeln('<td><img class=rteVertSep style="height: 23px;" src="'+imagesPath+'blackdot.jpg"></td>');
 // X. Отступ влево
 document.writeln('<td style="width: 25;"><img class="rteImage" src="' + imagesPath + 
                  'outdent.jpg" width="23" height="23" alt="Отступ влево" title="Отступ влево" '+
                  'onClick="rteCommand(\'' + rte + '\', \'outdent\', \'\')" '+
                  'onMouseOver=\'this.className = "rteImageRaised";\''+
                  'onMouseOut=\'this.className = "rteImage";\'></td>');
 // XI. Отступ вправо
 document.writeln('<td style="width: 25;"><img class="rteImage" src="' + imagesPath + 
                  'indent.jpg" width="23" height="23" alt="Отступ вправо" title="Отступ вправо" '+
                  'onClick="rteCommand(\'' + rte + '\', \'indent\', \'\')" '+
                  'onMouseOver=\'this.className = "rteImageRaised";\''+
                  'onMouseOut=\'this.className = "rteImage";\'></td>');
 // XII. Цвет шрифта
 document.writeln('<td style="width: 25;"><img class="rteImage" id="forecolor_'+rte+'" src="' + imagesPath + 
                  'textcolor.jpg" style="margin-top: 1px;" alt="Цвет текста" title="Цвет текста" '+
                  'onClick="getPallet(\'' + rte + '\', \'forecolor\')" '+
                  'onMouseOver=\'this.className = "rteImageRaised";\''+
                  'onMouseOut=\'this.className  = "rteImage";\'><div id="forecolor_' + rte + 
                  '" style="position: relative; left: 0px; top: 0px; z-index: 15;"></div></td>');
 // Разделитель
 document.writeln('<td><img class=rteVertSep style="height: 23px;" src="'+imagesPath+'blackdot.jpg"></td>');
 // XIII. Ссылка в тексте
 document.writeln('<td style="width: 25;"><img class="rteImage" src="' + imagesPath + 
                  'hyperlink.jpg" width="23" height="23" alt="Добавить ссылку" title="Добавить ссылку" '+
                  'onClick="rteCommand(\'' + rte + '\', \'CreateLink\')" '+
                  'onMouseOver=\'this.className = "rteImageRaised";\''+
                  'onMouseOut=\'this.className = "rteImage";\'></td>');
 // Конец панели редактирования
 document.writeln('</tr></table>');
 }

 document.writeln('<iframe id="' + rte + '" name="' + rte + '" width="' + width + 'px" height="' + height + 
                  'px" src="' + includesPath + 'blank.htm" onFocus="OnPaste();" cursor: pointer; '+
                  'style=\"border: #afafaf 1px solid; padding: 5px; margin: 0px;\"></iframe>');

 document.writeln('<iframe width="154" height="104" id="cp' + rte + '" src="' + includesPath + 
                  'palette.htm" marginwidth="0" marginheight="0" scrolling="no" style="visibility: hidden; '+
                  'position: absolute; z-index: 10; border: #afafaf 1px solid; left: 0px; top: 0;"></iframe>');

 document.writeln('<input type="hidden" id="chkSrc' + rte + '" value="1">');
 document.writeln('<input type="hidden" id="hdn' + rte + '" name="' + rte + '" value="">');
 document.writeln('</div>');

 document.getElementById('hdn' + rte).value = html;
 enableDesignMode(rte, html, readOnly);
}

function enableDesignMode(rte, html, readOnly) {
 var frameHtml = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" +
                 "<html id=\"" + rte + "\"><head>\n";
 if(cssFile.length > 0) {
    frameHtml += "<link media=\"all\" type=\"text/css\" href=\"/Css/base.css\" rel=\"stylesheet\">\n";
    frameHtml += "<link media=\"all\" type=\"text/css\" href=\"" + cssFile + "\" rel=\"stylesheet\">\n";
 } 
 // Запись содержимого в iframe
 frameHtml +="</head>\n<body style='margin: 0px; padding: 0px; FONT-SIZE: 11px;'>"+html+"</body>\n</html>";

 if( document.all ) {
    var oRTE = frames[rte].document;
    oRTE.open();
    oRTE.write(frameHtml);
    oRTE.close();
    if(!readOnly){
     oRTE.designMode = "On";
     frames[rte].document.attachEvent("onkeypress", function evt_ie_keypress(event) {ieKeyPress(event, rte);});
    }
 }else{
    try{
	if (!readOnly) document.getElementById(rte).contentDocument.designMode = "on";
	try {
	     var oRTE = document.getElementById(rte).contentWindow.document;
	     oRTE.open();
	     oRTE.write(frameHtml);
	     oRTE.close();
             if (isGecko && !readOnly){
		oRTE.addEventListener("keypress", geckoKeyPress, true);
	     }
	}catch(e){
          alert("Error preloading content.");
  	}
     }catch(e){
      if(isGecko) {
	 setTimeout("enableDesignMode('" + rte + "', '"+html+"', " + readOnly + ");", 10);
      }else{
	 alert('Error preloading content.');
       	 return false;
      }
     }
  }
}

//******************************************************
// Представление RTE в виде доступном HTML запросу
//******************************************************
function updateRTEs() {
 var vRTEs = allRTEs.split(";");
 for(var i = 0; i < vRTEs.length; i++) {
     updateRTE(vRTEs[i]);
 }
}

function updateRTE(rte) {
 if (!isRichText) return;
 var readOnly = false;
 if(document.all) {
    if(frames[rte].document.designMode != "On") readOnly = true;
 }else{
    if(document.getElementById(rte).contentDocument.designMode != "on") readOnly = true;
 }
 if(isRichText && !readOnly) {
  //***** Обновление содержания окна редактирования в случае активности HTML редактора *****//
  //if(document.getElementById("Bar2_" + rte).style.visibility == "visible" ) {
  //   document.getElementById("Bar2_" + rte).style.visibility = "hidden"
  //   toggleHTMLSrc(rte);
  //}
  setHiddenVal(rte);
 }
}
//**** Обновление содержания скрытых полей документа перед отправкой формы на сервер ****//
function setHiddenVal(rte) {
 var oHdnField = document.getElementById('hdn' + rte);
 if(oHdnField.value == null) oHdnField.value = "";

 if(document.all) {
    oHdnField.value = frames[rte].document.body.innerHTML;
 }else{
    oHdnField.value = document.getElementById(rte).contentWindow.document.body.innerHTML;
 }

 if( stripHTML(oHdnField.value.replace("&nbsp;", " ")) == "" &&
     oHdnField.value.toLowerCase().search("<hr") == -1 &&
     oHdnField.value.toLowerCase().search("<img") == -1) oHdnField.value = "";
}

function toggleHTMLSrc(rte) {
 var oHdnField = document.getElementById('hdn' + rte);
 if (document.getElementById("chkSrc" + rte).value == 1 ){
   //***** Обновление содержания окна редактирования в случае активности HTML редактора *****//
   document.getElementById("chkSrc" + rte).value = 0;
   document.getElementById("Bar2_" + rte).style.visibility = "visible";
   setHiddenVal(rte);
   if(document.all){
      frames[rte].document.body.innerText = oHdnField.value;
   }else{
      var oRTE = document.getElementById(rte).contentWindow.document;
      var htmlSrc = oRTE.createTextNode(oHdnField.value);
      oRTE.body.innerHTML = "";
      oRTE.body.appendChild(htmlSrc);
   }
 }else{
  //***** Обновление содержания окна редактирования в случае не активности HTML редактора *****//
  document.getElementById("chkSrc" + rte).value = 1;
  document.getElementById("Bar2_" + rte).style.visibility = "hidden";

  if(document.all) {
     var output = escape(frames[rte].document.body.innerText);
     output = output.replace("%3CP%3E%0D%0A%3CHR%3E", "%3CHR%3E");
     output = output.replace("%3CHR%3E%0D%0A%3C/P%3E", "%3CHR%3E");
     frames[rte].document.body.innerHTML = unescape(output);
  }else{
     var oRTE = document.getElementById(rte).contentWindow.document;
     var htmlSrc = oRTE.body.ownerDocument.createRange();
     htmlSrc.selectNodeContents(oRTE.body);
     oRTE.body.innerHTML = htmlSrc.toString();
  }
 }
}


//******************************************************
// Непосредственное форматирование выделенного фрагмента 
//******************************************************
function rteCommand(rte, command, option) {
 var oRTE;
 if (document.all) {
  oRTE = frames[rte];
 }else{
  oRTE = document.getElementById(rte).contentWindow;
 }

 if(command == "CreateLink"){
    var szURL = prompt("Enter a URL:", "");
    try {
         oRTE.document.execCommand("Unlink", false, null);
         oRTE.document.execCommand("CreateLink", false, szURL);
    } catch (e) {
    }
 }else{
  try {
   oRTE.focus();
   oRTE.document.execCommand(command, false, option);
   oRTE.focus();
  } catch (e) {
   //setTimeout("rteCommand('" + rte + "', '" + command + "', '" + option + "');", 10);
  }
 }
}


//******************************************************************************************
// Вспомогательные функции системы редактирования
//******************************************************************************************
// Выделение объекта для форматирования
function setRange(rte) {
 var oRTE;
 if(document.all) {
    oRTE = frames[rte];
    var selection = oRTE.document.selection;
    if (selection != null) rng = selection.createRange();
 }else{
    oRTE = document.getElementById(rte).contentWindow;
    var selection = oRTE.getSelection();
    rng = selection.getRangeAt(selection.rangeCount - 1).cloneRange();
 }
 return rng;
}
// Скрытие или востановление элементов редактора
function showHideElement(element, showHide) {
 if(document.getElementById(element)) {
    element = document.getElementById(element);
 }
 if(showHide == "show") {
    element.style.visibility = "visible";
 }else{
    element.style.visibility = "hidden";
 }
}

//******************************************************************************************
// Изменение цвета фона и шрифта сообщения
//******************************************************************************************
// Цвет шрифта и фона шрифта в зависимости от параметра command
function getPallet( rte, command ){
 setRange(rte);
 var oDialog = document.getElementById('cp' + rte);
 var buttonElement = document.getElementById(command + '_' + rte);
 var iLeftPos = getOffsetLeft(buttonElement)-6;
 var iTopPos = getOffsetTop(buttonElement) + (buttonElement.offsetHeight + 1);
 oDialog.style.left = (iLeftPos) + "px";
 oDialog.style.top = (iTopPos) + "px";

 if((command == parent.command) && (rte == currentRTE)) {
    if(oDialog.style.visibility == "hidden"){
       oDialog.style.visibility = "visible";
    }else{
       oDialog.style.visibility = "hidden";
    }
 }else{
  var vRTEs = allRTEs.split(";");
  for(var i = 0; i < vRTEs.length; i++){
      showHideElement('cp' + vRTEs[i], 'hide');
  }
  showHideElement(oDialog, 'show');
 }
 parent.command = command;
 currentRTE = rte;
}
// Получаем координаты палитры для корректного отображения
function getOffsetTop(elm){
 var mOffsetTop = elm.offsetTop;
 var mOffsetParent = elm.offsetParent;
 var parents_up = 2; 
 while(parents_up > 0){
   mOffsetTop += mOffsetParent.offsetTop;
   mOffsetParent = mOffsetParent.offsetParent;
   parents_up--;
 }
 return mOffsetTop;
}
function getOffsetLeft(elm) {
 var mOffsetLeft = elm.offsetLeft;
 var mOffsetParent = elm.offsetParent;
 var parents_up = 2;
 while(parents_up > 0){
   mOffsetLeft += mOffsetParent.offsetLeft;
   mOffsetParent = mOffsetParent.offsetParent;
   parents_up--;
 }
 return mOffsetLeft;
}

// Непосредственно ставим нужный цвет для элемента
function setColor(color) {
 var rte = currentRTE;
 var oRTE;
 if(document.all) {
    oRTE = frames[rte];
 }else{
    oRTE = document.getElementById(rte).contentWindow;
 }
 var parentCommand = parent.command;
 if(document.all) {
    var sel = oRTE.document.selection;
    if(parentCommand == "hilitecolor") parentCommand = "backcolor";
    if(sel != null){
       var newRng = sel.createRange();
       newRng = rng;
       newRng.select();
    }
 }
 oRTE.focus();
 oRTE.document.execCommand(parentCommand, false, color);
 oRTE.focus();
 document.getElementById('cp' + rte).style.visibility = "hidden";
}

function stripHTML(oldString) {
   var newString = oldString.replace(/(<([^>]+)>)/ig,"");
	
   //replace carriage returns and line feeds
   newString = newString.replace(/\r\n/g," ");
   newString = newString.replace(/\n/g," ");
   newString = newString.replace(/\r/g," ");
	
   //trim string
   newString = trim(newString);
	
   return newString;
}

function trim(inputString) {
   // Removes leading and trailing spaces from the passed string. Also removes
   // consecutive spaces and replaces it with one space. If something besides
   // a string is passed in (null, custom object, etc.) then return the input.
   if (typeof inputString != "string") return inputString;
   var retValue = inputString;
   var ch = retValue.substring(0, 1);
	
   while (ch == " ") { // Check for spaces at the beginning of the string
      retValue = retValue.substring(1, retValue.length);
      ch = retValue.substring(0, 1);
   }
   ch = retValue.substring(retValue.length - 1, retValue.length);
	
   while (ch == " ") { // Check for spaces at the end of the string
      retValue = retValue.substring(0, retValue.length - 1);
      ch = retValue.substring(retValue.length - 1, retValue.length);
   }
	
	// Note that there are two spaces in the string - look for multiple spaces within the string
   while (retValue.indexOf("  ") != -1) {
		// Again, there are two spaces in each of the strings
      retValue = retValue.substring(0, retValue.indexOf("  ")) + retValue.substring(retValue.indexOf("  ") + 1, retValue.length);
   }
   return retValue; // Return the trimmed string back to the user
}

//************************************************************************************
//Gecko-Only Functions
//************************************************************************************
function geckoKeyPress(evt) {
//function to add bold, italic, and underline shortcut commands to gecko RTEs
//contributed by Anti Veeranna (thanks Anti!)
  var rte = evt.target.id;
  if (evt.ctrlKey) {
   var key = String.fromCharCode(evt.charCode).toLowerCase();
   var cmd = '';
                switch (key) {
                        case 'b': cmd = "bold"; break;
                        case 'i': cmd = "italic"; break;
                        case 'u': cmd = "underline"; break;
                };

                if (cmd) {
                        rteCommand(rte, cmd, null);

                        // stop the event bubble
                        evt.preventDefault();
                        evt.stopPropagation();
                }
        }
}

//************************************************************************************
//IE-Only Functions
//************************************************************************************
function ieKeyPress(evt, rte) {
        var key = (evt.which || evt.charCode || evt.keyCode);
        var stringKey = String.fromCharCode(key).toLowerCase();
//the following breaks list and indentation functionality in IE (don't use)
//      switch (key) {
//              case 13:
//                      //insert <br> tag instead of <p>
//                      //change the key pressed to null
//                      evt.keyCode = 0;
//
//                      //insert <br> tag
//                      currentRTE = rte;
//                      insertHTML('<br>');
//                      break;
//      };
}

