/* 어플리케이션 컨텍스트 이름 */
var CONTEXT_NAME = "/kcdchome";

function getContextName(){
    // TODO cookie를 안쓸 경우엔 무조건 값이 "" 이 되어 버림.
    if (CONTEXT_NAME == null){
    	CONTEXT_NAME = getCookie("j_context_name");
    }
    return CONTEXT_NAME;
}

/* 전역 변수 */

var LEAF_NODE_IMAGE = CONTEXT_NAME + "/ext/image/tree/File.gif";
var OPENED_NODE_IMAGE = CONTEXT_NAME + "/ext/image/tree/Opened.gif";
var CLOSED_NODE_IMAGE = CONTEXT_NAME + "/ext/image/tree/Closed.gif";
var INDENTION = "&nbsp;&nbsp;&nbsp;&nbsp";
var CALLBACK_METHOD = "goTo";

var allNodes = new Array; /* 모든 JNode 객체를 담고 있는 배열 */

/**
 * 하위 노드를 가지고 있는 노드를 클릭하는 경우에 대한 처리를 한다.
 *
 * @param nodeId JNode 객체의 아이디
 */
function clickOnNode(nodeId) {
    var element = document.getElementById("IMG_TREE" + nodeId);  /* <img src=""/> 태그 객체의 획득 */
    if (!element) {
        return;
    }
    var node = allNodes[nodeId];
    
    if (node.isOpened) {
        element.src = CLOSED_NODE_IMAGE;
        node.isOpened = false;
    } else {
        element.src = OPENED_NODE_IMAGE;
        node.isOpened = true;
    }
    node.change();
   
    return;
}

function openPath(nodeId) {
    var node = allNodes[nodeId];
    path = new Array;
       path[path.length] = node;
    while (node.parent) {
        node = node.parent;
        path[path.length] = node;
    }
    for (i = path.length-1; i >= 0; i--) {
        clickOnNode(path[i].id);
    }
    return;
}

/**
 * 노드를 나타내는 클래스.
 *
 * @param parent 부모 JNode 객체
 * @param id 노드의 아이디로 전체 화면에서 유일해야 한다.
 * @param name 노드의 이름
 * @param url 노드의 URL로, 있을 경우에 클릭시 CALLBACK_METHOD를 호출한다. 
 */
function JNode(parent, id, name, url) {

    /* Member Fields */
    this.id = id;
    this.name = name;
    this.url;
    if (url != "null") {
        this.url = url;
    }
    this.isOpened = false;
    this.isVisible = true;

    this.parent;
    this.children = new Array;

    if (parent) {
        this.parent = parent;
        this.isVisible = false;
        this.parent.children[this.parent.children.length] = this;
    }


    /* Member Methods */
    this.display = jnode_display;
    this.change = jnode_change;

    this.hasChild = function() {
                        return this.children.length > 0;
                    }

    /* Indention을 위한 메소드 */
    this.level = function() {
                       var result = 0;
                       var parent = this.parent;
                       while (parent != null) {
                           parent = parent.parent;
                           result++;
                       }
                       return result;
                   }

    allNodes[this.id] = this;
}


/**
 * JNode display 메소드의 구현. 트리를 화면에 출력한다.
 */
function jnode_display() {
    var style = "style=\"display:block\"";
    if (this.parent) {
        style = "style=\"display:none\"";
    }

    var content = "<div id=\"" + this.id + "\" " + style + ">";

    /* INDENTION 처리를 한다. */
    var level = this.level();
    for (var i = 0; i < level; i++) {
        content += INDENTION;
    }

    if (this.hasChild()) {
        content += "<a href='javascript:clickOnNode(\"" + this.id + "\")'>";
        content += "<img id=\"IMG_TREE" + this.id + "\" align=\"absmiddle\" ";
        content += "src=\"" + CLOSED_NODE_IMAGE + "\"/ border=\"0\"></a>";

        content += displayUrl(this);
        document.write(content);

        for (var i = 0; i < this.children.length; i++) {
            this.children[i].display();
        }
    } else {
        content += "<img src=\"" + LEAF_NODE_IMAGE + "\"/ border=\"0\" align=\"absmiddle\"></a>";
        content += displayUrl(this);
        document.write(content);
    }
}


/**
 * 노드의 URL 값을 반환한다. JTree 라이브러리 안에서만 사용하는 함수이다.
 *
 * @param JNode 객체
 */
function displayUrl(node) {
    if (node.url) {
        return "<a name=\"" + node.id + "\" href=\"javascript:" + CALLBACK_METHOD + "('" + node.url + "', " + node.level() + ")\">" + node.name + "</a></div>";
    } else {
        return node.name + "</div>";
    }
}


/**
 * JNode change 메소드의 구현. 노드가 열리고 닫히는 이벤트를 처리한다.
 */
function jnode_change() {
    for (var i = 0; i < this.children.length; i++) {
        var element = document.getElementById(this.children[i].id);
        if (this.isOpened && this.isVisible) {
            this.children[i].isVisible = true;
            element.style.display = "block";
        } else if (this.isOpened && !this.isVisible) {
            this.children[i].isVisible = false;
            element.style.display = "none";
        } else if (!this.isOpenend && this.isVisible) {
            this.children[i].isVisible = false;
            element.style.display = "none";
        } else if (!this.isOpenend && !this.isVisible) {
            this.children[i].isVisible = false;
            element.style.display = "none";
        }
        this.children[i].change();
    }
}
