﻿var _makeLayer_webRoot = '';

// テンプレートファイルの読み込み
var _makeLayer_initTemplate = _makeLayer_webRoot + '/js/layer_parts/templates/';

// CSSファイルの読み込み
var _makeLayer_initCss = _makeLayer_webRoot + '/js/layer_parts/css/makelayer.css';

// 背景色の指定
var _makeLayer_bodyBgColor = '#000000';

// 重ねる要素の背景色の指定
var _makeLayer_elemBgColor = 'transparent';

// 透明度の設定
var _makeLayer_initOpac = '0.8';

// (ie8対策) 透過pngへのフルパス
var _makeLayer_ie8Png = _makeLayer_webRoot + '/js/layer_parts/images/ie8_opacity.gif';

// for Initialize
document.write('<link rel="stylesheet" href="' + _makeLayer_initCss + '" type="text/css" media="all" />');
addLoadEvent(init_layer);

function init_layer() {
	var anchor = document.getElementsByTagName('a');

	for(var i=0, imax=anchor.length; i<imax; i++) {
		var a = anchor[i];
		var href = a.getAttribute('href', 2);

		if(a.rel=='lbox'){
			setEvent(a, 'click', 'showBox(\'' + href + '\', \'' + a.getAttribute('title') + '\'); return false;');
			setEvent(a, 'keypress', 'showBox(\'' + href + '\', \'' + a.getAttribute('title') + '\'); return false;');
		}
	}
}

var setEvent = function(){
	if(arguments.length<3) return;

	var args = new Array();
	for(var i=0, imax=arguments.length; i<imax; i++)
		args.push(arguments[i]);

	var elem = args.shift();
	var evt = 'on' + args.shift();
	var func = args.shift();

	window.addEventListener || (document.documentMode && document.documentMode >= 8) ?
		elem.setAttribute(evt, func) :
		elem.setAttribute(evt, new Function(func));
};

function addLoadEvent(func){
	var oldonload = window.onload;
	if(typeof(window.onload)!='function')
		window.onload = func;
	else {
		window.onload = function(){
			oldonload();
			func();
		};
	}
	return false;
}

function showBox(v1, v2) {
	_makeLayer_initLoading(v1, v2);
	return false;
}

var _makeLayer_idName_BG = '_makeLayer_elemBG';
var _makeLayer_idName_BOX = '_makeLayer_elemBox';

