/*
==============================================================
          読み上げ処理
==============================================================
*/
var vdsPlayBtn = "/hp/images/2009/04/vds_read.gif";
var vdsStopBtn = "/hp/images/2009/04/vds_stop.gif";
var vdsMenteBtn = "/hp/images/2009/04/vds_mainte.gif";
var vdsLoaderImg = "/hp/images/2009/04/vds_wait.gif";
var vdsBackOriginal = "FFFFFF";
var vdsBackHighlight = "c7f9d8";
var vdsplay;
var vdsobj;
var vdsCnt = -1;
var vdsIdList = new Array();   // 音声再生のID
var vdsNowTextId = "";
var vdsNowTextNo = -1;

// 読み上げボタンの設置
function vdsSetButton(vdsId,flg){
  var setTag = "";
  var vdsArea = $(vdsId);
  if(vdsArea == null){
    return false;
  }
  switch (flg){
    case 1:
      // 再生可能なボタンの設置
      setTag = '<table style="border-style:none;">';
      setTag += '<tr><td style="border-style:none;">'
      setTag += '<div id="' + vdsId + 'Btn"><input type="image" ';
      setTag += 'id="' + vdsId + '_playBtn" src="' + vdsPlayBtn + '" ';
      setTag += 'alt="読み上げ" onClick="vdsRead1st(\'' + vdsId + '\');" /></div></td>';
      setTag += '<td style="border-style:none;">';
      setTag += '<a href="http://www.vdsapi.ne.jp" target="_blank">';
      setTag += 'Powered by vds</a></td></tr></table>';
      break;
    case 2:
      // flashplayer セットアップメッセージ
      setTag = '<table style="border-style:none;"><tr>';
      setTag += '<td style="border-style:none;">';
      setTag += '<a href="http://www.adobe.com/shockwave/download/';
      setTag += 'download.cgi?P1_Prod_Version=ShockwaveFlash&Lang=Japanese">';
      setTag += 'お使いのAdobe Flash Playerをバージョンアップしてください。';
      setTag += '詳しくはこちら</a></td></tr></table>';
      break;
    default:
      // 使用不可能なボタンの設置
      setTag = '<table style="border-style:none;"><tr>';
      setTag += '<td style="border-style:none;"><img src="' + vdsMenteBtn;
      setTag += '" alt="メンテナンス中" /></td>';
      setTag += '<td style="border-style:none;">';
      setTag += '<a href="http://www.vdsapi.ne.jp" target="_blank">';
      setTag += 'Powered by vds</a></td></tr></table>';
      break;
    case 4:
      // 停止ボタンの設置
      setTag = '<table style="border-style:none;">';
      setTag += '<tr><td style="border-style:none;">'
      setTag += '<div id="' + vdsId + 'Btn"><input type="image" ';
      setTag += 'id="' + vdsId + '_stopBtn" src="' + vdsStopBtn + '" ';
      setTag += 'alt="停止" onClick="vdsStop(\'' + vdsId + '\');"/></div></td>';
      setTag += '<td style="border-style:none;">';
      setTag += '<a href="http://www.vdsapi.ne.jp" target="_blank">';
      setTag += 'Powered by vds</a></td></tr></table>';
      break;
  }
  vdsArea.innerHTML = setTag;
  return true;
}

