// ルートディレクトリ
var dirAppRoot = '/';

// クッキー生存時間(時間)
var cookie_life_time = 168;

// データ名称
var dat_name = "mylist";

// 配列デリミタ
var array_delimiter = "<>";

// データデリミタ
var data_delimiter = "|";

// マイリスト最大登録可能数
var maxreg = 9;

var manager = new CookieManager();

//---------------------------------------------------------------------------------------------------------------------
// cookieにhttp_refererを記録
function set_referer ( ref ) {

    manager.setCookie ( "http_referer" ,ref );

}

//---------------------------------------------------------------------------------------------------------------------
// http_refererをcookieより取得
function get_referer () {

    return manager.getCookie ( "http_referer" );

}


//---------------------------------------------------------------------------------------------------------------------
// レイヤー表示
function show_layer (msg, x, y)
{
    if (isIE6()) {
        switchSelectDisplay(false);
    }

    // レイヤー表示
    document.getElementById ( "layer_window" ).style.visibility = "visible";

    // レイヤー表示位置を指定
    document.getElementById ( "layer_window" ).style.left = x + 50;
    document.getElementById ( "layer_window" ).style.top  = y - 25;

    // レイヤー表示位置を指定
    /*if (document.all) {
        // IE
        document.getElementById ( "layer_window" ).style.left = x + 50;
        document.getElementById ( "layer_window" ).style.top  = y + 50;
    } else {
        document.getElementById ( "layer_window" ).style.left = x + 20;
        document.getElementById ( "layer_window" ).style.top  = y;
    }*/

    /*// レイヤー表示位置を指定
    if ( window.innerWidth ) {    // Mozilla, Opera, NN4
        document.getElementById ( "layer_window" ).style.left = window.innerWidth / 2 - 250; 
    } else if ( document.documentElement && document.documentElement.clientWidth ) { // IE
        document.getElementById ( "layer_window" ).style.left = document.documentElement.clientWidth / 2 - 250;
    } else if ( document.body && document.body.clientWidth ) {
        document.getElementById ( "layer_window" ).style.left = document.body.clientWidth / 2 - 250;
    }

    if ( window.scrollY ) {    // Mozilla
        document.getElementById ( "layer_window" ).style.top = window.scrollY + 50;
    } else if ( window.pageYOffset ) {    // Opera, NN4
        document.getElementById ( "layer_window" ).style.top = window.pageYOffset + 50;
    } else if ( document.documentElement && document.documentElement.scrollTop ) {    // IE
        document.getElementById ( "layer_window" ).style.top = document.documentElement.scrollTop + 50;
    } else if ( document.body && document.body.scrollTop ) {
        document.getElementById ( "layer_window" ).style.top = document.body.scrollTop + 50;
    }*/

    // メッセージを表示
    result ( msg );

}


//---------------------------------------------------------------------------------------------------------------------
// レイヤー非表示
function hide_layer ( )
{
    if (isIE6()) {
        switchSelectDisplay(true);
    }

    document.getElementById ( "layer_window" ).style.visibility = "hidden";
}

//=====================================================================================================================
//---------------------------------------------------------------------------------------------------------------------
// クッキーのセット
function set_cookie (keydat, dat1, dat2, dat3, x, y)
{

    // 既に登録されているクッキーを読み込む
    buf = manager.getCookie ( dat_name );

    // 配列デリミタで区切って配列に格納
    chk = true;
    count = 0;
    if ( buf ) {

        cookie_data = buf.split ( array_delimiter );

        count = cookie_data.length;

        // クッキーに登録されているか確認
        for ( i = 0;i < count;i++ ) {

            // デリミタで区切る
            dat = cookie_data[i].split ( data_delimiter );

            if ( dat[0] == encodeURIComponent ( keydat ) ) {
                chk = false;
                break;
            }

        }

    }

    if ( count > maxreg - 1 ) {

        msg = "登録件数が一杯です。";

    } else {

        if ( chk ) {
            max_byte = (document.all) ? 54 : 64;
            storage_byte = max_byte - 3 - getByteLength(dat2);
            dat1 = chunkString(dat1, storage_byte, '…');

            manager.setCookie ( dat_name ,
                        encodeURIComponent ( keydat ) + 
                        data_delimiter + encodeURIComponent ( dat1 ) + 
                        data_delimiter + encodeURIComponent ( dat2 ) + 
                        data_delimiter + encodeURIComponent ( dat3 ) + 
                        ( buf ? array_delimiter + buf : "" ) );

            msg = "マイリストが追加されました（" + ( count + 1 ) + " / " + maxreg + "）。";

        } else {

            msg = "既にリストに登録されています。";

        }

    }

    // レイヤーの表示
    show_layer (msg, x, y);

}


