var clsCommon = Class.create();

clsCommon.prototype = {
	initialize: function() {
		
		this.inShowLoading = Array();				//ローディング中エレメント配列
		this.inModalEvent = Array();				//モーダルメソッド
		
		this.max_zIndex = 999;						//最大深度
		
		this.hideElement =  new Object();			//非表示エレメントリスト
		
		this.referComp =  new Object();					//コンポーネント参照元
		
		this.popup = null;
		
	},
	showModal: function(event, el, loading_flag) {
		//var offset = 17;
		el = (event == undefined || event == null) ? el : this;
	
		//var w = (window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth || 0);
		//var h = (window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || 0);
		var scroll_left = (document.documentElement.scrollLeft || document.body.scrollLeft || 0);
		var scroll_top = (document.documentElement.scrollTop || document.body.scrollTop || 0);	
		var offset = 0;
		var w = Position.getWinOuterWidth();
		var h = Position.getWinOuterHeight();
		
		el.style.width =  (w + scroll_left - offset)  +"px";
		el.style.height =  (h + scroll_top - offset) +"px";
//el.style.border = "5px solid #000000";
		if(loading_flag) {
			el.style.backgroundColor = "#cccccc";
			Element.setStyle(el, {opacity:0.2});
		}
		el.style.position = "absolute";
		el.style.left = "0px";
		el.style.top = "0px";
		
		if(event == undefined || (event.type != "scroll" && event.type != "resize")) {
			commonCls.max_zIndex = commonCls.max_zIndex + 1;
			el.style.zIndex = commonCls.max_zIndex;
		
			commonCls.inModalEvent[el] = commonCls.showModal.bindAsEventListener(el);
			Event.observe(window,"scroll",commonCls.inModalEvent[el],false);
			Event.observe(window,"resize",commonCls.inModalEvent[el],false);
			if(browser.isIE) {
				var img_blank = document.createElement("img");
				img_blank.src = _js_url +"/images/blank.gif";
				el.appendChild(img_blank);
			}
		}
		
		if(browser.isIE) {
			if(img_blank==undefined) {
				var img_blank = Element.getChildElement(el);
			}
			img_blank.style.width = el.style.width;
			img_blank.style.height = el.style.height;
		}
	},
	stopModal: function(el) {
		Event.stopObserving(window,"scroll", commonCls.inModalEvent[el], false);
		Event.stopObserving(window,"resize",commonCls.inModalEvent[el],false);
		commonCls.inModalEvent[el] = null;
	},
	
	/* enterMode */
	blockNotice: function(event, el) {
		if(typeof pagesCls == 'undefined' || pagesCls.inMoveDrag)
			return false;
		if(typeof(Event.element) != 'undefined') {
			var el = (el == undefined) ? Event.element(event) : el;
			if(!Element.hasClassName(el,"entermode_notice"))Element.addClassName(el,"entermode_notice");
		}
	},
	blockNoticeEnd: function(event, el) {
		if(typeof(Event.element) != 'undefined') {
			var el = (el == undefined) ? Event.element(event) : el;
			if(Element.hasClassName(el,"entermode_notice"))Element.removeClassName(el,"entermode_notice");
		}
	},
	
	scrollMoveDrag: function(event, offset) {
		//スクロールバー移動
		//40pxづつ移動
		var offset = (offset == undefined) ? 40 : offset;
		
		Position.prepare();
		if(Event.pointerX(event) - Position.deltaX  > Position.getWinOuterWidth() - offset) {
			scrollTo(Position.deltaX + offset -10, Position.deltaY);
		}else if(Event.pointerX(event)  <= Position.deltaX + offset && Position.deltaX > 0) {
			scrollTo(Position.deltaX - offset, Position.deltaY);
		}
			
		if(Event.pointerY(event) - Position.deltaY  > Position.getWinOuterHeight() - offset) {
			scrollTo(Position.deltaX, Position.deltaY + offset);
		} else if(Event.pointerY(event)  <= Position.deltaY + offset && Position.deltaY > 0) {
			scrollTo(Position.deltaX, Position.deltaY - offset);
		}
	},
	
	/********************************/
	/*一般関数						*/
	/********************************/
	alert: function(str) {
		var re_html = new RegExp("^<!DOCTYPE html", 'i');
		if(str.match(re_html)) {
			document.write(str);
		} else {
			str = str.replace(/\\n/ig,"\n");
			str = str.replace(/(<br\/>|<br \/>|<br>)/ig,"\n");
			if(str != "") {
				alert(str);
			}
		}
	},
	confirm: function(str) {
		var re_html = new RegExp("^<!DOCTYPE html", 'i');
		if(str.match(re_html)) {
			document.write(str);
		} else {
			str = str.replace(/\\n/ig,"\n");
			str = str.replace(/(<br\/>|<br \/>|<br>)/ig,"\n");
			return confirm(str);
		}
	},
	//表示：非表示切り替え
	//TODO: table,tr,tdの場合、table, table-row, table-cellにしなければならないため、うまく動作しない
	displayChange: function(el) {
		el = $(el);
		var elestyle = el.style;
		if (elestyle.display != "none") {
			this.displayNone(el);
		} else {
			this.displayVisible(el);
		}
	},
	displayNone: function(el) {
		var elestyle = el.style;
		elestyle.display = "none";
		//Element.addClassName(el,"display-none");
	},
	displayVisible: function(el) {
		var elestyle = el.style;
		var display = "";										//block
		if (el.tagName == "TR") display = "";					//table-row
		else if (el.tagName == "TD") display = "";				//table-cell
		else if (el.tagName == "TABLE") display = "";			//table
		elestyle.display = display;
		//Element.removeClassName(el,"display-none");
		//designModeがonのものが含まれていたら、再度、off,on。再表示した際、offのようになるため
		if (!(browser.isIE || browser.isOpera || browser.isSafari)) {
			var iframeList = el.getElementsByTagName("iframe");
			for (var i = 0; i < iframeList.length; i++){
				if(iframeList[i].contentWindow.document.designMode == "on") {
					iframeList[i].contentWindow.document.designMode = "off";
					iframeList[i].contentWindow.document.designMode = "on";
				}
			}
		}
	},
	cellIndex: function(element) {
		if(browser.isSafari) {
			//safariがcellIndex未対応なため
			for (var i = 0; i < element.parentNode.childNodes.length; i++) {
				if(element.parentNode.childNodes[i] == element) {
					return i;
				}
			}
		} else {
			return element.cellIndex;
		}
		return 0;
	},
	
	getCenterPosition: function(target_el, position_el) {
		Position.prepare();
		var offset_target = new Object();
		offset_target[0] = 0;
		offset_target[1] = 0;
		if(position_el == undefined) {
			var w = Position.getWinOuterWidth() ;  //+ Position.deltaX;
			var h = Position.getWinOuterHeight() ; //+ Position.deltaY;
		} else {
			position_el = $(position_el);
			var w = position_el.offsetWidth;
			var h = position_el.offsetHeight;
			offset_target = Position.cumulativeOffset(position_el);
		}
		var position = new Object();
		position[0] = ((w - target_el.offsetWidth) / 2) + offset_target[0];
		position[1] = ((h - target_el.offsetHeight) / 2) + offset_target[1];
		if(position[0] < 0) {
			position[0] = 0;
		}
		if(position[1] < 0) {
			position[1] = 0;
		}
		return position;
	},
	/* 色取得一般メソッド */
	// RBG値から HSL値を取得
	getHSL : function(r, g, b)
	{
		var h,s,l,v,m;
		var r = r/255;
		var g = g/255;
		var b = b/255;
		v = Math.max(r, g), v = Math.max(v, b);
		m = Math.min(r, g), m = Math.min(m, b);
		l = (m+v)/2;
		if (v == m) var sl_s = 0, sl_l = Math.round(l*255),sl_h=0;
		else
		{
			if (l <= 0.5) s = (v-m)/(v+m);
			else s = (v-m)/(2-v-m);
			if (r == v) h = (g-b)/(v-m);
			if (g == v) h = 2+(b-r)/(v-m);
			if (b == v) h = 4+(r-g)/(v-m);
			h = h*60; if (h<0) h += 360;
			var sl_h = Math.round(h/360*255);
			var sl_s = Math.round(s*255);
			var sl_l = Math.round(l*255);
		}
		return { h : sl_h, s : sl_s , l : sl_l };
	},
	
	// HSL値から RBG値を取得
	getRBG : function(h, s, l)
	{
		var r, g, b, v, m, se, mid1, mid2;
		h = h/255, s = s/255, l = l/255;
		if (l <= 0.5) v = l*(1+s);
		else v = l+s-l*s;
		if (v <= 0) var sl_r = 0, sl_g = 0, sl_b = 0;
		else
		{
			var m = 2*l-v,h=h*6, se = Math.floor(h);
			var mid1 = m+v*(v-m)/v*(h-se);
			var mid2 = v-v*(v-m)/v*(h-se);
			switch (se)
			{
				case 0 : r = v;    g = mid1; b = m;    break;
				case 1 : r = mid2; g = v;    b = m;    break;
				case 2 : r = m;    g = v;    b = mid1; break;
				case 3 : r = m;    g = mid2; b = v;    break;
				case 4 : r = mid1; g = m;    b = v;    break;
				case 5 : r = v;    g = m;    b = mid2; break;
			}
			var sl_r = Math.round(r*255);
			var sl_g = Math.round(g*255);
			var sl_b = Math.round(b*255);
		}
		return { r : sl_r, g : sl_g , b : sl_b };
	},
	getRGBtoHex : function(color) {
		if ( color.indexOf('#') == 0 )
			color = color.substring(1);
		var red   = color.substring(0,2);
		var green = color.substring(2,4);
		var blue  = color.substring(4,6);
		return { r : parseInt(red,16), g : parseInt(green,16) , b : parseInt(blue,16) };
	},
	getHex : function(r, g, b)
	{
		var co = "#";
		if (r < 16) co = co+"0"; co = co+r.toString(16);
		if (g < 16) co = co+"0"; co = co+g.toString(16);
		if (b < 16) co = co+"0"; co = co+b.toString(16);
		return co;
	},
	colorCheck: function(event) {
		if(((event.ctrlKey && !event.altKey) || event.keyCode == 229  || event.keyCode == 46 || event.keyCode == 8 || 
			(event.keyCode >= 37 && event.keyCode <= 40) || event.keyCode == 9 || event.keyCode == 13 || 
			(event.keyCode >= 96 && event.keyCode <= 105) ||
			(event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 65 && event.keyCode <= 70)))
			return true;
		return false;
	},
	numberCheck: function(event) {
		if(((event.ctrlKey && !event.altKey) || event.keyCode == 229 || event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 13 || 
			(event.keyCode >= 96 && event.keyCode <= 105) ||
			(event.keyCode >= 37 && event.keyCode <= 40) || (!event.shiftKey && event.keyCode >= 48 && event.keyCode <= 57)))
			return true;
		return false;
	},
	numberConvert: function(event) {
		if(event.keyCode == 13 || event.type == "blur") {
			var event_el = Event.element(event);
			var num_value = event_el.value;
			var en_num = "0123456789.,-+";
			var em_num = "０１２３４５６７８９．，?＋";
			var str = "";
			for (var i=0; i< num_value.length; i++) {
				var c = num_value.charAt(i);
				var n = em_num.indexOf(c,0);
				var m = en_num.indexOf(c,0);
				if (n >= 0) {c = en_num.charAt(n);str += c;
				} else if (m >= 0) str += c;
			}
			if(num_value != str) event_el.value = str;
			return true;
		}
		return false;
	},
	getColorCode: function(el , property_name) {
		if(property_name == "borderTopColor" || property_name == "borderRightColor" ||
			property_name == "borderBottomColor" || property_name == "borderLeftColor") {
			var width = Element.getStyle(el, property_name.replace("Color","")+"Width");
			if(width == "" || width == "0px" || width == "0") {
				return "transparent";
			}
		}
		var rgb = Element.getStyle(el, property_name);
		if(rgb == undefined || rgb == null) {
			return "transparent";
		} else if (rgb.match("^rgb") && rgb != "transparent" && rgb.substr(0, 1) != "#") {
			rgb = rgb.substr(4, rgb.length - 5);
			var rgbArr = rgb.split(",");
			rgb = commonCls.getHex(parseInt(rgbArr[0]),parseInt(rgbArr[1]),parseInt(rgbArr[2]));
		} else if(rgb.substr(0, 1) != "#"){
			//windowtext等
			return "";
		}
		return rgb;
	},
	//safariの場合、parent.Event.observe等でエラーとなるのでメソッド化
	observe: function(element, name, observer, useCapture, top_el) {
		Event.observe(element, name, observer, useCapture, top_el);
	},
	stopObserving: function(element, name, observer, useCapture) {
		Event.stopObserving(element, name, observer, useCapture);
	},
	stop: function(event) {
		Event.stop(event);
	},
	setStyle: function(el, value) {
		Element.setStyle(el, value);
	},
	
	//popup login
	popupLogin: function(requesturi) {
 		var src = _js_url + "/modules/login/popup_login.php" + requesturi;
 		if(!this.popup) this.popup = new compPopup(document.body, "login");
 		//this.popup.allowTransparency = true;
 		this.popup.posCenter = true;
 		this.popup.showSrcPopup(src);
 	}
}
commonCls = new clsCommon();