﻿function trace(msg){
	if(msg == undefined){
		TraceLayer.innerHTML = "undefined";
	}else if(msg == null){
		TraceLayer.innerHTML = "null";
	}else{
		TraceLayer.innerHTML = msg.toString();
	}
}
function assert(bCond, msg){
	if(! bCond)alert(msg);
}
function return_true(){ return true; }
function return_false(){ return false; }
function return_undefined(){ return undefined; }
function return_null(){ return null; }
function return_zero(){ return 0; }
function return_nullstring(){ return ""; }
function getCursorX(e){
	if(document.layers){
		return e.pageX;
	}else if (document.all){
		return e.clientX;
	}else if (document.getElementsByTagName){
		return e.pageX;
	}
	return 0;
}
function getCursorY(e){
	if(document.layers){
		return e.pageY;
	}else if(document.all){
		return e.clientY;
	}else if(document.getElementsByTagName){
		return e.pageY;
	}
	return 0;
}

function Range(start,end){
	this.start = start;
	this.end = end;
	this.setStart = function(start){
		this.start = start;
	}
	this.setEnd = function(end){
		this.end = end;
	}
	this.isIn = function(x){
		return this.start<=x && x<this.end;
	}
	this.isOut = function(x){
		return ! this.isIn(x);
	}
	this.toString = function(){
		return this.start + "～" + this.end;
	}
	this.appendRange = function(num){
		if(num){
			this.end = this.end + num;
		}else{
			this.end = this.end + 1;
		}
	}
}


function registerDragMove(obj,e,movecallback,upcallback){
	var startCursorX = getCursorX(e);
	var startCursorY = getCursorY(e);
	var startObjX = parseInt(obj.currentStyle ? obj.currentStyle.left : obj.style.left ? obj.currentStyle.left : "0");
	var startObjY = parseInt(obj.currentStyle ? obj.currentStyle.top  : obj.style.top  ? obj.currentStyle.top  : "0");
	var tempName = Math.random().toString();
	// マウスムーブの登録
	Page.setOnMouseMove(tempName, function(e){
		var x = startObjX+getCursorX(e||event)-startCursorX;
		var y = startObjY+getCursorY(e||event)-startCursorY;
		if(x<0)x=0;
		if(y<0)y=0;
		if(obj.runtimeStyle){
			obj.runtimeStyle.top = y.toString() + "px";
			obj.runtimeStyle.left= x.toString() + "px";
		}else{
			obj.style.top = y.toString() + "px";
			obj.style.left= x.toString() + "px";
		}
		if(movecallback)return movecallback(e||event);
		return true;
	});
	// マウスアップの登録
	Page.setOnMouseUp(tempName, function(e){
		// マウスムーブの登録解除
		Page.setOnMouseMove(tempName, undefined);
		// マウスアップの登録解除
		Page.setOnMouseUp(tempName, undefined);
		if(upcallback)return upcallback(e||event);
		return true;
	});
	return true;
}


var Page = undefined;

