/**
 * @name swfsize.js
 * @version 0.2.4
 * @date 2009-04-23
 * @revision 11
 */



/* SWFObjectのサイズ操作用クラス ---------------- */
function SWFSize(elm, minW, minH, maxW, maxH, marginW, marginH) {
	this.id = elm.getAttribute('id');
	this.minW = minW = (!minW) ? elm.getAttribute('width') : (minW == '*') ? false : minW;
	this.minH = minH = (!minH) ? elm.getAttribute('height') : (minH == '*') ? false : minH;
	this.maxW = maxW = (!maxW || maxW == '*') ? false : maxW;
	this.maxH = maxH = (!maxH || maxH == '*') ? false : maxH;
	this.marginW = marginW = (marginW) ? marginW : 0;
	this.marginH = marginH = (marginH) ? marginH : 0;
	this.options = { 'default': [minW, minH, maxW, maxH, marginW, marginH] }
	this.init();
}

SWFSize.prototype = {
	// 初期化
	init: function() {
		var self = this;
		this.addEvent(window, 'resize', function() { self.setSWFSize(); });
		this.setSWFSize();
	},

	// SWFObjectにサイズを設定
	setSWFSize: function() {
		if (!this.elm) this.elm = document.getElementById(this.id);
		var size = this.getSWFSize();
		this.elm.style.width = size.width;
		this.elm.style.height = size.height;
		this.setSWFPosition();
	},

	// SWFObjectにポジションを設定
	setSWFPosition: function() {
		var pos = this.getSWFPosition();
		this.elm.style.left = pos.left;
		this.elm.style.top = pos.top;
	},

	// SWFObjectに設定するサイズを算出
	getSWFSize: function(mode) {
		var minW = this.minW;
		var minH = this.minH;
		var maxW = this.maxW;
		var maxH = this.maxH;
		var win = this.getWindowSize();
		var w = win.width - this.marginW;
		var h = win.height - this.marginH;
		if (minW && w < minW) w = minW + 'px';
		else if (maxW && w > maxW) w = maxW + 'px';
		else w = '100%';
		if (minH && h < minH) h = minH + 'px';
		else if (maxH && h > maxH) h = maxH + 'px';
		else h = '100%';
		return (mode == 'w') ? w : (mode == 'h') ? h : { width: w, height: h }
	},

	// SWFObjectに設定するポジションを算出
	getSWFPosition: function() {
		var body = this.getSize(document.body);
		var elm = this.getSize(this.elm);
		var l = Math.floor((body.width - elm.width) / 2);
		var t = Math.floor((body.height - elm.height) / 2);
		if (l < 0) l = 0;
		if (t < 0) t = 0;
		return { left: l + 'px', top: t + 'px' }
	},

	// 制限サイズのオプションを追加
	addOption: function(key, minW, minH, maxW, maxH, marginW, marginH) {
		this.options[key] = [minW, minH, maxW, maxH, marginW, marginH];
	},

	// SWFObjectの制限サイズにオプションを設定
	setOption: function(key) {
		var option = this.options[key];
		this.setLimits(option[0], option[1], option[2], option[3], option[4], option[5]);
		this.setSWFSize();
	},

	// SWFObjectの制限サイズを設定
	setLimits: function(minW, minH, maxW, maxH, marginW, marginH) {
		this.minW = (!minW) ? this.minW : (minW == '*') ? false : minW;
		this.minH = (!minH) ? this.minH : (minH == '*') ? false : minH;
		this.maxW = (!maxW) ? this.maxW : (maxW == '*') ? false : maxW;
		this.maxH = (!maxH) ? this.maxH : (maxH == '*') ? false : maxH;
		this.marginW = (marginW) ? marginW : this.marginW;
		this.marginH = (marginH) ? marginH : this.marginH;
	},

	// サイズを取得
	getSize: function(elm, mode) {
		var w = elm.offsetWidth || elm.clientWidth || 0;
		var h = elm.offsetHeight || elm.clientHeight || 0;
		return (mode == 'w') ? w : (mode == 'h') ? h : { width: w, height: h };
	},

	// ウインドウサイズを取得
	getWindowSize: function(mode) {
		var win = window;
		var d = document;
		var w = win.innerWidth || d.documentElement.clientWidth || d.body.clientWidth || 0;
		var h = win.innerHeight || d.documentElement.clientHeight || d.body.clientHeight || 0;
		return (mode == 'w') ? w : (mode == 'h') ? h : { width: w, height: h };
	},

	// イベントを追加
	addEvent: function(elm, ev, fn, capt) {
		if (elm.addEventListener) {// Fx, Sf, Op, Ns
			if (!capt) capt = false;
			elm.addEventListener(ev, fn, capt);
			return true;
		} else if (elm.attachEvent) {// Win IE
			return elm.attachEvent('on' + ev, fn);
		} else {// Mac IE
			var handler = elm['on' + ev];
			if (typeof handler != 'function') {
				handler = function(e) { fn(e); }
			} else {
				var temp = handler;
				handler = function(e) {
					temp(e);
					fn(e);
				}
			}
			return true;
		}
	}
}







