/* ---------------
BNR ver. js.10.0069
--------------- */
//スクリプトバージョン
var version = 10.0069
//メニュー開閉
$(function() {
$('header #nav .btn img').on('click', function() {
console.log('a');
$('header nav').animate({
right: '0'
}, 500, 'swing');
});
$('header nav .close').on('click', function() {
$('header nav').animate({
right: '-100%'
}, 500, 'swing');
});
});
//ダウンロード試行ファイル
var downFiles = Array(
Array(
'SAKURA',
'https://www.musen-lan.com/speed/data/dat/down.php'
),
Array(
'WebArena',
'https://suites.musen-lan.com/speed/data/dat/down.php'
)
);
//アップテストサイズ倍数
var upSizes = 1024 * 50;
//アップロードデータ(1KB)
var upBase = 'FFD8FFE00010JFIF0001010100H00H0000FFDB00C0006040506050406060506070706080A100A0A09090A140E0F0C1017141818171416161A1D251F1A1B231C1616202C20232627292A29191F2D02D28025282928FFDB00C010707070A080A130A0A13281A161A2828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828FFC000110802C002BF03012200021101031101FFC4001C0000020203010100000000000000000000040503060102070008FFC400R100002010303020404030604030405080B0102030004110512211A061322Q14aq810729123BRA1B1C115bD1F03E1F11624r82C92A2B2D20817254St93A3C2D326Tcds83D8494FFC4001B01000301010101010000000000000000000001020304050607FFC40029110002020202020300030100020300000000010211032112104A1322Q2aqB238114RC1FFDA000C03010002110311003F00FA9C6MmBB4E41CmE4T8B2929B8AF401BC8E10dD422E87J82YLCC001D2A6vN8B9A0099E53BC1CE2BV91D97D2DBA872D2370B81SC62xEAzD00488C49008C1A8ng21B007J21E3ELB360D0A6DDA4fDAF050006C6v9810AAWF9D11EJB38724923B0ED45Cp6013D7BD4C224CE7BD000ABnCCE09008F9D4DEW963A0A20F23D279A16XE4DDBBDA8001B804B6140CFBRF7D3E592Q23923DC0A790AEA2D20FA';
var upData = '';
for (var i = 0; i < upSizes; i++) {
upData = upData + upBase;
}
//アップロード試行ファイル
var upFiles = Array(
Array(
'SAKURA',
'https://www.musen-lan.com/speed/data/dat/up.php'
),
Array(
'WebArena',
'https://suites.musen-lan.com/speed/data/dat/up.php'
)
);
//下り計測設定
//タイムアウト秒数(ミリ秒)
var Dtimeout = 1000 * 6;
//ゲージの横の「現時点の速度」の表示更新間隔(ミリ秒)
var Dswap = 300;
//平均速度の母数の時間(ミリ秒)
var Dchop = 1500;
//モード
// 0 : 最終数値
// 1 : 最速値
// 2 : 2番目に早い数値
// 3以降:2に準じる(x番目に早い数値)
// * 過大値を指定すると最も遅い数値となる
var Dmode = 1;
//上り計測設定
//タイムアウト秒数(ミリ秒)
var Utimeout = 1000 * 6;
//ゲージの横の現時点の速度の表示間隔(ミリ秒)
var Uswap = 300;
//平均速度の母数の時間(ミリ秒)
var Uchop = 1500;
//モード
// 0 : 最終数値
// 1 : 最速値
// 2 : 2番目に早い数値
// 3以降:2に準じる(x番目に早い数値)
// * 過大値を指定すると最も遅い数値となる
var Umode = 1;
/*
ボタンクリックで起動
*/
$(function() {
$('#down-start').on('click', function(){
$('#down').find('[name=result]').removeClass('start');
$('#down').find('[name=result]').html('準備中');
$('#down').find('button').html('測定中');
$('#down').find('button').addClass('progress');
$('#down').find('button').attr('disabled', true);
$('#up').find('button').attr('disabled', true);
getLineInfo('down');
});
$('#up-start').on('click', function(){
$('#up').find('[name=result]').removeClass('start');
$('#up').find('[name=result]').html('準備中');
$('#up').find('button').html('測定中');
$('#up').find('button').addClass('progress');
$('#down').find('button').attr('disabled', true);
$('#up').find('button').attr('disabled', true);
getLineInfo('up');
});
});
/*
秒間サイズ計測
@param {number} size バイト数
@param {number} sec 経過秒数
@return 秒間バイト数
*/
function calcbytes (size, sec) {
var bytes = size / sec * 1000;
return bytes;
}
/*
指定秒間の平均速度算出
@param {array} ary progressごとの経過秒数とサイズの配列
@param {number} chop 母数となる秒数の指定
@param {array} result 結果配列
@return 与えられた結果配列に今回の結果を加えた配列
*/
function sumChop (ary, chop, result) {
var l = ary.length - 1;
var tmpT = 0;
var tmpB = 0;
while (l >= 0) {
tmpT = tmpT + ary[l][0];
tmpB = tmpB + ary[l][1];
if (tmpT >= chop) {
break;
}
l--;
}
var byte = calcbytes(tmpB, tmpT);
var calc = calcbps(byte);
result.push(byte);
return calc;
}
/*
下り計測開始
*/
function downStart(lineinfo) {
//計測中
var now = new Date();
var dayOfWeek = now.getDay() ; // 曜日(数値)
var dayOfWeekStr = [ "日", "月", "火", "水", "木", "金", "土" ][dayOfWeek] ; // 曜日(日本語表記)
datetime = now.getFullYear() + "年" + zeroPad((now.getMonth() + 1)) + "月" + zeroPad(now.getDate()) + "日(" + dayOfWeekStr +") " + zeroPad(now.getHours()) + "時" + zeroPad(now.getMinutes()) + "分" + zeroPad(now.getSeconds()) + "秒";
var output = '------ BNRスピードテスト (ダウンロード速度) ------
';
output += '測定サイト: https://www.musen-lan.com/speed/ Ver' + version + '
';
output += '測定日時: ' + String(datetime) + '
';
if(lineinfo != ""){output += '回線/ISP/地域: ' + lineinfo + '
';}
output += '--------------------------------------------------
';
$('#down').find('[name=result]').html(output);
downResult = Array();
downTest(0);
}
/*
上り計測開始
*/
function upStart(lineinfo) {
//計測中
var now = new Date();
var dayOfWeek = now.getDay() ; // 曜日(数値)
var dayOfWeekStr = [ "日", "月", "火", "水", "木", "金", "土" ][dayOfWeek] ; // 曜日(日本語表記)
datetime = now.getFullYear() + "年" + zeroPad((now.getMonth() + 1)) + "月" + zeroPad(now.getDate()) + "日(" + dayOfWeekStr +") " + zeroPad(now.getHours()) + "時" + zeroPad(now.getMinutes()) + "分" + zeroPad(now.getSeconds()) + "秒";
var output = '------ BNRスピードテスト (アップロード速度) ------
';
output += '測定サイト: https://www.musen-lan.com/speed/ Ver' + version + '
';
output += '測定日時: ' + String(datetime) + '
';
if(lineinfo != ""){output += '回線/ISP/地域: ' + lineinfo + '
';}
output += '--------------------------------------------------
';
$('#up').find('[name=result]').html(output);
upResult = Array();
upTest(0);
}
/*
ダウンロードテスト
@param {number} num テストサーバ番号
@return なし
*/
function downTest (num) {
var output = downFiles[num][0]+':0%';
$('#down').find('[name=result]').append(output);
chkStart = chopStart = startTime = new Date();
loaded = 0;
var file = downFiles[num][1] + '?t=' + startTime.getTime();
var tmpAry = Array();
var svResult = Array();
var xhr = new XMLHttpRequest();
xhr.addEventListener('loadend', function(e){
if (Dmode == 0) {
var result = svResult[svResult.length - 1];
} else {
//降順ソート
svResult.sort(function (a, b){
if( a > b ) return -1;
if( a < b ) return 1;
return 0;
});
if (svResult.length < Dmode) {
var result = svResult[svResult.length - 1];
} else {
var result = svResult[Dmode - 1];
}
}
var calc = calcbps(result);
var output = String(calc['bps']) + ' (' + String(calc['bytes']) + ')
';
$('#down').find('[name=sv' + num + ']').html(output);
downResult.push(result);
clearInterval(interval);
if (downFiles[num + 1]) {
downTest(num + 1);
} else {
fin('down', downResult);
logging('down', downResult);
}
});
xhr.addEventListener('progress', function(e){
endTime = new Date();
var sec = endTime.getTime() - startTime.getTime();
var elp = endTime.getTime() - chkStart.getTime();
var wait = endTime.getTime() - chopStart.getTime();
var chunk = e.loaded - loaded;
loaded = e.loaded;
tmpAry.push(Array(sec, chunk));
if (wait > Dswap) {
var calc = sumChop(tmpAry, Dchop, svResult);
$('#down').find('[name=sv' + num + '] .bps').html(calc['bps']);
chopStart = new Date();
}
startTime = new Date();
//開始からの経過秒数で中断
if (elp > Dtimeout) {
xhr.abort();
}
});
xhr.open('GET', file);
xhr.send(null);
var standby = true;
interval = setInterval(function() {
if (svResult.length > 0) {
if (standby) {
chkStart = new Date();
standby = false;
}
thistime = new Date();
var elp = thistime.getTime() - chkStart.getTime();
var progress = Math.round(elp / Dtimeout * 100);
if (progress > 100) {
progress = 100;
}
$('#down').find('[name=sv' + num + '] progress').attr('value', progress);
$('#down').find('[name=sv' + num + '] progress').html(progress + '%');
$('#down').find('[name=sv' + num + '] .progress').html(progress + '%');
}
}, 50);
}
/*
アップロードテスト
@param {number} num テストファイル番号
@return なし
*/
function upTest (num) {
var output = upFiles[num][0]+':0%';
$('#up').find('[name=result]').append(output);
chkStart = chopStart = startTime = new Date();
loaded = 0;
var file = upFiles[num][1];
var tmpAry = Array();
var svResult = Array();
var formData = new FormData();
formData.append('d', upData);
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('loadend', function(e){
if (Umode == 0) {
var result = svResult[svResult.length - 1];
} else {
//降順ソート
svResult.sort(function (a, b){
if( a > b ) return -1;
if( a < b ) return 1;
return 0;
});
if (svResult.length < Umode) {
var result = svResult[svResult.length - 1];
} else {
var result = svResult[Umode - 1];
}
}
var calc = calcbps(result);
var output = String(calc['bps']) + ' (' + String(calc['bytes']) + ')
';
$('#up').find('[name=sv' + num + ']').html(output);
upResult.push(result);
clearInterval(interval);
if (upFiles[num + 1]) {
upTest(num + 1);
} else {
fin('up', upResult);
logging('up', upResult);
}
});
xhr.upload.addEventListener('progress', function(e){
endTime = new Date();
var sec = endTime.getTime() - startTime.getTime();
var elp = endTime.getTime() - chkStart.getTime();
var wait = endTime.getTime() - chopStart.getTime();
var chunk = e.loaded - loaded;
loaded = e.loaded;
tmpAry.push(Array(sec, chunk));
if (wait > Uswap) {
var calc = sumChop(tmpAry, Uchop, svResult);
$('#up').find('[name=sv' + num + '] .bps').html(calc['bps']);
chopStart = new Date();
}
startTime = new Date();
//開始からの経過秒数で中断
if (elp > Utimeout) {
xhr.abort();
}
});
xhr.open('POST', file);
xhr.send(formData);
var standby = true;
interval = setInterval(function() {
if (svResult.length > 0) {
if (standby) {
chkStart = new Date();
standby = false;
}
thistime = new Date();
var elp = thistime.getTime() - chkStart.getTime();
var progress = Math.round(elp / Utimeout * 100);
if (progress > 100) {
progress = 100;
}
$('#up').find('[name=sv' + num + '] progress').attr('value', progress);
$('#up').find('[name=sv' + num + '] progress').html(progress + '%');
$('#up').find('[name=sv' + num + '] .progress').html(progress + '%');
}
}, 50);
}
/*
データ収集完了して画面に反映
@param {element} elm 出力先エレメント
@param {array} ary 結果配列
@return なし
*/
function fin (key, ary) {
var elm = $('#'+key)
var fastest = Math.max.apply(null, ary);
var calc = calcbps(fastest);
var output = 'データ転送速度: ' + String(calc['bps']) + ' (' + String(calc['bytes']) + ')';
elm.find('[name=result]').append(output);
if (key == 'down') {
var tw_t = 'BNRスピードテスト(インターネット通信速度)' + "\n" + '測定日時: ' + String(datetime) + "\n" + '測定結果: ' + String(calc['bps']) + "\n";
var tw_w = ' ';
elm.find('[name=result]').append(tw_w);
}
elm.find('button').html('測定開始');
elm.find('button').removeClass('progress');
$('#down').find('button').attr('disabled', false);
$('#up').find('button').attr('disabled', false);
}
/*
ファイルに記録
@param {string} key 上り下り区別
@param {array} ary 結果配列
@return なし
*/
function logging (key, ary) {
var fastest = Math.max.apply(null, ary);
var bps = fastest * 8;
var kbps = bps / 1000;
kbps = orgRound(kbps, 100);
//ログ記録は下りのみ
if (key == 'down') {
//save
var xhr = new XMLHttpRequest();
xhr.addEventListener('loadend', function(){
});
xhr.open('POST', './flash_post.cgi');
xhr.send('ACTION=REGIST&VERSION='+version+'&SPEED='+kbps);
}
}
/*
bps計算
@param {number} bytes 秒間読込バイト数
@return {array} 結果配列
*/
function calcbps (bytes) {
var o_bytes;
var o_bps;
var kb = bytes / 1000;
if (kb > 1000) {
var mb = kb / 1000;
o_bytes = orgRound(mb, 100) + 'MB/sec'
} else {
o_bytes = orgRound(kb, 100) + 'KB/sec'
}
var bps = bytes * 8;
var kbps = bps / 1000;
if (kbps > 1000) {
var mbps = kbps / 1000;
o_bps = orgRound(mbps, 100) + 'Mbps'
} else {
o_bps = orgRound(kbps, 100) + 'Kbps'
}
return {
'bytes' : o_bytes,
'bps' : o_bps
}
}
/*
任意の桁で四捨五入する関数
@param {number} value 四捨五入する数値
@param {number} base どの桁で四捨五入するか(10→10の位、0.1→小数第1位)
@return {number} 四捨五入した値
*/
var orgRound = function (value, base) {
return Math.round(value * base) / base;
}
/*
桁数合わせ(2桁)
@param {number} num 2桁にしたい数値
@return {number} 2桁にした値
*/
var zeroPad = function (num) {
return ('00' + num).slice(-2);
}
/*
回線情報取得
@return {array} クッキーから得た回線情報テキスト(PHP経由で文字コード変換、成型済)
*/
function getLineInfo(key){
var xhr = new XMLHttpRequest();
xhr.addEventListener('loadend', function(){
if (key == 'down') {
downStart(xhr.responseText);
} else if (key == 'up') {
upStart(xhr.responseText);
}
});
xhr.open('GET', './cookie.php');
xhr.send();
}