﻿/**************************************************
 *
 *	@name			func.js
 *	@facility		値の取得・基本処理
 *	@created date	2008/05/02
 *	@copyright (c) 2008 COCONOE inc.
 *
 *	[更新履歴]
 *	@v1.0		:	2008/05/02	:	値の取得・基本処理用に独立させました
 *	@v1.1		:	2008/05/14	:	frameScrollをX軸,Y軸の両用に修正
 *	@v1.2		:	2008/05/15	:	frameScrollのバグ修正
 *	@v1.3		:	2008/05/15	:	さらにframeScrollのバグ修正
 *	@v1.4		:	2008/05/16	:	・getDocumentAreaの追加
 *									・frameScrollの修正
 *	@v1.5		:	2008/07/24	:	scrollWidth, scrollHeight, clientWidth, clientHeightの修正
 *	@v1.6		:	2008/07/28	:	getWinFromUrlの追加
 *	@v1.7		:	2008/11/14	:	addOnresizeEventの追加
 *	@v1.71		:	2008/12/22	:	スリム化
 *	@v1.8		:	2010/01/12	:	・addFunctionToElementでイベント関連を汎用化
 *									・encodeURICompの追加
 *	@v1.9		:	2010/02/04	:	getAbsolutePosの追加
 *
 **************************************************/
var VER				= 1.8;
var SN				= "201101140109";

var nUserAgent		= navigator.userAgent;
var nAppVersion		= navigator.appVersion;
var nAppName		= navigator.appName;
var nMimeTypes		= navigator.mimeTypes;

var IE				= '\v'=='v';
var OPERA			= (nUserAgent.indexOf("Opera", 0) != -1);
var FIREFOX			= /a/[-1]=='a';
var SAFARI			= /a/.__proto__=='//';
var CHROME			= (nUserAgent.indexOf("Chrome", 0) != -1);
var WIN				= (nUserAgent.indexOf("Win", 0) != -1);
var MAC				= (nUserAgent.indexOf("Mac", 0) != -1);

var HOST_NAME		= location.host;
var URL				= document.URL;
var REFERRER		= document.referrer;

var IE_VER			= parseInt( nUserAgent.substring( nUserAgent.indexOf( "MSIE", 0 ) + 5, nUserAgent.indexOf( ";", nUserAgent.indexOf( "MSIE", 0 ))));

var LOCAL			= document.URL.match(/(?:localhost|192\.168)/) ? 1 : 0;
var ROOT_PATH;

var tmpNodes = document.getElementsByTagName( 'script' );

for ( var i = 0, l = tmpNodes.length; i < l; i++ )
{
	if ( tmpNodes[i].src.indexOf( 'func.js' ) != -1 )
	{
		ROOT_PATH = tmpNodes[i].src.substr( 0, tmpNodes[i].src.indexOf( '/js/func.js' ) );
		break;
	}
}

/**************************************************
 *	hide div area
 **************************************************/
function hideArea(id)
{
	if(document.getElementById(id))
	{
		document.getElementById(id).style.display = "none";
		document.getElementById(id).style.visibility = "hidden";
	}
}

/**************************************************
 *	show div area
 **************************************************/
function showArea(id)
{
	if(document.getElementById(id))
	{
		document.getElementById(id).style.display = "block";
		document.getElementById(id).style.visibility = "visible";
	}
}

/**************************************************
 *	get document area
 **************************************************/
function getDocumentArea()
{
	return {
		w: getDocumentWidth(),
		h: getDocumentHeight()
	}
}

/**************************************************
 *	get width of document
 **************************************************/
function getDocumentWidth()
{
	val = [
		document.documentElement.scrollWidth ? document.documentElement.scrollWidth : 0,
		document.body.scrollWidth ? document.body.scrollWidth : 0
	]
	return Math.max(val[0], val[1]);
}

/**************************************************
 *	get height of document
 **************************************************/
function getDocumentHeight()
{
	val = [
		document.documentElement.scrollHeight ? document.documentElement.scrollHeight : 0,
		document.body.scrollHeight ? document.body.scrollHeight : 0
	]
	return Math.max(val[0], val[1]);
}

/**************************************************
 *	get viewport area
 **************************************************/
function getViewportArea()
{
	return {
		x: document.body.scrollLeft || document.documentElement.scrollLeft,
		y: document.body.scrollTop  || document.documentElement.scrollTop,
		w: getViewportWidth(),
		h: getViewportHeight()
	}
}

/**************************************************
 *	get width of browser's viewport
 **************************************************/
function getViewportWidth()
{
	val = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth;
	return val;
}

/**************************************************
 *	get height of browser's viewport
 **************************************************/
function getViewportHeight()
{
	val = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight;
	return val;
}

/**************************************************
 *	add to window.onload
 **************************************************/
function addOnloadEvent(func)
{
	addFunctionToElement( window, "onload", func );
}

/**************************************************
 *
 *	add to window.onresize
 *
 **************************************************/
function addOnresizeEvent( func )
{
	addFunctionToElement( window, "onresize", func );
}

function addFunctionToElement( elm, prop, func )
{
	var oldFunc = elm[ prop ];
	
	if ( typeof oldFunc != 'function' )
	{
		elm[ prop ] = function()
		{
			return func.apply( elm );
		}
	}
	else
	{
		elm[ prop ] = function()
		{
			oldFunc();
			return func.apply( elm );
		}
	}
}

/**************************************************
 *
 *	get Domain from URL
 *
 **************************************************/