/*
   読み上げ処理
       読み上げ中の文章があれば停止する。
       読み上げボタンを「作成中」に変更し、音声合成を行う。
*/
function vdsRead1st(vdsId){
  var ttlbtn,txt,vdsret;
  var nowCast = getVoiceSelectedName();
  var nowRate = 0;
  if(nowCast == ""){
    alert("読み上げ音声を選んでください。");
    return;
  }
  if(typeof(vdsplay) != "undefined"){
    vdsStop(vdsId);     // 音声作成または再生中の場合のための停止処理
    $(vdsId + "Btn").innerHTML = '<input type="image" id="' + vdsId + '_loaderBtn" src="' + vdsLoaderImg +'" alt="作成中" onClick="return false;" />';
    vdsNowTextId = vdsId;
    ttl = $(vdsId + "_title");
    if(ttl){
      vdsNowTextNo = 0;
      txt = ttl.innerHTML;
    }else{
      vdsNowTextNo = 1;
      txt = $(vdsId + "_text_1").innerHTML;
    }
    txt = txt.replace(/&nbsp;/g," ");
    vdsret = vdsobj.setCast(nowCast);
    if(vdsret == 0){
      nowRate = getVoiceSelectedRate(nowCast);
      vdsret = vdsobj.setRate(nowRate);
    }
    if(vdsret == 0){
      vdsret = vdsobj.setString(txt);
    }
    if(vdsret == 0){
      vdsobj.setFinishCallback("vdsServerCallbak(\"" + vdsId + "\")");
      vdsobj.speak();
    }else{
      vdsSetButton(vdsId,0);
    }
  }
}

/*
   音声合成作成後の処理
       正常終了：読み上げボタンが「作成中」のときには「停止」に変更し、
                 読み上げ箇所のハイライトを行う
       エラー  ：読み上げボタンを「メンテナンス中」に変更し、ハイライト
                 部分があれば元に戻す
*/
function vdsServerCallbak(vdsId){
  var ret = vdsobj.getServerError();
  if(ret == 0){
    if(vdsNowTextId != "" && $(vdsId + "_loaderBtn")){
      if(vdsNowTextNo == 1){
        colorFade(vdsNowTextId + "_text_" + vdsNowTextNo,'background',vdsBackOriginal,vdsBackHighlight,25,10);
      }
      vdsSetButton(vdsId,4);  // 再生中は停止ボタンに変更
    }
  }else{
    vdsSetButton(vdsId,0);
    if(vdsNowTextNo > 0){
      colorFade(vdsNowTextId + "_text_" + vdsNowTextNo,'background',vdsBackHighlight,vdsBackOriginal,25,10);
    }
    vdsNowTextId = "";
    vdsNowTextNo = -1;
  }
}

/*
   読み上げ音声の再生終了時の処理
     次の文章がある場合：ハイライト部分を次の文章に移し、その文章の音声
                         合成を行う。
     次の文章がない場合：読み上げボタンを「読み上げ」に変更し、ハイライト
                         部分を元に戻す。
*/
function vdsSpeakFinishCallback(){
  var ret;
  if(vdsNowTextId == ""){return;}
  if(vdsNowTextNo > 0){
    colorFade(vdsNowTextId + "_text_" + vdsNowTextNo,'background',vdsBackHighlight,vdsBackOriginal,25,10);
  }
  vdsNowTextNo++;
  var obj = $(vdsNowTextId + "_text_" + vdsNowTextNo);
  if(obj){
    colorFade(vdsNowTextId + "_text_" + vdsNowTextNo,'background',vdsBackOriginal,vdsBackHighlight,25,10);
    var txt = obj.innerHTML;
    ret = vdsobj.setString(txt);
    if(ret == 0){
      vdsobj.setFinishCallback("vdsServerCallbak(\"" + vdsNowTextId + "\")");
      vdsobj.speak();
    }
  }else{
    vdsSetButton(vdsNowTextId,1);
    vdsNowTextId = "";
    vdsNowTextNo = -1;
  }
}

/*
   読み上げ停止処理
       読み上げボタンを「読み上げ」に変更し、ハイライト部分を元に戻す。
*/
function vdsStop(vdsId){
  if(typeof(vdsplay) == "undefined" ){ return;}
  if(vdsNowTextId != ""){
    if($(vdsNowTextId + "_loaderBtn") || $(vdsNowTextId + "_stopBtn")){
      vdsSetButton(vdsNowTextId,1);
    }
    if(vdsNowTextNo > 0){
      colorFade(vdsNowTextId + "_text_" + vdsNowTextNo,'background',vdsBackHighlight,vdsBackOriginal,25,10);
    }
    vdsNowTextId = "";
    vdsNowTextNo = -1;
  }
  vdsplay.speakStop();
}

