/* read 次ボタンの横幅を拡張する（body oload後に実行）  */
function expandLargeNextButton()
{
	var large_nextObj = document.getElementById('large_next');
	if (large_nextObj) {
		large_nextObj.style.width = document.body.clientWidth - 134 - 21 + 'px'; // window.innerWidth
	}
}

function anchorJump(ancId)
{
	var gopos = document.getElementById(ancId);
	if (gopos) {
        var to = parseInt(gopos.offsetTop);
        to = to -60; // iPhoneのURLメニュー表示の高さ分だけ調整する
		document.body.scrollTop = to;
		//window.scrollTo(0, to);
	}
}

// iPhoneのURL表示部分を引っ込ませるため、わずかにスクロールする
function scrollForHideIPhoneUrlMenu()
{
	setTimeout(scrollTo, 100, 0, 1);  // 動作が追いつかない時の対策にsettimeoutしているらしい。scrollByにするとAndroidのデフォルトブラウザで「次」移動した時に、下の方へジャンプしてしまう
}

// （bodyがonloadしてから実行する）
function initIPhoneGestures(){
	if (isAndroidWebkit()) {
		return;
	}
	initIPhoneTripleTap();
}


gScrollTimerId = false;
function iphonePageScroll(dist)
{
	if (gScrollTimerId) {
		clearInterval(gScrollTimerId);
	}
    if (document.body.scrollTop == dist) {
        return;
    }
    
    gScrollDown = true;
    if (document.body.scrollTop > dist) {
        gScrollDown = false;
    }
	gScrollTimerId = setInterval('iphonePageScrollDo(' + dist + ')', 5);
}

function iphonePageScrollDo(dist)
{
	if (typeof(gPrevScrollTop) == 'number' && gPrevScrollTop == document.body.scrollTop || gScrollDown && dist < document.body.scrollTop || !gScrollDown && dist > document.body.scrollTop) {
        gPrevScrollTop = null;
		clearInterval(gScrollTimerId);
		return;
	}
    
    var distance = dist - document.body.scrollTop;
    var speed = 12;
    if (Math.abs(distance) < 2) {
        speed = 1;
    } else if (Math.abs(distance) < 30) {
        speed = 2;
    } else if (Math.abs(distance) < 60) {
        speed = 3;
    } else if (Math.abs(distance) < 180) {
        speed = 6;
    } else if (Math.abs(distance) < 300) {
        speed = 9;
    }
    if (distance < 0) {
        mv = -speed;
    } else {
        mv = speed;
    }
    
    gPrevScrollTop = document.body.scrollTop;
	window.scrollBy(0, mv);
}

function inactiveFlick()
{
	gFlickActive = false;
	gFlickPoint = 0;
}
function initIPhoneTripleTap()
{
	gTapped = new Object();
	gTapped.times = 0;
	gTapped.startDate = new Date();
	gTapped.touchendact = 0;
	gTapped.dbldiff = 0;
	gTapped.startY = false;
	
	document.body.ontouchstart  = function() {
		var e = event.touches[0];
		//alert(e.clientY);
		//alert(window.innerHeight);
		var nowDate = new Date();
		//alert(nowDate.getTime());
		var diff = nowDate.getTime() - gTapped.startDate.getTime();
		gTapped.startDate = nowDate;
		gTapped.startY = e.clientY;
		if (diff < 400) {
			gTapped.times = gTapped.times + 1;
			if (gTapped.times == 2) {
				//alert('ダブル！');
				gTapped.dbldiff = diff;
				if (e.clientY < window.innerHeight/2*0.8) {
					gTapped.touchendact = 3
				} else if (e.clientY > window.innerHeight/2*1.2) {
					gTapped.touchendact = 4;
				}
				return;
			}
			if (gTapped.times > 2 && diff > gTapped.dbldiff*0.7 && diff < gTapped.dbldiff*1.07) {
				//alert('トリプル！');
				if (e.clientY < window.innerHeight/2*0.8) {
					gTapped.touchendact = 1
				} else if (e.clientY > window.innerHeight/2*1.2) {
					gTapped.touchendact = 2;
				}
				return;
			}
		} else {
			gTapped.times = 1;
			if (gScrollTimerId) {
				clearInterval(gScrollTimerId);
			}
		}
		gTapped.touchendact = 0;
	};

	gFlickPoint = 0;
	gFlickActive = false;
	gFlickTimerID = false;
	
	document.body.ontouchmove  = function() {
		gTapped.times = 0;

		return;
		
		if (gFlickActive) {
			return;
		}
		var nowDate = new Date();
		var diff = nowDate.getTime() - gTapped.startDate.getTime();
		if (diff < 400) {
			var e = event.touches[0];
			if (Math.abs(e.clientY - gTapped.startY) > 200) {
				gFlickActive = true;
				gFlickPoint = gFlickPoint + 1;
				if (gFlickPoint > 1) {
					if (e.clientY > gTapped.startY) {
						iphonePageScroll(0);
					} else {
						iphonePageScroll(document.height - window.innerHeight + 14);
					}
				}
				if (gFlickTimerID) clearTimeout(gFlickTimerID);
				gFlickTimerID = setTimeout('inactiveFlick()', 600);
			}

		} else {
			inactiveFlick();
		}
		
		/*
		var dp = document.getElementById('debugpanel');
		var e = event.touches[0];
		dp.innerHTML = e.clientX + '.' + e.clientY;
		if (e.clientX > 200) {
			alert(e.clientX);
		}
		*/
	}

	document.body.ontouchend  = function() {
		//var zoomer = document.body.clientWidth / window.innerWidth;
		gFlickActive = false;
		if (gTapped.touchendact) {
			event.preventDefault();
			var nowDate = new Date();
			var diff = nowDate.getTime() - gTapped.startDate.getTime();
			if (diff < 400) {
				if (gTapped.touchendact == 1) {
					iphonePageScroll(0);
				} else if (gTapped.touchendact == 2) {
					iphonePageScroll(document.height - window.innerHeight + 14);
				} else if (gTapped.touchendact == 3) {
					iphonePageScroll(document.body.scrollTop - window.innerHeight*0.8);
				} else if (gTapped.touchendact == 4) {
					iphonePageScroll(document.body.scrollTop + window.innerHeight*0.8);
				}
			}
		}
	}
}


