/**
 * SubNaviTextクラス
 *
 */

/**
 * use ScriptToolKit<scripttoolkit.js>
 */
ScriptToolKit.Event.addEventListener(window, 'load', function(){SubNaviText.init();}, false);

/**
 * コンストラクタ
 */
var SubNaviText = [];

/**
 * クラスプロパティ
 */
SubNaviText._http_root = 'http://' + document.domain;
SubNaviText._common_dir = undefined;
SubNaviText._location = document.location.href;
SubNaviText._reference = document.location.href.substr(document.location.href.lastIndexOf('/')+1);

SubNaviText._src_params = [];
SubNaviText._settings = undefined;
SubNaviText._elements;

SubNaviText._generate_options = [
    {
        _target : 'snavi01',
        _regenetate : 'on border',
        _exception : 'now'
    },
    {
        _target : 'snavi02',
        _regenetate : 'now_sub border',
        _exception : ''
    }
];
  
/**
 * クラスメソッド
 */
 
SubNaviText.init = function() {
    /**
     * JSファイルに設定された各パラメータを取り出します。
     */
    var jsdoc = document.getElementsByTagName('script');
    for (var i=0; i<jsdoc.length; i++) {
        if (jsdoc[i].src.match(new RegExp(/\.js+\?+(TLD=.*&MID=.*&MT=.*)|\.js+\?+(TLD=.*&amp;MID=.*&amp;MT=.*)/))) {
            var url_param = jsdoc[i].src.match(/\.js+\?+(TLD=.*&MID=.*&MT=.*)/)[1].split('&');
            for (var key in url_param) {
                var tmp = url_param[key].split('=');
                this._src_params[tmp[0]] = tmp[1];
            }
            
            this._common_dir = jsdoc[i].src.match(/(.*\/).*\.js+\?+(TLD=.*&MID=.*&MT=.*)|(.*\/).*\.js+\?+(TLD=.*&amp;MID=.*&amp;MT=.*)/)[1];
            break;
        }
    }
    
    if (!this._src_params.TLD) {
        return false;
    }
    
    try {
        var obj = document.getElementById(this._src_params.MID);
        this._elements = obj.getElementsByTagName('li');
    } catch(e) {
        return false;
    }
    
    if (this._elements.length == 0) {
        return false;
    }
    
    if (this._src_params.MT != 'normal' && this._src_params.MT != '' && this._common_dir != undefined) {
        /**
         * jsファイルの設定ファイル(パラメータMTに設定される値 .js)をインクルードします。
         */
        var js = document.createElement('script');
        js.src = this._common_dir + this._src_params.MT + '.js';
        js.type = 'text/javascript';
        obj.appendChild(js);   
        
         /**
         * 設定ファイル(パラメータMTに設定される値 .js)のロード状況をチェックして
         * ロードされたらSubNaviText.mapperメソッドを実行します。
         */
        var loader = new ScriptToolKit.Document.Loader();
        loader._timeout = 5;
        loader._interval = 2;
        loader.onComplete = function(loader){SubNaviText.mapper(SubNaviText._elements, loader['settings'].value);};
        loader.load(new Array('var:settings'));
    } else {
        this.mapper(this._elements, this._settings);
    }
}


/**
 * SubNaviText::mapper 
 *
 *
 *
 *
 *
 *
 *
 */