function getWinFromUrl(url)
{
	var domain = url;
	domain = domain.replace(/^(http|https):\/\/([^\/]+)/ig, '$2');
	domain = domain.replace(/\?[\S]+$/, '');
	domain = domain.replace(/\.|-|\//ig, '');
	return domain;
}

/**************************************************
 *
 *	GET COOKIE
 *
 *	@param	cookie name
 *
 **************************************************/
function getCookie( name )
{
	var arg		= name + '=';
	var alen	= arg.length;
	var clen	= document.cookie.length;
	
	var i = 0;
	
	while (i < clen)
	{
		var j = i + alen;
		if ( document.cookie.substring( i, j ) == arg ) return getCookieVal( j );
		i = document.cookie.indexOf( ' ', i ) + 1;
		if ( i == 0 ) break;
	}
	
	return undefined;
}

function getCookieVal( offset )
{
	var endstr = document.cookie.indexOf( ';', offset );
	if ( endstr == -1 ) endstr = document.cookie.length;
	return unescape( document.cookie.substring( offset, endstr ));
}

/**************************************************
 *
 *	SET COOKIE
 *
 *	@param	cookie name
 *	@param	cookie value
 *	@param	cookie expires period (sec)
 *	@param	cookie path ex) /, /hoge
 *
 **************************************************/
function setCookie( name, value, period, path )
{
	var cookieExpires	= ''
	var cookiePath		= '';
	
	if ( period )
	{
		var d = new Date();
		d.setTime( d.getTime() + period ); 
		cookieExpires = '; expires=' + d.toGMTString();;
	}
	
	if ( path )
	{
		cookiePath = '; path=' + path;
	}

	document.cookie = name + '=' + escape( value ) + cookieExpires + cookiePath + ';';
}

/**************************************************
 *
 *	encodeURIComp ( only UTF-8 )
 *
 **************************************************/
function encodeURIComp( str )
{
	if(!str) return "";

	var s0, i, s, u;
	s0 = "";				// encoded str
	
	for (i = 0; i < str.length; i++){   // scan the source
		s = str.charAt(i);
		u = str.charCodeAt(i);		  // get unicode of the char
		if (s == " "){s0 += "+";}	   // SP should be converted to "+"
		else {
			if ( u == 0x2a || u == 0x2d || u == 0x2e || u == 0x5f || ((u >= 0x30) && (u <= 0x39)) || ((u >= 0x41) && (u <= 0x5a)) || ((u >= 0x61) && (u <= 0x7a))){	   // check for escape
				s0 = s0 + s;			// don't escape
			}
			else {				  // escape
				if ((u >= 0x0) && (u <= 0x7f)){	 // single byte format
					s = "0"+u.toString(16);
					s0 += "%"+ s.substr(s.length-2);
				}
				else if (u > 0x1fffff){	 // quaternary byte format (extended)
					s0 += "%" + (oxf0 + ((u & 0x1c0000) >> 18)).toString(16);
					s0 += "%" + (0x80 + ((u & 0x3f000) >> 12)).toString(16);
					s0 += "%" + (0x80 + ((u & 0xfc0) >> 6)).toString(16);
					s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
				}
				else if (u > 0x7ff){		// triple byte format
					s0 += "%" + (0xe0 + ((u & 0xf000) >> 12)).toString(16);
					s0 += "%" + (0x80 + ((u & 0xfc0) >> 6)).toString(16);
					s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
				}
				else {					  // double byte format
					s0 += "%" + (0xc0 + ((u & 0x7c0) >> 6)).toString(16);
					s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
				}
			}
		}
	}
	return s0;
}

/**************************************************
 *
 *	Digit
 *
 **************************************************/
function digit( num, keta )
{
	if ( keta == undefined )
	{
		keta = 2;
	}
	
	num = num + "";
	
	while( num.length <= keta - 1 )
	{
		num = "0" + num;
	}
	
	return num;
}

function removeUnit( arg )
{
	arg = arg.replace(/(?:px|em|pt)$/, '');
	
	return arg;
}

/**************************************************
 *
 * 絶対位置の取得
 *
**************************************************/
function getAbsolutePos( elm )
{
	var xx = 0, yy = 0;
	
	while ( elm )
	{
		xx += elm.offsetLeft || 0;
		yy += elm.offsetTop || 0;
		elm = elm.offsetParent;
	};
	
	return { x:xx, y:yy };
};

function em2px( val, base )
{
	if ( val.indexOf( 'em' ))
	{
		val = removeUnit( val );
		val *= base;
	}
	
	return val;
}

/**************************************************
 *
 *	入力したキーを取得
 *
 **************************************************/
function getPressedChar(event)
{
	var code = 0;
	
	// Firefox, Safari control code
	if ( event.charCode === 0 )
	{
		code = 0;
	}
	// Firefox
	else if ( !event.keyCode && event.charCode )
	{
		code = event.charCode;
	}
	// IE
	else if ( event.keyCode && !event.charCode )
	{
		code = event.keyCode;
	}
	// Safari
	else if ( event.keyCode == event.charCode )
	{
		code = event.keyCode;
	}
	
	// ASCII文字の範囲内
	if ( 32 <= code && code <= 126 )
	{
		return String.fromCharCode( code );
	}
	else
	{
		return null;
	}
}

/**************************************************
 *
 *	for Debug
 *
 **************************************************/
function showAllValue( obj, cond )
{
	var out = '';
	var condReg = new RegExp( cond, "i" );
	
	for ( var key in obj )
	{
		if( !cond || ( cond && key.match( condReg )) || ( cond && (obj[ key ]+"").match( condReg )))
		{
			out += "[" + key + "] -> " + obj[ key ] + "\n";
		}
	}
	
	alert( out );
}

