function editorFormat(field, action)
{ document.getElementById("_" + field).contentWindow.document.
    execCommand(action, false, null);
}

function editorCreateLink(field)
{ try // IE
  { document.getElementById("_" + field).contentWindow.document.
      execCommand('createlink');
  }
  catch(err) // firefox
  { var url = prompt("URL?", "");
    if(url.search("://") == -1) url = "http://" + url;
    document.getElementById("_" + field).contentWindow.document.
      execCommand('createlink', false, url);
  }    
}

function editorChangeFontSize(field, change)
{ var err;
  try // firefox
  { if(change == 1) editorFormat(field, "increasefontsize");
    else            editorFormat(field, "decreasefontsize");
  }
  catch(err)
  { if(err.message == "Invalid argument.") // IE
    { var doc = document.getElementById("_" + field).contentWindow.document;
      var size = doc.queryCommandValue("fontSize") + change;
      if(size < 1) size = 1;
      if(size > 7) size = 7;
      doc.execCommand("fontSize", false, size);
    }
  }
}

var editor_fields = {};

var editor_tags =
{ 'div align="right"':  "[right]|[/right]",
  'div align="left"':   "[left]|[/left]",
  'div align="center"': "[center]|[/center]",
  "div align=right":  "[right]|[/right]",
  "div align=left":   "[left]|[/left]",
  "div align=center": "[center]|[/center]",
  "/div": "&",

  "p align=right":  "[right]|[/right]",
  "p align=left":   "[left]|[/left]",
  "p align=center": "[center]|[/center]",
  "/p": "&",

  "i": "[i]", "/i": "[/i]",
  "b": "[b]", "/b": "[/b]",
  "u": "[u]", "/u": "[/u]",
  "big": "[big]", "/big": "[/big]",
  "small": "[small]", "/small": "[/small]",

  "/font": "&",
  "/a": "[/link]",
  "p": "", "/p": "\n",
  "strong": "[b]", "/strong": "[/b]",
  "em": "[i]", "/em": "[/i]",
  "br": "\n"
};

var editor_html = 
{ "left":   'div align="left"',   "/left":   "/div",
  "right":  'div align="right"',  "/right":  "/div",
  "center": 'div align="center"', "/center": "/div",
  "/link":  "/a",
  "i": "i", "/i": "/i",
  "b": "b", "/b": "/b",
  "u": "u", "/u": "/u",
  "big": "big", "/big": "/big",
  "small": "small", "/small": "/small"
};

var editor_entities =
{ "apos": "'",
  "quot": '"',
  "amp":  "&",
  "lt":   "<",
  "gt":   ">"
};

function editorTextareaToHtml(field)
{ var s = document.getElementById(field).value;
  var a = s.split("[");
  var o = "";

  for(var i in a)
  { var rb = a[i].indexOf("]");
    var tag = "";
    if(rb >= 0)
    { original_tag = a[i].substr(0, rb);
      tag = original_tag.toLowerCase();      
    }
    var rest = a[i].substr(rb+1);
    if(tag)
    { if(editor_html[tag]) o += "<" + editor_html[tag] + ">";
      else if(tag.substr(0, 5) == "link:")
      { var link = tag.substr(5);
        o += "<a href=\"" + link + "\">"
      }
      else if(tag.substr(0, 7) == "entity:")
      { var entity = tag.substr(7);
        o += "&" + entity + ";";
      }
      else o += "[" + original_tag + "]";
    }
    if(rest) o += rest;
  }
  
  return o.replace(/\n/g, "<br>");
}