SubNaviText.mapper = function(elements, settings) {
    for (var i=0; i<elements.length; i++) {
        if (settings != undefined) {
            for (var n=0; n<settings.length; n++) {
                /**
                 * @アーカイブマッピング
                 *  外部設定ファイルが存在する場合、アドレスバーに表示されるURLと
                 *  各_archive_mapの「_directory_name + _archive_list」を比較します。
                 *  以下のような場合、設定ファイルsettings[n番目]の_labelに設定されたボタンがハイライトされます。
                 * 
                 * @アドレスバーのURL
                 *  http://www.@@@@@.co.jp/@@@@@/hoge/index.html
                 *
                 * @settings[n番目]の_archive_mapの設定
                 *  /hoge/(_directory_name) + index.html(_archive_list[i])
                 *
                 * アーカイブマッピングでボタンをハイライトした場合、
                 * 以下のディレクトリマッピング・ロケーションマッピングの処理は行いません。
                 * 
                 */
                for (var k=0; k<settings[n]._archive_map.length; k++) {
                    if (this.archiveMapping(this._location, this._http_root, settings[n]._archive_map[k])) {
                        if (elements[i].firstChild.innerHTML.match(settings[n]._label)) {
                            this.regenerateClassName(elements[i], this._generate_options);
                            return;
                        }
                    }
                }
            }
        }
    }
    
    /**
     * @ディレクトリマッピング
     *  外部設定ファイルが存在する場合、アドレスバーに表示されるURLに
     *  各_directory_mapの「_directory_list[n番目]」が含まれているか比較します。
     *  以下のような場合、設定ファイルsettings[n番目]の_labelに設定されたボタンがハイライトされます。
     * 
     * @アドレスバーのURL
     *  http://www.@@@@@.co.jp/@@@@@/hoge/index.html
     *  http://www.@@@@@.co.jp/@@@@@/hoge/hoge.html
     *  http://www.@@@@@.co.jp/@@@@@/hoge/hoge2/index.html
     *  http://www.@@@@@.co.jp/@@@@@/hoge/hoge2/hoge2.html
     *
     * @settings[n番目]の_archive_mapの設定
     *  /hoge/(_directory_list[i])
     *
     * ディレクトリマッピングでボタンをハイライトした場合、
     * 以下のロケーションマッピングの処理は行いません。
     * 
     */
    for (var i=0; i<elements.length; i++) {
        if (settings != undefined) {
            for (var n=0; n<settings.length; n++) {
                // ディレクトリ単位
                if (elements[i].className == 'now') {
                    continue;
                }
                if (elements[i].firstChild.innerHTML.match(settings[n]._label) && settings[n]._directory_map._directory_list != '') {
                    if (this.directoryMapping(this._location.replace(this._reference, ''), this._http_root, settings[n]._directory_map)) {         
                        this.regenerateClassName(elements[i], this._generate_options);
                        return;
                    }
                }
            }
        }
    }
    
    
    /**
     * @ロケーションマッピング
     *  外部設定ファイルが存在しない(または、設定ファイルによるハイライトが行われなかった)場合、
     *  アドレスバーに表示されるURLとサブナビゲーションの各ボタンに設定されるhref属性の値が一致するか比較します。
     *  以下のような場合、サブナビゲーションのボタン[n番目]がハイライトされます。
     * 
     * @アドレスバーのURL
     *  http://www.@@@@@.co.jp/@@@@@/hoge/index.html
     *
     * @ボタンのhref属性の値
     *  http://www.@@@@@.co.jp/@@@@@/hoge/index.html
     *  http://www.@@@@@.co.jp/@@@@@/hoge/
     *  /@@@@@/hoge/index.html
     *
     * 設定ファイルが存在しないまたは、アーカイブマッピング・ディレクトリマッピングで
     * ボタンがハイライトされなかった場合、ロケーションマッピングを行います。
     * 
     */
    for (var i=0; i<elements.length; i++) {
        if (this.locationMapping(elements[i])) {
            this.regenerateClassName(elements[i], this._generate_options);
            return;
        }
    }        
}

SubNaviText.regenerateClassName = function(element, generate_options) {
    for (var i=0; i<generate_options.length; i++) {
        if (element.firstChild.className.match(generate_options[i]._target)) {
            if (generate_options[i]._exception == '' || element.className.indexOf(generate_options[i]._exception) <= -1 ) {
                element.className = generate_options[i]._regenetate;
                break;
            }
        }
    }
    return;
}

SubNaviText.directoryMapping = function(location, category_root, directory_map) {
    var directories = directory_map._directory_list.split(',');
    var res = false;
    for (var i=0; i<directories.length; i++) {
        if (directories[i].substr(0, 1) != '/') {
            directories[i] = '/' + directories[i];
            //alert(directories[i]);
        }
        if (directories[i].substr(directories[i].length -1 , 1) != '/') {
            directories[i] = directories[i] + '/';
            //alert(directories[i]);
        }
        tmp_dir = category_root + directories[i];
        if (location.match(tmp_dir)) {
            //alert('directoryMapping');
            res = true;
            break;
        }
    }
    return res;
}

SubNaviText.archiveMapping = function(location, category_root, archive_map) {
    var archives = archive_map._archive_list.split(',');
    var res = false;
    for (var i=0; i<archives.length; i++) {
        if (location == category_root + archive_map._directory_name + archives[i]) {
            //alert('archiveMapping');
            res = true;
            break;
        }
    }
    return res;
}


SubNaviText.locationMapping = function(target) {
    if (target.firstChild.href.replace(/\/index.html/, '/', 'g') == this._location.replace(/\/index.html/, '/', 'g')) {
        //alert('locationMapping');
        return true;
    } else {
        return false;
    }
}






