// trunc.js

Element.implement({
	'forceRerendering': function(){
		try {
			var n = document.createTextNode(' ');
			this.appendChild(n);
			this.removeChild(n);
		} catch (e) {
		}
		return this;
	}
});

//// define
if(typeof trunc == 'undefined') trunc = {};
trunc.XHRURL = '/if/';
trunc.GADGETURL = 'sandbox.trunc.jp/if/';

String.prototype.trim = function() {
	return this.replace(/^[　 \t\n\r\0\x0b]+|[　 \t\n\r\0\x0b]+$/g, '');
};

String.prototype.escapeHtml = function() {
	return this.replace(/&/, '&amp;').replace(/"/, '&quot;').replace(/'/, '&#039;').replace(/</, '&lt;').replace(/>/, '&gt;');
}

Number.prototype.toZeroFormat = function(digit) {
	var padding = '';
	for(var l=digit;l>0;l--) padding += "0";
	var ret = (padding+this.toString());
	return ret.substring(ret.length-digit);
}

//// tools
trunc.browser = {
	isFirefox: false,
	isIE: false,
	isMozilla: false,
	isOpera: false,
	isSafari: false,
	platform: ((navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()),
	canUseFlashWmode: false,
	version: 0
};

var ua = navigator.userAgent.toLowerCase();
if(window.opera) {
	// opera
	trunc.browser.isOpera = true;
	trunc.browser.version =  (document.getElementsByClassName) ? 950 : 925;
}else if(window.ActiveXObject) {
	// IE
	trunc.browser.isIE = true;
	trunc.browser.version = 6; // IE6以下は考慮しない

	if(typeof document.documentElement.style.msInterpolationMode != "undefined") trunc.browser.version = 7;
	else if (document.querySelectorAll) trunc.browser.version = 8;
}else if(!navigator.taintEnabled) {
	// safari
	trunc.browser.isSafari = true;
	trunc.browser.version = 2;
	// safari3
	if(ua.indexOf('applewebkit/5')) trunc.browser.version = 3;
}else if(document.getBoxObjectFor != null) {
	trunc.browser.isMozilla = true;
	trunc.browser.version = 2;
	if(document.getElementsByClassName) trunc.browser.version = 3;
}

trunc.browser.canUseFlashWmode = true;
//!(trunc.browser.version<=2 && trunc.browser.isMozilla) && !(trunc.browser.isWindows && trunc.browser.isSafari);

// ブラウザ別Hack
if(typeof console == 'undefined') console = {};
if (typeof console.log == 'undefined') {
	if(trunc.browser.isOpera) console.log = opera.postError;
	else console.log = function(msg){};
}
/** hack **/
if(window.ActiveXObject&&!window.XMLHttpRequest)try{document.execCommand("BackgroundImageCache",false,true);}catch(e){};

trunc.ColorPalette = new Class({
	
});

trunc.forceRerendering = function(element) {
  try {
    element = $(element);
    var n = document.createTextNode(' ');
    element.appendChild(n);
    element.removeChild(n);
  } catch(e) {}
};

/**
 * オーバーレイUIのベースクラス
 */
trunc.overlay = new Class({
	insertDialog: null,
	opacity: 0.5,
	initialize: function() {
		this.overlay = new Element('div', {'class': 'overlay'}).inject(document.body);
		trunc.overlay.zIndex += 10;
		this.overlay.setStyle('z-index', trunc.overlay.zIndex);
		
		this.overlayForm = $('overlayForm').clone();
		this.overlayForm = this.overlayForm.inject('trunc');
		trunc.overlay.zIndex += 10;
		this.overlayForm.setStyle('z-index', trunc.overlay.zIndex);
		
		this.insertDialog = null;
		this.resizeHandler = this.resize.bindWithEvent(this);
		window.addEvent('resize', this.resizeHandler);
	},
	resize: function() {
		var size = window.getSize();
		var scrollsize = window.getScrollSize();
		var scrollposition = window.getScroll();
		this.overlay.setStyle('width', size.x).setStyle('height', scrollsize.y).setOpacity(this.opacity);
		this.overlayForm.setStyle('left', ((size.x-this.overlayForm.offsetWidth)/2)+'px').setStyle('top', (scrollposition.y+(size.y-this.overlayForm.offsetHeight)/2)+'px');
	},
	start: function(opacity) {
		if(typeof opacity=='undefined') this.opacity = 0.5;
		else this.opacity = opacity;
		this.overlay.setOpacity(this.opacity);
		this.overlay.setStyle('display', '');
		
		this.overlayForm.setStyle('display', '');
		this.resize();
		if(this.focus) this.overlayForm.getElement('.overlayFormButton'+this.focus).focus();
	},
	end: function() {
		window.removeEvent('resize', this.resizeHandler);
		this.overlayForm.destroy();
		this.overlay.destroy();
	},
	setForm: function(text, button1, button2, focus) {
		this.overlayForm.getElement('h2').set('text', text);
		this.overlayForm.getElement('.overlayFormButton1').value = button1;
		
		if (!button2) 
			this.overlayForm.getElement('.overlayFormButton2').setStyle('display', 'none');
		else {
			this.overlayForm.getElement('.overlayFormButton2').setStyle('display', '');
			this.overlayForm.getElement('.overlayFormButton2').value = button2;
		}
		
		this.overlayForm.getElement('.overlayFormButton1').setStyle('font-weight', 'normal');
		this.overlayForm.getElement('.overlayFormButton2').setStyle('font-weight', 'normal');
		
		this.focus = focus || 1;
		this.overlayForm.getElement('.overlayFormButton'+this.focus).setStyle('font-weight', 'bold');
	},
	
	//ダイアログに表示内容をinject
	setCustomDialog: function(insert) {
		//配列、配列ではない場合で処理を分岐
		if (!trunc.isArray(insert)) {
			$(insert).inject(this.overlayForm.getElement('.alertFormBox'), 'before');
			this.insertDialog = insert;
		} else {
			for (var i=0;i<insert.length; i++){
				$(insert[i]).inject(this.overlayForm.getElement('.alertFormBox'), 'before');
				
			}
			this.insertDialog = insert;
		}
	},
	hook: function(callback) {
		var mastercallback = function(event) {
			this.overlayForm.getElement('.overlayFormButton1').removeEvents();
			this.overlayForm.getElement('.overlayFormButton2').removeEvents(); //壁紙などの設定処理も入るのでEvent -> Eventsに変更
			
			if(event.target==this.overlayForm.getElement('.overlayFormButton1')) callback(1);
			else callback(2);
		}.bindWithEvent(this);
		
		this.overlayForm.getElement('.overlayFormButton1').addEvent('click', mastercallback);
		this.overlayForm.getElement('.overlayFormButton2').addEvent('click', mastercallback)
	}
});
trunc.overlay.zIndex = 5000;

trunc.isArray = function(v) {
	return !(!v || (!v.length || v.length == 0) || typeof v !== 'object' || !v.constructor || v.nodeType || v.item);
};

trunc.alert = function(msg){
	var overlay = new trunc.overlay(); 
	overlay.setForm(msg, 'OK');
	overlay.start();
	overlay.hook( function() {
		overlay.end();
	});
};

trunc.confirm = function(msg, func) {
	var overlay = new trunc.overlay(); 
	overlay.setForm(msg, 'はい', 'いいえ', 1);
	overlay.start();
	overlay.hook( function(ret) {
		overlay.end();
		func(ret==1);
	});
}

trunc.getFormdata = function(target) {
	var ret = {};
	target.getElements('input, select, textarea').each(function(elem) {
		if(elem.name=='') return;
		switch (elem.type||'') {
		case 'radio':
			if (elem.checked) ret[elem.name] = elem.value; 
			break;
		
		case 'checkbox':
			if (!ret[elem.name]) ret[elem.name] = [];
			if (elem.checked) {
				ret[elem.name].push(elem.value);
			}
			break;
		
		case 'select-multiple':
			ret[elem.name] = [];
			$each(elem.options, function(v){
				if(v.selected) ret[elem.name].push(v.value);
			});
			break;
		
		case 'select-one':
			ret[elem.name] = elem.options[elem.selectedIndex].value;
			break;
		
		case 'text':
		case 'password':
		case 'hidden':
		default:
			if (elem.tagName.toLowerCase() == 'textarea') {
				ret[elem.name] = elem.value.split("\n");
			} else {
				ret[elem.name] = elem.value;
			}
			break;
		}
	});
	return ret;
}

trunc.setFormdata = function(target, data){
	if (!data || !data.name) return;
	var forms = target[data.name];
	if(!forms) return;
	if(!forms[0]) forms = [ forms ];
	for (var i = 0; i < forms.length; i++) {
		var elem = forms[i];
		switch (elem.type) {
		case 'radio':
			if(elem.value == data.value) elem.checked = true; 
			break;
			
		case 'checkbox':
			if( data.value.split(/[^\\]|/).indexOf(elem.value) != -1 )
				elem.checked = true;
			else
				elem.checked = false;
			break;
		
		case 'select-multiple':
			var sdata = data.value.split(/[^\\]|/);
			$each(elem.options, function(v) {
				if(sdata.indexOf(v.value)!=-1) v.selected = true;
				else v.selected = false;
			});
			break;
			
		case 'select-one':
			if( elem.options[elem.selectedIndex].value == data.value ) elem.options[elem.selectedIndex].selected = true;
			else elem.options[elem.selectedIndex].selected = false;
			break;
			
		case 'text':
		case 'password':
		case 'hidden':
		default:
			if (elem.tagName.toLowerCase() == 'textarea') {
				elem.value = data.value.join("\n");
			}else{
				elem.value = data.value;
			}
			break;
		}
	}
}

////########### 本体ここから

// すべてのデータ表示を管理するクラス
Screen = {
	model: null,
	tabGhorst: null,
	sortable: null,
	initializeFlag: false,
	tabRenameBox: null,
	/// 初期化
	initialize: function() {
		Screen.startPing();
		Screen.getScreen();
		
		$('addTab').addEvent('click', this.createTab.bind(this));
		var tabghorst = new Element('li', {'id':'tabghorst', 'styles': {'display':'none'}});
		$('tabbox').appendChild(tabghorst);
		
		$('gadgetList').setStyle('display', 'none');
		$('toggleGadgetList').addEvent('click', function() {
				if($('gadgetList').getStyle('display')=='none') {
					$('gadgetList').setStyle('display', '');
					$('toggleGadgetButton').src = $('toggleGadgetButton').src.replace(/toggleGadget/,"closeToggleGadget");
					$('toggleGadgetList').removeChild($('toggleGadgetButton').nextSibling);
					$('toggleGadgetList').appendText("ガジェットの追加を閉じる");
					ScreenGadgetList.firstAccress();
				} else {
					$('gadgetList').setStyle('display', 'none');
					$('toggleGadgetButton').src = $('toggleGadgetButton').src.replace(/closeToggleGadget/,"toggleGadget");
					$('toggleGadgetList').removeChild($('toggleGadgetButton').nextSibling);
					$('toggleGadgetList').appendText("ガジェットの追加");
				}
				trunc.forceRerendering($('main'));
		});

		$('closeGadgetList').addEvent('click', function(e){
			e.stop();
			$('gadgetList').setStyle('display', 'none');
			$('toggleGadgetButton').src = $('toggleGadgetButton').src.replace(/closeToggleGadget/,"toggleGadget");
			$('toggleGadgetList').removeChild($('toggleGadgetButton').nextSibling);
			$('toggleGadgetList').appendText("ガジェットの追加");
			trunc.forceRerendering($('main'));
		});
		
		Screen.tabRenameBox = new Fx.Slide('tabrenamebox').hide();
		$('tabrenamecancel').addEvent('click', function(e){
			e.stop();
			Screen.tabRenameBox.slideOut();
			return false;
		}.bindWithEvent(this));
		
		Screen.tabSettingBox = new Fx.Slide('tabsettingbox').hide();
		$('tabsettingcancel').addEvent('click', function(e){
			e.stop();
			Screen.tabSettingBox.slideOut();
			return false;
		}.bindWithEvent(this));
		
		window.addEvent('resize', this.onResize.bindWithEvent(this));
		
		/// タブ周り
		$('tabScrollLeft').addEvent('click', function(e) {
			e.stop();
			Screen.scrollTabbox(200);
		});
		$('tabScrollRight').addEvent('click', function(e) {
			e.stop();
			Screen.scrollTabbox(-200);
		});
		
		$('tabScrollLeft').addEvent('mouseover', function(e) {
			e.stop();
			Screen.scrollTabbox(false, true);
			$(e.target).addEvent('mouseout', function(e) {
				e.stop();
				Screen.tabScrollTween.cancel();
				$(e.target).removeEvent('mouseout', arguments.callee);
			});
		});
		$('tabScrollRight').addEvent('mouseover', function(e) {
			e.stop();
			Screen.scrollTabbox(false, false);
			$(e.target).addEvent('mouseout', function(e) {
				e.stop();
				Screen.tabScrollTween.cancel();
				$(e.target).removeEvent('mouseout', arguments.callee);
			});
		});
		
		$('logout').addEvent('click', function(e){
			e.stop();
			new Request({
			url: trunc.XHRURL+'Auth.php',
				method: 'get',
				data: {
					method: 'logout'
				},
				onComplete: function() {
					document.location.reload();
				},
				async: false
			}).send();
		});
		
		var evn = function(){
			// Opera 9.5以前対策
			// Windowサイズ以上のタブがあるとレンダリングが正しく行えない問題を回避するために
			// 強制的にTweenの時にレンダリングしなおす
			if (trunc.browser.isOpera && trunc.browser.version < 950) {
				$$('#tabbox li .tabtitle').forceRerendering();
			}
		};
		this.tabScrollTween = new Fx.Tween(
			$('tabbox_scroller'), 
			{
				'transition': Fx.Transitions.linear, 
				'duration': 'long',
				onCancel: evn,
				onComplete: evn
			});
		ScreenGadgetList.initialize();
		InfoDisplay.initialize.delay(0, InfoDisplay);
	},
	/// 指定したインデックスに対応するタブを取得する
	getTab: function(index) {
		var tabid = Screen.model.tabIDs[index];
		return (!tabid)? false: Screen.model.tabs[tabid];
	},
	/// 指定したタブIDを元にタブを取得する
	getTabByID: function(tabid) {
		return Screen.model.tabs[tabid];
	},
	/// 現在選択中のタブを取得する
	getCurrentTab: function() {
		return Screen.model.tabs[Screen.model.currentTabID];
	},
	/// このセッションに割り当てられたUIDを取得する
	getUID: function() {
		return Screen.model.uid;
	},
	/// このスクリーンに対応したモジュールを取得する
	getModel: function() {
		return Screen.model;
	},
	/// タブを作成する
	createTab: function() {
		new Request({
			url: trunc.XHRURL+'Screen.php',
			method: 'get',
			data: {
				method: 'createTab',
				'uid': trunc.uid
			},
			onComplete: this.onCreateTab
		}).send();
	},
	/// タブを削除する
	deleteTab: function(tid) {
		new Request({
			url: trunc.XHRURL+'Screen.php',
			method: 'get',
			data: {
				method: 'deleteTab',
				'tid': tid
			}
		}).send();
	},
	tabMove: function(srcIndex, destIndex) {
		srcIndex--;
		destIndex--;
		var tabdata = Screen.model.tabIDs[srcIndex];
		var tmptabs = Screen.model.tabIDs.erase(tabdata);
		if(srcIndex < destIndex) destIndex--;
		var newtabs = [];
		if(destIndex!=0) newtabs = tmptabs.slice(0, destIndex)
		newtabs = newtabs.concat([tabdata]);
		if(destIndex<tmptabs.length) newtabs = newtabs.concat(tmptabs.slice(destIndex, tmptabs.length-destIndex)); 
		Screen.model.tabIDs = newtabs;
	},
	resizeTabbox: function() {
		var size = window.getSize();
		var tabscrollbuttonWidth = $('tabScrollLeft').getSize().x + $('tabScrollRight').getSize().x;
		var limitx = (size.x-tabscrollbuttonWidth);
		$('tabbox_wrapper').setStyle('width', limitx+'px');
		
		if(this.model && this.model.currentTabID) {
			var ct = this.getCurrentTab();
			if(!ct) return;
			var tabsize = ct.element.getCoordinates();
			var tableft = tabsize.left;
			if(tableft<0) {
				this.scrollTabbox((tableft)*-1);
			}else{
				var tabright = tabsize.right;
				
				if(tabright > limitx) {
					this.scrollTabbox(limitx-tabright);
				}else{
					var tabs = $$('.tab');
					var tabmargin = parseInt(tabs[0].getStyle('margin-left')) + parseInt(tabs[0].getStyle('margin-right'));  
					tabs.each(function(v){
						limitx -= v.offsetWidth + tabmargin; 
					});
					if (limitx > 0) {
						Screen.tabScrollTween.cancel();
						Screen.tabScrollTween.start('left','0px');
					}
				}
			}
		}
	},
	scrollTabbox: function(pos, toTop) {
		var left = parseInt($('tabbox_scroller').style.left) || 0;
		if(pos!=false) left += pos;
		else if(toTop) left = 0;
		else left = -100000000;
		var tabscrollbuttonWidth = $('tabScrollLeft').getSize().x + $('tabScrollRight').getSize().x;
		var limitx = (document.getSize().x-tabscrollbuttonWidth);
		var tabs = $$('.tab');
		
		var tabmargin = parseInt(tabs[0].getStyle('margin-left')) + parseInt(tabs[0].getStyle('margin-right'));  
		tabs.each(function(v){
			limitx -= v.offsetWidth + tabmargin; 
		});
		if(limitx>0) limitx = 0;
		if(left>0) left = 0;
		else if(left<limitx) left = limitx;
		
		Screen.tabScrollTween.cancel();
		Screen.tabScrollTween.start('left',left+'px');
	},
	/// スクリーンデータを取得する
	getScreen: function() {
		new Request.JSON({
			url: trunc.XHRURL+'Screen.php',
			method: 'get',
			data: {
				method: 'getScreenModel',
				'uid': trunc.uid,
				'moreData': 'true'
			},
			onComplete : this.onGetScreen.bind(this)
		}).send();
	},
	repositionFooter: function() {
		var len = 0;
		var ct = this.getCurrentTab();
		if (ct) {
			var gadgets = ct.model.gadgets;
			if (gadgets) {
				gadgets.each(function(g){
					try {
						var m = g.element;
						if(!m) return;
						len = Math.max(len, m.getCoordinates('main').bottom);
					} catch (e) {
					}
				});
			}
		}
		len+=10;
		
		var maincontainer=$('main');
		
		var windowsize = document.getSize().y;
		var footer = $('footer');
		var documentsize = maincontainer.getPosition().y
			+ footer.getSize().y
			+ parseInt(footer.getStyle('border-top-width')||'0')
			+ parseInt(footer.getStyle('border-bottom-width')||'0');
			
		var pp = maincontainer.getParent();
		while (pp!=null) {
			documentsize += parseInt(pp.getStyle('padding-top')||'0');
			documentsize += parseInt(pp.getStyle('margin-top')||'0');
			documentsize += parseInt(pp.getStyle('border-top-width')||'0');
			pp = pp.getParent();
		}
		
		if(windowsize > documentsize+len) len = windowsize - documentsize;
		maincontainer.style.height = len+'px';
	},
	startPing: function() {
		Screen.timerID = Screen.ping.periodical(5*60*1000);
	},
	ping: function() {
		var req = new Request.JSON({
			url: trunc.XHRURL+'Screen.php',
			method: 'get',
			data: {
				method: 'ping'
			},
			onComplete: function(data){
				if( req.status == 0 ) return; // offline
				
				if (!data || !data.session_key) {
					$clear(Screen.timerID);
					document.location.reload();
				} else {
					Screen.model.session_key = data.session_key;
				}
			}
		}).send();
	},
	/// イベントハンドラ
	onCreateTab: function(res) {
		if(res.match(/^[45][0-9]{2} /)) return;
		var tab = new Tab();
		tab.getModel(res);
		Screen.model.tabs[res] = tab;
		Screen.model.tabIDs[Screen.model.tabIDs.length] = res;
		tab.element.fireEvent('click');
	},
	onGetScreen: function(res) {
		Screen.model = new ScreenModel(res);
		
		// nickname
		$('welcome').set('text', 'ようこそ、'+res.nickname+'さん');
		
		if(res.tabs) {
			Screen.model.tabs = $H({});
			$each(res.tabs, function(val){
				var tab = new Tab();
				tab.setModel(val);
				Screen.model.tabs[val.tid] = tab;
			});
		}else{
			$each(Screen.model.tabIDs, function(val,index){
				var tab = new Tab();
				tab.getModel(val);
				Screen.model.tabs[val] = tab;
			});
		}
		var current = Screen.model.tabs[Screen.model.currentTabID];
		if (typeof current == 'undefined' || !current) {
			current = Screen.model.tabs[Screen.model.tabIDs[0]];
			Screen.model.currentTabID = Screen.model.tabIDs[0];
		}
		current.onFocus();
		Screen.resizeTabbox.delay(100);
		Screen.repositionFooter();
		Screen.initializeFlag = true;
	},
	/// タブを選択されたときにタブ自身から呼び出される
	onSelectTab: function(tab) {
		if (!Screen.initializeFlag) {
			return true;
		}
		
		if (Screen.model.tabs[Screen.model.currentTabID] == tab) {
			return false;
		}
		
		if (Screen.model.currentTabID != '') {
			/// 前に選択されていたタブにイベントを送る
			var t = Screen.model.tabs[Screen.model.currentTabID];
			if (t) {
				t.onUnFocus();
			}
		}
		Screen.model.currentTabID = tab.getID();
		
		Screen.tabRenameBox.hide();
		Screen.tabSettingBox.hide();
		return true;
	},
	/// タブが閉じられた時に呼ばれる
	onCloseTab: function(target) {
		if (Screen.model.tabIDs.length <= 1) {
			trunc.alert("タブは一つ以上必要です。");
			return;
		} 
		
		trunc.confirm('タブ「'+target.model.tabname+'」を削除してもよろしいですか？', function(f) {
			if(!f) return;
			
			var targetid = target.model.tid;
			var targetkey = null;
			Screen.model.tabIDs.each( function(val,key){
				if(val==targetid) targetkey = key;
			});
			
			var nexttab = null;
			if (targetkey == 0) {
				nexttab = Screen.model.tabs[Screen.model.tabIDs[1]];
			}else{
				nexttab = Screen.model.tabs[Screen.model.tabIDs[targetkey-1]];
			}
			
			if(nexttab) nexttab.onFocus();
			
			Screen.deleteTab(target.getID());
			
			Screen.model.tabs = Screen.model.tabs.erase(target);
			if (targetkey == 0) {
				Screen.model.tabIDs.shift();
			}else{
				Screen.model.tabIDs = Screen.model.tabIDs.erase(targetid);
			}
			
			target.destroy();
		});
	},
	onResize: function(e) {
		e = new Event(e);
		e.stop();
		this.resizeTabbox();
		this.repositionFooter();
	}
};

ScreenModel = new Class({
	tabIDs: [],
	tabs: {},
	currentTabID: '',
	uid: '',
	showAddItem: false,
	showTabConfig: false,
	designSkin: '',
	designWallpaper: '',
	designWallpaperVisible: 0,
	session_key: '',
	initialize: function(option) {
		var option = $extend(this, option);
		
		this.tabIDs = option.tabIDs;
		this.tabs = $H(option.tabs);
		this.currentTabID = option.currentTabID;
		this.uid = option.uid;
		this.showAddItem = option.showAddItem;
		this.showTabConfig = option.showAddItem;
		
		this.designSkin = option.designSkin;
		this.designWallpaper = option.designWallpaper;
		this.designWallpaperVisible = option.visible;
		if (this.designSkin) {
			changeDesign.designName = this.designSkin;
			//Smarty上で切り替えるように変更したのでこの段階では変えない
			//changeDesign.change(changeDesign.designName);
		}
		
		//壁紙の設定
		if (this.designWallpaper) {
			changeDesign.imageUrl = this.designWallpaper;
			changeDesign.change(null, this.designWallpaperVisible);
		}
		this.session_key = option.session_key;
	}
});

ScreenSSLConnect = {
	initialized: false,
	initialize: function(){
		setTimeout( function() { aSSL.connect( trunc.XHRURL+'Encryption.php?method=initialize', this.onConnect.bind(this) ); }.bind(this), 0);
	},
	isInitialize: function(){
		return this.initialized;
	},
	onConnect: function(res){
		if (res && aSSL.connections['0'].sessionTimeout) this.initialized = true;
	},
	Request: function(attach, data, callback, async){
		async = async || true;
		if( !this.isInitialize() ) this.initialize();
		callback = callback || function(){};
		data = $H(data || {}).toQueryString();
		data = aSSL.encrypt( data );
		new Request({
			url: trunc.XHRURL+ 'Encryption.php?method=attach',
			method: 'post',
			'async': async,
			'data': {
				'attach': attach,
				'data': data
			},
			onComplete: callback
		}).send();
	}
};

/**
 * ガジェットリスト生成クラス
 */
ScreenGadgetList = {
	categoryData: null,
	gadgetListData: null,
	serviceData: null,
	serviceGadgetListData: null,
	feedData: null,
	feedGadgetListData: null,
	recommendData: null, 
	findFeedRequest: false,
	nowRequest: null,
	listlimit: 0,
	firstFlag: true,
	/**
	 * イニシャライズ(コンストラクタ)
	 */
	initialize: function() {
	 	// ～から探すリンクイベント生成
		var searchType = $$('#gadgetSearch a');
		searchType[0].addEvent('click', this.onSelectCategorySearch.bindWithEvent(this));
		searchType[1].addEvent('click', this.onSelectServiceSearch.bindWithEvent(this));
		searchType[2].addEvent('click', this.onSelectFeed.bindWithEvent(this));
		searchType[3].addEvent('click', this.onSelectAddFeed.bindWithEvent(this));
		
		this.resetColumn();
		
		this.tips = new Tips(null, {
			'className': 'tooltip'
		});
		
		$('gadgetList').addEvent('mouseleave', function(){
			this.tips.hide();
		}.bind(this));
		
		$('addFeedFormSubmit').addEvent( 'click', this.onFindFeed.bindWithEvent(this));
	},
	/**
	 * 「カテゴリから探す」リスト生成用のデータ取得
	 */
	getGadgetCategory: function() {
		if (this.categoryData != null) {
			this.createCategoryList();
			return;
		}
		ScreenGadgetList.resetRequest();
		ScreenGadgetList.nowRequest = new Request.JSON({
				url: trunc.XHRURL + 'GadgetList.php',
				method: 'get',
				data: {
					method: 'getCategory'
				},
				onSuccess: this.onGetGadgetCategory.bind(this)
			}).send();
	},
	/**
	 * 「サービスから探す」リスト生成用のデータ取得
	 */
	getGadgetService: function() {
		if(this.serviceData != null) {
			this.createServiceList();
			return;
		}
		ScreenGadgetList.resetRequest();
		ScreenGadgetList.nowRequest = new Request.JSON({
				url: trunc.XHRURL + 'GadgetList.php',
				method: 'get',
				data: {
					method: 'getServiceList'
				},
				onSuccess: this.onGetGadgetService.bind(this)
			}).send();	
	},
	/**
	 * 「フィードを探す」リスト生成用のデータ取得
	 */
	getFeedCategory: function() {
		if (this.feedData != null) {
			this.createFeedCategory();
			return;
		}
		ScreenGadgetList.resetRequest();
		ScreenGadgetList.nowRequest = new Request.JSON({
				url: trunc.XHRURL + 'GadgetList.php',
				method: 'get',
				data: {
					method: 'getFeedCategory'
				},
				onSuccess: this.onGetFeedCategory.bind(this)
			}).send();
	},
	/**
	 * 「おすすめガジェット」リスト生成用のデータ取得
	 */
	getGadgetRecommend: function() {
		if (this.recommendData != null) {
			this.createRecommendList();
			return;
		}
		ScreenGadgetList.resetRequest();
		ScreenGadgetList.nowRequest = new Request.JSON({
				url: trunc.XHRURL + 'GadgetList.php',
				method: 'get',
				data: {
					method: 'getRecommendedGadget'
				},
				onSuccess: this.onGetGadgetRecommend.bind(this)
			}).send();		
	},
	/**
	 * 「カテゴリから探す」リスト生成
	 */
	createCategoryList: function() {
		var target = $('parentCategory').getElement('div.contents ul');
		this.tips.detach(target.getElements('a'));
		target.set('html', '');
		var odd = true;
		this.categoryData.each(function(data, cid) {
			var options = {};
			if(odd) options['class'] = 'odd';
			var link = new Element('a',{'href': '#'}).set('text', data.name);
			link.addEvent('click', this.onSelectCategory.bindWithEvent(this, cid));
			var li = new Element('li', options);
			li.appendChild(link);
			target.appendChild(li);
			odd = !odd;
		}.bind(this));
	},
	/**
	 * 「カテゴリから探す」サブカテゴリリスト(サービス)生成
	 */
	createSubCategoryList: function(cid) {
		var target = $('subCategory').getElement('div.contents ul');
		this.tips.detach(target.getElements('a'));
		target.set('html', '');
		var categorydata = this.categoryData[cid];
		if(typeof categorydata == 'undefined' || !categorydata.subcategory) return;
		$each(categorydata.subcategory, function(data) {
			var link = new Element('a',{'href': '#', 'title': data.description}).set('text', data.name);
			link.addEvent('click', this.onSelectSubCategory.bindWithEvent(this, [cid, data.id]));
			var li = new Element('li');
			li.appendChild(link);
			target.appendChild(li);
			
			if(data.description) this.tips.attach(link);
		}.bind(this));
		
		return categorydata;
	},
	/**
	 * 「カテゴリから探す」ガジェットリスト生成
	 */
	createCategoryGadgetList: function(cid, sid, page) {
		page = page || 1;
		var limit = this.listlimit;
		if(!this.gadgetListData || !this.gadgetListData[cid] || !this.gadgetListData[cid][sid]  ) {
			ScreenGadgetList.resetRequest();
			ScreenGadgetList.nowRequest = new Request.JSON({
				url: trunc.XHRURL + 'GadgetList.php',
				method: 'get',
				data: {
					method: 'getGadgetList',
					'cid': cid,
					'sid': sid
				},
				onSuccess: function(res){ this.onGetGadgetList(cid, sid, page, res) }.bind(this)
			}).send();
			return;
		}
		
		
		var data = this.gadgetListData[cid][sid];
		var target = $('gadgets').getElement('ul');
		this.tips.detach(target.getElements('a'));
		target.set('html', '');
		var max = (page+this.listlimit-1)<data.count_max? (page+this.listlimit-1) : data.count_max;

		var loopfunc = function(val){
			var tooltip = val.title+(val.description?': <br />'+val.description:'');
			var link = new Element('a', {
				'href': '#',
				'title': tooltip
			}).grab(new Element('img', {'src': val.thumbnail})); 
			var gadgetname = new Element('div', {
				'class': 'gadgetName'
			}).set('text', val.title).inject(link);
			
			if(val.favicon_url) gadgetname.setStyle( 'background', 'url(' + '/favicon.php?url=' + encodeURIComponent( val.favicon_url ) + ') center left no-repeat transparent' );
			else if(val.title_url) gadgetname.setStyle( 'background', 'url(' + '/favicon.php?url=' + encodeURIComponent( val.title_url ) + ') center left no-repeat transparent' );
			
			if (val.gid) {
				link.addEvent('click', function(e){
					e.stop();
					Screen.getCurrentTab().addGadget(val.gid);
				});
			}
			var li = new Element('li').grab(link);
			target.appendChild(li);
			
			if(tooltip) this.tips.attach(link);
		}.bind(this);
		
		for (var i = page-1; i < max; i++) {
			loopfunc(data.data[i]);
		}
		
		var start = ''+page;
		var end = '' + max;
		var pn = $('parentCategory').getElement('li a.selected').get('html')
					+' &gt; '
					+$('subCategory').getElement('li a.selected').get('html')
					+'のガジェット&nbsp;'
					+'<strong>'+start.escapeHtml()+'</strong>-'
					+'<strong>'+end.escapeHtml()+'</strong>件 / '
					+'<strong>'+data.count_max+'</strong>件';
					
		$('gadgetsHitNumber').set('html',pn);
		
		var pagenaviPrev = $$('#gadgetsPaginate .prevGadgets');
		var pagenaviNext = $$('#gadgetsPaginate .nextGadgets');
		
		pagenaviPrev.removeEvents('click');
		if(page<=1) {
			pagenaviPrev.setStyle('display', 'none');
		}else{
			//$('prevGadgetsLimit').set('text', this.listlimit );
			pagenaviPrev.setStyle('display', '');
			pagenaviPrev.addEvent('click', this.onCategoryGadgetNavigation.bindWithEvent(this, [cid, sid, (page-limit>0)?(page-limit):1]));
		}
		
		pagenaviNext.removeEvents('click');
		if(page+limit>data.count_max) {
			pagenaviNext.setStyle('display', 'none');
		}else{
			//var nextcnt = data.count_max - page - limit+1;
			//$('nextGadgetsLimit').set('text', nextcnt );
			pagenaviNext.setStyle('display', '');
			pagenaviNext.addEvent('click', this.onCategoryGadgetNavigation.bindWithEvent(this, [cid, sid, page+limit]));
		}
	},
	/**
	 * 「サービスから探す」リスト生成
	 */
	createServiceList: function() {
		var target = $('parentCategory').getElement('div.contents ul');
		this.tips.detach(target.getElements('a'));
		target.set('html', '');
		var odd = true;
		this.serviceData.each(function(data) {
			var options = {};
			if(odd) options['class'] = 'odd';
			var link = new Element('a',{'href': '#', 'title': data.description}).set('text', data.servicename);
			link.addEvent('click', this.onSelectService.bindWithEvent(this, data.serviceid));
			var li = new Element('li', options);
			li.appendChild(link);
			target.appendChild(li);
			odd = !odd;
			if(data.description) this.tips.attach(link);
		}.bind(this));
	},
	/**
	 * 「サービスから探す」ガジェットリスト生成
	 */
	createServiceGadgetList: function(sid, page) {
		page = page || 1;
		var limit = this.listlimit;
		var target = $('gadgets').getElement('div.contents ul');
		this.tips.detach(target.getElements('a'));
		target.set('html', '');
		
		if (!this.serviceGadgetListData || !this.serviceGadgetListData[sid]) {
			ScreenGadgetList.resetRequest();
			ScreenGadgetList.nowRequest = new Request.JSON({
				url: trunc.XHRURL + 'GadgetList.php',
				method: 'get',
				data: {
					method: 'getServiceGadgetList',
					'sid': sid
				},
				onSuccess: function(res){ this.onGetServiceGadgetList(sid, page, res) }.bind(this)
			}).send();
			return;
		}
		
		var data = this.serviceGadgetListData[sid];
		var target = $('gadgets').getElement('ul');
		this.tips.detach(target.getElements('a'));
		target.set('html', '');
		var max = (page+this.listlimit-1)<data.count_max? (page+this.listlimit-1) : data.count_max;
		
		var loopfunc = function(val){
			var tooltip = val.title+(val.description?': <br />'+val.description:'');
			var link = new Element('a', {
				'href': '#',
				'title': tooltip
			}).grab(new Element('img', {'src': val.thumbnail})); 
			var gadgetname = new Element('div', {
				'class': 'gadgetName'
			}).set('text', val.title).inject(link);
			
			if(val.favicon_url) gadgetname.setStyle( 'background', 'url(' + '/favicon.php?url=' + encodeURIComponent( val.favicon_url ) + ') center left no-repeat transparent' );
			else if(val.title_url) gadgetname.setStyle( 'background', 'url(' + '/favicon.php?url=' + encodeURIComponent( val.title_url ) + ') center left no-repeat transparent' );
			
			if (val.gid) {
				link.addEvent('click', function(e){
					e.stop();
					Screen.getCurrentTab().addGadget(val.gid);
				});
			}
			var li = new Element('li').grab(link);
			target.appendChild(li);
			if(tooltip) this.tips.attach(link);
		}.bind(this);
		
		for (var i = page-1; i < max; i++) {
			loopfunc(data.data[i]);
		}
		
		var start = ''+page;
		var end = '' + max;
		var pn = $('parentCategory').getElement('li a.selected').get('html')
					+'のガジェット&nbsp;'
					+'<strong>'+start.escapeHtml()+'</strong>-'
					+'<strong>'+end.escapeHtml()+'</strong>件 / '
					+'<strong>'+data.count_max+'</strong>件';
					
		$('gadgetsHitNumber').set('html',pn);
		
		var pagenaviPrev = $$('#gadgetsPaginate .prevGadgets');
		var pagenaviNext = $$('#gadgetsPaginate .nextGadgets');
		
		pagenaviPrev.removeEvents('click');
		if(page<=1) {
			pagenaviPrev.setStyle('display', 'none');
		}else{
			//$('prevGadgetsLimit').set('text', this.listlimit );
			pagenaviPrev.setStyle('display', '');
			pagenaviPrev.addEvent('click', this.onServiceGadgetNavigation.bindWithEvent(this, [sid, (page-limit>0)?(page-limit):1]));
		}
		
		pagenaviNext.removeEvents('click');
		if(page+limit>data.count_max) {
			pagenaviNext.setStyle('display', 'none');
		}else{
			//var nextcnt = data.count_max - page - limit + 1;
			//$('nextGadgetsLimit').set('text', nextcnt );
			pagenaviNext.setStyle('display', '');
			pagenaviNext.addEvent('click', this.onServiceGadgetNavigation.bindWithEvent(this, [sid, page+limit]));
		}
	},
	/** 
	 * 「フィードを探す」リスト生成
	 */
	createFeedCategory: function() {
		var target = $('parentCategory').getElement('div.contents ul');
		this.tips.detach(target.getElements('a'));
		target.set('html', '');
		var odd = true;
		this.feedData.each(function(data, cid) {
			var options = {};
			if(odd) options['class'] = 'odd';
			var link = new Element('a',{'href': '#'}).set('text', data.name);
			link.addEvent('click', this.onSelectFeedCategory.bindWithEvent(this, cid));
			var li = new Element('li', options);
			li.appendChild(link);
			target.appendChild(li);
			odd = !odd;
		}.bind(this));
	},
	
	
	/**
	 * 「フィードを探す」サブカテゴリリスト(サービス)生成
	 */
	createFeedSubCategoryList: function(cid) {
		var target = $('subCategory').getElement('div.contents ul');
		this.tips.detach(target.getElements('a'));
		target.set('html', '');
		var feeddata = this.feedData[cid];
		if(typeof feeddata == 'undefined' || !feeddata.subcategory) return;
		$each(feeddata.subcategory, function(data) {
			var link = new Element('a',{'href': '#', 'title': data.description}).set('text', data.name);
			link.addEvent('click', this.onSelectFeedSubCategory.bindWithEvent(this, [cid, data.id]));
			var li = new Element('li');
			li.appendChild(link);
			target.appendChild(li);
			
			if(data.description) this.tips.attach(link);
		}.bind(this));
		
		return feeddata;
	},
	/**
	 * 「フィードを探す」ガジェットリスト生成
	 */
	createFeedGadgetList: function(cid, sid, page) {
		page = page || 1;
		var limit = this.listlimit;
		if(!this.feedGadgetListData || !this.feedGadgetListData[cid] || !this.feedGadgetListData[cid][sid]  ) {
			ScreenGadgetList.resetRequest();
			ScreenGadgetList.nowRequest = new Request.JSON({
				url: trunc.XHRURL + 'GadgetList.php',
				method: 'get',
				data: {
					method: 'getFeedGadgetList',
					'cid': cid,
					'sid': sid
				},
				onSuccess: function(res){ this.onGetGadgetList(cid, sid, page, res) }.bind(this)
			}).send();
			return;
		}
		
		
		var data = this.feedGadgetListData[cid][sid];
		var target = $('gadgets').getElement('ul');
		this.tips.detach(target.getElements('a'));
		target.set('html', '');
		var max = (page+this.listlimit-1)<data.count_max? (page+this.listlimit-1) : data.count_max;

		var loopfunc = function(val){
			var tooltip = val.title+(val.description?': <br />'+val.description:'');
			var link = new Element('a', {
				'href': '#',
				'title': tooltip
			}).grab(new Element('img', {'src': val.thumbnail})); 
			var gadgetname = new Element('div', {
				'class': 'gadgetName'
			}).set('text', val.title).inject(link);
			
			if(val.favicon_url) gadgetname.setStyle( 'background', 'url(' + '/favicon.php?url=' + encodeURIComponent( val.favicon_url ) + ') center left no-repeat transparent' );
			else if(val.title_url) gadgetname.setStyle( 'background', 'url(' + '/favicon.php?url=' + encodeURIComponent( val.title_url ) + ') center left no-repeat transparent' );
			else gadgetname.setStyle( 'background', 'url(/feed/feed.png) center left no-repeat transparent' );
			
			if (val.gid) {
				link.addEvent('click', function(e){
					e.stop();
					Screen.getCurrentTab().addGadget(val.gid);
				});
			}
			var li = new Element('li').grab(link);
			target.appendChild(li);
			
			if(tooltip) this.tips.attach(link);
		}.bind(this);
		
		for (var i = page-1; i < max; i++) {
			loopfunc(data.data[i]);
		}
		
		var start = ''+page;
		var end = '' + max;
		var pn = $('parentCategory').getElement('li a.selected').get('html')
					+' &gt; '
					+$('subCategory').getElement('li a.selected').get('html')
					+'のガジェット&nbsp;'
					+'<strong>'+start.escapeHtml()+'</strong>-'
					+'<strong>'+end.escapeHtml()+'</strong>件 / '
					+'<strong>'+data.count_max+'</strong>件';
					
		$('gadgetsHitNumber').set('html',pn);
		
		var pagenaviPrev = $$('#gadgetsPaginate .prevGadgets');
		var pagenaviNext = $$('#gadgetsPaginate .nextGadgets');
		
		pagenaviPrev.removeEvents('click');
		if(page<=1) {
			pagenaviPrev.setStyle('display', 'none');
		}else{
			//$('prevGadgetsLimit').set('text', this.listlimit );
			pagenaviPrev.setStyle('display', '');
			pagenaviPrev.addEvent('click', this.onFeedGadgetNavigation.bindWithEvent(this, [cid, sid, (page-limit>0)?(page-limit):1]));
		}
		
		pagenaviNext.removeEvents('click');
		if(page+limit>data.count_max) {
			pagenaviNext.setStyle('display', 'none');
		}else{
			//var nextcnt = data.count_max - page - limit+1;
			//$('nextGadgetsLimit').set('text', nextcnt );
			pagenaviNext.setStyle('display', '');
			pagenaviNext.addEvent('click', this.onFeedGadgetNavigation.bindWithEvent(this, [cid, sid, page+limit]));
		}
	},
	/**
	 * 「おすすめガジェット」リスト生成
	 */
	createRecommendList: function() {
		var target = $('gadgets').getElement('div.contents ul');
		this.tips.detach(target.getElements('a'));
		target.set('html', '');
		
		this.recommendData.each(function(val){
			var tooltip = val.title+(val.description?': <br />'+val.description:'');
			var link = new Element('a', {
				'href': '#',
				'title': tooltip
			}).grab(new Element('img', {'src': val.thumbnail})); 
			new Element('div', {
				'class': 'gadgetName',
				styles: {
					'background': 'url(' + val.favicon_url + ') center left no-repeat transparent'
				}
			}).set('text', val.title).inject(link);
			if (val.gid) {
				link.addEvent('click', function(){
					Screen.getCurrentTab().addGadget(val.gid);
				});
			}
			
			var li = new Element('li').grab(link);
			target.appendChild(li);
			if(tooltip) this.tips.attach(link);
		}.bind(this));
		
		var pn = 'おすすめガジェット';
					
		$('gadgetsHitNumber').set('html',pn);
		
		var pagenaviPrev = $$('#gadgetsPaginate .prevGadgets');
		var pagenaviNext = $$('#gadgetsPaginate .nextGadgets');
		
		pagenaviPrev.removeEvents('click');
		pagenaviNext.removeEvents('click');
	},
	
	/**
	 * 「フィードを追加する」のUIを表示
	 */
	displayAddFeed: function() {
		$('parentCategory').getElement('div.contents ul').set('html', '');
		$('subCategory').getElement('div.contents ul').set('html', '');
		$('gadgets').getElement('ul').set('html', '').setStyle('display', 'none');
		$('addFeedForm').setStyle('display', '');
		$('gadgetsHitNumber').set('text','フィードを追加する');
	},
	
	
	/**
	 * 別の検索カテゴリを選択したときにデータをリセット
	 */
	resetColumn: function() {
		$('parentCategory').getElement('div.contents ul').set('html', '');
		$('subCategory').getElement('div.contents ul').set('html', '');
		$('gadgets').getElement('ul').set('html', '').setStyle('display', '');
		$('addFeedForm').setStyle('display', 'none');
		$('gadgetsHitNumber').set('html','');
	},
	
	resetRequest: function() {
		if (!ScreenGadgetList.nowRequest) return;
		ScreenGadgetList.nowRequest.cancel();
		ScreenGadgetList.nowRequest = null;
	},
	
	resetListLimit: function() {
		var target = $('gadgets').getElement('ul');
		var tmp = new Element('li').inject(target);
		var gsize = tmp.getSize().x + (parseInt(tmp.getStyle('margin-left')) || 0) + (parseInt(tmp.getStyle('margin-right')) || 0);
		this.listlimit = Math.floor(target.getSize().x / gsize) * 2;
		tmp.destroy();
	},
	
	firstAccress: function() {
		if(!this.firstFlag) return;
		this.firstFlag = false;
		// 初期はカテゴリから探すを出すためにデータ取得
		this.getGadgetCategory();
	},
	
	// イベントハンドラ //////////////////////////////////////////////////////
	/**
	 * カテゴリリスト取得時のイベント
	 */
	onGetGadgetCategory: function(res) {
		this.categoryData = res;
		if (this.categoryData != null) {
			this.categoryData = $H(this.categoryData);
			this.createCategoryList();
			var keys = this.categoryData.getKeys();
			$('gadgetSearch').getElement('a').addClass('selected');
			var p = $('parentCategory').getElement('div.contents ul a');
			if(!p) return;
			p.addClass('selected');
			var categorydata = this.createSubCategoryList(keys[0]);
			var sc = $('subCategory').getElement('div.contents ul a');
			if(!sc) return;
			sc.addClass('selected');
			this.resetListLimit();
			this.createCategoryGadgetList(keys[0], categorydata.subcategory[0].id);
		}
	},
	/**
	 * ガジェットリストを取得したときのイベント
	 */
	onGetGadgetList: function(cid, sid, page, res) {
		if(!res) return;
		
		if(this.gadgetListData==null) this.gadgetListData = {};
		if(!this.gadgetListData[cid]) this.gadgetListData[cid] = {};
		this.gadgetListData[cid][sid] = res;
		
		this.createCategoryGadgetList(cid, sid, page);
	},
	/**
	 * サービスリストを取得したときのイベント
	 */
	onGetGadgetService: function(res) {
		this.serviceData = res;
		if(this.serviceData != null) {
			this.createServiceList();
		}
	},
	/**
	 * サービス別ガジェットリストを取得したときのイベント
	 * @param {Object} sid サービスID
	 * @param {Object} page ページ
	 * @param {Object} limit 制限数
	 * @param {Object} res 取得データ
	 */
	onGetServiceGadgetList: function(sid, page, res) {
		if(!res) return;
		
		if(this.serviceGadgetListData==null) this.serviceGadgetListData = {};
		this.serviceGadgetListData[sid] = res;
		
		this.createServiceGadgetList(sid, page);
	},
	/**
	 * フィードリスト取得時のイベント
	 */
	onGetFeedCategory: function(res) {
		this.feedData = res;
		if (this.feedData != null) {
			this.feedData = $H(this.feedData);
			this.createFeedCategory();
			var keys = this.feedData.getKeys();
			var gs = $('gadgetSearch').getElements('a')
			gs[2].addClass('selected');
			var p = $('parentCategory').getElement('div.contents ul a');
			if(!p) return;
			p.addClass('selected');
			var categorydata = this.createFeedSubCategoryList(keys[0]);
			var sc = $('subCategory').getElement('div.contents ul a');
			if(!sc) return;
			sc.addClass('selected');
			this.resetListLimit();
			
			this.createFeedGadgetList(keys[0], categorydata.subcategory[0].id);
		}
	},
	/**
	 * お勧めのガジェットを取得したときのイベント
	 */
	onGetGadgetRecommend: function(res) {
		this.recommendData = res;
		if(this.recommendData != null) {
			this.createRecommendList();
		}
	},

	//////////////////////////////////////////////////////
	/**
	 * 「カテゴリで探す」のクリック時のイベント
	 */
	onSelectCategorySearch: function(e) {
		e.stop();
		this.resetColumn();
		$('parentCategory').setStyle('display', '');
		$('subCategory').setStyle('display', '');
		$$('#gadgetSearch a').removeClass('selected');
		e.target.addClass('selected');
		if(trunc.browser.isOpera && trunc.browser.version < 950) $$('#gadgetList table').setStyle('display', 'none').setStyle('display', '');
		this.resetListLimit();
		this.getGadgetCategory();
	},
	/**
	 * 「カテゴリで探す」のカテゴリのクリック時のイベント
	 */
	onSelectCategory: function(e, cid) {
		e.stop();
		$('parentCategory').getElements('div.contents ul a').removeClass('selected');
		e.target.addClass('selected');
		this.createSubCategoryList(cid);
	},
	/**
	 * 「カテゴリで探す」のサブカテゴリのクリック時のイベント
	 */
	onSelectSubCategory: function(e, cid, sid) {
		e.stop();
		$('subCategory').getElements('div.contents ul a').removeClass('selected');
		e.target.addClass('selected');
		
		this.createCategoryGadgetList(cid, sid);
	},
	
	onCategoryGadgetNavigation: function(e, cid, sid, page) {
		e.stop();
		this.createCategoryGadgetList(cid, sid, page);	
	},
	
	//////////////////////////////////////////////////////
	/**
	 * 「サービスで探す」のクリック時のイベント
	 */
	onSelectServiceSearch: function(e) {
		e.stop();
		this.resetColumn();
		$('parentCategory').setStyle('display', '');
		$('subCategory').setStyle('display', 'none');
		$$('#gadgetSearch a').removeClass('selected');
		e.target.addClass('selected');
		if(trunc.browser.isOpera && trunc.browser.version < 950) $$('#gadgetList table').setStyle('display', 'none').setStyle('display', '');
		this.resetListLimit();
		this.getGadgetService();
	},
	/**
	 * 「サービスで探す」のサービスのクリック時イベント
	 * @param {Object} e Eventハンドラ
	 * @param {Interger} sid サービスID
	 */
	onSelectService: function(e, sid) {
		e.stop();
		$('parentCategory').getElements('div.contents ul a').removeClass('selected');
		e.target.addClass('selected');
		this.createServiceGadgetList(sid);
	},
	onServiceGadgetNavigation: function(e, sid, page) {
		e.stop();
		this.createServiceGadgetList(sid, page);	
	},
	
	//////////////////////////////////////////////////////
	/**
	 * 「フィードを探す」のクリック時のイベント
	 */
	onSelectFeed: function(e) {
		e.stop();
		this.resetColumn();
		$('parentCategory').setStyle('display', '');
		$('subCategory').setStyle('display', '');
		$$('#gadgetSearch a').removeClass('selected');
		e.target.addClass('selected');
		if(trunc.browser.isOpera && trunc.browser.version < 950) $$('#gadgetList table').setStyle('display', 'none').setStyle('display', '');
		this.resetListLimit();
		this.getFeedCategory();
	},
	/**
	 * 「フィードを探す」のカテゴリのクリック時のイベント
	 */
	onSelectFeedCategory: function(e, cid) {
		e.stop();
		$('parentCategory').getElements('div.contents ul a').removeClass('selected');
		e.target.addClass('selected');
		this.createFeedSubCategoryList(cid);
	},
	/**
	 * 「フィードを探す」のサブカテゴリのクリック時のイベント
	 */
	onSelectFeedSubCategory: function(e, cid, sid) {
		e.stop();
		$('subCategory').getElements('div.contents ul a').removeClass('selected');
		e.target.addClass('selected');
		
		this.createFeedGadgetList(cid, sid);
	},
	
	onFeedGadgetNavigation: function(e, cid, sid, page) {
		e.stop();
		this.createFeedGadgetList(cid, sid, page);	
	},

	//////////////////////////////////////////////////////
	/**
	 * 「おすすめのガジェット」のクリック時のイベント
	 */
	onSelectRecommend: function(e) {
		e.stop();
		this.resetColumn();
		$('parentCategory').setStyle('display', 'none');
		$('subCategory').setStyle('display', 'none');
		$$('#gadgetSearch a').removeClass('selected');
		e.target.addClass('selected');
		if(trunc.browser.isOpera && trunc.browser.version < 950) $$('#gadgetList table').setStyle('display', 'none').setStyle('display', '');
		this.resetListLimit();
		this.getGadgetRecommend();
	},
	
	//////////////////////////////////////////////////////
	/**
	 * 「フィードを追加する」のクリック時のイベント
	 */
	onSelectAddFeed: function(e) {
		e.stop();
		this.resetColumn();
		$('parentCategory').setStyle('display', 'none');
		$('subCategory').setStyle('display', 'none');
		$$('#gadgetSearch a').removeClass('selected');
		e.target.addClass('selected');
		$$('#gadgetList table').setStyle('display', 'none').setStyle('display', '');
		this.displayAddFeed();
	},
	/**
	 * 「フィードを追加する」の送信ボタンのイベント
	 */
	onFindFeed: function(e){
		e.stop();
		
		var urltextbox = $('addFeedFormURL');
		var value = urltextbox.value;
		if(!value) return;
		
		var submitbutton = $('addFeedFormSubmit');
		
		if(ScreenGadgetList.findFeedRequest) return;
		ScreenGadgetList.findFeedRequest = true;
		urltextbox.disabled = true;
		submitbutton.disabled = true;
		
		new Request.JSON({
			url: trunc.XHRURL + 'Feed.php',
			method: 'get',
			async: false,
			data: {
				method: 'search',
				url: value
			},
			onComplete: function(res){
				if (!res || !res.length || res.length==0) {
					trunc.alert('指定されたURLが正しくないか、フィードが見つかりませんでした。');
					ScreenGadgetList.findFeedRequest = false;
					urltextbox.disabled = false;
					submitbutton.disabled = false;
				} else {
					var insert = new Element('form', { 'id': 'feedSelect', events:{
						'submit': function(e){
							e.stop();
						}
					}});
					var dl = new Element('dl', {styles: {'margin': '15px 20px 0', 'padding': '0 0 0 12px'}});
					insert.grab(dl);
					
					res.each(function(v, i){
						var dt = new Element('dt');
						var radio = new Element('input', { 'type': 'radio', 'name': 'feed', value: v.feedurl });
						if(i==0) radio.checked = true;
						new Element('label').grab(radio).grab(document.createTextNode( v.title+' ('+v.type+')' )).inject(dt);
						dl.grab( dt );
						dl.grab(new Element('dd', {styles:{'font-size': 'x-small'}}));
					});
					var overlay = new trunc.overlay();
					overlay.setCustomDialog(insert);
					overlay.setForm('フィードを追加します。', '追加', 'キャンセル', 1);
					overlay.start();
					overlay.hook(function(flag){
						if (flag == 1) {
							var form = $('feedSelect');
							var radios = form.getElements('input[type=radio]');
							var feedurl = '';
							radios.each(function(elem) {
								if(elem.checked) feedurl = elem.value;
							});
							if(feedurl=='') feedurl = $('addFeedFormURL').value;
							new Request.JSON({
								url: trunc.XHRURL + 'Feed.php',
							 	method: 'get',
								async: false,
							 	data: {
							 		method: 'regist',
							 		url: feedurl
							 	},
								onComplete: function(res){
									if(res && res.gid) Screen.getCurrentTab().addGadget(res.gid);
									overlay.end();
								}
							 }).send();
						}else{
							overlay.end();
						}
						ScreenGadgetList.findFeedRequest = false;
						urltextbox.disabled = false;
						submitbutton.disabled = false;
					});
				}
			}
		}).send();
	}
};

/**
 * お知らせ・広告表示クラス
 */
InfoDisplay = {
	data: [],
	index: 0,
	initialize: function() {
		this.container = $('truncinfo').getElement('span');
		this.containerTween = new Fx.Slide(this.container, {
			mode: 'horizontal',
			duration: 2000
		}).hide();
		this.startBind = this.start.bind(this)
		this.getData();
	},
	start: function() {
		if(!this.data || this.data.length==0) return;
		
		if(this.index==this.data.length) this.index = 0;
		
		var data = this.data[this.index];
		
		var link = this.container.getElement('a');
		if (link) {
			link.removeEvents('click');
		}
		
		switch(data.type) {
			case 'ad': 
				this.container.innerHTML = 'PR: '+data.link;
				this.container.addClass('ad');
				break;
			case 'info':
				this.container.innerHTML = '<img src="/img/infobar/rss.gif" /> '+data.link;
				this.container.removeClass('ad');
				break;
		}
		
		link = this.container.getElement('a');
		link.target = '_blank';
		
		if(data.type=='ad') {
			link.addEvent('click', function(){
				new Request({
					url: trunc.XHRURL+'Ad.php',
					method: 'get',
					data: {
						'method': 'countAdClick',
						'id': data.id
					}
				}).send();
			});
		}
		
		this.index++;
		this.containerTween.slideIn();
		this.next.delay(60000, this);
	},
	next: function() {
		this.containerTween.slideOut().chain(this.startBind);
	},
	getData: function(){
		new Request.JSON({
			url: trunc.XHRURL+'Info.php',
			method: 'get',
			onComplete : this.onGetData.bind(this)
		}).send();
	},
	onGetData: function(res) {
		this.data = res;
		this.index = 0;
		this.start.delay(1000, this);
	}
}

Tab = new Class({
	model: null,
	element: null,
	zIndex: 0,
	layout: null,
	initialize: function(tid) {
		this.layout = null;
		this.drag=false;
	},
	create: function() {
		if(this.model==null) return;
		
		this.element = new Element( 'li', { 'class': 'tab', 'id': this.model.tid } );
		this.element.innerHTML = '<div class="tabinner"><div class="tabbody"><div class="tabtitle">'+this.model.tabname.escapeHtml()+'</div></div></div>';
		
		var tabbox = $('tabbox');
		tabbox.insertBefore(this.element,$('addTab'));
		
		// イベントハンドラのバインディングを保存する
		this.onCloseBind = this.onClose.bind(this);
		this.onSettingBind = this.onSetting.bindWithEvent(this)
		this.onReloadBind = this.onReload.bind(this)
		this.onMinimizeBind = this.onMinimize.bind(this)
		this.onFocusBind = this.onFocus.bind(this);
		this.onTabRenameBoxOpenBind = this.onTabRenameBoxOpen.bindWithEvent(this);
		this.onTabRenameBind = this.onTabRename.bindWithEvent(this);
		this.onKeyPressBind = this.onKeyPress.bindWithEvent(this);
		this.onSettingSubmitBind = this.onSettingSubmit.bind(this);
		
		this.element.addEvent('mousedown', function(){this.drag=false;}.bind(this));
		this.element.addEvent('mousemove', function(){this.drag=true;}.bind(this));
		this.element.addEvent('click', this.onFocusBind);
		this.element.addEvent('dblclick', this.onTabRenameBoxOpenBind);
		
		var targets = [];
		
		new Drag.Move(this.element, {
			snap: 4,
			container: true,
			onBeforeStart: function(el) {
				// ghost
				var tabghorst = $('tabghorst');
				var tabbox = $('tabbox');
				var pos = el.getPosition(tabbox);
				var marginleft = parseInt(el.getStyle('margin-left'));
				tabghorst.setStyles({
					'width': el.getStyle('width'),
					'height': el.getStyle('height'),
					'display': ''
				});
				tabbox.insertBefore(tabghorst, el);
				el.setStyles({
					'position': 'absolute',
					'z-index': '100'
				});
				el.setStyle('left', (pos.x-marginleft)+'px');
				this.tabtargets = new Array();
				this.tabs = $$('#tabbox .tab'); 
				this.orgLeft = parseInt(el.getStyle('left'));
				this.orgIndex = 0;
				this.tabs.each(function(val, index){
					if(val == tabghorst) return;
					if(val.id && val.id =='addTab') return;
					if(val==el) {
						this.orgIndex = index;
						return;
					}
					this.tabtargets[this.tabtargets.length] = [val, val.getCoordinates(tabbox)];
				}.bind(this));
				this.beforetab = null;
			},
			onDrag: function(el) {
				el.setStyle('top','0px');
				var tabbox = $('tabbox');
				var size = el.getCoordinates(tabbox);
				var flag = false;
				var bmLeft = parseInt(el.getStyle('left')) < this.orgLeft;
				this.tabtargets.each(function(v){
					if(flag) return;
					
					var where = '';
					if(bmLeft && size.left < (v[1].left+v[1].width/2)) where = 'before';
					else if(!bmLeft && size.right > (v[1].left+v[1].width/2) && size.right < v[1].right) where = 'after';
					
					if(where) {
						$('tabghorst').inject(v[0], where);
						el.inject(v[0],where);
						this.orgLeft = parseInt(el.getStyle('left'));
						this.beforetab = v[0];
						flag = true;
					}
				});
				
				if(flag) {
					var tabghorst = $('tabghorst');
					this.tabs.each(function(val){
						if(val==el || val == tabghorst) return;
						targets[targets.length] = [val, val.getCoordinates(tabbox)];
				});
				}
			},
			onComplete: function(el){
				// ghost hide
				var tabghorst = $('tabghorst');
				tabghorst.setStyle('display','none');
				$(el).setStyles({
					'position': 'relative',
					'z-index': '0',
					'top': '0px',
					'left': '0px'
				});
				el.setStyle('x-index', '0');
				
				var indexcnt = 0;
				$$('#tabbox .tab').each(function(val, index){
					if(val == tabghorst) return;
					if(val==el) {
						indexcnt = index;
						return;
					}
				});
				
				if(this.orgIndex != indexcnt) {
					this.orgIndex++;
					indexcnt++;
					if(this.orgIndex<indexcnt) indexcnt++;
					
					new Request({
							url: trunc.XHRURL + 'Screen.php',
							method: 'get',
							data: {
								method: 'insertTab',
								insIndex: this.orgIndex,
								tgtIndex: indexcnt
							}
						}).send();
					
					
					Screen.tabMove(this.orgIndex, indexcnt);
				}
			},
			onCancel: function(el){
				// ghost hide
				$('tabghorst').setStyle('display','none');
				$(el).setStyles({
					'position': 'relative',
					'z-index': '0',
					'top': '0px',
					'left': '0px'
				});
				el.setStyle('x-index', '0');
			}
		});
		
		// DragによってpositionがrelativeにOperaとSafariでは位置がずれるのを対策
		this.element.setStyles({'left': '0px', 'top': '0px'});
		
		/// レイアウト生成
		this.layout = (this.model.layout=='GRID')? new GridLayout(this) : new NoGridLayout(this);
	},
	destroy: function() {
		this.element.removeEvent('click',this.onFocusBind);
		//this.element.draggable("destroy").remove();
		this.element.destroy();
	},

	getID: function() {
		return this.model.tid;
	},
	getLayout: function() {
		return this.layout;
	},
	
	updatePosition: function() {
		var gadgets = this.model.gadgets;
		var postdata = [];
		gadgets.each(function(v){
			postdata.push({ 'giid': v.model.giid, 'position': v.model.position });
		});
		
		new Request({
			url: trunc.XHRURL+'Screen.php',
			method: 'post',
			data: {
				method: 'setGadgetModels',
				models: JSON.encode(postdata)
			}
		}).send();
	},
	changeLayout: function(type, options) {
		type = type || 'GRID';
		options = options || {};
		
		this.layout.changeLayout(type, options);
		
		$extend(this.model.layoutInfo, options);
		this.model.layout = type;
		this.updateLayoutInfo();
	},
	updateLayoutInfo: function(){
		new Request({
			url: trunc.XHRURL+'Screen.php',
			method: 'post',
			data: {
				method: 'setTabModel',
				model: JSON.encode({ 
					'tid': this.model.tid,
					'layout': (this.model.layout=='GRID')?'GRID':'NONE',
					'layoutInfo': this.model.layoutInfo
				})
			}
		}).send();
	},
	refreshAllGadgets: function() {
		$each(this.model.gadgets, function(val){
			if (typeof val.model.showContents != 'undefined') {
				if(val.model.showContents) val.refresh();
			}
		}.bind(this));
	},
	minimizeAllGadgets: function() {
		this.model.minimize = !this.model.minimize;
		$each(this.model.gadgets, function(val){
			if (typeof val.model.showContents != 'undefined') {
				if(this.model.minimize != val.model.showContents) val.minimize();
			}
		}.bind(this));
		
		if (this.model.minimize) {
			$('tabMinimize').src = '/theme/' + changeDesign.designName + '/img/tab/tabMinimize.gif';
			$('tabMinimize').title = 'タブ内を最小化';
			$('tabMinimize').alt = '最小化';
		} else {
			$('tabMinimize').src = '/theme/' + changeDesign.designName + '/img/tab/tabMaximize.gif';
			$('tabMinimize').title = 'タブ内を最大化';
			$('tabMinimize').alt = '最大化';
		}
		
		Screen.repositionFooter();
	},
	getModel: function(tid) {
		new Request.JSON({
			url: trunc.XHRURL+'Screen.php',
			method: 'get',
			data: {
				method: 'getTabModel',
				'tid': tid
			},
			async: false,
			onComplete : this.onGetModel.bind(this)
		}).send();
	},
	setModel: function(model) {
		this.model = new TabModel(model);
		
		// moreData対応
		if (model.gadgets) {
			this.model.gadgets = [];
			$each(model.gadgets, function(val, index){
				if (typeof val == 'undefined') 
					return;
				var gadget = new Gadget(this);
				gadget.setModel(val);
				this.model.gadgets[index] = gadget;
			}.bind(this));
		}
		this.create();
	},
	toggleAllDummy: function(show) {
		$A(this.model.gadgets).each( function(val){
			if(typeof val=='undefined') return;
			val.toggleDummy(show);
		});
	} ,
	deleteGadget: function(gadget) {
		this.model.gadgets = this.model.gadgets.erase(gadget);
		this.model.gadgetIDs = this.model.gadgetIDs.erase(gadget.model.giid);
	},
	moveGadget: function(gadget) {
		if (!this.model.gadgets) {
			new Request.JSON({
				url: '/if/Screen.php',
				method: 'get',
				async: false,
				data: {
					'method': 'getTabModel',
					'tid': this.model.tid,
					'moreData': true
				},
				onComplete: function(data){
					this.model.gadgetIDs = data.gadgetIDs;
					
					if(this.model.gadgets==null) this.model.gadgets = new Array();
					
					$each(data.gadgets, function(val, index){
						if (typeof val == 'undefined') 
							return;
						var gadget = new Gadget(this);
						gadget.setModel(val);
						this.model.gadgets[index] = gadget;
					}.bind(this));
				}.bind(this)
			}).send();
		}
		
		gadget.parentTab = this;
		gadget.model.tid = this.model.tid;
		this.model.gadgets[this.model.gadgetIDs.length] = gadget;
		this.model.gadgetIDs[this.model.gadgetIDs.length] = gadget.model.giid;
		
		if (this.model.layout == 'GRID') {
			$each(this.model.gadgets, function(g){
				if (g.model.position.col != 0) return;
				g.model.position.row++;
			});
			this.updatePosition();
		}
	},
	addGadget: function(gid) {
		new Request.JSON({
			url: trunc.XHRURL+'Screen.php',
			method: 'get',
			data: {
				method: 'addGadget',
				'tid': this.model.tid,
				'gid': gid
			},
			onSuccess: function(res) {
				if(!res) return;
				var gadget = new Gadget(this);
				gadget.setModel(res);
				
				if(!gadget.model.position) gadget.model.position = {};
				if (this.model.layout == 'NONE') {
					var size = window.getScrollSize();
					gadget.model.position.x = (size.x - gadget.model.position.width) / 2;
					gadget.model.position.y = 100;
				} else {
					gadget.model.position.row = -1;
					gadget.model.position.col = 0;
				}
				gadget.create();
				this.model.gadgets[this.model.gadgets.length] = gadget;
				
				this.layout.refreshPosition();
				Screen.repositionFooter();
			}.bind(this)
		}).send();
	},
	
	/// イベントハンドラ
	//タブが押されたとき
	onFocus: function() {
		if (this.drag) { // タブ移動時はclickイベントを無視
			this.drag = false;
			return;
		}
		
		if (!Screen.onSelectTab(this)) {
			return;
		}
		this.element.addClass('select');
		
		new Request({
			url: trunc.XHRURL + 'Screen.php',
			method: 'post',
			data: {
				method: 'setScreenModel',
				model: JSON.encode({
					'currentTabID': this.model.tid
				})
			}
		}).send();
		
		$('tabClose').addEvent('click', this.onCloseBind);
		$('tabSetting').addEvent('click', this.onSettingBind);
		$('tabReload').addEvent('click', this.onReloadBind);
		$('tabMinimize').addEvent('click', this.onMinimizeBind);
		
		$('tabrenamesubmit').addEvent('click', this.onTabRenameBind);
		$('tabrenamebox').getElement('input[@type=text]').addEvent('keypress',this.onKeyPressBind);
		
		$('tabsettingsubmit').addEvent('click', this.onSettingSubmitBind);
		
		this.layout.create();
		
		if(this.model.gadgets==null) {
			this.model.gadgets = [];
			this.model.minimize = true;
			
			new Request.JSON({
					url: '/if/Screen.php',
					method: 'get',
					async: true,
					data: {
						'method': 'getTabModel',
						'tid': this.model.tid,
						'moreData': true
					},
					onComplete: function(data){
						this.model.gadgetIDs = data.gadgetIDs;
						$each(data.gadgets, function(val, index){
							if (typeof val == 'undefined') 
								return;
							var gadget = new Gadget(this);
							gadget.setModel(val);
							this.model.gadgets[index] = gadget;
							setTimeout( function() { gadget.create(); } ,0);
							
							if( val.showContents ) this.model.minimize = false;
							
						}.bind(this));
					}.bind(this)
				}).send();
		}else{
			$each(this.model.gadgets, function(gadget){
				setTimeout( function() { gadget.create(); } ,0);
				if( gadget.model.showContents ) this.model.minimize = false;
			}.bind(this));
		}
		
		if (this.model.minimize) {
			$('tabMinimize').src = '/theme/' + changeDesign.designName + '/img/tab/tabMinimize.gif';
			$('tabMinimize').title = 'タブ内を最小化';
			$('tabMinimize').alt = '最小化';
		} else {
			$('tabMinimize').src = '/theme/' + changeDesign.designName + '/img/tab/tabMaximize.gif';
			$('tabMinimize').title = 'タブ内を最大化';
			$('tabMinimize').alt = '最大化';
		}
	},
	// 他のタブが押されて変更されたとき
	onUnFocus: function() {
		this.drag = false;
		$('main').innerHTML = '';
		this.element.removeClass('select');
		$('tabClose').removeEvents('click');
		$('tabSetting').removeEvents('click');
		$('tabReload').removeEvents('click');
		$('tabMinimize').removeEvents('click');
		$('tabrenamesubmit').removeEvents('click');
		$('tabrenamebox').getElement('input[@type=text]').removeEvents('keypress');
		$('tabsettingsubmit').removeEvents('click');
	},
	// 削除されるとき
	onClose: function() {
		Screen.onCloseTab(this);
	},
	// 設定ボタンを押されたとき
	onSetting: function(e) {
		e.stop();
		var tabSettingBox = $('tabsettingbox');
		var renameinput = tabSettingBox.getElement('input[@type=text]');
		renameinput.value=this.model.tabname;
		
		var point = $('all');
		if(trunc.browser.isIE) point = $('trunc');
		
		var p = e.target.getCoordinates(point);
		var ps = tabSettingBox.getCoordinates();
		tabSettingBox.setStyles({'top': p.top, 'left': p.right-ps.width});
		
		var value = (this.model.layout=='NONE')?0:this.model.layoutInfo.column||4;
		var radios = tabSettingBox.getElements('input');
		radios.each(function(v){
			if(v.type!='radio') return;
			v.addEvent('click',
			function(e){
				$$('#layouttype label').removeClass('checked');
				e.target.getParent().addClass('checked');
			});
			if (v.value == value) {
				v.checked = true;
				v.getParent().addClass('checked');
			}else{
				v.checked = false;
				v.getParent().removeClass('checked');
			}
		});
		
		renameinput.focus();
		renameinput.select();
		Screen.tabRenameBox.hide();
		Screen.tabSettingBox.slideIn();
	},
	onSettingSubmit: function(e) {
		e.stop();
		var tabSettingBox = $('tabsettingbox');
		var tabnameBox = tabSettingBox.getElement('input[@type=text]');
		var newtitle = tabnameBox.value;
		
		var layout = this.model.layoutInfo.column;
		$$('#layouttype input').each(function(v){
			v.removeEvents('click');
			if(v.checked) layout = v.value;
		});
		if(layout!=0) this.changeLayout('GRID', {column:layout});
		else this.changeLayout('NONE')
		
		if (newtitle != '' && newtitle != this.model.tabname) {
			new Request({
				url: trunc.XHRURL + 'Screen.php',
				method: 'post',
				data: {
					method: 'setTabModel',
					model: JSON.encode({
						'tid': this.model.tid,
						'tabname': newtitle
					})
				},
				onSuccess: function(){
					this.model.tabname = newtitle;
					this.element.getElement('.tabtitle').set('text', newtitle);
				}.bind(this)
			}).send();
		}
		
		tabnameBox.blur();
		Screen.tabSettingBox.slideOut();
	},
	// 再読込
	onReload: function() {
		this.refreshAllGadgets();
	},
	// 最小化
	onMinimize: function() {
		this.minimizeAllGadgets();
	},
	// Modelが読み込まれたとき
	onGetModel: function(res) {
		this.model = new TabModel(res);
		this.create();
	},
	onKeyPress: function(event){
		switch(event.key) {
		case 'enter':
			this.onTabRename(event);
			event.stop();
			return false;
		case 'esc':
			Screen.tabRenameBox.slideOut();
			event.stop();
			break;	
		}
	},
	onTabRenameBoxOpen: function(e) {
		e.stop();
		var renameinput = $('tabrenamebox').getElement('input[@type=text]');
		renameinput.value=this.model.tabname;
		
		var point = $('all');
		if(trunc.browser.isIE) point = $('trunc');
		
		var p = this.element.getPosition(point);
		var renameboxwidth = $('tabrenamebox').getSize().x;
		var windowwidth = window.getSize().x;
		if((p.x+renameboxwidth) > windowwidth) p.x = windowwidth - renameboxwidth - 10;
		$('tabrenamebox').setStyles({'top': p.y, 'left': p.x});
		Screen.tabSettingBox.hide();
		Screen.tabRenameBox.slideIn();
		renameinput.focus();
		renameinput.select();
	},
	onTabRename: function(e) {
		e.stop();
		var tabnameBox = $('tabrenamebox').getElement('input[@type=text]');
		var newtitle = tabnameBox.value;
		if(newtitle=='') return;
		new Request({
			url: trunc.XHRURL+'Screen.php',
			method: 'post',
			data: {
				method: 'setTabModel',
				model: JSON.encode({ 'tid': this.model.tid, 'tabname': newtitle })
			},
			onSuccess: function() {
				this.model.tabname = newtitle;
				this.element.getElement('.tabtitle').set('text', newtitle);
			}.bind(this)
		}).send();
		
		tabnameBox.blur();
		Screen.tabRenameBox.slideOut();
	}
});

TabModel = new Class({
	tid: '',
	gadgetIDs: [],
	gadgets: null,
	tabname: '',
	layout: null,
	options: {},
	initialize: function(option) {
		this.tid = option.tid || '';
		this.tabname = option.tabname || '';
		this.gadgetIDs = option.gadgetIDs || [];
		this.layout = option.layout || 'GRID';
		this.layoutInfo = option.layoutInfo || {};
		this.minimize = false;
	}
});

Gadget = new Class({
	DandD: null,
	resizeDandD: null,
	initialize: function(parentTab) {
		this.parentTab = parentTab;
	},
	create: function() {
		/// メインのガジェット構成を作成
		this.element = new Element( 'div', { 'class': 'gadget' } );
		var title = '読み込み中...';
		if(this.model.title) title = this.model.title.escapeHtml();
		
		
		var favicon = '';
		if(this.model.favicon_url || this.model.title_url) favicon = '<img src="/favicon.php?url='+encodeURIComponent(this.model.favicon_url || this.model.title_url)+'" width="16" height="16" alt="" />';
		this.element.innerHTML =
			'<div class="gadgetheader"><table><tr><td class="gadgettitle" ondragstart="event.returnValue = false">'+favicon+'<span>'+title+'</span></td><td class="gadgettoolbox"><ul><li><img alt="最小化" src="/theme/'+changeDesign.designName+'/img/gadget/gadgetSetting.gif" ondragstart="event.returnValue = false" /></li><li><img alt="設定" src="/theme/'+changeDesign.designName+'/img/gadget/gadgetSetting.gif" ondragstart="event.returnValue = false" /></li><li><img alt="更新" src="/theme/'+changeDesign.designName+'/img/gadget/gadgetReload.gif" ondragstart="event.returnValue = false" /></li><li><img alt="閉じる" src="/theme/'+changeDesign.designName+'/img/gadget/gadgetDelete.gif" ondragstart="event.returnValue = false" /></li></ul></td></tr></table></div><div class="gadgetconfig" style="display:none;"></div><div class="gadgetbody"><div class="gadgetdummy"></div></div><div class="gadgetfooter'+(this.model.scale?'':' nogadgetscale')+'"><img src="/img/gadget/gadgetResize.gif" alt="" /></div>';
		
		if(this.model.title_url) {
			if(this.model.title_url.match(/^javascript:/)) {
				this.model.title_url= '';
			}else{
				var gadgettitle = this.element.getElement('.gadgettitle');
				gadgettitle.getElement('span').destroy();
				var link = new Element('a', {
					href: encodeURI(this.model.title_url),
					target: '_blank',
					events:{
						'mousedown': function(e){
							this.drag = false;
						},
						'mousemove': function(e) {
							this.drag = true;
						},
						'click': function(e) {
							if(this.drag) e.stop();
						}
					}
				}).set('html', title);
				gadgettitle.grab(link);
			}
		}
		
		this.toolboxClickAllow = false;
		var gadgettoolbox = this.element.getElement('.gadgettoolbox');
		gadgettoolbox.addEvent('mousedown', function(){
			this.toolboxClickAllow = true;
		}.bind(this));
		gadgettoolbox.addEvent('mousemove', function(){
			this.toolboxClickAllow = false;
		}.bind(this));
		
		// 右上の操作ボタン群のイベント割り当て
		var toolboximage = this.element.getElements('.gadgettoolbox img');
		$each(toolboximage,function(val, index) {
			switch(index) {
			case 0:
				this.minimizeIcon = val;
				val.addEvent('click',this.onMinimize.bind(this));
				break;
			case 1:
				if(typeof this.model.prefs == 'undefined') toolboximage[1].destroy();
				val.addEvent('click',this.onToggleConfig.bindWithEvent(this));
				break;
			case 2:
				val.addEvent('click', this.onRefresh.bind(this));
				break;
			case 3:
				val.addEvent('click', this.onClose.bind(this));
			}
		}.bind(this));
		
		/// ガジェット本体を表示するiframe
		var iframetmp = document.createElement('div'); /// divを入れ子にするのはブラウザ依存を回避するため
		iframetmp.innerHTML = '<iframe id="'+this.model.giid+'" name="'+this.model.giid+'" className="moduleBodyFrame" scrolling="'+(this.model.scroll?'true':'false')+'" border="0" frameborder="0"></iframe>';
		var iframe = $(iframetmp.firstChild);
		iframe.border = 0;
		iframe.zIndex = 0;

		iframetmp.removeChild(iframe);
		this.iframe = iframe;
		this.element.getElement('.gadgetbody').appendChild(iframe);
		
		/// 設定フォームの構築
		if(typeof this.model.prefs != 'undefined') {
			var prefs = this.model.prefs;
			var config = this.element.getElement('.gadgetconfig');
			
			config = new Element('form', {'action': '', 'name': 'gadget'+this.model.giid}).inject(config);
			var hiddenonly = true;
			$H(prefs).each( function(thispref, thisprefname){
				if(typeof(thispref['default']) == 'undefined' || thispref['default']==null) thispref['default'] = '';
				
				if(thispref.type!='hidden') hiddenonly = false;
				var element = '';
				switch(thispref.type) {
				case 'hidden':
					element = new Element('input', {'type':'hidden', 'name':thisprefname, 'value':thispref['default']}).inject(config);
					element.value=((typeof(thispref.value)!='undefined' && thispref.value!=null)? thispref.value : thispref['default']);
					break;
					
				case 'string':
					new Element('div').appendText(thispref.display_name+' ').grab(element = new Element('input', {'type':'text', 'name':thisprefname, 'value':thispref['default']})).inject(config);
					element.value=(typeof thispref.value!='undefined' && thispref.value!=null)? thispref.value : thispref['default'];
					break;
					
				case 'password':
					new Element('div').appendText(thispref.display_name+' ').grab(element = new Element('input', {'type':'password', 'name':thisprefname, 'value':thispref['default']})).inject(config);
					element.value=(typeof thispref.value!='undefined' && thispref.value!=null)? thispref.value : thispref['default'];
					break;
					
				case 'bool': 
						var yes;
						var no;
						new Element('div').appendText(thispref.display_name + ' ').grab(new Element('br')).grab(
						new Element('label').grab(
							yes = new Element('input', {
								'type': 'radio',
								'name': thisprefname,
								'value': 'yes'
							})
						).appendText('はい')
						).grab(
						new Element('label').grab(
							no = new Element('input', {
								'type': 'radio',
								'name': thisprefname,
								'value': 'no'
							})
						).appendText('いいえ')
						).inject(config);
						if ((thispref.value || thispref['default']) == 'yes') yes.checked = true;
						else no.checked = true;
					break;
				
				case 'array':
					new Element('div').appendText(thispref.display_name).grab(element = new Element('textarea', {'name':thisprefname, 'value':thispref['default']})).inject(config);
					element.value=(typeof thispref.value!='undefined' && thispref.value!=null)? thispref.value : thispref['default'];
					break;
					
				case 'enum':
					switch (thispref.view || 'combo') {
						case 'radio':
							var radiovalue = (typeof thispref.value != 'undefined' && thispref.value!=null) ? thispref.value : thispref['default'];
							var attach = new Element('div').appendText(thispref.display_name+' ').inject(config);
							thispref['enum'].each(function(thisenum){
								var radio;
								new Element('label').grab(radio = new Element('input', {
									'type': 'radio',
									'name': thisprefname,
									'value': thisenum.value
								})).appendText(thisenum.display).inject(attach);
								if (thisenum.value == radiovalue) 
									radio.checked = true;
							});
							break;
						
						case 'combo':
							var combovalue = (typeof thispref.value != 'undefined' && thispref.value!=null) ? thispref.value : thispref['default'];
							var attach = new Element('select', {
								'name': thisprefname
							}).inject(new Element('div').appendText(thispref.display_name+' ').inject(config));
							thispref['enum'].each(function(thisenum){
								var op = new Element('option', {
									'value': thisenum.value
								}).appendText(thisenum.display).inject(attach);
								if (combovalue == thisenum.value) 
									op.set('selected', 'selected');
							});
							break;
						
						case 'checkbox':
							var checkvalue = (typeof thispref.value != 'undefined' && thispref.value!=null) ? thispref.value : thispref['default'];
							checkvalue = checkvalue || '';
							checkvalue = checkvalue.split("|");
							var attach = new Element('div').appendText(thispref.display_name+' ').inject(config);
							thispref['enum'].each(function(thisenum){
								var check = new Element('input', {
									'type': 'checkbox',
									'name': thisprefname,
									'value': thisenum.value
								});
								new Element('label').grab(check).appendText(thisenum.display).inject(attach);
								attach.appendText(' ');
								
								if (checkvalue.indexOf(thisenum.value) != -1) {
									window.setTimeout(function(){
										check.checked = true;
									}, 0);
								}
							});
							break;
						
						case 'list':
							var listvalue = (typeof thispref.value != 'undefined' && thispref.value!=null) ? thispref.value : thispref['default'];
							listvalue = listvalue.split("|");
							var attach = new Element('select', {
								'name': thisprefname,
								'multiple': 'multiple'
							}).inject(new Element('div').appendText(thispref.display_name+' ').inject(config));
							
							thispref['enum'].each(function(thisenum){
								var op = new Element('option', {
									'value': thisenum.value
								}).appendText(thisenum.display).inject(attach);
								if (listvalue.indexOf(thisenum.value)!=-1) 
									op.set('selected', 'selected');
							});
							break;
						
						default:
							
							break;
					}
				}
			});
			if (!hiddenonly) {
				new Element('div', {'class': 'gadgetconfigSubmit'}).grab(new Element('input', {
					'type': 'submit',
					'value': '設定'
				})).inject(config);
				config.addEvent('submit', this.onUpdateSetting.bindWithEvent(this));
			} else {
				toolboximage[1].destroy();
			}
			this.config = config;
		}
		
		/// マウスイベント横取り防止エレメントの作成
		var dummy = this.element.getElement('.gadgetdummy');
		dummy.style.backgroundColor = '#000000';
		dummy.setOpacity(0);
		dummy.style.visibility = 'hidden';
		this.dummy = dummy;
		
		/// 表示位置大きさの調整
		if(!this.model.position) {
			this.model.position = {};
			
		}
		
		if(!this.model.position) this.model.position = {};
		
		//// 以下レイアウト依存
		this.parentTab.layout.attachGadget(this);
		this.sandboxseed = 'ts'+this.model.giid.substring(0,5);
		this.setIframeSrc( 'http://'+this.sandboxseed+'.'+trunc.GADGETURL+"Gadget.php?method=getGadgetContents&giid="+this.model.giid); /// #!TODO!# サブドメインを変更して、セキュリティ強化をすること！
		
		this.onCDRsetTitleBind = this.onCDRsetTitle.bind(this);
		this.onCDRsetTitleLinkBind = this.onCDRsetTitleLink.bind(this);
		this.onCDRsetFaviconBind = this.onCDRsetFavicon.bind(this);
		this.onCDRplayMovieBind = this.onCDRplayMovie.bind(this);
		this.onCDRsetPrefBind = this.onCDRsetPref.bind(this);
		this.setCDRequest();
		
		this.model.showContents = !this.model.showContents;
		this.minimize(true);
		
		Screen.repositionFooter();
	},
	setIframeSrc: function(src) {
		this.iframe = $(this.iframe);
		if(trunc.browser.isIE) {
			var dummy = this.iframe.cloneNode(true);
			dummy.style.position = 'absolute';
			dummy.style.visibility = 'hidden';
			dummy.id = '';
			dummy.addEvent('load',function(){
				dummy.removeEvent("load", arguments.callee);
				dummy.style.position = this.iframe.style.position;
				dummy.style.visibility = this.iframe.style.visibility;
				this.iframe.parentNode.replaceChild(dummy, this.iframe);
				dummy.id = this.iframe.id;
				this.iframe = dummy;
			}.bind(this));
			dummy.src = src+'&session_key='+Screen.model.session_key;
			document.body.appendChild(dummy);
		}else{
			this.iframe.src = src+'&session_key='+Screen.model.session_key;
			//iframe.ownerModule = this;
		}
		this.src = src;
	},
	getModel: function(giid) {
		new Request.JSON({
			url: trunc.XHRURL+'Screen.php',
			method: 'get',
			data: {
				method: 'getGadgetModel',
				'giid': giid
			},
			onComplete : this.onGetModel.bind(this)
		}).send();
	},
	getPrefs: function() {
		return this.model.prefs;
	},
	getPref: function(name) {
		return this.model.prefs[name];
	},
	refresh: function() {
		this.iframe.src = "";
		this.iframe.src = this.src+'&session_key='+Screen.model.session_key;
	},
	minimize: function() {
		this.model.showContents = !this.model.showContents;
		var target = this.element.getElement(".gadgetbody");
		var footer = this.element.getElement(".gadgetfooter");
		if (!this.model.showContents) {
			this.minimizeIcon.src = '/theme/'+changeDesign.designName+'/img/gadget/gadgetMaximize.gif';
			target.setStyle('display', 'none');
			footer.setStyle('cursor','');
		}
		else {
			this.minimizeIcon.src = '/theme/'+changeDesign.designName+'/img/gadget/gadgetMinimize.gif';
			target.setStyle('display', '');
		}
		
		if (arguments.length <= 0 || !arguments[0]) {
			new Request({
				url: trunc.XHRURL + 'Screen.php',
				method: 'get',
				data: {
					method: 'setGadgetModel',
					model: JSON.encode({
						'giid': this.model.giid,
						'position': this.model.position,
						'showContents': this.model.showContents
					})
				}
			}).send();
		}
	},
	toggleDummy: function(show) {
		if (show) {
			this.dummy.style.visibility = 'visible';
			var size = this.iframe.getSize();
			this.dummy.setStyles({
				width: size.x,
				height: size.y
			});
		}else{
			this.dummy.style.visibility = 'hidden';
		}
	},
	destroy: function() {
		this.unSetCDRequest();
		new Request({
				url: trunc.XHRURL + 'Screen.php',
				method: 'get',
				data: {
					method: 'deleteGadget',
					'giid': this.model.giid
				},
				onSuccess: function(res) {
					if(res!='200 OK') return;
					
					this.element.destroy();
					this.parentTab.deleteGadget(this);
				}.bind(this)
			}).send();
	},
	setModel: function(res) {
		this.model = new GadgetModel(res);
		this.model.showConfig = false;
	},
	updatePosition: function() {
		new Request({
			url: trunc.XHRURL+'Screen.php',
			method: 'get',
			data: {
				method: 'setGadgetModel',
				model: JSON.encode({ 'giid': this.model.giid, 'position': this.model.position })
			}
		}).send();
	},
	setCDRequest: function() {
		trunc.cdRequest.addListener(this.iframe, 'setTitle',this.onCDRsetTitleBind);
		trunc.cdRequest.addListener(this.iframe, 'setTitleLink', this.onCDRsetTitleLinkBind);
		trunc.cdRequest.addListener(this.iframe, 'setFavicon', this.onCDRsetFaviconBind);
		trunc.cdRequest.addListener(this.iframe, 'playMovie', this.onCDRplayMovieBind);
		trunc.cdRequest.addListener(this.iframe, 'setPref', this.onCDRsetPrefBind);
	},
	unSetCDRequest: function() {
		trunc.cdRequest.removeListener(this.iframe, 'setTitle',this.onCDRsetTitleBind);
		trunc.cdRequest.removeListener(this.iframe, 'setTitleLink', this.onCDRsetTitleLinkBind);
		trunc.cdRequest.removeListener(this.iframe, 'setFavicon', this.onCDRsetFaviconBind);
		trunc.cdRequest.removeListener(this.iframe, 'playMovie', this.onCDRplayMovieBind);
		trunc.cdRequest.removeListener(this.iframe, 'setPref', this.onCDRsetPrefBind);
	},
	
	////
	onCDRsetTitle:  function(message){
		this.model.title = message.title;
		var title = this.element.getElement('.gadgettitle');
		if (title.getElement('a')) {
			title = title.getElement('a');
			title.set('text', message.title);
		} else {
			var img = title.getElement('img');
			if (img) {
				img.parentNode.removeChild(img);
				title.innerHTML = '';
				title.grab(img);
			} else {
				title.innerHTML = '';
			}
			title.grab(new Element('span', {
				'html': message.title
			}));
		}
	},
	onCDRsetTitleLink: function(message){
		if(message.link.match(/^javascript:/)) return;
		this.model.title_url = message.link;
		var title = this.element.getElement('.gadgettitle');

		if (this.model.title_url != "") {
			if (title.getElement('a')) {
				title.getElement('a').href = encodeURI(this.model.title_url);
			} else {
				var img = title.getElement('img');
				if (img) {
					img.parentNode.removeChild(img);
					title.innerHTML = '';
					title.grab(img);
				} else {
					title.innerHTML = '';
				}
				title.grab(new Element('a', {
					href: encodeURI(this.model.title_url),
					target: '_blank',
					events: {
						'mousedown': function(e){
							this.drag = false;
						},
						'mousemove': function(e){
							this.drag = true;
						},
						'click': function(e){
							if (this.drag) e.stop();
						}
					}
				}).set('text', this.model.title));
			}
		} else {
			if (title.getElement('a')) {
				var img = title.getElement('img');
				if (img) {
					img.parentNode.removeChild(img);
					title.innerHTML = '';
					title.grab(img);
				} else {
					title.innerHTML = '';
				}
				title.grab(new Element('span', {
					'html': this.model.title
				}));
			}
		}
	},
	onCDRsetFavicon: function(message){
		this.model.favicon_url = message.url;
		var title = this.element.getElement('.gadgettitle');
		if (this.model.favicon_url=='') {
			var img = title.getElement('img');
			if(img) img.destroy();
		}else{
			if (title.getElement('img')) title.getElement('img').src = '/favicon.php?url=' + encodeURIComponent(this.model.favicon_url);
			else title.grab(new Element('img', {
				src: '/favicon.php?url=' + encodeURIComponent(this.model.favicon_url),
				width: 16,
				height: 16,
				alt: ''
			}), 'top');
		}
	},
	onCDRplayMovie: function(msg){
		var postion = this.iframe.getPosition();
		//var winposition = window.getScrollPosition();
		trunc.playMovieEvent(msg);
	},
	onCDRsetPref: function(message){
		var name = message.name;
		var value = JSON.decode(message.value);
		trunc.setFormdata(this.config, { 'name':name, 'value':value });
		var formdata = trunc.getFormdata(this.config);
		
		var passwordflag = false;
		$each(formdata, function(v, k) {
			if(this.model.prefs[k].type=="array") formdata[k] = v.join("\n");
			else if(this.model.prefs[k].type=="enum" && (this.model.prefs[k].view=="checkbox" || this.model.prefs[k].view=="list")) formdata[k] = v.join("|");
			
			if (this.model.prefs[k].type == "password" && v) {
				passwordflag = true;
				trunc.setFormdata(this.config, { 'name': k, 'value': '' });
			} 
		}.bind(this));
		
		formdata['giid'] = this.model.giid;
		if (!passwordflag) {
			setTimeout( function() {
				new Request({
					url: trunc.XHRURL+'Screen.php',
					method: 'post',
					data: {
						method: 'setPrefs',
						'prefs':  JSON.encode(formdata)
					}
				}).send();
			},0);
		} else {
			ScreenSSLConnect.Request('Screen.php',{
				 method: 'setPrefs',
				 'prefs':  JSON.encode(formdata)
			});
		}
	},
	
	/// EventListener
	onGetModel: function(res) {
		this.setModel(res);
		this.create();
	},
	onMinimize: function() {
		if(!this.toolboxClickAllow) return;
		this.minimize();
		Screen.repositionFooter();
	},
	onActive: function() {
		if(this.model.position.zIndex == this.parentTab.zIndex) return;
		this.element.setStyle('z-index', ++this.parentTab.zIndex);
		this.model.position.zIndex = this.parentTab.zIndex;
		
		this.updatePosition();
	},
	onMouseDown: function(evn) {
		if( evn.rightClick ) return;
		this.onActive();
	},
	onToggleConfig: function(evn, force) {
		evn.stop();
		force = force || false;
		if(!force && !this.toolboxClickAllow) return;
		
		this.model.showConfig = !this.model.showConfig;
		if(force) this.model.showConfig = false;
		if(this.model.showConfig) {
			evn.target.src = '/theme/'+changeDesign.designName+'/img/gadget/gadgetSetting_open.gif';
			this.element.getElement('.gadgetconfig').setStyle('display', '');
		}else{
			evn.target.src = '/theme/'+changeDesign.designName+'/img/gadget/gadgetSetting.gif';
			this.element.getElement('.gadgetconfig').setStyle('display', 'none');
		}
		Screen.repositionFooter();
	},
	onRefresh: function() {
		if(!this.toolboxClickAllow) return;
		this.refresh();
	},
	onUpdateSetting: function(evn) {
		var formdata = trunc.getFormdata(this.config);
		var formdataorg = formdata;
		
		var passwordflag = false;
		$each(formdata, function(v, k) {
			if(this.model.prefs[k].type=="array") formdata[k] = v.join("\n");
			else if(this.model.prefs[k].type=="enum" && (this.model.prefs[k].view=="checkbox" || this.model.prefs[k].view=="list")) formdata[k] = v.join("|");
			
			if (this.model.prefs[k].type == "password" && v) {
				trunc.setFormdata(this.config, { 'name': k, 'value': '' });
				passwordflag = true;
			}
		}.bind(this));
		
		formdata['giid'] = this.model.giid;
		
		var refreshfunc = function(){
			trunc.cdRequest.send(this.iframe, {
				mid: 'setPref',
				data: JSON.encode(formdataorg)
			});
		}.bind(this)
		
		if (!passwordflag) {
			new Request({
				url: trunc.XHRURL+'Screen.php',
				method: 'post',
				data: {
					method: 'setPrefs',
					'prefs':  JSON.encode(formdata)
				},
				onComplete: refreshfunc
			}).send();
		} else {
			ScreenSSLConnect.Request('Screen.php', {
				method: 'setPrefs',
				'prefs': JSON.encode(formdata)
			}, refreshfunc);
		}
		new Event(evn).stop();
		this.onToggleConfig({target: (this.element.getElements('.gadgettoolbox img'))[1],stop:function(){}}, true);
		
		return false;
	},
	onClose: function() {
		if(!this.toolboxClickAllow) return;
		trunc.confirm('ガジェット「'+this.model.title+'」を削除してもよろしいですか?', function(flag){
			if(!flag) return;
			this.destroy();
		}.bind(this));
	}
});

GadgetModel = new Class({
	giid: '',
	gid: '',
	tid: '',
	position: null,
	prefs: [],
	title: '',
	title_url: '',
	favicon_url: '',
	showContents: false,
	showConfig: false,
	initialize: function(option) {
		option = $extend(this, option);
		this.giid = option.giid;
		this.gid = option.gid;
		this.tid = option.tid;
		this.position = option.position;
		if(this.position==false) this.position = new Bound();
		this.prefs = option.prefs;
		this.showContents = option.showContents;
		this.title = option.title || '';
		this.title_url = option.title_url || '';
		this.favicon_url = option.favicon_url || '';
	}
});

Bound = function(){
	return {
		x: 0,
		y: 0,
		width: 0,
		height: 0,
		zIndex: 0
	};
}

GridLayout = new Class({
	column: 4,
	resizeInfo: {},
	colsizemin: 100,
	initialize: function(tab) {
		this.parentTab = tab;
		this.layoutInfo = tab.model.layoutInfo;
		this.setColumn(this.layoutInfo.column || 4);
	},
	getType: function() {
		return 'GRID';
	},
	setColumn: function(column) {
		if(column>0 && column<5) {
			this.column = column;
		}
		return this;
	},
	getColumn: function() {
		return this.column;
	},
	create: function() {
		var columns = new Element('div', {'id': 'columns' });
		columns.inject($('main'));
		var maxwidth = 100 - this.column+1;

		if(!this.layoutInfo.columnsize) {
			this.layoutInfo.columnsize = [];
			for(var i=0; i< this.column; i++)
				this.layoutInfo.columnsize[i] = parseFloat(maxwidth/this.column);
		}
		
		for(var i=0; i< this.column; i++) {
			new Element('div', {'class': 'column', 'id': 'col'+i, 'styles': { 'width': this.layoutInfo.columnsize[i] + '%' } }).inject(columns);
			if((i+1)<this.column) new Element('div', {'class':'columnResize'}).inject(columns).addEvent('mousedown', this.onSpliteMouseDown.bindWithEvent(this));
		}
		
		new Element('div', {'id': 'gadgetghorst', 'class': 'gadget', 'styles': {'display':'none'}} ).inject($('col0'));
	},
	attachGadget: function(gadget, reAttach) {
		reAttach = reAttach || false;
		
		/// 追加
		var col = gadget.model.position.col || 0;
		if(this.column <= col) col = 0;
		var row = gadget.model.position.row || 0;
		var igt = null;
		gadget.element.row = row;
		$('col'+col).getElements('.gadget').each(function(elem){
			if(!igt && row < elem.row) igt = elem; 
		});
		if(igt!=null) $('col'+col).insertBefore(gadget.element, igt);
		else $('col'+col).appendChild(gadget.element);
		
		if(!reAttach) {
			trunc.cdRequest.send(gadget.iframe, {
				mid: 'onResize',
				data: JSON.encode({'width': gadget.element.getParent().getSize().x, 'height': gadget.model.position.height})
			});
		}
		
		gadget.element.setStyle('position','relative');
		if(gadget.model.position.height) gadget.iframe.height = gadget.model.position.height;
		
		var me = this;
		
		/// D&D
		gadget.DandD = new Drag(gadget.element, {
			container: true,
			handle: gadget.element.getElement('.gadgetheader'),
			onBeforeStart: function(el) {
				gadget.parentTab.toggleAllDummy(true);
				gadget.unSetCDRequest();
				// ghost
				var gadgetghorst = $('gadgetghorst');
				var gadgetcolumn = el.getParent();
				var pos = el.getCoordinates($('columns'));
				
				var elHeight = parseInt(el.getStyle('height'));
				
				gadgetghorst.setStyles({
					'height': elHeight+'px',
					'display': ''
				});
				gadgetcolumn.insertBefore(gadgetghorst, el);
				
				el.setStyle('position', 'absolute'); 
				el.setStyles({
					'z-index': '20000',
					'top': (pos.top-(parseInt(el.getStyle('margin-top'))||0))+'px',
					'left': (pos.left-(parseInt(el.getStyle('margin-left'))||0))+'px',
					'width': pos.width+'px'
				});
				//pos = el.getCoordinates();
				
				this.columnPosition = new Array();
				for(var i=0; i<this.column; i++) {
					this.columnPosition[i] = $('col'+i).getCoordinates();
				}
				
				this.orgLeft = parseInt(el.getStyle('left'));
				this.orgTop = parseInt(el.getStyle('toip'));
				this.orgIndex = 0;
				
				this.oldTab = null;
			}.bind(this),
			onDrag: function(el) {
				var column = el.getParent();
				var columnsize = column.getSize();
				var size = el.getCoordinates();
				var gadgetghorst = $('gadgetghorst');
				var gp = gadgetghorst.getParent();
				
				var columnstop = $('columns').getPosition().y;
				
				var mp = this.mouse.now;
				// タブ間移動
				if (mp.y < columnstop) {
					el.setOpacity(0.6);
					if (me.oldTab == null || !(me.oldTab[1].left <= mp.x && me.oldTab[1].right >= mp.x)) {
						$each(Screen.model.tabs, function(t){
							t.element.removeClass('focus');
							if(t.element.get('class').match(/select/)) return;
							var p = t.element.getCoordinates();
							if (p.left < mp.x && p.right > mp.x && p.top < mp.y && p.bottom > mp.y) {
								t.element.addClass('focus');
								me.oldTab = [t, p];
							}
						});
					}
					return;
				}
				me.oldTab = null;
				el.setOpacity(1);
				
				// カラム内移動
				var nowcolumn = null;
				for (var i = 0; i < me.column-1; i++) {
					var cs = me.columnPosition[i];
					if (mp.x <= cs.right) {
						nowcolumn = $('col' + i);
						break;
					}
				}
				if(nowcolumn==null) nowcolumn = $('col'+(me.column-1));
				var insertTarget = nowcolumn;
				var where = 'bottom';
				var flag = false;
				nowcolumn.getElements('.gadget').each(function(v){
					if(v==el || flag) return;
					var vs = v.getCoordinates();
					
					if(vs.top < mp.y && (vs.top+80) > mp.y) {
						if(v==nowcolumn.firstChild || v.previousSibling != gadgetghorst) {
							insertTarget = v;
							where = 'before';
							flag = true;
						}else{
							where = '';
						}
					}
				});
				
				if(where) gadgetghorst.inject( insertTarget, where);
				Screen.repositionFooter();
			},
			onComplete: function(el){
				// ghost hide
				var gadgetghorst = $('gadgetghorst');
				gadgetghorst.setStyle('display','none');
				$(el).setStyles({
					'position': 'relative',
					'z-index': '0',
					'top': '0px',
					'left': '0px',
					'width': 'auto'
				});
				
				var tmpiframe = this.iframe;
				$(el).inject(gadgetghorst, 'after');
				el.setOpacity(1);
				$$('.tab').removeClass('focus');
				
				this.parentTab.toggleAllDummy(false);
				this.refresh();
				
				Screen.repositionFooter();
				this.parentTab.layout.refreshPosition();
				
				/// タブ間移動
				if (me.oldTab && me.oldTab[0] != me.parentTab) {
					var targettab = me.oldTab[0];
					
					gadget.model.position.row = -1;
					gadget.model.position.col = 0;
					gadget.model.position.x = gadget.model.position.y = 0;
					
					targettab.moveGadget(gadget);
					
					new Request({
						url: trunc.XHRURL + 'Screen.php',
						method: 'get',
						data: {
							method: 'setGadgetModel',
							model: JSON.encode({
								'giid': gadget.model.giid,
								'tid': targettab.model.tid
							})
						}
					}).send();
					me.parentTab.deleteGadget(gadget);
					gadget.element.destroy();
				} else {
					this.setCDRequest();
				}
			}.bind(gadget),
			onCancel: function(el){
				// ghost hide
				$('gadgetghorst').setStyle('display','none');
				$(el).setStyles({
					'position': 'relative',
					'z-index': '0',
					'top': '0px',
					'left': '0px',
					'width': 'auto'
				});
				el.setOpacity(1);
				$$('.tab').removeClass('focus');
				
				this.parentTab.toggleAllDummy(false);
				gadget.setCDRequest();
				Screen.repositionFooter();
			}.bind(this)
		});
		
		//// resize
		if (gadget.model.scale) {
			gadget.resizeDandD = gadget.element.makeResizable({
				handle: gadget.element.getElement('.gadgetfooter'),
				limit: {
					'y': [100]
				},
				modifiers: {
					'x': ''
				},
				onBeforeStart: function(){
					this.parentTab.toggleAllDummy(true);
					if (!gadget.model.showContents) 
						return false;
					this.resizeDandD.FrameHeight = this.element.getSize().y - this.iframe.getSize().y;
				}.bind(gadget)				,
				onDrag: function(el){
					if (this.value.now['y']) {
						var y = this.value.now['y'];
						y -= this.FrameHeight;
						gadget.iframe.setStyle('height', y);
					}
					var size = gadget.iframe.getSize();
					gadget.dummy.setStyles({
						width: size.x,
						height: size.y
					});
					el.setStyle('width', '');
					Screen.repositionFooter();
				},
				onComplete: function(el){
					this.parentTab.toggleAllDummy(false);
					var width = this.element.getParent().getSize().x;
					var height = parseInt(gadget.iframe.getStyle('height'));
					this.model.position.height = height;
					
					el.setStyle('height', '');
					
					trunc.cdRequest.send(this.iframe, {
						mid: 'onResize',
						data: JSON.encode({
							'width': width,
							'height': height
						})
					});
					
					Screen.repositionFooter();
					this.updatePosition();
				}.bind(gadget)
			});
		}
	},
	detachGadget: function(gadget) {
		gadget.DandD.detach();
		gadget.DandD = null;
		if (gadget.model.scale) {
			gadget.resizeDandD.detach();
			gadget.resizeDandD = null;
		}
	},
	refreshPosition: function() {
		var gadgets = this.parentTab.model.gadgets;
		var gadgetpositions = {};
		for(var i=0; i<this.column; i++) {
			var row = 0;
			$('col'+i).getElements('.gadget').each(function(elem){
				if(elem.id && elem.id=='gadgetghorst') return;
				var id = elem.getElement('iframe').id;
				gadgetpositions[id] = [i,row];
				elem.row = row;
				row++;
			});
		}
		gadgets.each(function(v){
			var p = gadgetpositions[v.model.giid];
			if(!p) return;
			v.model.position.col = p[0];
			v.model.position.row = p[1];
		});
		this.parentTab.updatePosition();
	},
	changeLayout: function(type, options) {
		if(type==this.getType()) {
			if (this.column == options.column) {
				// カラム数が同じなら何もしない
				return;
			}else if(this.column < options.column) {
				// カラム数が増える場合
				var columns = $('columns');
				for (var i = this.column; i < options.column; i++) {
					new Element('div', {
						'class': 'columnResize'
					}).inject(columns).addEvent('mousedown', this.onSpliteMouseDown.bindWithEvent(this));
					new Element('div', {
						'class': 'column',
						'id': 'col' + i
					}).inject(columns);
				}
			}else{
				// カラム数が減る場合
				var col0 = $('col0');
				for(var i=options.column; i<this.column; i++) {
					$('col'+i).getElements('.gadget').inject(col0);
					var splite = $('col'+i).getPrevious();
					splite.removeEvents('mousedown');
					splite.destroy();
					$('col'+i).destroy();
				}
			}
			var colwidth = parseFloat((100 - options.column) / options.column);
			this.layoutInfo.columnsize = [];
			for (var i = 0; i < options.column; i++) {
				this.layoutInfo.columnsize[i] = colwidth;
				$('col' + i).setStyle('width', colwidth + '%');
			}
			
			this.column = options.column;
			this.parentTab.updatePosition();
		}else{
			var newlayout = new NoGridLayout(this.parentTab);
			
			this.parentTab.model.gadgets.each(function(g){
				this.detachGadget(g);
				var ngp = g.element.getCoordinates($('columns'));
				var gp = g.model.position;
				gp.width = ngp.width;
				gp.y = ngp.top;
				gp.x = ngp.left;
			}.bind(this));
			
			this.parentTab.model.gadgets.each(function(g){
				newlayout.attachGadget(g, true);
			}.bind(this));
			
			$('columns').destroy();
			this.parentTab.layout = newlayout;
			this.parentTab.updatePosition();
			delete this;
		}
	},
	// イベントハンドラ
	onSpliteMouseDown: function(e) {
		e.stop();
		this.parentTab.toggleAllDummy(true);
		document.body.style.cursor = 'col-resize';
		this.resizeInfo = {
			sx : e.page.x,
			target: e.target,
			ol: e.target.getPrevious().getScrollSize().x,
			or: e.target.getNext().getScrollSize().x,
			fmm: this.onSpliteMouseMove.bindWithEvent(this),
			fmu: this.onSpliteMouseUp.bindWithEvent(this)
		};
		this.drag = true;
		$(document.body).addEvent('mousemove', this.resizeInfo.fmm);
		$(document.body).addEvent('mouseup', this.resizeInfo.fmu);
	},
	onSpliteMouseMove: function(e) {
		if(!this.drag) return;
		
		var d = e.page.x - this.resizeInfo.sx;
		var lw = this.resizeInfo.ol + d;
		var rw = this.resizeInfo.or - d;
		
		if (lw > this.colsizemin && rw > this.colsizemin) {
			this.resizeInfo.target.getPrevious().setStyle('width', lw + 'px');
			this.resizeInfo.target.getNext().setStyle('width', rw + 'px');
		} else {
			if (lw > this.colsizemin) {
				d = this.resizeInfo.or - this.colsizemin;
				this.resizeInfo.target.getPrevious().setStyle('width', (this.resizeInfo.ol + d) + 'px');
			} else {
				this.resizeInfo.target.getPrevious().setStyle('width', this.colsizemin + 'px');
			}
			if (rw > this.colsizemin) {
				d = this.resizeInfo.ol - this.colsizemin;
				this.resizeInfo.target.getNext().setStyle('width', (this.resizeInfo.or + d) + 'px');
			} else {
				this.resizeInfo.target.getNext().setStyle('width', this.colsizemin + 'px');
			}
		}
		
		e.stop();
	},
	onSpliteMouseUp: function(e) {
		e.stop();
		document.body.style.cursor = '';
		document.body.removeEvents('mousemove');
		document.body.removeEvents('mouseup');
		
		var totalx = 0.0 + $('columns').getScrollSize().x;
		this.parentTab.toggleAllDummy(false);
		/// ここでサーバーへの更新命令をかく
		var columnsize = [];
		for(var i=0; i<this.column; i++) {
			var x = $('col'+i).getScrollSize().x / totalx * 100;
			columnsize[i] = x;
		}
		this.layoutInfo.columnsize = columnsize;
		this.parentTab.model.layoutInfo = this.layoutInfo;
		this.parentTab.updateLayoutInfo();
	}
});

NoGridLayout = new Class({
	initialize: function(tab) {
		this.parentTab = tab;
	},
	getType: function() {
		return 'NONE';
	},
	create: function() {
		
	},
	attachGadget: function(gadget, reAttach) {
		reAttach = reAttach || false;
		
		$('main').appendChild(gadget.element);
		
		gadget.element.setStyle('position','absolute');
		gadget.element.setStyle('top', gadget.model.position.y+'px');
		gadget.element.setStyle('left', gadget.model.position.x+'px');
		gadget.element.setStyle('width', gadget.model.position.width+'px');
		
		if(!gadget.model.position.zIndex) {
			gadget.model.position.zIndex = ++gadget.parentTab.zIndex;
		}else{
			gadget.parentTab.zIndex = Math.max(gadget.model.position.zIndex, gadget.parentTab.zIndex);
		}
		gadget.element.setStyle('z-index', gadget.model.position.zIndex );
		gadget.iframe.setStyle('height', gadget.model.position.height+'px');
		
		trunc.cdRequest.send(gadget.iframe, {
			mid: 'onResize',
			data: JSON.encode({'width': gadget.model.position.width, 'height': gadget.model.position.height})
		});
		
		var me = this;
		
		/// D&D
		gadget.DandD = gadget.element.makeDraggable({
			handle:gadget.element.getElement('.gadgetheader'),
			onBeforeStart: function() {
				this.parentTab.toggleAllDummy(true);
			}.bind(gadget),
			onDrag: function(el) {
				var columnstop = $('main').getPosition().y;
				var mp = this.mouse.now;
				if (mp.y < columnstop) {
					el.setOpacity(0.8);
					if (me.oldTab == null || !(me.oldTab[1].left <= mp.x && me.oldTab[1].right >= mp.x)) {
						$each(Screen.model.tabs, function(t){
							t.element.removeClass('focus');
							var p = t.element.getCoordinates();
							if (p.left < mp.x && p.right > mp.x && p.top < mp.y && p.bottom > mp.y) {
								t.element.addClass('focus');
								me.oldTab = [t, p];
							}
						});
					}
					return;
				}
				me.oldTab = null;
				el.setOpacity(1);
				
				Screen.repositionFooter();
			},
			onComplete: function(el) {
				el.setOpacity(1);
				
				$$('.tab').removeClass('focus');
				this.parentTab.toggleAllDummy(false);
				if(parseInt(el.getStyle('top')) < 0) el.setStyle('top', '0px');
				
				this.model.position.y = parseInt(el.style.top);
				this.model.position.x = parseInt(el.style.left);
				
				this.updatePosition();
				
				if(me.oldTab&& me.oldTab[0]!=me.parentTab) {
					var targettab = me.oldTab[0];
					this.model.position.row = -1;
					this.model.position.col = 0;
					this.model.position.x = this.model.position.y = 0;
					
					targettab.moveGadget(gadget);
					
					new Request({
						url: trunc.XHRURL + 'Screen.php',
						method: 'get',
						data: {
							method: 'setGadgetModel',
							model: JSON.encode({
								'giid': this.model.giid,
								'tid': targettab.model.tid,
								'position': this.model.position
							})
						}
					}).send();
					me.parentTab.deleteGadget(gadget);
					gadget.element.destroy();
				}
			}.bind(gadget),
			onCancel: function(el) {
				el.setOpacity(1);
				$$('.tab').removeClass('focus');
			}
		});
		
		//// resize
		if (gadget.model.scale) {
			gadget.resizeDandD = gadget.element.makeResizable({
				handle: gadget.element.getElement('.gadgetfooter img'),
				limit: {
					'x': [200],
					'y': [100]
				},
				onBeforeStart: function(){
					this.parentTab.toggleAllDummy(true);
					if (!this.model.showContents) 
						return false;
				}.bind(gadget)				,
				onDrag: function(el){
					if (this.value.now['y']) 
						gadget.iframe.setStyle('height', this.value.now['y']);
					var size = gadget.iframe.getSize();
					gadget.dummy.setStyles({
						width: size.x,
						height: size.y
					});
					Screen.repositionFooter();
				},
				onComplete: function(el){
					this.parentTab.toggleAllDummy(false);
					var width = parseInt(el.style.width);
					var height = parseInt(el.style.height);
					this.model.position.width = width;
					this.model.position.height = height;
					
					el.setStyle('height', '');
					
					trunc.cdRequest.send(this.iframe, {
						mid: 'onResize',
						data: JSON.encode({
							'width': width,
							'height': height
						})
					});
					Screen.repositionFooter();
					this.updatePosition();
				}.bind(gadget)
			});
		}
		
		// zIndex
		gadget.element.addEvent('mousedown', gadget.onMouseDown.bindWithEvent(gadget));
		
		if(!reAttach) {
			trunc.cdRequest.send(gadget.iframe, {
				mid: 'onResize',
				data: JSON.encode({'width': gadget.element.getParent().getSize().x, 'height': gadget.model.position.height})
			});
		}
	},
	detachGadget: function(gadget) {
		gadget.DandD.detach();
		gadget.DandD = null;
		if (gadget.model.scale) {
			gadget.resizeDandD.detach();
			gadget.resizeDandD = null;
		}
	},
	refreshPosition: function() {
	},
	changeLayout: function(type, options) {
		if(type==this.getType()) {
			// 同じレイアウトなら何もしない
			return;
		}else{
			options.column = options.column || 4;
			this.parentTab.model.layoutInfo.column = options.column;
			this.parentTab.model.layoutInfo.columnsize = null;
			var newlayout = new GridLayout(this.parentTab);
			newlayout.setColumn( options.column );
			newlayout.create();
			
			var colwidth = Math.floor(window.getSize().x / options.column);
			var mask = [];
			this.parentTab.model.gadgets.each(function(g){
				var gp = g.element.getCoordinates($('columns'));
				var i = Math.floor((gp.left+gp.width/2)/colwidth);
				i = Math.min( i, options.column-1 );
				if(!mask[i]) {
					mask[i] = [];
					mask[i].push([gp,g]);
				}else{
					for(var j=0; j<mask[i].length; j++) {
						var m = mask[i][j];
						if(m[0].top > gp.top) {
							mask[i].splice(j, 0, [gp,g]); 
							break;
						}
						if(j==mask[i].length-1) {
							mask[i].push([gp,g]);
							break;
						}
					}
				}
			}.bind(this));
			
			for(var i=0; i<options.column; i++) {
				if(!mask[i]) continue;
				for (var j = 0; j < mask[i].length; j++) {
					var g = mask[i][j][1];
					this.detachGadget(g);
					g.element.setStyles({
						'position': 'relative',
						'z-index': '0',
						'top': '0px',
						'left': '0px',
						'width': 'auto'
					});
					g.model.position.col = i;
					g.model.position.row = j;
					g.model.position.zIndex = 0;
					newlayout.attachGadget(g, true);
				}
			}
			
			this.parentTab.layout = newlayout;
			this.parentTab.updatePosition();
			delete this;
		}
	}
});


/**
* デザイン設定画面の表示
* スキン変更と壁紙変更の機能
*/
changeDesign = {
	cssUrl: null,
	designName: 'default_blue',
	bgVisibleFlag: 0, //壁紙表示フラグ
	imageUrl : null, //画像URL :アップロードされていなければnull。一度アップロードされれば何らかの画像URLがはいる（ハズ）
	bgVisibleMode : 0, //壁紙とスキンの表示モード（１：スキンを選択する際に壁紙を非表示に、０：スキンを選択する際、壁紙を保持し続ける）
	bgVisibleModeFlag : 0, //確認ダイアログは一度出したら出さないようにするので、表示済みかどうかを保持するフラグ（デザイン変更画面再表示時に初期化）
	bgUploadedFlag:1, //一度でも画像をアップロードしたなら１
	bgUploadFlag:0, //ダイアログを開いてからアップロードを行ったら１、していない場合は０
	showSkinDialog: function() {
		
	},
	showDialog: function() {
		bgVisibleMode = 0;
		bgVisibleModeFlag = 0;
		
		var req = new Request.JSON({
			url: trunc.XHRURL+'Skin.php',
			method: 'get',
			async: false,
			onComplete:function(data) {
				var container = new Array();
				var insert = new Element('div', {'id':'designBox'}); //デザイン画面のスキン表示エリア
				var wallpaper = new Element('div', {'id': 'wallpaperBox'}); //壁紙表示エリア
				changeDesign.bgVisibleModeFlag = 0;
				container[0] = insert;
				container[1] = wallpaper;
				
				var nowt = null;
				changeDesign.cssUrl = null;
				var backup = changeDesign.get();
				//スキンの設定エリア
				//new Element('h3', {'class' : 'designSubHeader', 'html' : 'スキンの設定'}).inject(insert, 'before');
				var overlay = new trunc.overlay();
				overlay.setCustomDialog(container);
				overlay.setForm('デザインを変更します。', '設定', 'キャンセル', 1);
				
				//スキンの表示＆イベント関連付け
				data['skin'].each(function(v, i){
					if((i%3)==0) nowt = new Element('div', {'class': 'section'}).inject(insert);
					var l = new Element('a', {'href':'#', 'title': v.title});
					l.addEvent('click', function(e, css){
						e.stop();
						
						changeDesign.cssUrl = css;
						if (changeDesign.bgVisibleModeFlag == 0 && changeDesign.bgVisibleFlag == 1) {
							trunc.confirm("壁紙を非表示にしますか？",function(res){
								if (res == true) {
									changeDesign.bgVisibleFlag = 0;
									changeDesign.bgVisibleModeFlag = 1;
									use_button.removeProperty('checked');
								} else {
									changeDesign.bgVisibleFlag = 1;
									changeDesign.bgVisibleModeFlag = 1;
									use_button.setProperty('checked', 'checked');
								}
								changeDesign.change(css, changeDesign.bgVisibleFlag);
							});
							
							
						} else {
							changeDesign.change(css, changeDesign.bgVisibleFlag);
						}
						
					}.bindWithEvent(this, v.id));
					
					var l2 = l.clone();
					l2.addEvent('click', function(e, css){
						e.stop();
						changeDesign.cssUrl = css;
						changeDesign.change(css);
						
					}.bindWithEvent(this, v.id));
					new Element('div', { 'class': 'designThumbList' })
						.grab(l.grab(new Element('img', {src: v.thumbnail, 'width': 100, 'height': 90})))
						.grab(new Element('h3').grab(l2.set('text', v.title)))
						.inject(nowt);
					
				});
				
				//---------------
				// 壁紙
				//---------------
				//「スキンの設定」ラベルは、スクロールの関係でdesignBoxの上に入れる。
				if (!overlay.overlayForm.getElement('.alertBoxBody').hasChild('sub_title1')) {
					new Element('h3', {'id':'sub_title1', 'class' : 'designSubHeader', 'html' : 'スキンの設定', 'style':'margin-left:30px;'}).inject($('designBox'),'before');
				}
				new Element('h3', {'id':'sub_title2','class' : 'designSubHeader', 'html' : '壁紙の設定'}).inject($('wallpaperBox'));
				
				if (!trunc.isGuest) {
					var wallpaper_thumbnail = new Element('div', {'id':'wallpaper_thumbnail'}).inject(wallpaper);
					
					//iframe - 壁紙画像のプレビュー表示エリア
					var previewFrame = document.createElement('div');
					previewFrame.innerHTML = '<iframe src="about:blank" name="uploader_iframe" width="0" height="0" border="0" frameborder="0"></iframe>';
					var iframe = $(previewFrame.firstChild);
					iframe.inject(wallpaper);
					
					//壁紙のURLと表示の可否を設定
					var v = data['bg'][0];
					
					//一度もアップロードしていない場合にフラグをセットする。
					if (v.thumbnail == 'img/no_photo.gif') {
						changeDesign.bgUploadedFlag = 0;
					} else {
						changeDesign.bgUploadedFlag = 1;
					}
					document.getElementById('wallpaper_thumbnail').innerHTML='<div id="WallpaperThumb" class="designThumbList"><img src="'+v.thumbnail+'" width="100px" height="90px" /></div>';
					changeDesign.imageUrl = v.thumbnail;
					changeDesign.bgVisibleFlag = v.visible;
					
					var helpMessage = document.createElement('div');
					helpMessage.innerHTML = '<span>※4MBまでの画像ファイルをアップロードできます。</span>';
					var helpMessageObj = $(helpMessage.firstChild);
					helpMessageObj.inject(wallpaper);
					
					
					//アップロードインターフェースの作成
					var uploadFormDiv = document.createElement('div');
					uploadFormDiv.innerHTML = '<div id="wallpaper_setting"><form id="uploadForm" name="uploadForm" enctype="multipart/form-data" method="POST" action="/setBG.php" target="uploader_iframe"></form></div>';
					var formobj = $(uploadFormDiv.firstChild.firstChild);
					formobj.inject(wallpaper);
					
					//ファイル参照用インプット要素
					var input_maxfile = new Element('input',{
						'name':'MAX_FILE_SIZE',
						'type':'hidden',
						'value':'4194304'
					}).inject(formobj);
					var input_imgfile = new Element('input',{
						'class':'uploadButton',
						'name':'image',
						'type':'file',
						'id':'imageupload'
					}).inject(formobj);
					var input_uploadflag = new Element('input',{
						'name':'upload_flag',
						'type':'hidden',
						'value':'1'
					}).inject(formobj);
					
					//アップロードボタン
					var upload_button = new Element('input', {'type':'button', 'value':'アップロード', 'id':'upload_button', 'class':'button', 'style':'opacity:.40;'}).inject(formobj);
					new Element('br').inject(formobj);
					input_imgfile.addEvent('change',function(e){
						if ($('imageupload').value != '') {
							upload_button.setStyle('opacity','1');
						} else {
							upload_button.setStyle('opacity','.40');
						}
					});
					
					
					
					//壁紙の表示、非表示ボタンを作成
					if (changeDesign.bgVisibleFlag == 1) {
						var use_button = new Element('input', {
							'type':'checkbox',
							'checked':'checked',
							'id':'use_button',
							'class':'button'
						}).inject(formobj);
					} else {
						var use_button = new Element('input', {
							'type':'checkbox',
							'id':'use_button',
							'class':'button'
						}).inject(formobj);
					}
					if (changeDesign.bgUploadedFlag == 0) {
						use_button.setProperty('disabled','disabled');
					}
					
					
					
					//アップロードボタンのイベント
					upload_button.addEvent('click',function(e){
						if ($('imageupload').value) {
							$('WallpaperThumb').innerHTML = '<img src="img/loading_header.gif" width="100" height="90" />';
							$('uploadForm').submit();
						}
					});
					
					var use_button_label = new Element('label', {
						'for':'use_button'
					}).inject(formobj);
					
					use_button_label.set('text','壁紙を表示する');
					
					//壁紙の表示・非表示のイベント設定
					if (changeDesign.imageUrl) { //壁紙のファイルがセットされているときのみ有効
						use_button.addEvent('click', function(e) {
							if (changeDesign.bgVisibleFlag == 0) { //壁紙が無効状態であれば、壁紙を有効にする。
								use_button.setProperty('checked','checked');
								$('content').setStyle('background-image', 'url(\'' + changeDesign.imageUrl + '\')');
								$('main').setStyle('background-color', 'transparent');
								changeDesign.bgVisibleFlag = 1; //「表示済み」にフラグ値をセットする
							} else {
								use_button.removeProperty('checked');
								$('content').setStyle('background-image', 'none');
								$('main').setStyle('background-color', '#FFFFFF');
								changeDesign.bgVisibleFlag = 0; //「非表示」にフラグ値をセットする。
							}
						});
					}
					
				} else {
					var for_guest_message = new Element('p',{'html':'ゲストユーザーはご利用できません。'}).inject(wallpaper);
				}
				
				overlay.start(0.1);
				
				overlay.hook( function(flag){
					if(flag==1) { //設定ボタン押したとき
						if (changeDesign.cssUrl || changeDesign.imageUrl) {
							if (changeDesign.cssUrl == null) {
								changeDesign.designName = backup['skin'];
							} else {
								changeDesign.designName = changeDesign.cssUrl;
							}
							
							new Request({
								url: trunc.XHRURL + 'Screen.php',
								method: 'post',
								data: {
									method: 'setScreenModel',
									model: JSON.encode({
										"designSkin" : changeDesign.designName,
										"visible" : changeDesign.bgVisibleFlag //壁紙が有効かどうかの値を渡す
									})
								}
							}).send();
						}
					} else { //キャンセルボタン押したとき
						changeDesign.designName = backup['skin'];
						if (changeDesign.bgUploadFlag == 1 && changeDesign.bgVisibleFlag == 0 ) {
							if (backup['bg'] == 0) {
								changeDesign.bgVisibleFlag = 0;
							} else {
								changeDesign.bgVisibleFlag = 1;
								
							}
						} else {
							changeDesign.bgVisibleFlag = backup['bg'];
						}
						new Request({
							url: trunc.XHRURL + 'Screen.php',
							method: 'post',
							data: {
								method: 'setScreenModel',
								model: JSON.encode({
									"designSkin": backup['skin'],
									"visible": changeDesign.bgVisibleFlag //壁紙が有効かどうかの値を渡す
								})
							}
						}).send();
						if (changeDesign.bgVisibleFlag == 1) {
							$('content').setStyle('background-image', 'url(\'' + changeDesign.imageUrl + '\')');
							$('main').setStyle('background-color', 'transparent');
						} else {
							$('content').setStyle('background-image', 'none');
							$('main').setStyle('background-color', '#EEEEEE');
						}
					}
					changeDesign.change(changeDesign.designName, changeDesign.bgVisibleFlag);
					$$('#designBox a').removeEvents('click');
					overlay.end();
				});
				
				
			}
		}).send();
	},
	//cssfiles : スキン変更用CSSの指定
	//bgVisible : 壁紙の表示フラグ
	change: function(cssfiles, bgVisible) {
		if (cssfiles) {
			var base = document.location.protocol + '//' + document.location.host;
			var css = '(' + base + ')?/css/';
			var reg = new RegExp('^' + css);

			for (var i = 0; i < document.styleSheets.length; i++) {
				if (!document.styleSheets[i].href || document.styleSheets[i].href.match(reg)) 
					continue;
				document.styleSheets[i].disabled = true;
			}
			if (cssfiles) {
				if (document.createStyleSheet) 
					document.createStyleSheet('/theme/'+cssfiles+'/design.css');
				else {
					$$('head').grab(new Element('link', {
						rel: 'stylesheet',
						type: 'text/css',
						href: '/theme/'+cssfiles+'/design.css'
					}));
				}
				
				var imgreg = new RegExp('^'+base+'/theme/[^/]+/');
				$$('#all img').each(function(v){
					if(!v.src.match(imgreg)) return;
					v.src = v.src.replace(imgreg, base+'/theme/'+cssfiles+'/');
				});
			}
		}
		
		//壁紙変更時の処理（有効・無効）
		if (bgVisible == 1) {
			$('content').setStyle('background-image', 'url(\'' + changeDesign.imageUrl + '\')');
			$('main').setStyle('background-color', 'transparent');
			changeDesign.bgVisibleFlag = 1; //「表示済み」にフラグ値をセットする
		} else {
			$('content').setStyle('background-image', 'none');
			$('main').setStyle('background-color', '#EEEEEE');
			changeDesign.bgVisibleFlag = 0; //「非表示」にフラグ値をセットする。
		}
	},
	
	get: function() {
		var base = document.location.protocol + '//' + document.location.host + '/css/';
		var reg = new RegExp('^' + base);
		var ret = '';
		for (var i = 0; i < document.styleSheets.length; i++) {
			if(!document.styleSheets[i].href) continue;
			if(document.styleSheets[i].href.match(reg)) continue;
			if(document.styleSheets[i].disabled) continue;
			if(!document.styleSheets[i].href.match(new RegExp('/theme/([^/]+)/design.css'))) continue;
			ret = RegExp.$1;
		}
		
		//現在の壁紙設定を返すように拡張
		var bgVisibleFlag = changeDesign.bgVisibleFlag;
		return {'skin': ret, 'bg':bgVisibleFlag};
	}
};

/////////////////////////////////////////////////////////////////////////////

PLAYER_WIDTH = "300";
PLAYER_HEIGHT = "236";

PLAYER_YOUTUBE_WIDTH = "300";
PLAYER_YOUTUBE_HEIGHT = "193";

PLAYER_DECOWAKU_WIDTH = "350";
PLAYER_DECOWAKU_HEIGHT = "370";

PLAYER_NICOVIDEO_WIDTH = 485;
PLAYER_NICOVIDEO_HEIGHT = 385;
PLAYER_NICOVIDEO_ICHIBA_WIDTH = 250;

trunc.playMovieEvent = function(msg){
	var type = msg.type, title = msg.title;
	
	var position = null;
	
	switch (type) {
	case 'youtube':
		trunc.playMovieYoutube( position, title, msg.link, msg.image );
		break;
	case 'amebavision':
		trunc.playMovieAmebaVision( position, title, msg.link, msg.image );
		break;
	case 'googlevideo':
		trunc.playMovieGoogleVideo( position, title, msg.link, msg.image );
		break;
	case 'decowaku':
		trunc.playMovieDecowaku( position, title, msg.link );
		break;
	case 'nicovideo':
		trunc.playMovieNicovideo( position, title, msg.link );
		break;
	}
};

trunc.playMovie = function(position, title, link, movieurl, imageurl, defaultplayer, decowaku, youtube){
	var playerurl = '/flash/flvPlayer.swf?v=12';
	decowaku = decowaku || false;
	youtube = youtube || false;
	var self = trunc.playMovie;
	
	if(!self.idPool) self.idPool = new Array();
	var vid = undefined;
	self.idPool.each(function(alink, index){
		if(alink == link) vid = index + 1;
	});
	
	if (typeof vid == 'undefined') {
		self.idPool.push(link);
		vid = self.idPool.length;
	}
	
	var player = $('playerMovieTray'+vid);
	if (!player) {
		var width = PLAYER_WIDTH;
		var height = PLAYER_HEIGHT;
		if (decowaku) {
			width = PLAYER_DECOWAKU_WIDTH;
			height = PLAYER_DECOWAKU_HEIGHT;
		}
		
		if (youtube) {
			width = PLAYER_YOUTUBE_WIDTH;
			height = PLAYER_YOUTUBE_HEIGHT;
		}

		player = new Element('div', {
			'id': 'playerMovieTray'+vid,
			'class':'moviePlayerTray gadget',
			'styles' :{
				'position': (trunc.browser.isIE && trunc.browser.version < 7)?'absolute':'fixed',
				'z-index': self.zIndex++,
				'width': width+'px'
			}
		});
		
		document.body.appendChild(player);
		
		var titlebox = new Element('div', {
			'class': "moviePlayerTitle gadgetheader"
		});
		player.appendChild(titlebox);
		
		var spbody = new Element( 'div', {
			'class': "moviePlayer gadgetbody",
			styles: {'height': height+'px'}
		} );
		
		if(typeof(defaultplayer)!='undefined') playerurl = defaultplayer;
		spbody.innerHTML = '<iframe width="'+width+'" height="'+height+'" scrolling="no" frameborder="0" style="border:0;float:left" src="/xhr/movieplayer.php?link='+encodeURIComponent(link)+'&movieurl='+encodeURIComponent(movieurl)+'&imageurl='+encodeURIComponent(imageurl)+'&playerurl='+encodeURIComponent(playerurl)+'&decowaku='+(decowaku?'true':'false')+'"></iframe><div></div>';
		
		var iframe = $(spbody.firstChild);
		var scrolldummy = $(spbody.childNodes[1]);
		scrolldummy.style.position = 'absolute';
		scrolldummy.style.zIndex = 100;
		scrolldummy.style.visibility = 'hidden';
		scrolldummy.style.cursor = 'move';
		this.scrolldummy = scrolldummy;
		// IE7対策
		// transparentだとz-indexが下のものにイベントを送ってしまうので不透過を0%にして対応
		scrolldummy.style.backgroundColor = "#FFFFFF";
		scrolldummy.setOpacity(0);
		
		var titletext = new Element( 'a', { href:link, target: "_blank", title: title}).set('html', title);
		titletext.onmousedown = function() {
			titletext.jumpallow = true;
		};
		titletext.onmousemove = function() {
			titletext.jumpallow = false;
		};
		titletext.onclick = function() {
			return titletext.jumpallow;
		};
		
		var close = new Element( 'a', { href : '#' }).grab(new Element('img', { src:'/theme/'+changeDesign.designName+'/img/gadget/gadgetDelete.gif', alt: 'x' } ) );
		close.onclick = function() {
			$(player.id).destroy();
			return false;
		};
		
		var titletable = new Element('table',{cellpadding:0,cellspacing:0, width: '100%'});
		titlebox.appendChild(titletable);
		if(titletable.firstChild && titletable.firstChild.nodeName == 'TBODY') {
			titletable = titletable.firstChild;
		}
		var tdt = new Element('td', {'class': 'gadgettitle'}).grab( titletext );
		var tdc = new Element('td',{width:50, 'class': 'gadgettoolbox'}).grab(close);
		tdc.style.textAlign = 'right';
		titletable.grab(new Element('tr').grab(tdt).grab(tdc));
		
		player.appendChild(spbody);
		
		new Drag.Move(player,{
			handle:tdt,
			onStart: function(element) {
				element.style.zIndex = trunc.playMovie.zIndex++;
				scrolldummy.style.visibility = 'visible';
				var size = iframe.getSize();
				scrolldummy.setStyles({'width': size.x, 'height':size.y});
				Screen.getCurrentTab().toggleAllDummy(true);
			},
			onComplete: function(el){
				var pos = el.getCoordinates();
				var windowwidth = document.body.getScrollSize().x;
				if(pos.top<0) el.setStyle('top', '0px');
				if(pos.right<0) el.setStyle('left', '0px');
				if(pos.left>windowwidth) el.setStyle('left', (windowwidth-pos.width)+'px');
				scrolldummy.style.visibility = 'hidden';
				Screen.getCurrentTab().toggleAllDummy(false);
			}
		});
	}
	player.setStyle('display', '');
	
	if (position == null) {
		var size = window.getSize();
		var scrollsize = window.getScrollSize();
		var scrollposition = window.getScroll();
		
		position = {};
		position.x = (size.x - player.offsetWidth) / 2 - scrollposition.x;
		position.y = (size.y - player.offsetHeight) / 2 - scrollposition.y;
	}
	player.style.top = position.y+'px';
	player.style.left = position.x+'px';
};

trunc.playMovie.idPool = new Array();

trunc.playMovie.zIndex = 50;

trunc.playMovieYoutube = function(position,title,link,url) {
	var id = link.match(/v=([a-zA-Z0-9_-]+)/)[1];
	trunc.playMovie(position,title,link,link, '', link, false, true);
};

trunc.playMovieAmebaVision = function(position,title,link,url) {
	var id = url.match(/vi([0-9]-[0-9])\.vision\.ameba\.jp\/jpg(\/([0-9]{4}\/[0-9]{2}|[0-9]{6})\/[0-9]{2}\/[0-9a-z]+)_[0-9]+\.jpg/);
	if(id==null) {
		id = url.match(/jpg(\/[0-9]{6}\/[0-9]{2}\/[0-9a-z]+)_[0-9]+\.jpg/)[1];
		var movieurl = 'http://visionmovie2.ameba.jp/flv/'+id+'.flv';
		trunc.playMovie(position,title,link,movieurl,url);
	}else{
		var server = id[1];
		id = id[2];
		var movieurl = 'http://vm'+server+'.vision.ameba.jp/flv'+id+'.flv';
		trunc.playMovie(position,title,link,movieurl,url);
	}
};

trunc.playMovieGoogleVideo = function(position,title,link,url) {
	var id = link.match(/docid=(-?[0-9]+)(&.+)?$/)[1];
	var movieurl = 'http://video.google.com/googleplayer.swf?docId='+id;
	trunc.playMovie(position,title,link,movieurl,'',movieurl);
};

trunc.playMovieDecowaku = function(position,title,vid) {
	var movieurl = 'http://media.video.ask.jp/vcaster/player/decowaku.swf?video_id='+vid+'&vendor_id=554212c4-e310-102a-a4af-0017a4aafc10&logoFlg=Y';
	var link = '/decowaku/player.php?vid='+vid;
	trunc.playMovie(position,title,link,movieurl,'',movieurl,true);
};

trunc.playMovie.nicovideoId = 1;
trunc.playMovieNicovideo = function(position, title, mid) {
	var link = 'http://www.nicovideo.jp/watch/'+mid;
	var self = trunc.playMovie;
	
	if(!self.idPool) self.idPool = new Array();
	var vid = undefined;
	self.idPool.each(function(alink, index){
		if(alink == link) vid = index + 1;
	});
	
	if (typeof vid == 'undefined') {
		self.idPool.push(link);
		vid = self.idPool.length;
	}
	
	var player = $('playerMovieTray'+vid);
	if (!player) {
		player = new Element('div', {
			'id': 'playerMovieTray'+vid,
			'class':'moviePlayerTray gadget',
			'styles' :{
				'width': (PLAYER_NICOVIDEO_WIDTH+PLAYER_NICOVIDEO_ICHIBA_WIDTH+5)+'px',
				'position': (trunc.browser.isIE && trunc.browser.version < 7)?'absolute':'fixed',
				'z-index': self.zIndex++
			}
		});
		
		var spbody = new Element( 'div', {
			'class': "moviePlayer gadgetbody",
			'styles': {
				'width': (PLAYER_NICOVIDEO_WIDTH+PLAYER_NICOVIDEO_ICHIBA_WIDTH+3)+'px',
				'background-color': '#FFFFFF'
			}
		} );
		
		spbody.innerHTML = '<iframe width="'+PLAYER_NICOVIDEO_WIDTH+'" height="'+PLAYER_NICOVIDEO_HEIGHT+'" scrolling="no" frameborder="0" style="border:0;float:left" src="/xhr/nicovideoplayer.php?videoid='+mid+'&title='+encodeURIComponent(title)+'"></iframe><div></div><div class="playerNicoichiba" style="width:'+PLAYER_NICOVIDEO_ICHIBA_WIDTH+'px"></div>';
		spbody.lastChild.style.height = PLAYER_NICOVIDEO_HEIGHT+'px';
		new Request({
				url: '/xhr/getNicoichiba.php',
				method: 'get',
				onSuccess: function(res) {
					spbody.lastChild.innerHTML = res;
				}
			}).send('videoid='+mid+'&link='+encodeURIComponent(link));
		var iframe =$(spbody.firstChild);
		iframe.setStyle('width', PLAYER_NICOVIDEO_WIDTH+'px');
		var scrolldummy = $(spbody.childNodes[1]);
		scrolldummy.style.position = 'absolute';
		scrolldummy.style.zIndex = 100;
		scrolldummy.style.visibility = 'hidden';
		scrolldummy.style.cursor = 'move';
		this.scrolldummy = scrolldummy;
		// IE7対策
		// transparentだとz-indexが下のものにイベントを送ってしまうので不透過を0%にして対応
		scrolldummy.style.backgroundColor = "#FFFFFF";
		scrolldummy.setOpacity(0);
		
		var titletext = new Element( 'a', { href:link, target: "_blank", title: title}).set('text', title);
		titletext.onmousedown = function() {
			titletext.jumpallow = true;
		};
		titletext.onmousemove = function() {
			titletext.jumpallow = false;
		};
		titletext.onclick = function() {
			return titletext.jumpallow;
		};
		
		var title = new Element('div', {
			'class': "moviePlayerTitle gadgetheader"
			});
		player.appendChild(title);
		
		var close = new Element( 'a', { href : '#' }).grab(new Element('img', { src:'/theme/'+changeDesign.designName+'/img/gadget/gadgetDelete.gif', alt: 'x' } ) );
		close.onclick = function() {
			$(player.id).destroy();
			return false;
		};
		
		var titletable = new Element('table',{cellpadding:0,cellspacing:0, width: '100%'});
		title.appendChild(titletable);
		if(titletable.firstChild && titletable.firstChild.nodeName == 'TBODY') {
			titletable = titletable.firstChild;
		}
		var tdt = new Element('td', {'class': 'gadgettitle'}).grab(titletext);
		var tdc = new Element('td',{width:50, 'class': 'gadgettoolbox'}).grab(close);
		tdc.style.textAlign = 'right';
		titletable.appendChild(new Element('tr').grab(tdt).grab(tdc));
		player.appendChild(spbody);
		
		document.getElementsByTagName("body")[0].appendChild(player);
		new Drag.Move(player,{
			handle:tdt,
			onStart: function() {
				scrolldummy.style.visibility = 'visible';
				var size = iframe.getSize();
				scrolldummy.setStyles({'width': size.x, 'height':size.y});
				Screen.getCurrentTab().toggleAllDummy(true);
			},
			onComplete: function(element) {
				scrolldummy.style.visibility = 'hidden';
				element.style.zIndex = trunc.playMovie.zIndex++;
				
				Screen.getCurrentTab().toggleAllDummy(false);
				var pos = element.getCoordinates();
				var windowwidth = document.body.getScrollSize().x;
				if(pos.top<0) element.setStyle('top', '0px');
				if(pos.right<0) element.setStyle('left', '0px');
				if(pos.left>windowwidth) element.setStyle('left', (windowwidth-pos.width)+'px');
			}
		});
	}
	player.setStyle('display', '');
	
	if (position == null) {
		var size = window.getSize();
		var scrollsize = window.getScrollSize();
		var scrollposition = window.getScroll();
		
		position = {};
		position.x = (size.x - player.offsetWidth) / 2;
		position.y = (size.y - player.offsetHeight) / 2;
	}
	player.style.top = position.y+'px';
	player.style.left = position.x+'px';
};

trunc.search = {};
trunc.search.toggleIchiba = function(target) {
	var pframe = target.parentNode.parentNode;
	if(target.parentNode.style.width!=='14px') {
		target.parentNode.style.width='14px';
		target.nextSibling.style.paddingLeft = '20px';
		pframe.style.width = (PLAYER_NICOVIDEO_WIDTH+17)+'px';
		pframe.parentNode.style.width = (PLAYER_NICOVIDEO_WIDTH+19)+'px';
	}else{
		target.parentNode.style.width=PLAYER_NICOVIDEO_ICHIBA_WIDTH+'px';
		target.nextSibling.style.paddingLeft = '5px';
		pframe.style.width = (PLAYER_NICOVIDEO_WIDTH+PLAYER_NICOVIDEO_ICHIBA_WIDTH+3)+'px';
		pframe.parentNode.style.width = (PLAYER_NICOVIDEO_WIDTH+PLAYER_NICOVIDEO_ICHIBA_WIDTH+5)+'px';
	}
};
function fullscreenMovieStart(uid) {
	var player = $(uid);
	if(player===null) return;
	var player_style = player.style;
	var player_parent = player.parentNode.parentNode;
	var player_parent_style = player_parent.style;
	var player_parent_parent = player_parent.parentNode;
	var player_parant_parent_style = player_parent_parent.style;
	
	if(typeof(player_parent_parent.bk_flag)!=='undefined' && player_parent_parent.bk_flag) {
		fullscreenMovieStop(uid);
		return;
	}
	
	player_parent_style.position = 'absolute';
	player_parent_style.top = '0px';
	player_parent_style.left = '0px';
	player_parent_style.width = '100%';
	player_parent_style.height = '100%';

	player_parent_parent.bk_top = player_parant_parent_style.top;
	player_parent_parent.bk_left = player_parant_parent_style.left;
	player_parent_parent.bk_zIndex = player_parant_parent_style.zIndex;
	player_parent_parent.bk_flag = true;
	
	player_parant_parent_style.position = 'absolute';
	player_parant_parent_style.top = '0px';
	player_parant_parent_style.left = '0px';
	player_parant_parent_style.width = '100%';
	player_parant_parent_style.height = '100%';
	player_parant_parent_style.zIndex = '10000';
	(document.getElementsByTagName('body')[0]).style.overflow = 'hidden';
	(document.getElementsByTagName('html')[0]).style.overflow = 'hidden';
}
		
function fullscreenMovieStop(uid) {
	var player = $(uid);
	
	if(player===null) return;
	var player_style = player.style;
	var player_parent = player.parentNode.parentNode;
	var player_parent_style = player_parent.style;
	var player_parent_parent = player_parent.parentNode;
	var player_parant_parent_style = player_parent_parent.style;

	player_parent_style.position = 'static';
	player_parent_style.top = '0px';
	player_parent_style.left = '0px';
	player_parent_style.width = 'auto';
	player_parent_style.height = PLAYER_HEIGHT+'px';
	player_parent_style.zIndex = '';
	
	if(trunc.browser.isIE && !trunc.browser.isIE7) {
		player_parant_parent_style.position = 'absolute';
	}else{
		player_parant_parent_style.position = 'fixed';
	}
	
	player_parant_parent_style.top = player_parent_parent.bk_top;
	player_parant_parent_style.left = player_parent_parent.bk_left;
	player_parant_parent_style.zIndex = player_parent_parent.bk_zIndex;
	player_parent_parent.bk_flag = false;
	
	player_parant_parent_style.width = PLAYER_WIDTH+'px';
	player_parant_parent_style.height = 'auto';
	
	(document.getElementsByTagName('body')[0]).style.overflow = 'visible';
	(document.getElementsByTagName('html')[0]).style.overflow = 'scroll';
}
