var catsNum = '1001'; var paramCatsid = ''; var paramCatsIdArray = []; var paramCatsResult = false; var cookie = catsGetCookie(); var catsDomain = catsGetDomain(); // スクリプト呼び出しドメイン if ( (typeof(cid) === 'undefined' ) ) var cid = ''; if ( (typeof(gid) === 'undefined' ) ) var gid = ''; /** * パラメータを解析してクッキーに保存する */ try { if (location.search.match(/cats_sid=(.*?)(&|$)/)) { paramCatsid = decodeURIComponent(location.search.match(/cats_sid=(.*?)(&|$)/)[1]);// 現在アクセスしているページのURLパラメータを正規表現で取得する。 } // ドット区切りでパラメータを分割する paramCatsIdArray = paramCatsid.split('.'); // 離脱→再流入(URLパラメータを伴っていない) if (paramCatsIdArray == '') { if (cookie.hasItem('CCATS' + cid)) { // P_CCATS = Parameter_ContentId_Cats の略 paramCatsid = cookie.getItem('P_CCATS' + cid) + '.' + cookie.getItem('CCATS' + cid); // ドット区切りでパラメータを分割する paramCatsIdArray = paramCatsid.split('.'); // バリデーションの実施 if (cidValidate(cid, paramCatsIdArray) === false) { catsExit(''); } } else if (cookie.hasItem('GCATS' + gid)) { // P_GCATS = Parameter_GroupId_Cats の略 paramCatsid = cookie.getItem('P_GCATS' + gid) + '.' + cookie.getItem('GCATS' + gid);; // ドット区切りでパラメータを分割する paramCatsIdArray = paramCatsid.split('.'); // バリデーションの実施 if (gidValidate(gid, paramCatsIdArray) === false) { catsExit(''); } } else { catsExit(''); } } // バリデーションの実施 if (paramValidate(paramCatsIdArray) === false) { catsExit(''); } // 有効期限の作成 var nowtime = new Date().getTime(); var clearTime = new Date(nowtime + (60 * 60 * 24 * 1000 * paramCatsIdArray[2])); var expires = clearTime.toGMTString(); // toGMTString インターネットグリニッジ標準時 (GMT) 協定に基づき、与えられた日付を表す文字列。 // CIDのクッキーを残す var origin = catsGetOriginDomain(); // CCATS = ContentId_Cats の略 document.cookie = 'CCATS' + paramCatsIdArray[0] + '=' + paramCatsIdArray[3] + '; expires=' + expires + '; path=/; domain=.' + origin; // P_CCATS = Parameter_ContentId_Cats の略 document.cookie = 'P_CCATS' + paramCatsIdArray[0] + '=' + paramCatsIdArray[0] + '.' + paramCatsIdArray[1] + '.' + paramCatsIdArray[2] + '; expires=' + expires + '; path=/; domain=.' + origin; // GIDがある場合クッキーを残す if (paramCatsIdArray[1] != 0) { // GCATS = GroupId_Cats の略 document.cookie = 'GCATS' + paramCatsIdArray[1] + '=' + paramCatsIdArray[3] + '; expires=' + expires + '; path=/; domain=.' + origin; // P_GCATS = Parameter_GroupId_Cats の略 document.cookie = 'P_GCATS' + paramCatsIdArray[1] + '=' + paramCatsIdArray[0] + '.' + paramCatsIdArray[1] + '.' + paramCatsIdArray[2] + '; expires=' + expires + '; path=/; domain=.' + origin; } paramCatsResult = true; } catch (errorMsg) { // console.log('ITP_Error!: '); // console.log(errorMsg); } try { // 付与するパラメータがない場合は処理しない if (paramCatsResult == false) { catsExit(''); } // パラメータを付与するスクリプトを読み込ませる // defer付きで読み込むのでコールバックで呼ばれる処理は最後になる catsLoadScript(catsDomain + '/fpc/param.js', paramCatsIdArray, function(paramCatsIdArray) { catsAddParameter(paramCatsIdArray); }); } catch (errorMsg) { } /** * スクリプトファイルを動的に読み込み生成する * * @param src 読み込むソースファイルのURL * @param paramCatsIdArray パラメータ配列 * @param callback コールバック関数 * @returns */ function catsLoadScript(src, paramCatsIdArray, callback) { var done = false; var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.src = src; script.defer = true; script.async = false; head.appendChild(script); // Attach handlers for all browsers script.onload = script.onreadystatechange = function() { if ( !done && (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') ) { done = true; callback(paramCatsIdArray); //Handle memory leak in IE script.onload = script.onreadystatechange = null; if ( head && script.parentNode ) { // head.removeChild( script ); } } }; } /** * cats_sidのバリデーション * @param paramCatsId Array パラメータ配列 * @return boolean true エラーなし / false エラーあり */ function paramValidate(paramCatsIdArray) { if (paramCatsIdArray.length != 4) { return false; } // 広告IDの検証 if ( (typeof(paramCatsIdArray[0]) === 'undefined' || paramCatsIdArray[0] === null) || isNaN(paramCatsIdArray[0] ) !== false ) { return false; } else { if(paramCatsIdArray[0] < 0){ return false; } } // 広告グループIDの検証 if ( (typeof(paramCatsIdArray[1]) === 'undefined' || paramCatsIdArray[1] === null) || isNaN(paramCatsIdArray[1]) !== false ) { return false; } else { if(paramCatsIdArray[1] < 0){ return false; } } // クッキー保存期間の検証 if ( (typeof(paramCatsIdArray[2]) === 'undefined' || paramCatsIdArray[2] === null) || isNaN(paramCatsIdArray[2]) !== false || paramCatsIdArray[2] == 0) { return false; } else { if(paramCatsIdArray[2] < 0){ return false; } } // アフィリエイトIDの検証 if ( (typeof(paramCatsIdArray[3]) === 'undefined' || paramCatsIdArray[3] === null) || paramCatsIdArray[3] === "") { return false; } else if (paramCatsIdArray[3].match(/[^A-Za-z0-9]+/)) { // 半角英数字以外の文字が存在する場合、エラー return false; } else if( paramCatsIdArray[3].length != 16){ // 16桁でなければエラー return false; } return true; } /** * cidのバリデーション * @param cid 広告ID * @param paramCatsId Array パラメータ配列 * @return boolean true エラーなし / false エラーあり */ function cidValidate(cid, paramCatsIdArray) { // 広告IDの検証 if ( (typeof(cid) === 'undefined' || cid === null) || isNaN(cid) !== false ) { return false; } else { if(cid < 0){ return false; // マイナス値はエラー } } // URLパラメータの値とタグに指定してある値が異なる if(paramCatsIdArray[0] != cid){ return false; } return true; } /** * gidのバリデーション * @param gid 広告グループID * @param paramCatsId Array パラメータ配列 * @return boolean true エラーなし / false エラーあり */ function gidValidate(gid, paramCatsIdArray) { // 広告グループIDの検証 if ( (typeof(gid) === 'undefined' || gid === null) || isNaN(gid) !== false ) { return false; } else { if(gid < 0){ return false; // マイナス値はエラー } } // URLパラメータの値とタグに指定してある値が異なる if(paramCatsIdArray[1] != gid){ return false; } return true; } /** * クッキー情報を取得しオブジェクトとして返却する * https://developer.mozilla.org/ja/docs/Web/API/Document/cookie * @return オブジェクト クッキー情報 */ function catsGetCookie() { var docCookies = { getItem: function (sKey) { if (!sKey || !this.hasItem(sKey)) { return null; } return unescape(document.cookie.replace(new RegExp("(?:^|.*;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*"), "$1")); }, setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) { if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return; } var sExpires = ""; if (vEnd) { switch (vEnd.constructor) { case Number: sExpires = vEnd === Infinity ? "; expires=Tue, 19 Jan 2038 03:14:07 GMT" : "; max-age=" + vEnd; break; case String: sExpires = "; expires=" + vEnd; break; case Date: sExpires = "; expires=" + vEnd.toGMTString(); break; } } document.cookie = escape(sKey) + "=" + escape(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : ""); }, removeItem: function (sKey, sPath) { if (!sKey || !this.hasItem(sKey)) { return; } document.cookie = escape(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (sPath ? "; path=" + sPath : ""); }, hasItem: function (sKey) { return (new RegExp("(?:^|;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie); }, keys: /* optional method: you can safely remove it! */ function () { var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/); for (var nIdx = 0; nIdx < aKeys.length; nIdx++) { aKeys[nIdx] = unescape(aKeys[nIdx]); } return aKeys; } }; return docCookies; } /** * 現在のスクリプトの呼び出しドメインを取得する * @return string ドメイン(ex http://ad.cats.jp) */ function catsGetDomain() { var currentScript = document.getElementById('cats_script'+catsNum).src; var urlArray = currentScript.match(/^(.*?:\/\/)(.*?)([a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})[\:[0-9]*]?([\/].*?)?$/i); return urlArray[1] + urlArray[2] + urlArray[3]; } /** * サブドメインなしのドメイン名を取得する * @return string サブドメインなしのドメイン名 */ function catsGetOriginDomain() { var origin = ''; var sessionName = 's'; var cookie = catsGetCookie(); // ドメインをピリオドで分割 var domains = location.hostname.split('.').reverse(); var length = domains.length; // トップレベルから順に回してクッキーをセットしていく for (var i= 0; i < length; i++) { // 仮ドメインを生成 var bufOrigin = domains.slice(0, i + 1).reverse().join('.'); // 仮ドメインを用いてクッキーをセット document.cookie = sessionName + '=s; domain=.' + bufOrigin + '; path=/'; // セットしたクッキーの値が取得できたら利用可能かつ一番高いレベルのドメインであるとみなし、オリジンとする if (cookie.hasItem(sessionName)) { origin = bufOrigin; } // 先にセットしたクッキーを削除しておく document.cookie = sessionName + '=; domain=.' + bufOrigin + '; path=/; Max-age=0'; // オリジンがセットできたら終了 if (origin) { break; } } return origin; } /** * 例外処理の実行させる為のexit関数 * @param errorMsg エラーメッセージ */ function catsExit(errorMsg) { throw (errorMsg); }