// 読み上げ音声の種類を取得する
function getVoiceSelectedName(){
  var voiceName = "";
  var vdsVList = document.getElementsByName("vdsVoice");
  for(var ii=0;ii < vdsVList.length;ii++){
    if(vdsVList[ii].checked){
      voiceName = vdsVList[ii].value;
      break;
    }
  }
  return voiceName;
}

// 読み上げる速さを取得する
function getVoiceSelectedRate(nowCast){
  var nowRate = 0;
  var val = $('vdsRate_slider_Thumb').getAttribute('aria-valuenow');
  val = parseInt(val);
  if(nowCast == ""){
    nowCast = getVoiceSelectedName();
  }
  switch (val) {
    case 0:  // 遅い
      nowRate = -5
      break;
    case 1:  // やや遅い
      nowRate = -2
      break;
    case 2:  // 普通
      nowRate = 0
      break;
    case 3:  // やや速い
      nowRate = 2
      break;
    case 4:  // 速い
      nowRate = 5
      break;
  }
  if(nowCast != "MisakiJPf"){
    nowRate = nowRate + 2;
  }
  return nowRate;
}

// ＩＥ用読み上げボタンの初期セット処理
//   各読み上げボタンのセットとハイライトのための読み上げ文章の分割処理
function initBtn4IE(setFlg,err){
  var ret;
  var ii;
  var vdsBtnList = document.getElementsByTagName("div");
  cnt = vdsBtnList.length - 1;
  // ボタンの設置とvdsobjの生成
  for(ii=0;ii<=cnt;ii++){
    ret = false;
    if(vdsBtnList[ii].name == "vdsReadBtn"){
      vdsID = vdsBtnList[ii].id;
      if(vdsID != ""){
        if(setFlg == 3){
          if(vdsID == "vdsNewsList"){
            ret = vdsSetButton(vdsID,1);
          }else{
            if(vdsTextAddSpanTag(vdsID)){
              ret = vdsSetButton(vdsID,1);
            }
          }
        }else{
          if(err == "-701"){
            ret = vdsSetButton(vdsID,2);
          }else{
            ret = vdsSetButton(vdsID,0);
          }
        }
        if(ret == true){
          vdsCnt++;
          vdsIdList[vdsCnt] = vdsID;
        }
      }
    }
  }
}

// ＩＥ以外用読み上げボタンの初期セット処理
//   各読み上げボタンのセットとハイライトのための読み上げ文章の分割処理
function initBtn4FF(setFlg,err){
  var ret;
  var ii;
  var vdsBtnList = document.getElementsByName("vdsReadBtn");
  cnt = vdsBtnList.length - 1;
  // ボタンの設置とvdsobjの生成
  for(ii=0;ii<=cnt;ii++){
    ret = false;
    vdsID = vdsBtnList[ii].id;
    if(vdsID != ""){
      if(setFlg == 3){
        if(vdsID == "vdsNewsList"){
          ret = vdsSetButton(vdsID,1);
        }else{
          if(vdsTextAddSpanTag(vdsID)){
            ret = vdsSetButton(vdsID,1);
          }
        }
      }else{
        if(err == "-701"){
          ret = vdsSetButton(vdsID,2);
        }else{
          ret = vdsSetButton(vdsID,0);
        }
      }
      if(ret == true){
        vdsCnt++;
        vdsIdList[vdsCnt] = vdsID;
      }
    }
  }
}

