/*
 * 見出しに応じたフォーマッティングを行うクラス。
 *
 * Copyright (C) 2005-2006 Y System Create Corporation. All Rights Reserved.
 *
 * $Date:$
 * $Revision:$
 */
function Caption(topElement) {

    this.initializeCaption(topElement);
}

/**
 * 初期処理
 * Captionクラスを継承する場合は、必ずこのメソッドを、
 * コンストラクタ内で最初にコールすること。
 * @param topElement : 要素 : フォーマットする先頭の要素。
 *        この要素の子供に対して、フォーマットを行う。
 *        指定されなかった場合は、document.body をフォーマットする。
 */
Caption.prototype.initializeCaption = function (topElement) {

    this.h1Num = 0;
    this.h2Num = 0;
    this.h3Num = 0;
    this.h4Num = 0;
    this.h5Num = 0;
    this.h6Num = 0;

    this.leftMarginPixH1 = -1;
    this.leftMarginPixH2 = -1;
    this.leftMarginPixH3 = -1;
    this.leftMarginPixH4 = -1;
    this.leftMarginPixH5 = -1;
    this.leftMarginPixH6 = -1;

    this.number_ = 0;

    this.emPixcl = getEmPixcl();
    this.isHNext = false;
    this.topElement = topElement;

    if (! this.topElement) {

        this.topElement = document.body;
    }
}

/**
 * フォーマット
 * ドキュメントのフォーマットを行う。
 */
Caption.prototype.format = function () {

    var childNodes = this.topElement.childNodes;
    var leftMargin = 0;
    var nextMargin = 0;

    for (var i = 0; i < childNodes.length; i ++) {

        var child = childNodes.item(i);

        if (child.nodeType != 1) {

            /*
             * エレメント要素以外は、対象外。
             */
            continue;
        }

        var upperName = child.nodeName.toUpperCase();

        switch (upperName) {

            case "H1" :
                this.h2Num = 0;
//                break;
            case "H2" :
                this.h3Num = 0;
            case "H3" :
                this.h4Num = 0;
            case "H4" :
                this.h5Num = 0;
            case "H5" :
                this.h6Num = 0;
            case "H6" :

                this.isHNext = true;

                switch (upperName) {

                    case "H1" :
                        this.h1Num ++;
                        break;
                    case "H2" :
                        this.h2Num ++;
                        break;
                    case "H3" :
                        this.h3Num ++;
                        break;
                    case "H4" :
                        this.h4Num ++;
                        break;
                    case "H5" :
                        this.h5Num ++;
                        break;
                    case "H6" :
                        this.h6Num ++;
                        break;
                }

                var captionText =
                    this["get"+upperName+"CaptionText"].call(this);
                var spanElement = document.createElement("span");
                var textNode = document.createTextNode(captionText);
                textNode = spanElement.appendChild(textNode);
                spanElement = child.insertBefore(spanElement, child.firstChild);
                var cat_width = spanElement.offsetWidth;

                switch (upperName) {

                    case "H1" :
//                        if (-1 == this.leftMarginPixH1) {
//                            this.leftMarginPixH1 = cat_width;
//                        }
//                        leftMargin = 0;
//                        nextMargin = this.leftMarginPixH1;
                        break;
                    case "H2" :
                        if (-1 == this.leftMarginPixH2) {
                            this.leftMarginPixH2 = cat_width;
                        }
                        leftMargin = this.leftMarginPixH1;
                        nextMargin = leftMargin + this.leftMarginPixH2;
                        break;
                    case "H3" :
                        if (-1 == this.leftMarginPixH3) {
                            this.leftMarginPixH3 = cat_width;
                        }
                        leftMargin = this.leftMarginPixH1 +
                                     this.leftMarginPixH2;
                        nextMargin = leftMargin + this.leftMarginPixH3;
                        break;
                    case "H4" :
                        if (-1 == this.leftMarginPixH4) {
                            this.leftMarginPixH4 = cat_width;
                        }
                        leftMargin = this.leftMarginPixH1 +
                                     this.leftMarginPixH2 +
                                     this.leftMarginPixH3;
                        nextMargin = leftMargin + this.leftMarginPixH4;
                        break;
                    case "H5" :
                        if (-1 == this.leftMarginPixH5) {
                            this.leftMarginPixH5 = cat_width;
                        }
                        leftMargin = this.leftMarginPixH1 +
                                     this.leftMarginPixH2 +
                                     this.leftMarginPixH3 +
                                     this.leftMarginPixH4;
                        nextMargin = leftMargin + this.leftMarginPixH5;
                        break;
                    case "H6" :
                        if (-1 == this.leftMarginPixH6) {
                            this.leftMarginPixH6 = cat_width;
                        }
                        leftMargin = this.leftMarginPixH1 +
                                     this.leftMarginPixH2 +
                                     this.leftMarginPixH3 +
                                     this.leftMarginPixH4 +
                                     this.leftMarginPixH5;
                        nextMargin = leftMargin + this.leftMarginPixH6;
                        break;
                }

                break;

            default :

                leftMargin = nextMargin;
        }

        if ("footer" == child.id) {

            child.style.marginLeft = "0";
        }
        else {

            child.style.marginLeft = "" + leftMargin + "px";
        }
    }
}

/**
 * H1要素の先頭に付加するテキストを編集し返す。
 * @return H1要素の先頭に付加するテキスト。
 */
Caption.prototype.getH1CaptionText = function () {

    return "" + this.h1Num + ". ";
}

/**
 * H2要素の先頭に付加するテキストを編集し返す。
 * @return H2要素の先頭に付加するテキスト。
 */
Caption.prototype.getH2CaptionText = function () {

    return "" + this.h1Num + "." + this.h2Num + ". ";
}

/**
 * H3要素の先頭に付加するテキストを編集し返す。
 * @return H3要素の先頭に付加するテキスト。
 */
Caption.prototype.getH3CaptionText = function () {

    return "" + this.h1Num + "." + this.h2Num + "." + this.h3Num + ". ";
}

/**
 * H4要素の先頭に付加するテキストを編集し返す。
 * @return H4要素の先頭に付加するテキスト。
 */
Caption.prototype.getH4CaptionText = function () {

    return "(" + this.h4Num + ") ";
}

/**
 * H5要素の先頭に付加するテキストを編集し返す。
 * @return H5要素の先頭に付加するテキスト。
 */
Caption.prototype.getH5CaptionText = function () {

    var val_list = [  '.', 'a. ', 'b. ', 'c. ', 'd. ', 'e. ', 'f. ', 'g. ',
                    'h. ', 'i. ', 'j. ', 'k. ', 'l. ', 'm. ', 'n. ', 'o. ',
                    'p. ', 'q. ', 'r. ', 's. ', 't. ', 'u. ', 'v. ', 'w. ',
                    'x. ', 'y. ', 'z. '];

    return val_list[this.h5Num];
}

/**
 * H6要素の先頭に付加するテキストを編集し返す。
 * @return H6要素の先頭に付加するテキスト。
 */
Caption.prototype.getH6CaptionText = function () {

    return "･";
}

function allList() {

    new Caption().format();
}

function getEmPixcl() {

    var div = document.createElement("div");
    div = document.body.appendChild(div);
    div.style.width = "10em";
    var width1 = div.clientWidth;
    div.style.width = "11em";
    var width2 = div.clientWidth;
    return (width2 - width1);
}

