Editor.Sweeper = Class.create();
Editor.Sweeper.prototype = {

  initialize: function(editor) {
    this.editor = editor
    this.body   = editor.iframe.body();
  },

  scrub: function(body) {
    this.removeTrailingBreaks(body);
    this.swapToStandard(body);

    str = body.innerHTML;
    // lowercase tag names
    str = str.replace(/<(\/)?([A-Z]+)/g, function(match, slash, tagName) {
      return "<" + (slash || "") + tagName.toLowerCase();
    });

    // remove newlines
    str = str.replace(/\r\n|\r|\n/g, "");

    tags = $A(str.match(/<[a-z]+ [^>]+>/g));
    if (tags.any()) {
      tags.each(function(tag) {
        // remove crufty attributes
        var cruft = $A([/ _counted="undefined"/, / style=""/, / class=""/]);
        cruft.each(function(rx) {
          str = str.replace(rx, "");
        });
        // wrap attributes in double-quotes
        var quotes_rx  = /=([^ >\/"]+)( |>|\/>)/g;
        var replaced = tag.replace(quotes_rx, function(full, attr, end) {
          return "=\"" + attr + "\"" + end;
        });
        str = str.replace(tag, replaced);
      });
    }
    return str;
  },

  sweep: function() {
    var l = this.body.childNodes.length;
    if (l == 0) {
      this.appendAndFocusOnDefault();
    }
    var f = this.body.firstChild;
    if (l == 1 && (f.nodeName.toLowerCase() == "br") || (f.nodeType == 3 && f.nodeValue == "")) {
      this.body.removeChild(f);
      this.appendAndFocusOnDefault();
    }
  },

  appendAndFocusOnDefault: function() {
    var p = this.editor.iframe.appendChild(new Element("p"));
    $s().setSelection({start: p});
  },

  removeTrailingBreaks: function(element) {
    var len = element.childNodes.length;
    for (var i = 0; i < len; i++) {
      var child = element.childNodes[i];
      if (!child.hasChildNodes()) { return true; }

      var j    = child.childNodes.length - 1;
      var last = child.childNodes[j];
      if (last.nodeName.toLowerCase() == "br") {
        child.removeChild(last);
      }
      this.removeTrailingBreaks(child);
    }
  },

  swapToStandard: function(element) {
    if (Prototype.Browser.IE) { return true; }
    $w("b i").each(function(tag) {
      $A(element.getElementsByTagName(tag)).each(function(replace) {
        var n = new Element((tag == "b" ? "strong" : "em"));
        n.innerHTML = replace.innerHTML;
        replace.parentNode.replaceChild(n, replace);
      });
    });
  },
  
  swapToDeprecated: function(element) {
    if (Prototype.Browser.IE) { return true; }
    $w("strong em").each(function(tag) {
      $A(element.getElementsByTagName(tag)).each(function(replace) {
        var n = new Element((tag == "strong" ? "b" : "i"));
        n.innerHTML = replace.innerHTML;
        replace.parentNode.replaceChild(n, replace);
      });
    });
  },

  removeDivTagsFromLiTags: function() {
    $A(this.body.getElementsByTagName("li")).each(function(li) {
      var first = Element.firstDescendant(li);
      if (first && first.nodeName.toLowerCase() == "div") {
        li.innerHTML = first.innerHTML;
      }
    });
  }
}