// ハイライト用に読み上げ文章をspanタグで囲む
function vdsTextAddSpanTag(vdsID){
  var ii;
  var pos;
  var strCheck;
  var txtObj = $(vdsID + "_text");
  if(txtObj == null){return false;}  // 対応するテキストがない
  var str = txtObj.innerHTML;
  if(vdsID.toLowerCase().indexOf("vdstopnews") < 0 ){
    var strAddTag = "";

    var strRet = "";
    var idx = 0;
    var skipTag = "";
    var tagList = str.match(/<.*?>/g,"");
    for(ii=0;ii<tagList.length;ii++){
      if(skipTag == ""){
        skipTag = skipTagName(tagList[ii]);
        if(skipTag != ""){continue;}
      }else{
        if(tagList[ii].toLowerCase().indexOf(skipTag) >= 0){
          skipTag = "";
        }
        continue;
      }
      if(tagList[ii].indexOf("</") > 0){
        strAddTag += "</span>";
      }
      pos = str.indexOf(tagList[ii]);
      if(pos > 0){
        strCheck = str.substring(0,pos);
        if(checkText(strCheck)){
          // 読み上げるテキストがある
          kugiriPos = strCheck.indexOf("。");
          while (kugiriPos >= 0){
            kugiriPos ++;
            idx ++;
            strAddTag += "<span id=\"" + vdsID + "_text_" + idx + "\">" + strCheck.substring(0,kugiriPos);
            strCheck = strCheck.substring(kugiriPos);
            kugiriAf = strCheck.substring(0,1);
            if(kugiriAf == "\n" || kugiriAf == "」" || kugiriAf == "）" || kugiriAf == "＞"){
              strAddTag += kugiriAf;
              strCheck = strCheck.substring(1);
            }
            strAddTag += "</span>";
            kugiriPos = strCheck.indexOf("。");
          }
          if(checkText(strCheck)){
            idx ++;
            strAddTag += "<span id=\"" + vdsID + "_text_" + idx + "\">" + strCheck + "</span>";
          }
        }else{
          strAddTag += strCheck;
        }
        str = str.substring(pos);
      }
      strAddTag += tagList[ii];
      str = str.substring(tagList[ii].length);
    }
    if(checkText(str)){
      // 読み上げるテキストがある
      idx ++;
      strAddTag += "<span id=\"" + vdsID + "_text_" + idx + "\">" + str + "</span>";
    }
    txtObj.innerHTML = strAddTag;
  }else{
//    txtObj.innerHTML = "<span id=\"" + vdsID + "_text_1\">" + str + "</span>";
  }
  return true;
}

// spanタグで囲む文章に読み上げるテキストがあるかをチェック
function checkText(strChk){
  if(strChk == ""){
    return false;
  }
  strChk = strChk.replace(/<.*?>/g,"");
  strChk = strChk.replace(/&nbsp;/g,"");
  strChk = strChk.replace(/\s/g,"");
  if(strChk == ""){
    return false;
  }else{
    return true;
  }
}

// 読み上げる文章の区切りにならないタグかどうかを確認し、その終了タグを返す
function skipTagName(tag){
  tag = tag.toLowerCase();
  if(tag == "<b>" || tag.substring(1,3) == "b "){
    return "</b>";
  }
  if(tag == "<a>" || tag.substring(1,3) == "a "){
    return "</a>";
  }
  if(tag == "<strong>" || tag.substring(1,8) == "strong "){
    return "</strong>";
  }
  if(tag == "<em>" || tag.substring(1,4) == "em "){
    return "</em>";
  }
  if(tag == "<font>" || tag.substring(1,6) == "font "){
    return "</font>";
  }
  if(tag == "<ruby>" || tag.substring(1,6) == "ruby "){
    return "</ruby>";
  }
  if(tag == "<span>" || tag.substring(1,6) == "span "){
    return "</span>";
  }
  return "";
}

/*
==============================================================
          スライダー関連の処理
==============================================================
*/
var gDragging = '';
var gDragOffset = 0;
function $(id) {
  return document.getElementById(id);
}

//get the ratio between the slider length and the slider's value maximum
function calibrate(target) {
  var rail = target.parentNode;
  var sliderLength = rail.clientWidth - target.clientWidth ;
  var max = parseInt(target.getAttribute('aria-valuemax'));
  return sliderLength / max;
}

