/* --------------------------------------------------------
 *
 * フォントサイズ変更
 * 
 * --------------------------------------------------------
 * 基本仕様
 * --------------------------------------------------------
 * ・原則、代替スタイルシートを使用する
 * ・ボタン類はjsで表示
 * ・各<link>のtitle属性の値が該当するボタンのファイル名
 * ・選択されてるスタイルシートのボタンはvisibility: hiddenで隠す
 *
 * --------------------------------------------------------
 * 注意事項
 * --------------------------------------------------------
 * ・iframeのhtmlに必ず何らかのスタイルシートをリンクする事
 * ・CSSにてボタンの背景を設定する事
 *
 * ------------------------------------------------------ */
if (document.getElementsByTagName) {

  // 設定

  var cname			= 'CkFont';									// cookieの名前
  var cpath			= '/' + document.URL.split('/')[3] + '/';	// cookieを設定するサイトのパス（ルート直下のディレクトリ）
  var cdays			= 10;										// cookieの有効日数

  var btnPath		= '/univ_hp/img/lib_image/';									// ボタン画像のパス
  var btnId			= 'fontSizeController';						// ボタンを出力するタグのID
  var btnListPreId	= 'fcsLi';									// 各ボタンの親タグ（li）に割り当てるIDの接頭辞（後ろにs / m / lを付与）
  var btnImgPreId	= 'fcsImg';									// 各ボタンに割り当てるIDの接頭辞（後ろにs / m / lを付与）
  var fileType		= '.gif'									// ボタン画像の拡張子
  var styleList		= new Array('s', 'm', 'l');					// スタイルシートのtitleの末尾の文字一覧（表示順をコントロール）
  var defaultStyle	= 'm'	;									// デフォルトスタイルのtitleの末尾の文字

  // グローバル変数の設定
  var iframeList	= new Array();								// iframeのid一覧を格納
  var di			= document.implementation;
  var sss			= getStyleSheets();
  var isOpera		= window.opera && navigator.userAgent.match(new RegExp('Opera[/ ]7'));
  var isMacIE		= !isOpera && navigator.userAgent.match(new RegExp('MSIE 5.+Mac'));

  if (!isOpera) addEvent(window, 'unload', setCookie);			// ページ遷移時にもcookieを保存(MozillaのUIでスタイルを切り替えた場合のため)

  addEvent((isOpera ? document : window), 'load', initialize);	// onLoad処理
}

// --------------------------------------------------------
// 初期化

function initialize() {
  iframeList = document.getElementsByTagName('iframe');
  setStyle();			// スタイル適用
  appendSelectBtn();	// 選択ボタンを追加
  defaultBtnSet();		// ボタンの初期化
}

// --------------------------------------------------------
// Cookieに保存されたスタイルを設定（初期化時）

function setStyle() {
  var stitle = getCookie();	// cookieからスタイル名を取得
  if (!stitle) stitle = defaultTitle();
  applyStyle(stitle);		// スタイルの変更
}

// --------------------------------------------------------
// 選択ボタンを追加

function appendSelectBtn() {
  var stitles = getStyleNames()					// スタイル名のリストを取得
  ndiv = makeBtnArea(stitles);					// 選択フォームを生成
  var nbody = document.getElementById(btnId);	//選択フォームを本文に追加
  nbody.insertBefore(ndiv, nbody.firstChild);
  setBtnEvent(ndiv);
}

// --------------------------------------------------------
// ボタン回りのHTML生成

function makeBtnArea(stitles) {
  var btnArea = createHTMLElement('ul');
  if (isMacIE) {
    var linkList;
    for (var i = 0; i < stitles.length; i++) {
      linkList += '<li id="' + btnListPreId + styleList[i] + '"><img src="' + btnPath + stitles[i] + fileType + '" id="' + btnImgPreId + styleList[i] + '" style="cursor:pointer"></li>';
    }
    btnArea.innerHTML = linkList;
  } else {
    for (var i = 0; i < stitles.length; i++) {
      var linkList = createHTMLElement('li');
      btnArea.appendChild(linkList);
      linkList.id = btnListPreId + styleList[i];
      var tempImg = linkList.appendChild(createHTMLElement('img'));
      tempImg.src = btnPath + stitles[i] + fileType;
      tempImg.id = btnImgPreId + styleList[i];
    }
  }
  return btnArea;
}

// --------------------------------------------------------
// イベントの付与

function setBtnEvent(btnArea) {
  myImages = btnArea.getElementsByTagName('img');
  for (var i = 0; i < myImages.length; i++) {
    addEvent(myImages[i], 'click', checkId);	// idをチェックして、紐付くスタイルシートをスタイル適用関数に渡す
  }
}

// --------------------------------------------------------
// イベントが発生した画像のidを取得し、スタイル適用関数に渡す

function checkId(event) {
  var element = event.target || event.srcElement;
  var str = element.id.substr(element.id.length - 1, 1);
  var stitles = getStyleNames();
  for (var i = 0; i < stitles.length; i++) {
    if (stitles[i].lastIndexOf(str) == stitles[i].length - 1) {	// 末尾にサイズを現す文字があるか
      applyStyle(stitles[i]);
      break;
    }
  }
  changeBtn(element);
}

// --------------------------------------------------------
// ボタン画像の切り替え

function changeBtn(element) {
  var myImages = element.parentNode.parentNode.getElementsByTagName('img');
  for (var i = 0; i < myImages.length; i++) {
    if (myImages[i] == element) {
      myImages[i].style.visibility = 'hidden';
    } else {
      myImages[i].style.visibility = 'visible';
    }
  }
}