function editorHtmlToTextarea()
{ for(var f in editor_fields)
  { var s = editor_fields[f].body.innerHTML;
    
    if(!encode_on_submit)
    { //alert(f + ", " + document.getElementById(f).type);
      document.getElementById(f).value = s;
      continue;
    }
  
    var a = s.split("<");
    var o = "";
    var text = "";
    
    var stack = [];
    
    for(var i in a)
    { var gt = a[i].indexOf(">");
      var tag = "";
      if(gt >= 0) tag = a[i].substr(0, gt).toLowerCase();
      var rest = a[i].substr(gt+1);
      if(tag)
      { if(editor_tags[tag] == "&") o += stack.pop();
        else if(tag.substr(0, 2) == "a ")
        { var link = tag.substr(tag.indexOf("href")+5);
          link = link.substr(link.indexOf("\"")+1);
          link = link.substr(0, link.indexOf("\""));
          o += "[link:" + link + "]"
        }
        else if(tag.substr(0, 5) == "font ")
        { var size = tag.substr(tag.indexOf("size")+5);
          //alert(size);
          if(size.indexOf("\"") > -1)
          { size = size.substr(size.indexOf("\"")+1);
            size = size.substr(0, size.indexOf("\""));
          }
          size = parseInt(size);
          var close = "";
          if(size < 3)
            for(var i = size; i < 3; i++)
            { o += "[small]";
              close += "[/small]";              
            }
          else
            for(var i = 3; i < size; i++)
            { o += "[big]";
              close += "[/big]";
            }
          stack.push(close);
        }
        else if(editor_tags[tag])
        { var t = editor_tags[tag];
          var p = t.indexOf("|");
          if(p >= 0)
          { stack.push(t.substr(p+1));
            t = t.substr(0, p);
          }
          o += t;
        }
//        else o += "[" + tag + "]";
      }
      
      rest = rest.replace(/\&([A-Za-z0-9#]+)\;/g, "[entity:$1]");
      for(var name in editor_entities)
        rest = rest.replace("[entity:"+name+"]", editor_entities[name]);
      
      o += rest;
      text += rest;
    }
    
    o = o.replace(/^\s+/g, "")
         .replace(/\s+$/g, "");    
 
      //alert(f + ", " + document.getElementById(f).type);
      document.getElementById(f).value = o;
//    alert(f);
  }
}

var editor_initialized = false;
var encode_on_submit = true;

function editorInit()
{ if(editor_initialized) return;
  editor_initialized = true;
  
  for(var field in editor_fields)
  { var editor = document.getElementById("_" + field).contentWindow.document;
    editor.body.innerHTML = editor_fields[field];
    editor_fields[field] = editor;
    if(editor.body) editor.body.contentEditable = true;

    if(navigator.appVersion.indexOf("MSIE")==-1) // not IE
    { editor.designMode = "on";
      editor.execCommand("styleWithCSS", false, false);
    }
  }
}

var controls = 
[ "bold", "italic", "underline", "createlink", "unlink",
  "justifyleft", "justifycenter", "justifyright",  
  "increasefontsize", "decreasefontsize"
];

function editorAdd(form, field)
{ // don't get any funny ideas, now
  if(navigator.userAgent.search("Firefox") == -1 &&
     navigator.userAgent.search("MSIE") == -1)
    return;

  var justfield = field;
  field = form + "_" + field;

  editor_fields[field] = editorTextareaToHtml(field);

  document.getElementById(form).onsubmit = editorHtmlToTextarea;
  
  var editor_html = "";
  for(var i in controls)
  { var c = controls[i];
    editor_html += "<a href='#' onclick='";

    if(c == "createlink")
      editor_html += 'editorCreateLink("' + field + '");';
    else if(c == "increasefontsize")
      editor_html += 'editorChangeFontSize("' + field + '",  1);';
    else if(c == "decreasefontsize")
      editor_html += 'editorChangeFontSize("' + field + '", -1);';
    else editor_html +=  'editorFormat("' + field + '", "' + c + '");'
    
    editor_html += " return false;'/>" +
                   "<img src='/scripts/content/images/edit_" + c +
                     ".gif' border=0 alt='" + c + "'></a> ";
  }
  
  editor_html += '<br/><iframe id="_' + field + '" class="wysiwygBox" style="width:475px; ' + 
    'height:300px; border:1px solid #999"></iframe><br/>' +
    '<input type="hidden" name="' + justfield + '" id="' + field +
    '" value=""/>';

  document.getElementById(field + "_wrapper").innerHTML =
    editor_html;
}