//get the left offset of the rail, needed for conversion of mouse coordinates
function getHOffset(elem) {
  var node = elem;
  var offset = node.offsetLeft;
  while(node.offsetParent) {
    node = node.offsetParent;
    if (node.nodeName.toLowerCase() != 'html') {
      offset += node.offsetLeft;
    }
  }
  return offset;
}

function getHScrollOffset() {
  var scrollOffset;
  if (window.pageLeft !== undefined) {
    scrollOffset = window.pageLeft;
  }else if (document.documentElement && document.documentElement.scrollLeft !== undefined){
    scrollOffset = document.documentElement.scrollLeft;
  }else if (document.body.scrollLeft !== undefined) {
    scrollOffset = document.body.scrollLeft;
  }
  return scrollOffset;
}

function handleKeyDown(event) {
  var event = event || window.event;
  var keyCode = event.keyCode || event.charCode;
  var target = event.target || event.srcElement; 
  switch (keyCode) {
    case 37: // left arrow
      decrement(target, false);
      break;
    case 39: //right arrow
      increment(target, false);
      break;
    case 33: // page up
      increment(target, true);
      break;
    case 34: // page down
      decrement(target, true);
      break;
    case 36: // home
      changeValue(target, 0);
      break;
    case 35: // end
      changeValue(target, 4);
      break;
    case 27: // escape
      target.blur();
      break;
    default:
      passThrough = true;
      break;
  }
}

function handleRailMouseDown(event) {
  event = event || window.event;
  var target = event.target || event.srcElement;
  var thumb = $(target.id.replace(/Rail/, 'Thumb'));
  var newPos = event.clientX - getHOffset(target)+ getHScrollOffset() - (thumb.clientWidth / 2);
  changeValue(thumb, mapPositionToValue(thumb, newPos));
  if (!document.activeElement || !document.activeElement !== thumb) {
    thumb.focus();
  }
  return false;
}

function handleThumbMouseDown(event) {
  event = event || window.event;
  var target = event.target || event.srcElement;
  gDragging = target.id;
  gDragOffset = event.clientX - getHOffset(target.parentNode) - target.offsetLeft + getHScrollOffset();
  document.onmousemove = handleDrag;
  document.onmouseup = stopDrag;
  if (!document.activeElement || document.activeElement !== target) {
    target.focus();
  }
  cancelEvent(event);
  return false;
}

function handleDrag(event) {
  event = event || window.event;
  if (gDragging === '') {
    return;
  }else {
    var target = $(gDragging);
    var newPos = event.clientX - getHOffset(target.parentNode) + getHScrollOffset() - gDragOffset;
    changeValue(target, mapPositionToValue(target, newPos));
  }
}

this.stopDrag = function (event) {
  gDragging = '';
  gDragOffset = 0;
  document.onmousemove = null;
  document.onmouseup = null;
}

function mapPositionToValue(target, pos) {
  return Math.round(pos / calibrate(target));
}

function increment(target, byChunk) {
  var newValue = parseInt(target.getAttribute('aria-valuenow')) + (byChunk ? 1 : 1); 
  changeValue(target, newValue);
}

function decrement(target, byChunk) {
  var newValue = parseInt(target.getAttribute('aria-valuenow')) - (byChunk ? 1 : 1); 
  changeValue(target, newValue);
}

function changeValue(target, value) {
  var ratio = calibrate(target);
  var min = parseInt(target.getAttribute('aria-valuemin'));
  var max = parseInt(target.getAttribute('aria-valuemax'));
  var newValue = Math.min(Math.max(value, min), max);
  var newPos = Math.round(newValue * ratio) ;
  target.style.left = newPos + 'px';
  var valueTxt = "";
  switch (newValue) {
   case 0:
     valueTxt = "遅い";
     break;
   case 1:
     valueTxt = "やや遅い";
     break;
   case 2:
     valueTxt = "普通";
     break;
   case 3:
     valueTxt = "やや速い";
     break;
   case 4:
     valueTxt = "速い";
     break;
  }
  target.setAttribute('aria-valuenow', newValue);
  target.setAttribute('aria-valuetext', valueTxt);
}

