
function get_outerHTML(element) {
    // outerHTML 이 있을 경우 바로 리턴 : IE의 경우 attributes 가 직접 설정되지 않은 모든 속성을 참조하기 때문에 사용 불가
    if(element.outerHTML)
        return element.outerHTML;

    // 엘리먼트가 아닐 경우 리턴 null
    if(element.nodeType != 1)
        return null;

    // 정식 태그가 아닐 경우 리턴 null : html 4.1 기준
    var tagName = element.nodeName.toLowerCase();
    var tag = " a abbr acronym address applet area b base basefont bdo big blockquote body br button caption center cite code col colgroup dd del dfn dir div dl dt em fieldset font form frame frameset h1 h2 h3 h4 h5 h6 head hr html i iframe img input ins isindex kbd label legend li link map menu meta noframes noscript object ol optgroup option p param pre q s samp script select small span strike strong style sub sup table tbody td textarea tfoot th thead title tr tt u ul var ";
    if(tag.indexOf(" " + tagName + " ") == -1)
        return null;

    // attributes 를 조회해서 nodeName="nodeValue" 꼴로 배열에 넣고 마지막에 공백으로 join
    // 속성에 " 가 포함되어 있을 경우 ' 로 감싸기
    var attr_arr = new Array();
    var attributes = element.attributes;
    var attr_len = attributes.length;
    for(var i=0 ; i<attr_len ; i++) {
        var attr_prop = attributes[i].nodeName;
        var attr_value = attributes[i].nodeValue;
        if(attr_value.indexOf("\"") != -1)
            attr_value = "'" + attr_value + "'";
        else
            attr_value = "\"" + attr_value + "\"";
        attr_arr[i] = attr_prop + "=" + attr_value;
    }
    var attr_text = attr_len?(" " + attr_arr.join(" ")):"";

    // empty tag, 즉 빈 태그일 경우 처리 : xhtml식으로 /> 로 닫음
    var lower = " area base basefont br col frame hr img input isindex link meta param ";
    if(lower.indexOf(" " + tagName + " ") != -1)
        return "<" + tagName + attr_text + " />";
    else
        return "<" + tagName + attr_text + ">" + element.innerHTML + "</" + tagName + ">";
}

function set_outerHTML(element,html) {
    // outerHTML이 있을 경우 바로 설정
    if(element.outerHTML) {
        element.outerHTML = html;
        return;
    }

    // 아니면 div를 만들고 innerHTML로 적용해서 실제 node로 적용시킨 다음 차례대로 대상 엘리먼트의 앞에 넣고 마지막에 대상 엘리먼트 삭제
    var temp = document.createElement("div");
    temp.innerHTML = html;
    var parent = element.parentNode;
    while(temp.firstChild) {
        parent.insertBefore(temp.firstChild,element);
    }
    parent.removeChild(element);
    // document.createElement로 생성한 엘리먼트는 그냥 놔둬도 되나? 안되나? 완전히 지우려면 어떻게? 일단 패스
    temp = null;
} 