var _makeLayer_Heredoc = {
	load: function(uri, loaded, failed) {
		var self = this;
		this._getSource(uri, function(src) {
			loaded(self.parse(src));
		}, failed);
	},
	
	parse: function(src, proc){
		var values = {};
		var re = /([\w\.\[\]]+)\s*=\s*<<\s*("?)(\w+)"?\s*;?\s*/;
		var p = null;
		while((p=re.exec(src))!=null){
			var vname = p[1];
			var quote = p[2];
			var target= p[3];
			src = src.substring(p.index + p[0].length);
			
			var re2 = new RegExp('^' + target + '$', 'm');
			p = re2.exec(src);
			if(p===null){
				break;
			}
			var v = src.substring(0, p.index);
			src = src.substring(p.index + target.length);
			if(proc){
				v = proc(v);
			}
			if(quote){
				v = this.create_template(v);
			}
			values[vname] = v;
		}
		return values;
	},
	
	create_template: function(src){
		return src;
	},
	
	parseInline: function(){
		var currentScript = (function(e){ if(e.nodeName.toLowerCase()=='script') return e; return arguments.callee(e.lastChild) })(document);
		var src = currentScript.innerHTML;
		if (! src) return;
		var values = this.parse(src, function(str){
			return str.replace(/<(\\*)\\\//g, "<$1/");
		});
		for(var k in values){
			var v = values[k];
			eval(k + " = v;");
		}
	},
	
	_getSource: function(uri, loaded, failed){
		var transport = this._getTransport();
		transport.open("GET", uri, true);
		
		transport.onreadystatechange=function(){
			if(transport.readyState==4){
				if(transport.status==200){
					loaded(transport.responseText);
				}else{
					if(failed){
						failed(transport);
					}
				}
			}
		}
		transport.send(null);
	},
	
	_getTransport: function(){
		var imprements = [
			function(){ return new XMLHttpRequest() },
			function(){ return new ActiveXObject('Msxml2.XMLHTTP') },
			function(){ return new ActiveXObject('Microsoft.XMLHTTP') }
		];
		
		var returnValue;
		for(var i=0; i<imprements.length; i++){
			var lambda = imprements[i];
			try{
				returnValue = lambda();
				break;
			}catch(e){ }
		}
		return returnValue;
	}
};

function _makeLayer_removeEvent(eventName, funcName, bFlag){
	if(window.removeEventListener){
		window.removeEventListener(eventName, funcName, bFlag);
	}else{
		window.detachEvent('on' + eventName, funcName);
	}
}

function _makeLayer_closeLayer(){
	var elems = new Array(_makeLayer_idName_BG, _makeLayer_idName_BOX);
	var imax = elems.length;
	for(var i=0; i<imax; i++){
		var elem = document.getElementById(elems[i]);
		elem.parentNode.removeChild(elem);
	}
	
	_makeLayer_removeEvent('resize', _makeLayer_setArea, false);
	if(typeof(_makeLayer_condScroll)!='undefined') _makeLayer_removeEvent('scroll', _makeLayer_setScroll, false);
	
	// for ie6 bug
	if(typeof(document.documentElement.style.maxHeight)=='undefined') _makeLayer_fixSelect('on');
}

function _makeLayer_elemOffset(){ }

_makeLayer_elemOffset.prototype = {
	setting: function(elem){
		_makeLayer_elemOffset.prototype.y = elem.offsetTop;
		_makeLayer_elemOffset.prototype.x = elem.offsetLeft;
	}
};

function _makeLayer_setCenter(){
	var elem = arguments[0];
	if(!elem) elem = document.getElementById(_makeLayer_idName_BOX);
	var w = elem.scrollWidth;
	var h = elem.scrollHeight;
	elem.style.top = '50%';
	elem.style.left = '50%';
	elem.style.marginTop = '-' + (h / 2) + 'px';
	elem.style.marginLeft = '-' + (w / 2) + 'px';
	
	if(typeof(_makeLayer_condScroll)!='undefined'){
		var offset = new _makeLayer_elemOffset();
		offset.setting(elem);
	}
	
	return false;
}

function _makeLayer_fixSelect(){
	var _tmp_tags = document.getElementsByTagName('select');
	for(var i=0, imax=_tmp_tags.length; i<imax; i++){
		_tmp_tags[i].style.visibility = arguments[0] ? 'visible' : 'hidden';
	}
	
	return false;
}

function _makeLayer_fixScroll(){
	var scrollX = document.documentElement.scrollTop || document.body.scrollTop;
	var moveTo = scrollX;
	
	if(scrollX<=0) moveTo++;
	else moveTo--;
	
	window.scrollTo(0, moveTo);
	window.scrollTo(0, scrollX);
	
	return false;
}

function _makeLayer_setArea(){
	if(document.getElementById(_makeLayer_idName_BG)){
		// クライアントのブラウザ(横幅)を取得
		var getBrowserWidth = function(){
			if(document.documentElement && document.documentElement.clientWidth!=0){ return document.documentElement.clientWidth; }
			else if(document.body){ return document.body.clientWidth; }
			else if(window.innerWidth){ return window.innerWidth; }
			return 0;
		};

		// クライアントのブラウザ(高さ)を取得
		var getBrowserHeight = function(){
			if(document.documentElement && document.documentElement.clientHeight!=0){ return document.documentElement.clientHeight; }
			else if(document.body){ return document.body.clientHeight; }
			else if(window.innerHeight){ return window.innerHeight; }
			return 0;
		};

		var setArea = function(){
			var body = document.compatMode=='CSS1Compat' ? document.documentElement : document.body;
			var elem = document.getElementById(_makeLayer_idName_BG);
			var pNode = elem.parentNode;
			var cpElem = elem.cloneNode(false);
			pNode.removeChild(elem);
			var w = getBrowserWidth();
			var h = getBrowserHeight();
			var bw = body.scrollWidth;
			var bh = body.scrollHeight;
			if(w<bw) w = bw;
			if(h<bh) h = bh;
			cpElem.style.width = w + 'px';
			cpElem.style.height = h + 'px';
			pNode.insertBefore(cpElem, pNode.lastChild);
			
			if(typeof(_makeLayer_condScroll)!='undefined'){
				_makeLayer_setCenter();
				_makeLayer_fixScroll();
			}
		};
		
		if(navigator.userAgent.indexOf('MSIE')!=-1) setTimeout(setArea, 1);
		else setArea();
	}
	
	return false;
}

function _makeLayer_setScroll(){
	if(document.getElementById(_makeLayer_idName_BOX)){
		document.scroll = function(){
			return {
				x: this.body.scrollLeft || this.documentElement.scrollLeft,
				y: this.body.scrollTop  || this.documentElement.scrollTop
			};
		};
		
		var elem = document.getElementById(_makeLayer_idName_BOX);
		var x = document.scroll().x;
		var y = document.scroll().y;
		var offset = new _makeLayer_elemOffset();
		x += offset.x;
		y += offset.y;
		elem.style.top = y + 'px';
		elem.style.left = x + 'px';
		elem.style.margin = '0px';
	}
	
	return false;
}


function _makeLayer_initLoading(href, title){
	var my_ua;
	
	//Safari
	if(navigator.userAgent.indexOf('Safari')!=-1){
		my_ua = 'sf';
	}
	//Firefox
	else if(navigator.userAgent.indexOf('Firefox')!=-1){
		my_ua = 'ff';
	}
	//Netscape
	else if(navigator.appName=='Netscape'){
		my_ua = 'ns';
	}
	//Netscape6 や Mozilla(オープンソース版)
	else if(navigator.userAgent.indexOf('Gecko')!=-1){
		my_ua = 'gk';
	}
	//Opreaすべて
	else if(window.opera){
		my_ua = 'op';
	}
	//Internet Explorer
	else if(navigator.userAgent.indexOf('MSIE')!=-1){
		my_ua = 'ie';
	}
	
	var setOpacity = function(elem, opac){
		if(my_ua=='sf'){
			elem.style.KhtmlOpacity = opac;
			elem.style.opacity = opac;
		}
		else if(my_ua=='ff' || my_ua=='ns'){
			elem.style.MozOpacity = opac;
		}
		else if(my_ua=='ie'){
			if(document.documentMode) elem.style.background = 'url(' + _makeLayer_ie8Png + ')';
			else elem.style.filter = 'alpha(opacity=' + (eval(opac) * 100) + ')';
		}
		else{
			elem.style.opacity = opac;
		}
	};
	
	var body = document.body;
	
	// for ie6 bug
	if(typeof(document.documentElement.style.maxHeight)=='undefined') _makeLayer_fixSelect();
	
	// make background
	var div = document.createElement('div');
	div.setAttribute('id', _makeLayer_idName_BG);
	div.style.position = 'absolute';
	div.style.top = '0px';
	div.style.left = '0px';
	div.style.backgroundImage = 'none';
	div.style.backgroundColor = _makeLayer_bodyBgColor;
	div.style.border = 'none';
	div.style.margin = '0px';
	div.style.padding = '0px';
	div.style.overflow = 'auto';
	div.style.zIndex = '99998';
	setOpacity(div, _makeLayer_initOpac);
	body.appendChild(div);
	_makeLayer_setArea();
		
	// make main element
	var div = document.createElement('div');
	div.setAttribute('id', _makeLayer_idName_BOX);
	if(my_ua=='ie'){
		if(typeof(document.documentElement.style.msInterpolationMode)!='undefined' && document.compatMode=='CSS1Compat'){
			div.style.position = 'fixed';
		}else{
			_makeLayer_condScroll = '1';
			
			div.style.position = 'absolute';
			window.attachEvent('onscroll', _makeLayer_setScroll);
		}
	}
	else div.style.position = 'fixed';
	div.style.float = 'left';
	div.style.backgroundImage = 'none';
	div.style.backgroundColor = _makeLayer_elemBgColor;
	div.style.border = 'none';
	div.style.margin = '0px';
	div.style.padding = '0px';
	div.style.width = 'auto';
	div.style.height = 'auto';
	div.style.overflow = 'auto';
	div.style.zIndex = '99999';
	body.appendChild(div);
	
	var callback = function(html){
		var elem = document.getElementById(_makeLayer_idName_BOX);
		var inText = html.template;
		inText = inText.replace(/##href##/g, href);
		inText = inText.replace(/##title##/g, title);
		inText = inText.replace(/##uri##/g, location.href);
		elem.innerHTML = inText;
		if(elem.hasChildNodes()){
			var cNode = elem.childNodes[0];
			elem.style.width = cNode.offsetWidth + 'px';
			elem.style.height = cNode.offsetHeight + 'px';
		}
		
		var anchor = elem.getElementsByTagName('a');
		for(var i=0, imax=anchor.length; i<imax; i++){
			var a = anchor[i];
			if(a.rel=='outsite'){
				setEvent(a, 'click', 'open_page(\'' + a.href + '\', \'' + a.rel + '\'); _makeLayer_closeLayer(); return false;');
				setEvent(a, 'keypress', 'open_page(\'' + a.href + '\', \'' + a.rel + '\'); _makeLayer_closeLayer(); return false;');
			}
			else if(a.rel=='close'){
				setEvent(a, 'click', '_makeLayer_closeLayer(); return false;');
				setEvent(a, 'keypress', '_makeLayer_closeLayer(); return false;');
			}
		}
		
		// 位置調整(センター揃え)
		_makeLayer_setCenter(elem);
		if(typeof(document.documentElement.style.maxHeight)=='undefined') _makeLayer_fixScroll();
	};

	_makeLayer_Heredoc.load(_makeLayer_initTemplate + href, callback);

	if(window.addEventListener){
		window.addEventListener('resize', _makeLayer_setArea, false);
	}else{
		window.attachEvent('onresize', _makeLayer_setArea);
	}
	
	return false;
}
document.getElemetsByClassName = function(name,target)
{
	var result = [];
	var object  = null;
	var search = new RegExp(['(^|\\s)',name,'(\\s|$)'].join(''));
	if (target && target.getElementsByTagName)
		object = target.getElementsByTagName('*');
	if (!object)
		object = document.getElementsByTagName ? document.getElementsByTagName('*') : document.all;
	for (var i=0,n=object.length;i<n;i++)
	{
		var check = object[i].getAttribute('class') || object[i].className;
		if (check.match(search)) result.push(object[i]);
	}
	return result;
}
// === window ===
function  WindowSize()
{ // window size object
	this.w = 0;
	this.h = 0;
	return this;
}
WindowSize.prototype.update = function()
{
	var d = document;
	var w = 
	  (window.innerWidth) ? window.innerWidth
	: (d.documentElement && d.documentElement.clientWidth) ? d.documentElement.clientWidth
	: d.body.clientWidth;
	var h = 
	  (window.innerHeight) ? window.innerHeight
	: (d.documentElement && d.documentElement.clientHeight) ? d.documentElement.clientHeight
	: d.body.clientHeight;
	if (w != this.w || h != this.h)
	{
		this.w = w;
		this.h = h;
		return true;
	}
	return false;
};
function PageSize()
{ // page size object
	this.win = new WindowSize();
	this.w = 0;
	this.h = 0;
	return this;
}
PageSize.prototype.update = function()
{
	var d = document;
	var w = 
	  (window.innerWidth && window.scrollMaxX) ? window.innerWidth + window.scrollMaxX
	: (d.body.scrollWidth > d.body.offsetWidth) ? d.body.scrollWidth
	: d.body.offsetWidt;
	var h = 
	  (window.innerHeight && window.scrollMaxY) ? window.innerHeight + window.scrollMaxY
	: (d.body.scrollHeight > d.body.offsetHeight) ? d.body.scrollHeight
	: d.body.offsetHeight;
	var updated = this.win.update();
	if (w < this.win.w) w = this.win.w;
	if (h < this.win.h) h = this.win.h;
	if (updated || w != this.w || h != this.h)
	{
		this.w = w;
		this.h = h;
		return true;
	}
	return false;
};
function PagePos()
{ // page position object
	this.x = 0;
	this.y = 0;
	return this;
}
PagePos.prototype.update = function()
{
	var d = document;
	var x =
	  (window.pageXOffset) ? window.pageXOffset
	: (d.documentElement && d.documentElement.scrollLeft) ? d.documentElement.scrollLeft
	: (d.body) ? d.body.scrollLeft
	: 0;
	var y =
	  (window.pageYOffset) ? window.pageYOffset
	: (d.documentElement && d.documentElement.scrollTop) ? d.documentElement.scrollTop
	: (d.body) ? d.body.scrollTop
	: 0;
	if (x != this.x || y != this.y)
	{
		this.x = x;
		this.y = y;
		return true;
	}
	return false;
};