//---------------------------------------------------------------------------------------------------------------------
// レイヤー内容の作成
function result ( msg )
{

    html = "";

    html = "<p class='title_bar'><img src='" + dirAppRoot + "img/mylist/close.gif' width='46' height='17' alt='閉じる' align='right' onclick='hide_layer();' style='cursor: pointer;'> マイリスト</p>";

    html += "<p class='listp' align='right'>";

    if ( msg ) html += "<span class='message'>" + msg + "　　　　　　　　　</span>";

    html += "<span class='control_string' onclick='truncate_cookie();'>全件削除</span>";

    html += "</p>";


    // データ取得
    buf = manager.getCookie ( dat_name );

    // データ表示
    if ( buf ) {    // データが登録されている場合

        // データデリミタによりデータを分割
        array_dat = buf.split ( array_delimiter );

        for ( i = 0;i < array_dat.length;i++ ) {

            dat = array_dat[i].split ( data_delimiter );

            // データを表示
            html += "<div>";
            html += " <img src='" + dirAppRoot + "img/mylist/trush.gif' width='11' height='13' alt='" + decodeURIComponent ( dat[1] ) + "を削除'  align='absmiddle' onclick='delete_cookie(\"" + decodeURIComponent ( dat[0] ) + "\");' style='cursor: pointer;'> ";
            html += decodeURIComponent ( dat[2] ) + " / ";
            //html += decodeURIComponent ( dat[2] ) + "";

            // 個別データ削除
            if ( dat[3] ) {
                html += "<a href='" + dirAppRoot + "vc.php?" + decodeURIComponent ( dat[3] ) + "' target='_BLANK'>" + decodeURIComponent ( dat[1] ) + "</a>";
            } else {
                html += decodeURIComponent ( dat[1] );
            }

            html += "</div>";

        }

    } else {    // データが登録されていない場合

        html += "登録データはありません。";

    }

    html += "<hr size='1'>";

    html += "<span>　<img src='" + dirAppRoot + "img/mylist/myp.gif'alt='' align='absmiddle'> <a href='" + dirAppRoot + "mylist.php'>マイリストページを開く</a></span>";

    // データを表示する
    document.getElementById ( "layer_window" ).innerHTML = html;

}


//---------------------------------------------------------------------------------------------------------------------
// 登録データの全件削除
function truncate_cookie ()
{

    manager.clearCookie ( dat_name );    // クッキーをクリア

    msg = "全登録データを削除しました。";

    result ( msg );    // データ表示

}

//---------------------------------------------------------------------------------------------------------------------
// 登録データの全件削除（レイヤ表示無し）
function truncate_cookie2 ()
{

    manager.clearCookie ( dat_name );    // クッキーをクリア

    msg = "全登録データを削除しました。";

}


//---------------------------------------------------------------------------------------------------------------------
// 登録データの指定削除
function delete_cookie ( keydat )
{

    var cookie_value = manager.getCookie ( dat_name );

    if ( cookie_value.length ) {    // データが登録されている場合

        // クッキーよりデータを取得し、配列に分割
        cookie_array = cookie_value.split ( array_delimiter );

        buf = "";
        for ( i = 0;i < cookie_array.length;i++ ) {

            dat = cookie_array[i].split ( data_delimiter );    // データデリミタによりデータを分割

            // 対象データを確認
            if ( dat[0].indexOf ( keydat ,0 ) == -1 ) {
                buf += ( ( buf ) ? array_delimiter : "" ) + 
                    dat[0] + 
                    data_delimiter + dat[1] + 
                    data_delimiter + dat[2] + 
                    data_delimiter + dat[3];
            }

        }

        manager.setCookie ( dat_name ,buf );

    }

    msg = "選択された登録データを削除しました。";

    // データ表示
    result ( msg );

}