function Initialize(){
	if(Page)return false;
	Page = new function(){
		var self = this;
		/// ルートディレクトリの設定
		this.RootDir = undefined;
		this.setRoot = function(root_dir){
			this.RootDir = root_dir;
		}
		/// リンクの開き方
		this.Link = undefined;
		this.setLink = function(link_opened_name){
			this.Link = link_opened_name;
		}
		//////////
		/// イベントハンドラ系の設定
		function foreachHandler(eh, e){
			var res = true;
			for(i in eh){
				if(! eh[i])continue;
				res = eh[i](e);
				if(!res && res != undefined)return res;
			}
			return true;
		}
		function registHandler(dic,key,val){
			if(val == undefined){
				delete dic[key];
			}else{
				dic[key] = val;
			}
		}
		// onclick
		this.OnClick = new Array();
		this.setOnClick = function(name, eh){ registHandler(this.OnClick, name, eh); }
		document.body.onclick = function(e){ foreachHandler(self.OnClick,e); }
		
		// ondblclick
		this.OnDblClick = new Array();
		this.setOnDblClick = function(name, eh){ registHandler(this.OnDblClick, name, eh); }
		document.body.ondblclick = function(e){ foreachHandler(self.OnDblClick,e); }
		
		// onmousemove
		this.OnMouseMove = new Array();
		this.setOnMouseMove = function(name, eh){ registHandler(this.OnMouseMove, name, eh); }
		document.body.onmousemove = function(e){ foreachHandler(self.OnMouseMove,e); }
		
		// onmouseup
		this.OnMouseUp = new Array();
		this.setOnMouseUp = function(name, eh){ registHandler(this.OnMouseUp, name, eh); }
		document.body.onmouseup = function(e){ foreachHandler(self.OnMouseUp,e); }
		
		// onmousedown
		this.OnMouseDown = new Array();
		this.setOnMouseDown = function(name, eh){ registHandler(this.OnMouseDown, name, eh); }
		document.body.onmousedown = function(e){ foreachHandler(self.OnMouseDown,e); }
		
		// onmouseout
		this.OnMouseOut = new Array();
		this.setOnMouseOut = function(name, eh){ registHandler(this.OnMouseOut, name, eh); }
		document.body.onmouseout = function(e){ foreachHandler(self.OnMouseOut,e); }
		
		// onmouseover
		this.OnMouseOver = new Array();
		this.setOnMouseOver = function(name, eh){ registHandler(this.OnMouseOver, name, eh); }
		document.body.onmouseover = function(e){ foreachHandler(self.OnMouseOver,e); }
		
		// onmouseover
		this.OnUnLoad = new Array();
		this.setOnUnLoad = function(name, eh){ registHandler(this.OnUnLoad, name, eh); }
		document.body.onunload = function(e){ foreachHandler(self.OnUnLoad,e); }
		/// イベントハンドラ系の設定
		//////////


		/// getter
		this.getScrollTop =  function(){ return document.body.scrollTop  || document.documentElement.scrollTop;  }
		this.getScrollLeft = function(){ return document.body.scrollLeft || document.documentElement.scrollLeft; }

		//////////
		/// Cookie
		// クッキーを読み込む
		this.getCookie = function(key){
			var tmp1 = " " + document.cookie + ";";
			var xx1 = 0;
			var xx2 = 0;
			var xx3 = 0;
			var tmp2 = "";
			var len = tmp1.length;
			while (xx1 < len){
				xx2 = tmp1.indexOf(";", xx1);
				tmp2 = tmp1.substring(xx1 + 1, xx2);
				xx3 = tmp2.indexOf("=");
				if(tmp2.substring(0, xx3) == key){
					return(unescape(tmp2.substring(xx3 + 1, xx2 - xx1 - 1)));
				}
				xx1 = xx2 + 1;
			}
			return "";
		}
		// クッキーを書き込む
		// timeはDateオブジェクト
		this.setCookie = function(key, val, time){
			function setw(num,dig){
				var numstr = num.toString();
				while(numstr.length < dig)numstr = "0" + numstr;
				return numstr;
			}
			if(time){
				var time = "expires=" + time.toGMTString();
//				timetemp += ["Sun","Mon","Tue","Wed","Thu","Fry","Sat"][time.getUTCDay()] + ", ";
//				timetemp += setw(time.getUTCDate(),2) + "-";
//				timetemp += ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][time.getUTCMonth()] + "";
//				timetemp += setw(time.getUTCYear(),4) + " ";
//				timetemp += setw(time.getUTCHours(),2) + ":";
//				timetemp += setw(time.getUTCMinutes(),2) + ":";
//				timetemp += setw(time.getUTCSeconds(),2) + "; ";
//				time = timetemp;
//			}else{
				time = "expires=Tue, 31-Dec-2030 23:59:59; ";
			}
			var tmp = key + "=" + escape(val) + "; ";
		//	tmp += "path=" + location.pathname + "; ";
			tmp += time;
			document.cookie = tmp;
		}
		// クッキーをクリア
		this.clearCookie = function(key){
			document.cookie = key + "=" + "xx; expires=Tue, 1-Jan-1980 00:00:00;";
		}
		/// Cookie
		//////////
		
		
	}
	this.Initialized=true;
}

