// UTF-8
// meltdown.js
// Copyright (c) 2007 KAZUMiX
// http://d.hatena.ne.jp/KAZUMiX/20071105/meltdown
// Licensed under the MIT License:
// http://www.opensource.org/licenses/mit-license.php


var boxHeight;

function meltdown(){
	// ブラウザがIEで後方互換かどうかのフラグをセット
	//var IeQuirks = false;
	//if (window.attachEvent && document.compatMode == 'BackCompat') IeQuirks = true;
	
	// 全要素を取得
	var all = document.body.getElementsByTagName('*');
	
	// ドキュメントの高さ
	// スタイルで使うときは px つける
	var documentHeight = document.body.scrollHeight;
	
	// 表示ウィンドウの高さ
	var windowHeight = Math.max(document.body.clientHeight, document.documentElement.clientHeight);
	
	// ラッパーを追加する
	boxHeight = Math.max(documentHeight, windowHeight);
	var divBegin = '<div style="width:100%;overflow:hidden;height:' + boxHeight + 'px;">';
	var divEnd = '</div>';
	//document.body.innerHTML = divBegin + document.body.innerHTML + divEnd;
	
	// 全要素の絶対値座標を保存する
	// offsetParentを持たない要素（scriptとか）は除外する
	// IEはこのチェックじゃだめ。実際に動いたかどうかでもチェック。
	var targetEles = [];
	var i,len;
	for(i = 0, len = all.length; i < len; i ++){
		if (!all[i].offsetParent) continue;
		all[i].point = getPoint(all[i]);
		targetEles[targetEles.length] = all[i];
	}
	
	// 設定するスタイルプロパティの値を準備する
	var ele;
	var eleParent;
	for(i = 0, len = targetEles.length; i < len; i ++){
		ele = targetEles[i];
		eleParent = ele.parentNode;
		
		// オーバーレイさせたswfは動かさない
		if (ele.id == lastFlashID) {
			continue;
		}
		
		// widthとheightを記録する
		// clientWidth がゼロなら offsetWidth
		// そうじゃなければ小さいほう
		if (ele.clientWidth == 0) {
			ele._width = ele.offsetWidth;
		}
		else {
			ele._width = Math.min(ele.offsetWidth, ele.clientWidth);
		}
		if (ele.clientHeight == 0) {
			ele._height = ele.offsetHeight;
		}
		else {
			ele._height = Math.min(ele.offsetHeight, ele.clientHeight);
		}
		
		// 親からのオフセット座標を保存する
		if (eleParent.point) {
			ele._x = ele.point.x - eleParent.point.x;
			ele._y = ele.point.y - eleParent.point.y;
			ele.parentX = eleParent.point.x;
			ele.parentY = eleParent.point.y;
		}
		else {
			ele._x = ele.point.x;
			ele._y = ele.point.y;
		}
	}
	
	
	// ターゲット要素のpositionをabsoluteにし、現在の座標をセットする
	var ele;
	for(i = 0, len = targetEles.length; i < len; i++){
		ele = targetEles[i];
		
		// オーバーレイさせたswfは動かさない
		if (ele.id == lastFlashID || ele.id == lastFlashID + "swf") {
			continue;
		}
		
		// 親ノードとの差分をセットする
		//ele.style.overflow = 'visible';
		ele.style.position = 'absolute';
		ele.style.margin = '0px';
		ele.style.padding = '0px';
		ele.style.width = ele._width + 'px';
		ele.style.height = ele._height + 'px';
		//ele.style.display = 'block';
		ele.style.left = ele._x + 'px';
		ele.style.top = ele._y + 'px';
		
	}
	
	
	// アニメーション割り当てスタート
	// 追加したdivは割り当てない
	for(i = 0; i < targetEles.length - 1; i ++){
		var obj = new Falldown(targetEles[targetEles.length - 1 - i]);
		obj.start(i * 30);
	}
}


// 要素 ele の x,y 座標を絶対値で取得する関数
function getPoint(ele){
	var x = 0, y = 0;
	while(ele){
		x += ele.offsetLeft;
		y += ele.offsetTop;
		ele = ele.offsetParent;
	}
	return {x:x, y:y};
}


// 指定要素を画面外に落とすアニメーションクラス
// コンストラクタ
function Falldown(target){
	this.ele = target;
	this.speed = 1;
	this.left = target.offsetLeft;
	//this.leftRightSpeed = 2;
	this.leftRightSpeed = Math.random() * 3;
}


// start(アニメーション開始遅延時間)
Falldown.prototype.start = function(delay){
	this.targetY = boxHeight - this.ele.point.y;
	var scope = this;
	setTimeout(function(){scope.loop()},delay);
}


// loop()
Falldown.prototype.loop = function(){
	//console.log(this.targetY,this.ele.offsetTop);
	if (this.targetY < this.ele.offsetTop) return;
	var _top = this.ele.offsetTop;
	
	this.ele.style.top = this.ele.offsetTop - parseInt(this.speed) + 'px'; // move
	this.speed *= 1.2; // speed
	this.left += this.leftRightSpeed;
	this.ele.style.left = parseInt(this.left) + 'px';
	var scope = this;
	
	// 要素が画面外に出たら非表示
	if ((this.ele.offsetTop + this.ele.offsetHeight) < 0) {
		this.ele.style.display = 'none';
	}
	
	// 要素の位置が変わらなかったら動かせない要素なので終わり
	if (this.ele.offsetTop == _top) return;
	
	// ループ
	setTimeout(function(){scope.loop()}, 70);
}