/* Create Navigation List 1.0a1

	Public Domain (Programmed by RobaQ[private@robaq.info] in 2003-2005.)

 機能
  HTML ファイル (Media Type: text/html) の body 内に link 要素の情報から Navigation っぽいリストを生成する。
   1: class 属性に "navigation"(全て1Byte codeで小文字の事) が設定され、内容がない div 要素(ex: <div class="navigation"></div>) の内容として、navigationをlink要素から生成する。
   2: 1 に該当する箇所がなく h1 要素が文書中 1 つだけ有る場合
    2-1: h1 要素と兄弟関係にある一番最初の h2 要素または div 要素の直前にnavigationをlink要素から生成する。 
    2-2: h1 要素と兄弟関係に h2 要素も div 要素もない場合、h1 要素の親要素の一番最後の子要素としてnavigationをlink要素から生成する。 
   3: h1 要素がない、または複数ある場合、body 直下にnavigationをlink要素から生成する

  生成されるnavigaitonは以下の構造を持つ
   <div class="seciton">
    <hx>Navigation</hx>
    <ul>
     <li><a class="link要素のclass属性の設定値" type="link要素のtype属性の設定値" href="link要素のhref属性の設定値" lang="link要素のlang属性の設定値" target="link要素のtarget属性の設定値" >link要素のtitle属性 (title 属性が未設定の場合 rel属性の設定値 + "(" +href属性の設定値 + ")" )</a></li>
    </ul>
   </div>

   # 上記 1 の場合、あらかじめある "navigation" が class 属性に設定された div の子要素として ul 以下の要素のみが生成される。
   # 上記 2 の場合 hx は h2 要素として、3 の場合 hx は h1 要素として生成される。

 使い方
  HTML ファイルの head 要素内に以下の 1 行を記述する
   <script type="text/javascript" src="createNavigationList.js" charset="UTF-8"></script>
  (既に別の SCRIPT を利用している HTML 文書の場合思いっきり競合しそうですが既に使っているって事は SCRIPT 解るでしょうから利用者が勝手に回避してください)

 問題点
  下記にない問題点に関して著者が無自覚かもしれない。
  browser 毎の動作確認をしていない。
  namespase 無視。
  事実上 Link 要素リストであって、Navigation ではない。
  Link Type は rel にしか対応していない。
  Alternate が無視される。
  Stylesheet も無視される。
*/

var linkTypes = new function(){
	this.start = "start";
	this.prev = "prev";
	this.next = "next";
	this.contents = "contents";
	this.index = "index";
	this.copyright = "copyright";
	this.bookmark = "bookmark";
	this.help = "help";
}

window.onload = navigationWrite;

// navigator の記述
function navigationWrite(){
	if(createLinkList() == false){
		return;
	}
	
	var allDiv = document.getElementsByTagName("DIV");
	var navigationExistence = false;
	for(i = 0; i < allDiv.length; i++){
		if(allDiv[i].className == "navigation" && allDiv[i].childNodes.length == 0){
			allDiv[i].appendChild(createLinkList());
			navigationExistence = true;
		}
	}
	
	if(navigationExistence == true){
		return;
	}
	
	var navigation = document.createElement("DIV");
	navigation.className = "section";
	
	var h1Elements = document.getElementsByTagName("H1");
	if(h1Elements.length == 1){
		var h = document.createElement("H2");
	} else {
		var h = document.createElement("H1");
	}
	
	h.appendChild(document.createTextNode("Navigation"));
	navigation.appendChild(h);
	navigation.appendChild(createLinkList());
	
	if(h1Elements.length == 1){
		var parentH1 = h1Elements[0].parentNode;
		var h1Brother = parentH1.childNodes;
		var h1Number = null;
		
		for(var k = 0; k < h1Brother.length; k ++){
			if(h1Brother[k].tagName == "H1"){
				h1Number = k;
			}
			if(k > h1Number){
				var regPattern = new RegExp("div|h[123456]?", "i");
				if(regPattern.test(h1Brother[k].tagName)){
					parentH1.insertBefore(navigation, h1Brother[k]);
					k = h1Brother.length;
				}
			}
		}
		
		if(h1Number === null){
			parentH1.insertBefore(navigation, h1Elements[0].nextSibling);
		}
	} else {
		document.getElementsByTagName("body")[0].insertBefore(navigation, document.getElementsByTagName("body")[0].getElementsByTagName("*")[0]);
	}
	
	function createLinkList(){
		var linkTypeExistence = false;
		var link  = document.getElementsByTagName("link");
		var ul = document.createElement("ul");
		for(var i in linkTypes){
			for(j = 0; j < link.length; j++){
				var regPattern = new RegExp(linkTypes[i], "i");
				
				if(regPattern.test(link[j].getAttribute("rel")) == false){
					continue;
				}
				
				if(!linkTypeExistence){
					linkTypeExistence = true;
				}
				
				var href = link[j].getAttribute("href")
				if(link[j].getAttribute("title")){
					var title = link[j].getAttribute("title");
				} else {
					var title = linkTypes[i] + "( " + link[j].getAttribute("href") + " )";
				}
				
				var li = document.createElement("li");
				if(link[j].className){
					li.className = link[j].className;
				}
				
				if(link[j].getAttribute("type")){
					li.setAttribute("type", link[j].getAttribute("type"));
				}
				
				if(link[j].getAttribute("target")){
					li.setAttribute("target", link[j].getAttribute("target"));
				}
				
				if(link[j].getAttribute("lang")){
					li.setAttribute("lang", link[j].getAttribute("lang"));
				}
				
				var a  = document.createElement("a");
				a.setAttribute("href", href);
				a.appendChild(document.createTextNode(title));
				li.appendChild(a);
				ul.appendChild(li);
			}
		}
		
		if(linkTypeExistence){
			return ul;
		} else {
			return null;
		}
	}
}