// メインレイヤーの移動サポート
function MainLayerMover(){
	var self = this;
	/// リンクレイヤーのポジションを変更します。
	this.setPosition = function(x,y){
		if(x<0)x = 0;
		if(y<0)y = 0;
		if(MainLayer.runtimeStyle){
			MainLayer.runtimeStyle.top  = y.toString() + "px";
			MainLayer.runtimeStyle.left = x.toString() + "px";
		}else{
			MainLayer.style.top  = y.toString() + "px";
			MainLayer.style.left = x.toString() + "px";
		}
	}
	// クッキーを書き込む
	this.writeCookie = function(){
		var d = new Date();
		d.setTime(d.getTime()+( 300 * 1000 ));
		if(document.body){
			if(MainLayer.currentStyle){
				Page.setCookie("MainLayerMover::posY", parseInt(MainLayer.currentStyle.top ),d);
				Page.setCookie("MainLayerMover::posX", parseInt(MainLayer.currentStyle.left),d);
			}else{
				if(! MainLayer.style.top) MainLayer.style.top = "0px";
				if(! MainLayer.style.left) MainLayer.style.top = "0px";
				Page.setCookie("MainLayerMover::posY", parseInt(MainLayer.style.top ),d);
				Page.setCookie("MainLayerMover::posX", parseInt(MainLayer.style.left),d);
			}
		}
	}
	
	// クッキーを読み込む
	this.readCookie = function(){
		var y = Page.getCookie("MainLayerMover::posY");
		var x = Page.getCookie("MainLayerMover::posX");
		if(x.toString() != "NaN" && y.toString() != "NaN" && x.length != 0 && y.length != 0){
			this.setPosition(Number(x),Number(y));
		}
	}
	/// 位置と状態の初期化
	this.Reset = function(){
		if(MainLayer.runtimeStyle){
			MainLayer.runtimeStyle.top  = "";
			MainLayer.runtimeStyle.left = "";
		}else{
			MainLayer.style.top  = "70px";
			MainLayer.style.left = "150px";
		}
	}
	/// ダブルクリック時の動作
	MainLayerGrip.ondblclick = function(){
		var x;
		var y;
		if(MainLayer.currentStyle){
			x = parseInt(MainLayer.currentStyle.left);
			y = parseInt(MainLayer.currentStyle.top);
		}else{
			x = parseInt(MainLayer.style.left);
			y = parseInt(MainLayer.style.top);
		}
		self.Reset();
		if(MainLayer.currentStyle){
			if(x == parseInt(MainLayer.currentStyle.left) && y == parseInt(MainLayer.currentStyle.top) ){
				MainLayer.runtimeStyle.top = "0px";
			}
		}else{
			if(x == parseInt(MainLayer.style.left) && y == parseInt(MainLayer.style.top) ){
				MainLayer.style.top = "0px";
			}
		}
	};
	/// マウスダウン時の動作
	MainLayerGrip.onmousedown = function(e){
		if(MainLayerGrip.runtimeStyle){
			document.body.runtimeStyle.cursor = "move";
		}
		return registerDragMove(MainLayer, e||event, undefined, function(){
			if(MainLayerGrip.runtimeStyle){
				document.body.runtimeStyle.cursor = "";
			}
		});
	};
}


function Listup(x){
	var outstr ="";
	document.clear();
	for(i in x){
		outstr += i +"="+ x[i] + "<br/>";
	}
	document.write(outstr);
}


var MainLayerObject;

function onLoad(){
	if(! document.all)return false;
	MainLayerObject = new MainLayerMover();
	MainLayerObject.readCookie();
	Page.setOnUnLoad("Main", onUnLoad);
}


function onUnLoad(){
	MainLayerObject.writeCookie();
}

function getPageScrollTop()
{
	try
	{
		switch (navigator.appName)
		{
		case "Netscape":
			return window.pageYOffset;
			break;
		case "Opera":
			return window.pageYOffset;
			break;
		default:
			return document.documentElement.scrollTop;
		}
	}
	catch(e)
	{
		// 絶対パスだとエラーになるよ！
		return document.body.scrollTop;
	}
}

function getPageScrollLeft()
{
	try
	{
		switch (navigator.appName)
		{
		case "Netscape":
			return window.pageXOffset;
			break;
		case "Opera":
			return window.pageXOffset;
			break;
		default:
			return document.documentElement.scrollLeft;
		}
	}
	catch(e)
	{
		// 絶対パスだとエラーになるよ！
		return document.body.scrollLeft;
	}
}

function setPageScrollTop(y)
{
	window.scrollTo(getPageScrollLeft(), y);
}

function setPageScrollLeft(x)
{
	window.scrollTo(x, getPageScrollTop());
}

function onInlinepageLoaded(elmIFrame)
{
	setPageScrollTop(10000);
	while(getPageScrollTop() <= 0)
	{
		var frmstyle = elmIFrame.currentStyle || document.defaultView.getComputedStyle(elmIFrame, '');
		elmIFrame.style.height = (( parseInt(frmstyle.height) + 10 ).toString() + "px").toString();
		setPageScrollTop(10000);
	}
	while(getPageScrollTop() > 0)
	{
		var frmstyle = elmIFrame.currentStyle || document.defaultView.getComputedStyle(elmIFrame, '');
		elmIFrame.style.height = (( parseInt(frmstyle.height) - 1 ).toString() + "px").toString();
	}
	
}
