/**
 *  Класс для чистки HTML-кода.
 *  @author Sergey Suzdaltsev
 */
var cHTMLCleaner = function()
{
    this.good_tags=["a","p","br","strong","b","em","i","tt","code","pre","ul","ol","li","img","table","tbody","thead","tfoot","caption","tr","td","th","col","colgroup","h1","h2","h3","h4","h5","h6","small","big","sub","sup","div","span"]
    // Теги, допустимые в html-документе.
    this.allowed_tags = [];
    for(i in this.good_tags){
        this.allowed_tags[this.good_tags[i]]=true
    }

    // Инициализация допустимых аттрибутов.
    this.good_attr = [];
    this.good_attr["all"] = ["href", "target", "name", "title", "alt", "src", "id", "bgColor", "color", "class"];
    this.good_attr["img"] = ["width", "height", "border", "align"];
    this.good_attr["table"] = ["cellspacing", "cellpadding", "border", "width"];
    this.good_attr["td"] = ["colspan", "rowspan"];
    this.good_attr["tr td col colgroup"] = ["noWrap", "align", "valign", "width"];
    this.good_attr["a area"] = ["href", "name"];
    this.good_attr["br"] = ["clear"];
    this.good_attr["li"] = ["type"];
    //debugger;
    // Формируем допустимые аттрибуты для разных тегов
    var valid_attr = [];
    for (key in this.good_attr)
    {
        var keys = key.split(" ");
        for (tag in keys)
        {
            for (attr in this.good_attr[key])
            {
                var my_tag_name = keys[tag];
                var my_attr_name = this.good_attr[key][attr];
                if (!this.good_attr[ my_tag_name ]) {
                    this.good_attr[ my_tag_name ] = true;
                }
                
                this.good_attr[ my_tag_name ][ my_attr_name ] = true;
            }
        }
    }
}

/**
 *  Рекурсивно обходит дерево элементов в рамках заданного контейнера.
 *  @param Element elem
 *  @param boolean must_clean
 */
cHTMLCleaner.prototype.clean_tree = function(elem, must_clean)
{
    //debugger;
    var elem_children = elem.children;
    if (elem_children==undefined) {
        elem_children = elem.childNodes;
    }
    var i;
    if(elem_children)
    {
        for(i=elem_children.length-1;i>=0;i--)
        {
            cleaner.clean_tree(elem_children[i], true);
        }
    }

    if(must_clean) cleaner.clean_object(elem);
}

/**
 * Чистит отдельный элемент.
 * @param Element elem
 */
cHTMLCleaner.prototype.clean_object = function(elem)
{
    // Текстовые узлы не трогаем.
    if (elem.nodeType == 3) {
        return;
    }

    current_tag_name = elem.nodeName;
    if (current_tag_name)
    {
        current_tag_name = current_tag_name.toLowerCase();
        // Если данный тег не разрешен убиваем его.
        if (!this.allowed_tags[current_tag_name])
        {
            var parent_node = elem.parentNode;
            parent_node.removeChild(elem);
            return;
        }

        //debugger;
        // Чистим аттрибуты
        var attr = elem.attributes;
        for (var i=0; i<=attr.length-1; i++)
        {   //debugger;
            var attr_name = attr[i].name;
            attr_name = attr_name.toLowerCase();

            
            // Проверка аттрибута class
            if (attr_name == "class") {
               
                var reg = /MsoNormal/;
                var attr_value = attr[i].value;
               
                if (reg.test(attr_value))
                {
                     elem.removeAttribute(attr_name);
                }
            }
            // Проверка className
            if (elem.className) {
                reg = /MsoNormal/;
                attr_value = elem.className;

                if (reg.test(attr_value))
                {
                     elem.removeAttribute("class");
                }
            }
            
            // Если есть хорошие аттрибуты для такого тега
            if (this.good_attr[current_tag_name])
            {
                if (!this.good_attr[current_tag_name][attr_name]) {
                    // Проверяем может такой аттрибут есть у all
                    if (!this.good_attr['all'][attr_name]) {
                        // Убиваем такой аттрибут
                        elem.removeAttribute(attr_name);
                    }
                }
            }
            else {
                // Проверяем может такой аттрибут есть у all
                    if (!this.good_attr['all'][attr_name]) {
                        // Убиваем такой аттрибут
                        elem.removeAttribute(attr_name);
                    }
            }
        }
    }
}
cHTMLCleaner.prototype.clean = function(elem)
{
    debugger;
    

    var children = elem.childNodes;
    var child_count = children.length - 1;
    for(i=0; i<=child_count; i++)
    {
        var child = children[i];
        // Проверяем а есть ли у него дети.
        var child_children = child.childNodes;
        if (child_children) {
            var child_children_count = child_children.length-1;
            if (child_children_count>0) {
                cleaner.clean(child);
            }
        }
        if (child.nodeType == 3 || child.nodeType==8) {
            continue;
        }

        current_tag_name = child.nodeName;
        
        if (current_tag_name) {
            current_tag_name = current_tag_name.toLowerCase();
            var res = this.allowed_tags[current_tag_name];
            if (res == undefined) {
                elem.removeChild(child);
            }
            
            
        }
        else {
            if (child.nodeType == 1) {
                elem.removeChild(child);
            }
        }
        
       
    }
}