// iPhone フッターのレス検索または書き込みフォームのポップアップを表示するメソッド (Edit 080727 by 240)
// @param  integer  arrayIdx  0:検索, 1:書き込み 2:その他
// @param  integer(bool) resetFlag  1:非表示の指定をしたい場合 0:フラグなし
// @param  integer(bool) forceOn  1:トグルではなく強制オンにしたい場合 0:フラグなし
function popUpFootbarFormIPhone(arrayIdx, resetFlag, forceOn) {
	var popElements = new Array(3);
	var buttonElements  = new Array(3);
    
	popElements[0] = document.getElementById('searchForm');
	popElements[1] = document.getElementById('writeForm');
	popElements[2] = document.getElementById('footbarEtc');

	buttonElements[0]  = document.getElementById('searchRes');
	buttonElements[1]  = document.getElementById('writeButton');
	buttonElements[2]  = document.getElementById('etcButoon');
    
	for (var i = 0; i <= 2; i++) {
		if (i != arrayIdx) {
			if (buttonElements[i]) {
                buttonElements[i].setAttribute('title', 'off'); // titleは条件ステータスの保持っぽい
            }
		}
		// 一旦全てを非表示にしている
        if (buttonElements[i]) {
		    buttonElements[i].style.backgroundPositionY = '0'; // 通常状態（光っていない）
        }
        if (popElements[i]) {
		    popElements[i].style.display = 'none';
        }
	}

	// 強制オン指定でなく、オフトグルまたはリセット(off)指定ならそのまま終了
	if (!forceOn && (buttonElements[arrayIdx].getAttribute('title') == 'on' || resetFlag)) {
		buttonElements[arrayIdx].setAttribute('title', 'off');
		return;
	}

	buttonElements[arrayIdx].setAttribute('title', 'on');
	buttonElements[arrayIdx].style.backgroundPositionY = '-50px'; // 光らせる
	//popElements[arrayIdx].style.top = (document.height - 480).toString(); + "px"

	// bodyが画面の長さが短くて上がはみ出している場合の修正措置
	var footToolbarElem = document.getElementById('footToolbar');
	if (arrayIdx != 1 && footToolbarElem.offsetTop < 280) { // だいたいの値
		//popElements[arrayIdx].style.position = 'absolute';
		popElements[arrayIdx].style.top = 0 + 'px'; //14; // もっといい指定方法があるような気がする // heightも必要っぽい
		//var writeFormCloseBtnElem = document.getElementById('writeFormCloseBtn');
		//if (writeFormCloseBtnElem) {
		//	writeFormCloseBtnElem.style.display = 'block';
		//}
	}

    // 表示する
	popElements[arrayIdx].style.display = 'block';

	// 書き込みフォームなら画面をスクロール
	if (arrayIdx == 1) {
		//var writeFormObj = document.getElementById('writeForm');
		//scrollBy(0, writeFormObj.clientHeight);
		anchorJump('writeForm');
	}
    
	return true;
}