//---------------------------------------------------------------------------------------------------------------------
// 登録データの指定削除（レイヤ表示無し）
function delete_cookie2 ( keydat )
{

    var cookie_value = manager.getCookie ( dat_name );

    if ( cookie_value.length ) {    // データが登録されている場合

        // クッキーよりデータを取得し、配列に分割
        cookie_array = cookie_value.split ( array_delimiter );

        buf = "";
        for ( i = 0;i < cookie_array.length;i++ ) {

            dat = cookie_array[i].split ( data_delimiter );    // データデリミタによりデータを分割

            // 対象データを確認
            if ( dat[0].indexOf ( keydat ,0 ) == -1 ) {
                buf += ( ( buf ) ? array_delimiter : "" ) + 
                    dat[0] + 
                    data_delimiter + dat[1] + 
                    data_delimiter + dat[2] + 
                    data_delimiter + dat[3];
            }

        }

        manager.setCookie ( dat_name ,buf );

    }

    msg = "選択された登録データを削除しました。";

}

//---------------------------------------------------------------------------------------------------------------------
// ドラッグ

  function dragLay(layName,x,y,html){
    this.id      = layName   // ドラッグできるようにするレイヤー名
    this.x       = x         // 初期left位置
    this.y       = y         // 初期top位置
    if(document.layers)      //n4用
      this.div='<layer name="'+layName+'" left="'+x+'" top="'+y+'">\n'
              +'<a     href="javascript:void(0)" \n'
              +'       onmousedown="clickElement=\''+layName
                                    +'\';mdown(event);return false">\n'
              + html + '</a></layer>\n'
    else                     //n4以外用
      this.div='<div  id="'+layName+'" class="dragLays"\n'
              +'      onmousedown="clickElement=\''+layName
                                    +'\';mdown(event);return false"\n'
              +'      style="position:absolute;left:'+x+'px;top:'+y+'px">\n'
              + html + '</div>\n'
    document.write(this.div)
    return 
  }
  dragLay.prototype.moveLAYOJ = moveLAYOJ //メソッドを追加する
  //--レイヤー移動
  function moveLAYOJ(oj,x,y){
    if(document.getElementById){  //e5,e6,n6,m1,o6用
      oj.left = x
      oj.top  = y
    } else if(document.all){      //e4用
      oj.pixelLeft = x
      oj.pixelTop  = y
    } else if(document.layers)    //n4用
      oj.moveTo(x,y)
  }

  //--layNameで指定したオブジェクトを返す(必ずonload後に実行すること)
  function getLayOj(layName){  
    if(document.getElementById) 
      return document.getElementById(layName)           //e5,e6,n6,m1,o6用
    else if(document.all)   return document.all(layName)    //e4用
    else if(document.layers)return document.layers[layName] //n4用
  }

  //--奥行きZ座標set 
  function zindexLAYOJ(oj,zindex){
    if(document.getElementById) oj.zIndex=zindex  //n6,m1,e5,e6,o6用
    else if(document.all)       oj.zIndex=zindex  //e4用
    else if(document.layers)    oj.zIndex=zindex  //n4用
  }

  //--イベントキャプチャー開始
  document.onmousemove = mmove
  document.onmouseup = mup
  if(navigator.userAgent.indexOf('Gecko')!=-1)   //m1,n6用
    document.onmousedown = mdown
  if(document.layers){                           //n4用
    document.captureEvents(Event.MOUSEMOVE)
    document.captureEvents(Event.MOUSEUP)
  }

  //--マウスX座標get 
  function getMouseX(e){
    if(window.opera)                            //o6用
        return e.clientX
    else if(document.all)                       //e4,e5,e6用
        return document.body.scrollLeft+event.clientX
    else if(document.layers||document.getElementById)
        return e.pageX                          //n4,n6,m1用
  }

  //--マウスY座標get 
  function getMouseY(e){
    if(window.opera)                            //o6用
        return e.clientY
    else if(document.all)                       //e4,e5,e6用
        return document.body.scrollTop+event.clientY
    else if(document.layers||document.getElementById)
        return e.pageY                          //n4,n6,m1用
  }

  //--レイヤ－左辺X座標get 
  function getLEFT(layName){
    if(document.all)                            //e4,e5,e6,o6用
      return document.all(layName).style.pixelLeft
    else if(document.getElementById)            //n6,m1用
      return (document.getElementById(layName).style.left!="")
              ?parseInt(document.getElementById(layName).style.left):""
    else if(document.layers)                    //n4用
      return document.layers[layName].left 
  }

  //--レイヤ－上辺Y座標get 
  function getTOP(layName){
    if(document.all)                          //e4,e5,e6,o6用
      return document.all(layName).style.pixelTop
    else if(document.getElementById)          //n6,m1用
      return (document.getElementById(layName).style.top!="")
              ?parseInt(document.getElementById(layName).style.top):""
    else if(document.layers)                  //n4用
      return document.layers[layName].top 
  }

  //--マウスカーソルを動かした時レイヤーもmoveLAYOJで動かす
  function mmove(e) {
    if(!window.clickElement) return
    if (getLayOj(clickElement)) {
       movetoX = getMouseX(e) - offsetX
       movetoY = getMouseY(e) - offsetY

       var oj=(!!document.layers)?getLayOj(clickElement)
                                 :getLayOj(clickElement).style
      dragLay[clickElement].moveLAYOJ(oj,movetoX,movetoY)
      return false
    }
  }

  //--マウスボタンを押し下げた時
  //  レイヤー内のカーソルoffset位置取得
  function mdown(e) {
    if(navigator.userAgent.indexOf('Gecko')!=-1)   //n6,m1用
      if(e.currentTarget.className != 'dragLays') return
      else clickElement = e.currentTarget.id
    var selLay = getLayOj(clickElement)
    if (selLay){
        offsetX = getMouseX(e) - getLEFT(selLay.id)
        offsetY = getMouseY(e) - getTOP(selLay.id)
    }
    return false
  }

  //--マウスボタンを上げた時ドラッグ解除
  var zcount = 0
  function mup(e) {
    if(!window.clickElement) return
    if (getLayOj(clickElement)) {
      zindexLAYOJ((!!document.layers)?getLayOj(clickElement)
                     :getLayOj(clickElement).style,zcount++)
      clickElement=null
    }
  }