// --------------------------------------------------------
// ボタン画像の初期化

function defaultBtnSet() {
  var styleName = getStyleTitle();
  if (styleName) {
    for (var i = 0; i < styleList.length; i++) {
      if (styleName.lastIndexOf(styleList[i]) == styleName.length - 1) {
        changeBtn(document.getElementById(btnImgPreId + styleList[i]));
      }
    }
  }
}

// --------------------------------------------------------
// スタイルの適用関数呼び出し

function applyStyle(stitle) {
  setNow(stitle, sss);								//まず、親ページのスタイルを適用
  if (iframeList.length > 0) {
    for (var i = 0; i < iframeList.length; i++) {	// 次にiframeのスタイルを適用
      var docStyle = getStyleSheets(iframeList[i]);
      if (docStyle) setNow(stitle, docStyle);
    }
  }
  setCookie();
}

// --------------------------------------------------------
// スタイルの適用

function setNow(stitle, docStyle) {
  for (var i = 0; i < docStyle.length; i++) {
    docStyle[i].disabled = (docStyle[i].title == stitle || !docStyle[i].title || isStyleElement(docStyle[i])) ? false : true;
  }
}

// --------------------------------------------------------
// スタイル名をcookieへ保存

function setCookie() {
  var stitle = getStyleTitle();										// 現在適用されているスタイルの名前を取得
  var c =  cname + '=' + escape(stitle) + ';' + 'path=' + cpath;
  if (cdays) {														// 有効日数が設定されていれば追加
    var cexp = new Date();
    cexp.setTime(cexp.getTime() + 1000*60*60*24*cdays);
    c += ';expires=' + cexp.toGMTString();
  }
  document.cookie = c;
}

// --------------------------------------------------------
// cookieからスタイル名を取得

function getCookie() {
  var c = document.cookie + ';';
  var cindex = c.indexOf(cname + '=');
  if (cindex == -1) return false;
  var clen = c.indexOf(';', cindex + cname.length + 1);
  return unescape(c.substring(cindex + cname.length + 1, clen));
}

// --------------------------------------------------------
// addEventListenerラッパー

function addEvent(obj, eventType, func) {
  if (di && di.hasFeature('HTMLEvents', '2.0')) {
    obj.addEventListener(eventType, func, false);	// for DOM2
  } else if (obj.attachEvent) {
    obj.attachEvent('on' + eventType, func);		// for winie5-6
  } else {
    obj['on' + eventType] = func;					// for macie
  }
}

// --------------------------------------------------------
// StyleSheetオブジェクトがstyle要素かどうかを判定

function isStyleElement(ss) {
  return (ss.href ? false : true);					// WinIE5-6はStyleSheets.ownerNodeが使えないのでhref属性の有無で判定
}


// --------------------------------------------------------
// HTML要素を作成する

function createHTMLElement(tagname) {
  if ( (di && di.hasFeature('Core', '2.0')) || isOpera) {
    return document.createElementNS('http://www.w3.org/1999/xhtml', tagname);	// for dom2 or opera
  } else {
    return document.createElement(tagname);										// for ie5-6
  }
}

// --------------------------------------------------------
// 現在適用されているスタイルの名前を取得

function getStyleTitle() {
  for (var i = 0; i < sss.length; i++) {
    if (isStyleElement(sss[i])) continue;
    if (sss[i].title && !sss[i].disabled) return sss[i].title;
  }
  return false;
}

// --------------------------------------------------------
// スタイルシートの名前一覧を取得（ソート込）

function getStyleNames() {
  var stitles = new Array();
  for (var i = 0; i < sss.length; i++) {
    if (!sss[i].title || isStyleElement(sss[i])) continue;
    var isSameTitle = false;													// 以下既に同じスタイル名がある場合の排除処理
    for (var j = 0; j < i; j++) {
      if (sss[j].title == sss[i].title) {
        isSameTitle = true;
        break;
      }
    }
    if (!isSameTitle) {
      stitles[stitles.length] = sss[i].title;
    }
  }

  var sortTitles = new Array();
  for (var i = 0; i < styleList.length; i++) {									// 並び替え処理
    for (var j = 0; j < stitles.length; j++) {
      if (stitles[j].lastIndexOf(styleList[i]) == stitles[j].length - 1) {		// 末尾にサイズを示す文字列があるか
        sortTitles.push(stitles[j]);
        break;
      }
    }
  }
  return sortTitles;
}

// --------------------------------------------------------
// スタイルシートリストを取得

function getStyleSheets(docId) {

  var d = !docId ? document : document.getElementById(docId.id).contentWindow.document;	// iframeになるとパスの起点が違うので
  if (d.styleSheets && d.styleSheets[0] && (d.styleSheets[0].title != null)) {
    return d.styleSheets;
  }
  var slinks = new Array();
  var links = d.getElementsByTagName('link');
  for (var i = 0; i < links.length; i++) {
    if (links[i].rel && (links[i].rel.toLowerCase().indexOf('stylesheet') != -1) && links[i].title) {
      slinks[slinks.length] = links[i];
    }
  }
  return slinks;
}

// --------------------------------------------------------
// デフォルトスタイルのタイトルを取得

function defaultTitle() {
  var stitles = getStyleNames();
  for (var i = 0; i < stitles.length; i++) {
    if (stitles[i].lastIndexOf(defaultStyle) == stitles[i].length - 1) {	// 末尾にサイズを現す文字があるか
      return stitles[i];
    }
  }
}

