﻿(  function(){ 

/*******************************************************************************
 *【referre分析処理】
 *
 *　各画面を開く際、ヘッターで読み込まれreferre分析処理を実行する
 *
 * 　・20090122 y.ichimura  新規作成
 *
 *******************************************************************************/


/**変数設定*********************************************************************/
var fgProcess = 0;                   // このリファラー処理を行うかを決めるフラグ(0=検索ｻｲﾄ未使用(処理無),1=検索ｻｲﾄ使用(処理有))
var ckPrcessName = "fgPrcess";       // Cookieに保存されているフラグ名(fgProcess内容)
var rf = document.referrer;          // リファラー内容
var fgYahoo = 0;                     // Yahoo利用フラグ
var fgGoogle = 0;                    // Google利用フラグ
var fgEtcSearch = 0;                 // 検索サイト以外からの参照（お気に入り、直接参照）フラグ

var ckName1 = "searchName";          //クッキー名1（検索サイト名）
var ckName2 = "searchKeyword";       //クッキー名2（検索キーワード）
var searchName = "";                 //設定値（検索サイト名）
var searchKeyword = "";              //設定値（検索キーワード）

var period = 1;                      //有効期限日数

var nowUrl = document.URL            // 現在のURL
var cmpUrl = "shopping/complete.php";// 購入完了画面のURL
/*******************************************************************************/

/**[Cookie利用チェック(START)]***********************************************/
// Cookieが利用できる場合
if(checkCookie()){
/**[Cookie利用チェック(END)]*************************************************/

  /*******************************************************/
  /* クッキーを確認(START)                               */
  /* テスト用コード（本番はコメントアウトすること！）    */
  /*******************************************************
  // CookiからfgProcess情報取得
  if (document.cookie) {
    var cookies = document.cookie.split("; ");
      for (var i = 0; i < cookies.length; i++) {
        var str = cookies[i].split("=");
          if (str[0] == ckName1 ) {
            var cookie_value = decodeURI(str[1]);
              document.write(cookie_value);
            }
          if (str[0] == ckName2 ) {
            var cookie_value = decodeURI(str[1]);
              document.write(" &nbsp;&nbsp; " + cookie_value  );
            }
        }
  }
   ********************************************************/
  /* クッキーを確認(END)                                  */
  /********************************************************/

  /**CookiからfgProcess情報取得START****************************************/
  // (フラグの説明：0=後続処理を行わない,1=後続処理を行う)
  if (document.cookie) {
    var cookies = document.cookie.split("; ");
      for (var i = 0; i < cookies.length; i++) {
        var str = cookies[i].split("=");
          if (str[0] == ckPrcessName ) {
            var cookie_value = unescape(str[1]);
              if (cookie_value)
                fgProcess = cookie_value; //fgProcess情報取得
              break;
           }
       }
  }
  /**CookiからfgProcess情報取得END*******************************************/


  /**[検索サイトから遷移してきた場合(START)]*********************************/
    // 各検索サイトがリファラーに含まれているか検索
    var searchYahoo = rf.indexOf("http://search.yahoo."); 
    var searchGoogle = rf.indexOf("http://www.google."); 
    
    // Yahooを利用している場合
    if(searchYahoo == 0){ fgYahoo = 0; }else{ fgYahoo = 1;}
    // Googleを利用している場合
    if(searchGoogle == 0){ fgGoogle = 0; }else{ fgGoogle = 1; }

  //遷移前の画面が購入完了画面だった時
  if( fgYahoo == 0 || fgGoogle == 0){
    // リファラー分析処理を行うようフラグを設定
    fgProcess = 0;
  }
  /**[検索サイトから遷移してきた場合(END)]***********************************/


  /**[検索サイト未使用時の処理情報登録(START)]*******************************/
  if(fgProcess == 0){ 

    // 検索サイトを利用していない場合
    if(fgYahoo == 1 && fgGoogle == 1){ 
      fgProcess = 1; // 後続処理を実行しないように設定

      // クッキーの発行（書き込み）
      document.cookie = ckName1 + "=" + encodeURI('(Direct)') + "; path=/;"; // 検索サイト名
      document.cookie = ckName2 + "=" + encodeURI(null) + "; path=/;";       // 検索キーワード
    }
  }
  /**[検索サイト未使用時の処理情報登録(END)]**********************************/


  /**[検索サイト使用時の処理情報登録(START)]**********************************/
  if(fgProcess == 0){ 

    // デコード処理
    var orgstr = decodeURI(rf); 

      if(fgYahoo == 0){ // Yahooの場合の分析を行う

        start = orgstr.indexOf("?p=");                        // 検索キーワードの先頭位置を取得
        if(start == -1){                                      // 検索条件の先頭位置が取得できなかった場合
          start = orgstr.indexOf("&p=");                      // 検索キーワードの先頭位置を再取得
        }
        startStr= orgstr.substring(start + 3);                // 検索キーワード開始位置から文字列を取得（先頭の不必要な情報削除）
        end = startStr.indexOf("&");                          // 検索キーワードの最後尾の位置を取得
        if(end != -1){     　　　　　　　　　　　　　　　　   // 検索追加条件がない場合（この場合、検索キーワードの最後尾は取得できない）
           searchKeyword = startStr.substring(0 , end);       // 検索キーワードのみの文字列を取得
        }else{
           searchKeyword = startStr.substring(0);             // 検索キーワードのみの文字列を取得(取得範囲無し)
        }

        searchKeyword  = searchKeyword .replace(/\+/g , " "); // 半角スペースは+に変換されるため、元に戻す
        searchKeyword  = searchKeyword .replace(/　/g , " "); // 全角半角は半角スペースにする。
  
        searchName = 'Yahoo! JAPAN'; // 検索サイト名
        
      }else if(fgGoogle == 0){ // Googleの場合の分析を行う

        start = orgstr.indexOf("&q=");                        // 検索キーワードの先頭位置を取得
        if(start == -1){                                      // 検索条件の先頭位置が取得できなかった場合
          start = orgstr.indexOf("?q=");                      // 検索キーワードの先頭位置を再取得
        }
        startStr= orgstr.substring(start + 3);                // 検索キーワード開始位置から文字列を取得（先頭の不必要な情報削除）
        end = startStr.indexOf("&");                          // 検索キーワードの最後尾の位置を取得
        if(end != -1){     　　　　　　　　　　　　　　　　   // 検索追加条件がない場合（この場合、検索キーワードの最後尾は取得できない）
           searchKeyword = startStr.substring(0 , end);       // 検索キーワードのみの文字列を取得(取得範囲設定)
        }else{
           searchKeyword = startStr.substring(0);             // 検索キーワードのみの文字列を取得(取得範囲無し)
        }
        
        searchKeyword  = searchKeyword .replace(/\+/g , " "); // 半角スペースは+に変換されるため、元に戻す
        searchKeyword  = searchKeyword .replace(/　/g , " "); // 全角半角は半角スペースにする。
        
        searchName = 'Google'; // 検索サイト名

      } 

      // ASCIIコード記号をデコード
      searchKeyword = changeAscii(searchKeyword);

      // 文字をカンマ区切りにする
      searchKeyword  = searchKeyword .replace(/ /g , ",");  

      // クッキーの発行（書き込み）
      document.cookie = ckName1 + "=" + encodeURI(searchName) + "; path=/;";    // 検索サイト名（Cookieに設定）
      document.cookie = ckName2 + "=" + encodeURI(searchKeyword) +"; path=/;";  // 検索キーワード（Cookieに設定:XSS対策）
      
      //*************************************************************************************************************/ 
      // XSS対策について
      // 特殊記号を変更して登録する対策を作成したが、後のCSV出力を考えると記号をASCIIコードにしないほうよい。
      // また、現状では画面に出力されることのない値しか扱っていないためスクリプト実行される可能性は無い。
      // もし、画面出力値で使用する場合は、出力画面側でXSS対策表示を行う
      //*************************************************************************************************************/ 
      //var changeXssStr = changeXss(searchKeyword);                              // 検索キーワード（XSS対策変換）
      //document.cookie = ckName2 + "=" + encodeURI(changeXssStr) +"; path=/;";   // 検索キーワード（Cookieに設定）
      //*************************************************************************************************************/ 

      // このリファラー処理を画面を閉じるまで行わないようフラグを設定（再度検索サイトからの来店は処理を行う）
      document.cookie = ckPrcessName + "= 1; path=/;"; 

  }else{ // 検索サイト利用時、後続処理を行う(END)

      // このリファラー処理を画面を閉じるまで行わないようフラグを設定（再度検索サイトからの来店は処理を行う）
      document.cookie = ckPrcessName + "= 1; path=/;"; 

  }

  /**[検索サイト使用時の処理情報登録(END)]**********************************************/

/**[Cookie利用チェック(END)]**********************************************/
}  // if(checkCookieResult == true)
/**[Cookie利用チェック(END)]**********************************************/
  

  /************************************************************/
  // ASCII記号をデコードする
  // @prm    str searchKeyword (検索キーワード)
  // @return str               (検索キーワード:コード変換後)
  /************************************************************/
  function changeAscii(searchKeyword){
      searchKeyword  = searchKeyword .replace(/%21/g , "!");
      searchKeyword  = searchKeyword .replace(/%23/g , "#");
      searchKeyword  = searchKeyword .replace(/%24/g , "$");
      searchKeyword  = searchKeyword .replace(/%25/g , "%");
      searchKeyword  = searchKeyword .replace(/%26/g , "&");
      searchKeyword  = searchKeyword .replace(/%27/g , "'");
      searchKeyword  = searchKeyword .replace(/%28/g , "(");
      searchKeyword  = searchKeyword .replace(/%29/g , ")");
      searchKeyword  = searchKeyword .replace(/%2A/g , "*");
      searchKeyword  = searchKeyword .replace(/%2B/g , "+");
      searchKeyword  = searchKeyword .replace(/%2b/g , "+");
      searchKeyword  = searchKeyword .replace(/%2C/g , ",");
      searchKeyword  = searchKeyword .replace(/%2F/g , "/");
      searchKeyword  = searchKeyword .replace(/%3C/g , "<");

// 半角だと、表示する際に出力落ちするケースがあるため、全角変換
//      searchKeyword  = searchKeyword .replace(/%3A/g , ":");
//      searchKeyword  = searchKeyword .replace(/%3B/g , ";");
//      searchKeyword  = searchKeyword .replace(/%3D/g , "=");
//      searchKeyword  = searchKeyword .replace(/%3d/g , "=");
      searchKeyword  = searchKeyword .replace(/%3A/g , "：");
      searchKeyword  = searchKeyword .replace(/%3B/g , "；");
      searchKeyword  = searchKeyword .replace(/%3D/g , "＝");
      searchKeyword  = searchKeyword .replace(/%3d/g , "＝");

      searchKeyword  = searchKeyword .replace(/%3E/g , ">");
      searchKeyword  = searchKeyword .replace(/%3F/g , "?");
      searchKeyword  = searchKeyword .replace(/%3f/g , "?");
      searchKeyword  = searchKeyword .replace(/%40/g , "@");
      searchKeyword  = searchKeyword .replace(/%5B/g , "[");
      searchKeyword  = searchKeyword .replace(/5C /g , " ");
      searchKeyword  = searchKeyword .replace(/%5D/g , "]");
      searchKeyword  = searchKeyword .replace(/%5E/g , "^");
      searchKeyword  = searchKeyword .replace(/%60/g , "`");
      searchKeyword  = searchKeyword .replace(/%7B/g , "{");
      searchKeyword  = searchKeyword .replace(/%7C/g , "|");
      searchKeyword  = searchKeyword .replace(/%7D/g , "}");
      searchKeyword  = searchKeyword .replace(/%7E/g , "~");
    return searchKeyword;
  }
  /************************************************************/

  /************************************************************/
  // XSS対策（特殊記号を変換）
  // @prm    str searchKeyword (検索キーワード)
  // @return str               (検索キーワード:コード変換後)
  /************************************************************/
  function changeXss(searchKeyword){
      searchKeyword  = searchKeyword .replace(/&/g , "&amp");
      searchKeyword  = searchKeyword .replace(/</g , "&lt");
      searchKeyword  = searchKeyword .replace(/>/g , "&gt");
      searchKeyword  = searchKeyword .replace(/"/g , "&quot");
      searchKeyword  = searchKeyword .replace(/'/g , "&#39");
    return searchKeyword;
  }
  /************************************************************/

  /************************************************************/
  // Cookieが利用できるか確認する
  // @return boolean      (Cookie利用)
  /************************************************************/
  function checkCookie()
  {
　  //クッキー作成
    document.cookie = " cookieTest = 'test'; path=/;"; 
    
　  //クッキー取得
　  var strTemp = document.cookie;
　  if (!strTemp)
　  {
　  　return false;
　  }
　  else
　  {
　  　return true;
　  }
  }
  /************************************************************/

}  )(); //無名関数で実行