/*
┌─────────────────────────────────
│  LinkElement.js v1.00
│  Copyright(C) K2@Factory 2002
│  Mail toro@cside8.com
│  URL  http://toro.cside8.com/
└─────────────────────────────────

更新履歴 ------------------------------------------------------------
	v1.00 12/30 link要素の操作及び代替スタイルシート操作クラス
動作確認ブラウザ ----------------------------------------------------
	WIN2000 -> IE5, IE6, NN6.2, NN7, Mozilla, Opera7
必須クラス ----------------------------------------------------------
	ClientCheck
*/

function LinkElement(){

	var C = LinkElement;
	var CC = ClientCheck;
	var D = document;

	//link要素数を返します
	C.getLength = function(){
		return CC.DOM ? D.getElementsByTagName('link').length : null;
	};

	//引数無しだとlink要素全体を配列で返します｡
	//番号を引数するとlink要素配列のその番号の要素を返します｡
	//文字列を引数とするとtitle属性と一致するlink要素を返します｡
	C.getElement = function(){
		if(CC.DOM){
			var a = arguments;
			var j, k, r = new Array();

			switch( a.length ){
				case 0 : default : {
					for(j=0; j < C.getLength(); j++){
						r[j] = D.getElementsByTagName('link')[j];
					}
					return r;
					break;
				}
				case 1 : {
					if(typeof(a[0]) == 'number'){
						return D.getElementsByTagName('link')[a[0]];
					} else if(typeof(a[0]) == 'string'){
						for(k=0; k < C.getLength(); k++){
							if(a[0] == D.getElementsByTagName('link')[k].getAttribute('title')){
								return D.getElementsByTagName('link')[k];
							}
						}
					} else {
						return null;
					}
					break;
				}
			}
		} else {
			return null;
		}
	};

	// 引数が数字か文字列かを自動判別して、文字列だったらtitle属性と一致したlink要素の配列番号を返す｡
	// 数字とかはそのまま返す｡
	C.getElementNumber = function(i){
		var k, r = null;
		if(CC.DOM){
			if(typeof(i) == 'string'){
				for(k=0; k < C.getLength(); k++){
					if(i == C.getElement(k).getAttribute('title')){
						r = k;
						break;
					}
				}
				return r ? r : null;
			} else {
				return i;
			}
		}
	};

	// 上の反対・・・タイトルから配列番号に
	C.getElementTitle = function(i){
		var r;
		if(CC.DOM){
			if(typeof(i) == 'number'){
				r = C.getElement(i).getAttribute('title');
				return r ? r : null;
			} else {
				return i;
			}
		}
	};

	//引数（文字列・配列番号）で指定したlink要素のスタイルシートの種類を取得するメソッド
	//種類は次の番号で返ってきます→「固定スタイルシート=0、代替スタイルシート=1、代替スタイルシート（推奨）=2」
	C.getStyleSheetMode = function(i){
		if(CC.DOM){
			var no, rel, title;

			// 引数を配列番号に変換
			no = C.getElementNumber(i);

			if((typeof(no) == 'number') && C.getElement(no)){
				rel = C.getElement(no).getAttribute('rel');
				title = C.getElement(no).getAttribute('title');
				if(rel.match(/stylesheet/gi) && !title){
					//固定スタイルシート
					return 0;
				} else if((rel.match(/alternate stylesheet/gi)) && title){
					//代替スタイルシート
					return 1;
				} else if((rel.match(/stylesheet/gi)) && title){
					//代替スタイルシート（推奨）
					return 2;
				} else {
					return null;
				}
			} else {
				return null;
			}
		} else {
			return null;
		}
	};

	//例のIE5(win)では代替スタイルシート全部の初期値がfalseであるため、link要素のうちの代替スタイルシートの disabled プロパティを ture に統一させる必要があるための処理
	function disable(){
		for(j=0; j < C.getLength(); j++){
			//代替だけ
			if(C.getStyleSheetMode(j) == 1){
				C.getElement(j).disabled = true;
			}
		}
	} disable();

	//Opera6だとプロパティは存在してるけど動作しない？
	//NN6.2だと推奨スタイルシートの初期値はfalse / 代替スタイルシートの初期値は true
	//IE5だと推奨スタイルシートの初期値はfalse / 代替スタイルシートの初期値は false
	//基本的に宣言が後の奴が上書き＋追加される！！！
	//element => 配列番号（数字）又は title属性値（文字列）
	//mode => 0=false（適用）, 1=true（解除）
	C.setDisabled = function(element, mode){
		var no;
		if(CC.DOM){
			no = C.getElementNumber(element);
			if(C.getElement(no)){
				C.getElement(no).disabled = mode;
			}
		}
	};

	C.getDisabled = function(element){
		var no;
		if(CC.DOM){
			no = C.getElementTitle(element);
			if(C.getElement(no)){
				return C.getElement(no).disabled;
			}
		}
	};

	// 引数（link要素配列番号又はtitle属性名・・・幾つでも可）の代替スタイルシートを適用
	// こいつは指定したスタイルシートだけ適用します
	C.setStyleSheet = function(){
		var c, k, no, a = arguments;
		if(CC.DOM && !CC.OP6){
			//現在適用されている代替スタイルシートを全部外す
			for(k=0; k < C.getLength(); k++){
				if(C.getStyleSheetMode(k) >= 1){
					C.setDisabled(k, true);
				}
			}
			//引数の数だけ実行
			for(c=0; c < a.length; c++ ){
				// 引数を配列番号に変換
				no = C.getElementNumber(a[c]);
				// 適用
				C.setDisabled(no, false);
			}
		}
	};

	// 引数（link要素配列番号又はtitle属性名・・・何個でも可）の代替スタイルシートを適用する｡（指定した物を追加適用）
	// これは追加適用ですが、後に宣言されてるスタイルシートが優先されます！！！
	C.addStyleSheet = function(){
		var c, k, no, a = arguments;
		if(CC.DOM && !CC.OP6){
			//引数の数だけ実行
			for(c=0; c < a.length; c++ ){
				//引数の数だけ実行
				for(c=0; c < a.length; c++ ){
					// 引数を配列番号に変換
					no = C.getElementNumber(a[c]);
					// 適用
					C.setDisabled(no, false);
				}
			}
		}
	};

	// 引数（link要素配列番号又はtitle属性名・・・何個でも可）の代替スタイルシートを解除する｡
	C.delStyleSheet = function(){
		var c, k, no, a = arguments;
		if(CC.DOM && !CC.OP6){
			if(a.length == 0){
				//現在適用されている代替スタイルシートを全部外す
				for(k=0; k < C.getLength(); k++){
					if(C.getStyleSheetMode(k) >= 1){
						C.setDisabled(k, true);
					}
				}
			} else {
				//引数の数だけ実行
				for(c=0; c < a.length; c++ ){
					// 引数を配列番号に変換
					no = C.getElementNumber(a[c]);
					// 適用
					C.setDisabled(no, true);
				}
			}
		}
	};
} new LinkElement();