/**
 * チェック対象文字列のバイト数を取得します。
 *
 * @param str argValue チェック対象文字列
 * @return int 文字列のバイト数
 */
function getByteLength(argValue)
{
    var HALF_SIZE_KANA ="ｧｱｨｲｩｳｪｴｫｵｶｷｸｹｺｻｼｽｾｿﾀﾁｯﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓｬﾔｭﾕｮﾖﾗﾘﾙﾚﾛﾜｦﾝｰﾟﾞ､｡･";
    var i = 0;
    var count = 0;
    for (i = 0; i < argValue.length; i++) {
        if (0 <= HALF_SIZE_KANA.indexOf(argValue.charAt(i))) {
            //半角カタカナの場合は1バイトとして計算します
            count++;
        } else if (encodeURIComponent(argValue.charAt(i)).length >= 4) {
            count+=2;
        } else {
            count++;
        }
    }
    return count;
}

/**
 * 対象文字列を指定バイト数までに切り詰め、接尾文字を付加して返却する
 *
 * @param str string 対象文字列
 * @param int byte 残したいバイト数(suffixも含む)
 * @param str suffix 接尾文字(… がおすすめ)
 * @return str 切り詰められた文字列(接尾文字付き)
 */
function chunkString(string, byte, suffix)
{
    if (getByteLength(string) <= byte) return string;

    suffix_byte = getByteLength(suffix)

    border = (byte / 2) - suffix_byte;

    ret     = string.slice(0, border);
    residue = string.slice(border, string.length);

    for (var i = border; i < string.length; i++) {
        ret += string.charAt(i);
        if (getByteLength(ret) + suffix_byte >= byte) {
            break;
        }
    }

    return ret + suffix;
}

/**
 * クリックした座標を返却
 *
 * @param obj event イベントオブジェクト
 * @return array [x座標, y座標]
 */
function getClickPos(event)
{
    if (document.all) {
        // IE
        x = event.x + document.body.scrollLeft;
        y = event.y + document.body.scrollTop;
    } else {
        x = event.layerX;
        y = event.layerY;
    }
    return [x, y]
}

/**
 * IE6 or Older の判定
 */
function isIE6()
{
    if (typeof document.documentElement.style.msInterpolationMode == "undefined" && document.all) {
        return true;
    } else {
        return false;
    }
}

/**
 * select 要素の 表示/非表示 を切り替える
 * @param bool $bool 表示：true 非表示：false
 */
function switchSelectDisplay($bool)
{
    $value = ( ! $bool) ? 'none' : '';
    var elems = document.getElementsByTagName('select');
    for (i = 0; i < elems.length; i++) {
        elems[i].style.display = $value;
    }
}