function setHandlers(slider,valnow) {
  slider.setAttribute('aria-labelledby','slider_slider_Rail');
  slider.setAttribute('aria-valuemin','0');
  slider.setAttribute('aria-valuemax','4');
  slider.setAttribute('aria-valuenow',valnow);
  slider.setAttribute('aria-valuetext','');
  slider.setAttribute('role','slider');
  slider.parentNode.onmousedown = handleRailMouseDown;
  slider.onmousedown = handleThumbMouseDown;
  slider.onkeydown = handleKeyDown;
  slider.parentNode.onfocus = function (event) { //temp IE fix
    event = event || window.event;
    var target = event.target || event.srcElement;
    var thumb = $(target.id.replace(/Rail/, 'Thumb'));
    if (thumb)
      thumb.focus();
  }
  changeValue(slider, valnow);
}

function cancelEvent(event) {
  if (typeof event.stopPropagation == 'function') {
    event.stopPropagation();
  }else if (typeof event.cancelBubble != 'undefined') {
    event.cancelBubble = true;
  }
  if (event.preventDefault) {
    event.preventDefault();
  }
  return false;
}

/*
==============================================================
          ページを開いたときと閉じたときの処理
==============================================================
*/
// ページを表示するときの処理
window.onload=function(){
  var flg = 0;
  var errcd;
  var idx;
  var ii;
  try{
    flg = 1;
    vdsplay = new VoiceDeliveryPlayer("vdsp");
    flg = 2;
    vdsobj = new VoiceDelivery(vdsplay,"vdsobj");
    flg = 3;
//    vdsobj.setCache(0);   // テスト用に常に音声合成
  }catch (errcd) {
    // エラー処理があれば入れる
    //alert("vdsObjectError=" + errcd);
  }
  if(navigator.appName == "Microsoft Internet Explorer"){
    initBtn4IE(flg,errcd);
  }else{
    initBtn4FF(flg,errcd);
  }
  // Cookie から前回の読み上げ音声を取得
  var defVoice = "";
  var defRate = "";
  var arrDat = document.cookie.split(";");
  for(ii=0; ii < arrDat.length; ii++) {
    idx = arrDat[ii].indexOf("=");
    // 2番目は頭がスペースのとき
    if(arrDat[ii].substring(0, idx) == "vdsCastName" || arrDat[ii].substring(0, idx) == " vdsCastName"){
      defVoice = arrDat[ii].substring(idx + 1);
      if(defVoice != "" && defRate != ""){break;}
    }
    if(arrDat[ii].substring(0, idx) == "vdsRateNum" || arrDat[ii].substring(0, idx) == " vdsRateNum"){
      defRate = arrDat[ii].substring(idx + 1);
      if(defVoice != "" && defRate != ""){break;}
    }
  }
  delete arrDat;
  if(defVoice == ""){defVoice = "KeikoJPf";}
  if(defRate == ""){defRate = "2";}
  arrDat = document.getElementsByName("vdsVoice");
  for(ii=0;ii < arrDat.length;ii++){
    if(arrDat[ii].value == defVoice){
      arrDat[ii].checked = true;
    }
    if(flg < 3){
      arrDat[ii].disabled = true;
    }else{
      arrDat[ii].disabled = false;
    }
  }
  // 読み上げ速さを設定するスライダーの処理
  setHandlers($('vdsRate_slider_Thumb'),defRate);
}

// ページを閉じる前にCookieへ音声の種類と速さを保存
window.onbeforeunload=function(){
  var cname = getVoiceSelectedName();
  var rnum = $('vdsRate_slider_Thumb').getAttribute('aria-valuenow');
  document.cookie = "vdsCastName=" + cname + ";expires=Tue, 31-Dec-2030 23:59:59;";
  document.cookie = "vdsRateNum=" + rnum + ";expires=Tue, 31-Dec-2030 23:59:59;";
}
