/*
 * Orginal: http://adomas.org/javascript-mouse-wheel/
 * prototype extension by "Frank Monnerjahn" <themonnie@gmail.com>
 */
if (typeof(Koebu) == "undefined") Koebu = {};
Object.extend(Event, {
  wheel:function (event){
    var delta = 0;
    if (!event) event = window.event;
    if (event.wheelDelta) {
      delta = event.wheelDelta/120;
      if (window.opera) delta = -delta;
    } else if (event.detail) { delta = -event.detail/3; }
    return Math.round(delta); //Safari Round
  }
});
function matchWithTextArea(textarea,text){
	var textwithr = text.replace(/\n/g,"\r\n");
	if( textarea.value==text || textarea.value==textwithr ){
		return true;
	}else{
		return false;
	}
}
function getElementsByIdPrefix(prefix){
	var ret = [];
	for( var i=0; true; i++ ){
		var el = $(prefix+i);
		if( !el ){ break; }
		ret.push(el);
	}
	return ret;
}
function onUnitClick(ev){
	swfPlayer.xi_play(this.index);
	ev.stop();
	return false;
}
function addBtnMouseOverListener( btn ) {
	btn.observe('mouseover',function(ev) {
		btn.orig_src = btn.src;
		btn.src = btn.src.replace(/(?:_sel)?\.(gif|jpg|png)/, '_o.$1');
	});
	btn.observe('mouseout',function(ev) {
		btn.src = btn.orig_src;
	});
}

var swfPlayer = null;
var elsongs;
var player = function(){
	// constants
	var swfplayerid =  "externalInterface_player";
	var elparent;
	var clPlaying = "unitPlaying";
	var clPaused  = "unitSelected";
	var songnums;
	var playing = 0;
	var timer = null;

	// internals
	function initel(){
		swfPlayer = navigator.userAgent.match(/MSIE/) ? window[swfplayerid] : document[swfplayerid];
		elsongs     = getElementsByIdPrefix('koe_');
		songnums    = elsongs.length;
	}

	var playerstate;				// ex: {hilighted:0,state:false,height:485}	false:pause true:play
	var playerstate_last = { hilighted:-1,state:false,height:485 };
	function updateHilighting(){
		if ( !swfPlayer.xi_playerstate ) { return; }
		playerstate = swfPlayer.xi_playerstate();
		if(  playerstate.hilighted != playerstate_last.hilighted
			|| playerstate.state   != playerstate_last.state ){
			changedPlaying(playerstate_last.hilighted,playerstate.hilighted,playerstate.state);
			playerstate_last = playerstate;
		}
	}
	function initHilighting(){
		playerstate_last = { hilighted:-1,state:false };
		updateHilighting();
	}
	function startInterval(){
		timer = setInterval( function(){
			updateHilighting();
			positionFix();
		},100 );
	}

	function changedPlaying(l,n,s){
		if( l>=0 && elsongs[l] ){
			elsongs[l].removeClassName(clPlaying);
			elsongs[l].removeClassName(clPaused);
		}
		if( n>=0 && elsongs[n] ){
			elsongs[n].addClassName( s ? clPlaying : clPaused );
		}
	}

	function setPlayAction(){
		var index = 0;
		var a = getElementsByIdPrefix('koe_a_');
		a.each( function(el){
			el.index = index;
			Event.observe(el,'click',onUnitClick);
			index++;
		});
	}
	function removePlayAction(){
		var a = getElementsByIdPrefix('koe_a_');
		a.each( function(el){
			Event.stopObserving(el,'click',onUnitClick);
		});
	}

	function next(){
		var index = (playerstate.hilighted+1)%songnums;
		swfPlayer.xi_play(index);
	}

	function prev(){
		var index = (playerstate.hilighted+songnums-1)%songnums;
		swfPlayer.xi_play(index);
	}

	function setKeyboardListeners(){
		if( typeof(shortcut)=="undefined" ){
			throw("needs shortcut.js");
			return;
		}
		shortcut.add("k",function(){
			prev();
		},{
			"disable_in_input" : true
		});
		shortcut.add("j",function(){
			next();
		},{
			"disable_in_input" : true
		});
		shortcut.add("p",function(){
			if( swfPlayer && swfPlayer.xi_toggleplay ){
				swfPlayer.xi_toggleplay();
			}
		},{
			"disable_in_input" : true
		});
		shortcut.add("Right",function(){
			next();
		},{
			"disable_in_input" : true
		});
		shortcut.add("Left",function(){
			prev();
		},{
			"disable_in_input" : true
		});
	}

	function onMouseWheel(ev){
		var wheel = Event.wheel(ev);
		//console.log("[onMouseWheel]wheel: "+wheel);
		if( swfPlayer && swfPlayer.xi_scroll ){
			var ret = swfPlayer.xi_scroll(wheel);
			if( ret ){
				ev.stop();
			}
		}
	}

	function setMouseWheelListeners(){
		Event.observe(document, "mousewheel", onMouseWheel, false);
		Event.observe(document, "DOMMouseScroll", onMouseWheel, false); // Firefox
	}

	var defaultOffsetTop;
	var defaultScrollHeight;
	function positionFix(){
		if( !swfPlayer ){ return; }
		var windowHeight= (window.innerHeight) ? window.innerHeight :
			(document.documentElement && document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.body.clientHeight;
		var sTop = document.body.scrollTop || document.documentElement.scrollTop;
		var playerHeight = Math.floor(playerstate.height);
		var player = $('player');
		player.style.height = playerHeight+"px";
		swfPlayer.height         = playerHeight;
		var nextStyleTop = 0;	// not changed
		if( playerHeight <= windowHeight ){
			if( sTop >= defaultOffsetTop ){
				nextStyleTop = sTop;
			}else{
				nextStyleTop = defaultOffsetTop;
			}
		}else{
			var playerTop    = player.offsetTop;
			var playerBottom = player.offsetTop + playerHeight;
			var windowTop    = sTop;
			var windowBottom = sTop + windowHeight;
			if( playerTop    <= windowTop
			 && playerBottom <= windowBottom ){
				// 上にはみでてる → 下を合わせる
				nextStyleTop = (windowBottom-playerHeight);
			}else
			if( windowTop    <= playerTop
			 && windowBottom <= playerBottom ){
				// 下にはみでてる → 上を合わせる
				nextStyleTop = sTop;
			}
		}
		nextStyleTop = (nextStyleTop!=0 && nextStyleTop<defaultOffsetTop) ? defaultOffsetTop : nextStyleTop;
		nextStyleTop = (nextStyleTop+playerHeight > defaultScrollHeight && playerHeight < defaultScrollHeight ) ? (defaultScrollHeight-playerHeight) : nextStyleTop;
		if( nextStyleTop==player.offsetTop ){
			nextStyleTop++;	// hack!
		}
		if( nextStyleTop==0 || nextStyleTop+1==player.offsetTop ){
			// do nothing
		}else{
			player.style.top = nextStyleTop+'px';
		}
	}

	// globals
	return {
		load : function(list,playing){
			initel();
			var l = list, p = playing;
			if( location.pathname=="/" ){
				// 前にトップページに来た時以降に録音されたお知らせがあればそれを聞く
				lastvisit = Cookie.get('lastvisit') || 0;
				for( var i=0; i<p; i++ ){
					if( songs[i].created_date*1000 > lastvisit ){
						p = i;
						break;
					}
				}
				Cookie.set('lastvisit',(new Date).getTime(),365);
			}
			waitForEval( "swfPlayer.xi_load", function(){
				var koe_uid = (location.hash) ? location.hash.substr(1) : null;
				var aboutme = !me ? null : {full_name:me.full_name,screen_name:me.screen_name,small_image:me.small_image};
				swfPlayer.xi_init(aboutme);
				swfPlayer.xi_load(l,p,koe_uid);
				if ( typeof(audioads)             != 'undefined'
				  && typeof(swfPlayer.xi_loadads) != 'undefined' ) {
					swfPlayer.xi_loadads( audioads );
				}
				defaultOffsetTop = $('player').offsetTop;
				defaultScrollHeight = document.body.scrollHeight;
				startInterval();
				setPlayAction();
				setKeyboardListeners();
				setMouseWheelListeners();
			});
		},
		reload : function(list){
			if( !list || !list.length || playing<0 ){
				$('player').innerHTML = '<div class="heightLine-main" id="player" style="height: 427px;"><p><img alt="このページではこえプレイヤーは使用できません" src="/img/common/player_inactive.jpg"/></p></div>';
				clearInterval(timer);
				swfPlayer = null;
				return;
			}
			initel();
			waitForEval( "swfPlayer.xi_load", function(){
				var l = list, p = 0;
				swfPlayer.xi_load(l,p,null);
				removePlayAction();
				setPlayAction();
				initHilighting();
			});
		}
	};
}();

(function(){
	var visibles      = [];

	function toggleVisibility(el){
		if( el.getStyle('visibility')=='visible' ){
			el.setStyle({visibility:'hidden'});
			visibles = visibles.without(el);
		}else{
			el.setStyle({visibility:'visible'});
			visibles.each( function(elvisible){
				elvisible.setStyle({visibility:'hidden'});
			} );
			visibles.clear();
			visibles.push(el);
		}
	}
	function getKoeUID(el){
		var classes = $(el).classNames();
		var class_withid = classes.detect( function(cn){
			return cn.indexOf('koe_')!=-1;
		});
		return class_withid.substr(4);
	}
	function getFavTopicID(ela){
		return ela.className.substr(8);
	}
	function getTopicName(el){
		var deletedIndex = elsongs.indexOf(el);
		if( deletedIndex >= 0 ){
			return songs[deletedIndex].topic_title;
		}else{
			return "";
		}
	}
	function getUserScreenName(){
		return page_owner_screen_name;	// rendered in tt
	}
	function getTopicID(){
		return topic_uid;	// rendered in tt
	}
	function getUserCommentID(el){
		// unitCom145
		var classes = el.classNames();
		var classwithid = classes.detect( function(cn){
			return cn.length>7;
		});
		return classwithid ? classwithid.substr(7) : -1;	// err: -1
	}
	function isLogin(){
		return (typeof(me)!="undefined" && me!=null);
	}
	function showTitle(sel,tit){
		sel.options.length=1;
		var opt = sel.options[0];
		opt.innerHTML = tit+"に追加済";
		sel.disabled = true;
	}
	function addToPlaylist(title,koeid){
		var ajax = new Ajax.Request(
			"/api/playlist/add",{
			method:     "post",
			parameters: "title="+encodeURIComponent(title)+"&koe="+koeid
		});
	}
	function textOK(s){
		var r = new RegExp("[^ 　\r\n]","g");
		return r.test(s);
	}

	document.observe("dom:loaded", function(){
		if( isLogin() ){
			// login
			getElementsByIdPrefix('gray_').each( function(el){
				el.style.display='none';	// hide link for login
			});
		}

		// 新着
		var mynews = $('myNews_a');
		if( mynews && me && me.screen_name ){
			var ajaxmynews = new Ajax.Request(
				"/api/update?user="+me.screen_name,{
				method:        "get",
				onComplete:    function(o){
					mynews.innerHTML = o.responseJSON.result;
				}
			});
		}

		function onRemoveFromPlaylistClicked(playlist,unit){
			var topicname = getTopicName(unit);
			if( confirm(topicname+"を"+playlist+"から削除します。よろしいでしょうか？") ){
				var koe_uid   = getKoeUID(unit);
				var ajax = new Ajax.Request(
					"/api/playlist/remove",{
					method:     "post",
					parameters: "title="+encodeURIComponent(playlist)+"&koe="+koe_uid,
					onComplete: function(o){
					}
				});
				return true;	// deleted
			}else{
				return false;
			}
		}
		function setCloseEventListeners(el){
			el.observe('click',function(ev){
				var p = $(el.parentNode);
				p.setStyle({visibility:'hidden'});
				visibles = visibles.without(p);
				ev.stop();
			});
		}
		var closes = getElementsByIdPrefix('close_');
		closes.each( function(elclose){
			setCloseEventListeners(elclose);
		});

		function setKoeUnitListeners() {
			// this: .unit
			var unit = this;
			var koe_uid = getKoeUID(this);

			var ancstar = $(this).getElementsByClassName("unitRating")[0];
			var idx = $(this).id.substr(4);
			var point = $('ratepoint_'+idx);
			ancstar.observe('click',function(ev){
				var songauthor_screen_name = songs[idx].author.screen_name;
				if( me && me.screen_name==songauthor_screen_name ){
					var gray = $(this).getElementsByClassName('gray_smile')[0];
					gray.style.display='block';
					var note = gray.getElementsBySelector('p.notes a')[0];
					note.innerHTML = '自分のこえにスマイルを<br/>つけることはできません';
					note.href      = '#';
					setCloseEventListeners($(note.parentNode.parentNode));
				}
				var tgt = $('addStar_'+idx);
				toggleVisibility(tgt);
				ev.stop();
			}.bind(this));
			ancstar.observe('mouseout',function(ev){
				if( !point ){ return; }
				ancstar.fadeeffect = Effect.Fade(point,{
					beforeStart: function(){
						if(ancstar.fadeeffect){
							ancstar.fadeeffect.cancel();
							ancstar.fadeeffect=null;
						}
					},
					delay: 1.5,
					duration: 0.5
				});
			});
			ancstar.observe('mouseover',function(ev){
				if( !point ){ return; }
				if(ancstar.fadeeffect){
					ancstar.fadeeffect.cancel();
					ancstar.fadeeffect=null;
				}
				point.show();
			});

			var anclist = $(this).getElementsByClassName("unitAdd")[0];
			if ( anclist ) {
				var selList = this.getElementsBySelector('select')[0];

				anclist.observe('click',function(ev){
					var tgt = $(this).getElementsByClassName("addList")[0];
					toggleVisibility(tgt);
					ev.stop();
				}.bind(this));

                anclist.observe('click', function(ev) {
                    anclist.stopObserving('click', arguments.callee);
                    // プレイリスト一覧に、グローバルに定義してある、自分のプレイリスト一覧をつっこむ(users_playlists)
                    var options = selList.options;
                    users_playlists.each( function(playlist) {
                        options[options.length] = new Option(playlist, playlist);
                    });
                    options[options.length] = new Option( '新規プレイリストに追加', '_addnew' );
                }.bindAsEventListener(this));

				selList.selectedIndex = 0;
				if( Prototype.Browser.IE && selList && !isLogin() ){
					// hide select, ie6 hack
					selList.setStyle({ visibility : "hidden" });
				}
				selList.observe('change',function(ev){
					var val = this.options[this.selectedIndex].value;
					var title;
					if( val=="_addnew" ){
						var now = new Date;
						var long_month = "00"+(now.getMonth()+1);
						var long_date  = "00"+now.getDate();
						var long_hour  = "00"+now.getHours();
						var long_min   = "00"+now.getMinutes();
						var long_sec   = "00"+now.getSeconds();
						title = long_month.substr(long_month.length-2)+
							long_date.substr(long_date.length-2)+
							long_hour.substr(long_hour.length-2)+
							long_min.substr(long_min.length-2)+
							long_sec.substr(long_sec.length-2)+
							"のリスト";
						var ajax = new Ajax.Request(
							"/api/playlist/create",{
							method:     "post",
							parameters: "title="+encodeURIComponent(title),
							onComplete: function(o){
								addToPlaylist(title,koe_uid);
							}
						});
					}else{
						title = val;
						addToPlaylist(title,koe_uid);
					}
					showTitle(this,title);
					$(selList.parentNode.parentNode).getElementsBySelector('dt')[0].innerHTML = "マイリストに追加済";
					ev.stop();
				});

			}

			var addFav  = this.getElementsBySelector('input')[0];
			if( addFav ){
				addFav.observe('click',function(ev){
					var ajax = new Ajax.Request(
						"/api/favorite",{
						method:     "post",
						parameters: "koe="+koe_uid,
						onComplete: function(o){
						}
					});
					this.disabled          =true;
					this.style.borderStyle ="dotted";
					this.value             ="お気に入りに追加済";
					ev.stop();
				}.bind(addFav));
			}

			var starspans = this.getElementsBySelector('div.addStar p span img');
			for( var i=0; i<starspans.length; i++ ){
				var star = starspans[i];
				star.observe('click',function(rate){
					var ajax = new Ajax.Request(
						"/api/koe/rate/"+koe_uid,{
						method:     "post",
						parameters: "rate="+(rate+1),
						onComplete: function(o){
						}
					});
					var gray    = unit.getElementsBySelector('div.addStar div.gray_smile')[0];
					var message = gray.getElementsBySelector('p.notes')[0];
					gray.style.display = 'block';
					message.innerHTML = "thanks!!";
				}.bind(star,i));
			}
		} // setKoeUnitListeners

		// こえユニット
		getElementsByIdPrefix('koe_').each( function(el){
			var koe_uid = getKoeUID(el);
			setKoeUnitListeners.apply(el);
			// マイページでお気に入りから削除する
			var ancdel  = $(el).getElementsByClassName("unitDel")[0];
			if( !ancdel ){ return; }
			ancdel.observe('click',function(ev){
				var topicname = getTopicName(el);
				function removeUnit(el){
					$(el.parentNode).removeChild(el);
					var deletedIndex = elsongs.indexOf(el);
					if( deletedIndex>=0 ){
						songs = songs.without(songs[deletedIndex]);
					}
					player.reload(songs);
				}
				var ismykoes  = !!$(el.parentNode).hasClassName("unitGroupMyKoes");
				if( ismykoes ){
				}
				else if( $(el.parentNode).hasClassName("unitGroupPlaylist") ) {
					// プレイリストからこえを削除
					var deleted = onRemoveFromPlaylistClicked(users_playlists[0],el);
					if( deleted ){
						removeUnit(el);
					}
				}
				else{
					// お気に入りからこえを削除
					if( confirm(topicname+"をお気に入りから削除します。よろしいでしょうか？") ){
						var koe_uid   = getKoeUID(el);
						var ajax = new Ajax.Request(
							"/api/favorite",{
							method:     "delete",
							parameters: "koe="+koe_uid,
							onComplete: function(o){
							}
						});
						removeUnit(el);
					}
				}
				ev.stop();
			});
		});

		// ユーザーページ ユーザーをお気に入りに追加
		var btnList = $('btnList');
		if ( btnList ) {
			var ancUserFavAdd = $('favAdd');
			if ( ancUserFavAdd && isLogin() ) {
				ancUserFavAdd.observe('click',function(ev){
					new Ajax.Request( "/api/favorite", {
						method:     "post",
						parameters: "user="+getUserScreenName(),
						onComplete: function(o){}
					});
					var parent = ancUserFavAdd.up();
					ancUserFavAdd.remove();
					var newimg = document.createElement('img');
					newimg.src   = '/img/user/btn_listed.gif';
					newimg.title = 'この部員はお気に入りに登録済です';
					parent.appendChild( newimg );
					var elAddList = btnList.getElementsBySelector('dl.addList')[0];
					if ( elAddList ) {
						elAddList.setStyle({visibility:'visible'});
					}
					ev.stop();
				});
			}
			else if ( ancUserFavAdd ) {
				ancUserFavAdd.href = "/login?redirect="+encodeURIComponent(location.pathname);
			}
		}

		// マイページ お気に入り部員削除
		getElementsByIdPrefix('user_del_').each( function(el){
			el.observe('click',function(ev){
				var unit = $(el.parentNode.parentNode);
				var full_name   = unit.getElementsBySelector('h4 a')[0].innerHTML;
				if( confirm(full_name+"をお気に入りから削除します。よろしいでしょうか？") ){
					var userhref = unit.getElementsBySelector('p a')[0].href;
					var screen_name = userhref.split('/').last();
					var ajax = new Ajax.Request(
						"/api/favorite",{
						method:     "delete",
						parameters: "user="+screen_name,
						onComplete: function(o){
						}
					});
					unit.style.display='none';
				}
				ev.stop();
			});
		});

		// マイページ お気に入りお題削除
		getElementsByIdPrefix('topic_del_').each( function(el){
			el.observe('click',function(ev){
				var ul = $(el.parentNode.parentNode);
				var unit = $(ul.parentNode);
				var topic = ul.getElementsBySelector('li.unitTi a')[0].innerHTML;
				if( confirm(topic+"をお気に入りから削除します。よろしいでしょうか？") ){
					var ajax = new Ajax.Request(
						"/api/favorite",{
						method:     "delete",
						parameters: "topic="+getFavTopicID(el),
						onComplete: function(o){
						}
					});
					unit.style.display='none';
				}
				ev.stop();
			});
		});

		// お題ページ お気に入りに追加
		var btnAdd = $('topicFavAdd');
		if( btnAdd ){
			btnAdd.observe('click',function(ev){
				var ajax = new Ajax.Request(
					"/api/favorite",{
					method:     "post",
					parameters: "topic="+getTopicID(),
					onComplete: function(o){
					}
				});
				var paren = btnAdd.parentNode;
				paren.removeChild(btnAdd);
				var newimg = document.createElement('img');
				newimg.src   = '/img/topic/btn_listed_t.gif';
				newimg.title = 'このお題はお気に入りに登録済です';
				paren.appendChild(newimg);
				var elAddList = $(paren.parentNode).getElementsBySelector('dl.addList')[0];
				if( elAddList ){
					elAddList.setStyle({visibility:'visible'});
				}
				ev.stop();
			});
		}

		// ユーザーページ プレイリスト編集
		var currentSelected;
		function buildIconPath(i,size,format){
			if( i ){
				var path1 = i.substr(0,1);
				var path2 = i.substr(0,2);
				var path3 = i.substr(0,4);
				return "/images/icon/"+path1+"/"+path2+"/"+path3+"/"+i+size+"."+format;
			}else{
				return null;
			}
		}
		function getPlaylistName(li){
			return li.getElementsBySelector('a')[1].title;
		}
		function setRemoveFromPlaylistListener(playlist,unit){
			var ancdel = $(unit).getElementsByClassName("unitDel")[0];
			if( !ancdel ){ return; }
			function removeUnit(el){
				$(el.parentNode).removeChild(el);
				var deletedIndex = elsongs.indexOf(el);
				if( deletedIndex>=0 ){
					songs = songs.without(songs[deletedIndex]);
				}
				player.reload(songs);
			}
			ancdel.observe('click',function(ev){
				var deleted = onRemoveFromPlaylistClicked(playlist,unit);
				if( deleted ){
					removeUnit(unit);
				}
				ev.stop();
			});
		}
		function onLiClicked(ev){
			if( currentSelected==this ){ ev.stop(); return; }
			var unitgroup    = $(document.body).getElementsBySelector('div#boxMyList div.unitGroup')[0];
			var title = getPlaylistName(this);
			var ajax2 = new Ajax.Request(
				"/api/playlist",{
				method:     "get",
				parameters: "title="+encodeURIComponent(title)+'&user='+getUserScreenName(),
				onComplete: function(o){
					// unitgroupに入ってるunit数分songsの最後からけす
					var playlistunits = unitgroup.getElementsBySelector('div.unitKoe').length;
					for( var i=0; i<playlistunits; i++ ){
						songs.pop();
					}
					unitgroup.innerHTML = "";
					var koe_index = songs.length;
					var html = "";
					var json = o.responseJSON;
					json.result.items.each( function(item){
						item.icon = buildIconPath(item.author.icon,"s",item.author.icon_format);
						item.users_playlists = users_playlists;
						item.mypage          = mypage;
						item.koe_index       = koe_index;
						koe_index++;
						songs.push(item);
					});
					koe_index   = getElementsByIdPrefix('koe_').length;
					unitgroup.innerHTML = json.html;
					unitgroup.getElementsBySelector('div.unit').each( function(unit){
						// unitの中のidを付け替える
						unit.id = 'koe_'+koe_index;
						$(unit).getElementsBySelector('.unitTi a')[0].id  = 'koe_a_'+koe_index;
						$(unit).getElementsBySelector('.ratepoint')[0].id = 'ratepoint_'+koe_index;
						$(unit).getElementsBySelector('.addStar')[0].id = 'addStar_'+koe_index;
						koe_index++;
						setKoeUnitListeners.apply(unit);
						if( isLogin() ){
							$(unit).getElementsBySelector('.gray').each( function(el){
								el.style.display='none';	// hide link for login
							});
						}
						$(unit).getElementsBySelector(".closeBaloon").each( function(elclose){
							setCloseEventListeners(elclose);
						});
						$(unit).getElementsBySelector('.btn').each( function(btn) {
							addBtnMouseOverListener( btn );
						});
						setRemoveFromPlaylistListener(getPlaylistName(currentSelected),unit);
					});
					player.reload(songs);
					set_publish_level_text( o.responseJSON.result.publish_level=="public" );
				}
			});
			currentSelected.removeClassName('mylistSelected');
			currentSelected = this;
			this.addClassName('mylistSelected');
			ev.stop();
		}
		var playlistform = $('contMylist');
		if( playlistform ){
			var playlist_anchors = getElementsByIdPrefix('playlist');
			playlist_anchors.each( function(playlist_anchor){
				var li = playlist_anchor.parentNode.parentNode;
				playlist_anchor.observe('click',onLiClicked.bindAsEventListener(li));
				if( !!Element.hasClassName(li,'mylistSelected') ){
					currentSelected = li;
				}
			});
		}

		// プレイリストまるごと削除
		getElementsByIdPrefix('playlist_del_').each( function(p){
			p.observe('click',function(ev){
				var playlistname = getPlaylistName($(p.parentNode));
				if( confirm(playlistname+"を削除します。よろしいでしょうか？") ){
					var ajax = new Ajax.Request(
						"/api/playlist/delete",{
						method:     "post",
						parameters: "title="+encodeURIComponent(playlistname),
						onComplete: function(o){
						}
					});
					var li = $(p.parentNode);
					li.parentNode.removeChild(li);
					var unitgroup = $(document.body).getElementsBySelector('div#boxMyList div.unitGroup')[0];
					// unitgroupに入ってるunit数分songsの最後からけす
					var playlistunits = unitgroup.getElementsBySelector('div.unitKoe').length;
					unitgroup.innerHTML=""
					for( var i=0; i<playlistunits; i++ ){
						songs.pop();
					}
					player.reload(songs);
				}
				ev.stop();
			});
		});

		// プレイリストリネーム
		getElementsByIdPrefix('playlist_edit_').each( function(p,i){
			var playlist     = $(p.parentNode).getElementsBySelector('a')[1];
			var playlistname = playlist.innerHTML;
			var newplaylistname = "";
			try{
				var editor = new Ajax.InPlaceEditor("playlist"+i,"/api/playlist/rename",{
					callback : function(form,value){
						newplaylistname = value;
						return "title="+encodeURIComponent(playlistname)+"&to="+encodeURIComponent(value);
					},
					onComplete : function(transport,el){
						if( !transport || transport.responseJSON.error ){
							el.innerHTML = playlistname;
						}else{
							el.innerHTML = newplaylistname;
						}
					},
					onFailure  : function(transport,el){
					},
					ajaxOptions : {
						method : "post"
					},
					htmlResponse : false
				});
				editor.dispose();
				p.observe('click',function(ev){
					editor.enterEditMode(ev);
					//ev.stop();
				});
			}catch(e){
			}
		});

		// プレイリストのpublic/private設定
		function playlist_is_public() {
			return !$('playlist_publish_level').innerHTML.match(/非公開/);
		}
		function set_publish_level_text( is_public ) {
			var playlist_publish_level = $('playlist_publish_level');
			if ( playlist_publish_level ) {
				playlist_publish_level.innerHTML = is_public ? "公開されています。" : "非公開になっています。";
			}
		}
		function onPublicLevelChange( ev ) {
			var playlistname = getPlaylistName(currentSelected);
			var publish_level = playlist_is_public() ? 'private' : 'public';
			var ajax = new Ajax.Request(
				"/api/playlist/publish_level", {
				method: "post",
				parameters: {
					title: playlistname,
					publish_level: publish_level
				},
				onComplete : function(o) {
					set_publish_level_text( o.responseJSON.publish_level=="public" );
				}
			});
			ev.stop();
		}
		var btn_playlist_publish_level = $('btn_playlist_publish_level');
		if ( btn_playlist_publish_level ) {
			btn_playlist_publish_level.observe('click',onPublicLevelChange);
		}

		// dashboardでコメント削除
		function extract_koe_comment_id_from_delete_btn( delete_btn ) {
			return delete_btn.className.substr(12);
		}
		var deletable_koe_comments = getElementsByIdPrefix('deletable_koe_comment_');
		deletable_koe_comments.each( function(delete_btn){
			delete_btn.observe('click',function(ev){
				if( confirm("コメントを削除します。よろしいでしょうか？") ){
					var koe_comment_id = extract_koe_comment_id_from_delete_btn( delete_btn );
					var ajax = new Ajax.Request(
						"/api/koe/comment/delete",{
						method:     "post",
						parameters: {
							id : koe_comment_id
						},
						onComplete: function(o){
						}
					});
					this.parentNode.parentNode.parentNode.style.display="none";
				}
				ev.stop();
			});
		});

		// ユーザーページコメント[削除]
		function deleteUserComment(el){
			if ( !confirm("コメントを削除します。よろしいでしょうか？") ) { return; }
			el.style.display='none';
			var ajax = new Ajax.Request(
				"/api/user/comment/delete",{
				method:     "post",
				parameters: "id="+getUserCommentID(el),
				onComplete: function(o){
				}
			});
		}
		function addUserCommentDeleteListeners() {
			var unitComs = getElementsByIdPrefix('user_comment_');
			unitComs.each( function(el,idx){
				var del = $('user_comment_del_'+idx);
				if( del ){
					del.observe('click',function(ev){
						deleteUserComment(el);
						ev.stop();
					});
				}
			});
		}
		addUserCommentDeleteListeners();

		// ユーザーページコメント[初期化]
		var txtComNonLoginAlert = '※全角200字以内で入力してください。';
		var txtCom = $('txtCom');
		if( txtCom ){
			txtCom.observe('focus',function(ev){
				this.value = "";
				Event.stopObserving(this,'focus',arguments.callee);
			});
		}

		// ユーザーページコメント[追加]
		var btnCom = $('btnCom');
		if( btnCom ){
			btnCom.observe('click',function(ev){
				if( !textOK(txtCom.value) || matchWithTextArea(txtCom,txtComNonLoginAlert) ){
					ev.stop();
					return;
				}
				var params = "body="+encodeURIComponent(txtCom.value);
				if( !me ){
					params += "&name="+encodeURIComponent('見学者');
				}
				var ajax = new Ajax.Request(
					"/api/user/comment/"+getUserScreenName(),{
					method:     "post",
					parameters: params,
					onComplete: function(o){
						var result = o.responseJSON.result;
						// 2007/12/23 19:14:00
						var date = new Date(result.datetime*1000);
						var fullyear = date.getFullYear();
						var month    = date.getMonth()+1;
						var day      = date.getDate();
						var hour     = date.getHours();
						var minute   = date.getMinutes();
						var second   = date.getSeconds();
						var datestring = fullyear+"/"+month+"/"+day+" "+hour+":"+minute+":"+second;
						var all_user_comments = $('all_user_comments');
						all_user_comments.innerHTML = o.responseJSON.html;
						all_user_comments.getElementsBySelector('.btn').each( function(btn) {
							addBtnMouseOverListener( btn );
						});
						addUserCommentDeleteListeners();
						var noItem = $('groupCom').getElementsBySelector('div.noItem')[0];
						if( noItem ){
							noItem.style.display = 'none';
						}
					}
				});
				txtCom.value = "";
				ev.stop();
			});
		}

	});
})()


var Topic = new function(){
	var BTN_EDIT;
	var BTN_SUBMIT;
	var BTN_CANCEL;
	var BLOCK_SHOW;
	var BLOCK_EDIT;
	var TAG_AREA;
	var MAX_SELECTABLE = 3;
	return {
		checkedHistory : null,
		reset_element_cache : function(){
			BTN_EDIT   = $("btnTopicTagEdit");
			BTN_SUBMIT = $("btnTopicTagSubmit");
			BTN_CANCEL = $("btnTopicTagCancel");
			BLOCK_SHOW = $("topicTagShow");
			BLOCK_EDIT = $("topicTagEdit");
			TAG_AREA   = $("topicTag");
		},
		load : function(){
			this.checkedHistory = [];
			this.reset_element_cache();
			if ( BTN_EDIT ) {
				BTN_EDIT.observe('click', function(ev){
					BLOCK_EDIT.style.display='block';
					BLOCK_SHOW.style.display='none';
					ev.stop();
				});
				var inputs = getElementsByIdPrefix('topic_tag_');
				var inputs_length = inputs.length;
				inputs.each( function(input,index){
					if ( input.type == 'text' ) {
						//input.value = '';
					}
					else {	// checkbox
						input.checked = input.defaultChecked;
						if ( input.defaultChecked ) {
							this.checkedHistory.push(index);
						}
						input.observe('click', function(idx){
							if ( inputs[idx].checked ) {
								this.checkedHistory.push( idx );
								if ( this.checkedHistory.length > MAX_SELECTABLE ) {
									var uncheck = this.checkedHistory.shift();
									inputs[uncheck].checked = false;
								}
							}
							else {	// unchecked
								this.checkedHistory.splice( this.checkedHistory.indexOf(idx), 1 );
							}
						}.bind(this,index) );
					}
				}.bind(this));
			}
			if ( BTN_SUBMIT ) {
				BTN_SUBMIT.observe('click', function(ev){
					BLOCK_EDIT.style.display='none';
					BLOCK_SHOW.style.display='block';

					var others = $('topic_tag_0').value.split(' ');
					others = others.findAll( function(str){ return str.match(/[^\s]/); });
					var hidden_inputs = getElementsByIdPrefix('topic_tag_hidden_');
					for ( var i=0; i<hidden_inputs.length && i<others.length; i++ ) {
						hidden_inputs[i].value = others[i];
					}

					var ajax = new Ajax.Request('/api/topic/tag/update',{
						method : 'post',
						parameters : $('topic_tag_form').serialize(),
						onSuccess : function(xhr,json){
							TAG_AREA.innerHTML = xhr.responseJSON.result.html;
							Topic.load.bind(Topic)();
							Topic.addMouseOverEvents();
						}
					});
					ev.stop();
				});
			}
			if ( BTN_CANCEL ) {
				BTN_CANCEL.observe('click', function(ev){
					BLOCK_EDIT.style.display='none';
					BLOCK_SHOW.style.display='block';
					ev.stop();
				});
			}
		},
		addMouseOverEvents : function(){
			var btns = $A(TAG_AREA.getElementsByClassName("btn"));
			btns.each( function(btn){	// these images already should have been cached
				addBtnMouseOverListener( btn );
			});
		}
	}
}

var swfLive = null;
var Live = new function(){
	return {
		swfID : "externalLive",
		load : function() {
			if ( !$(this.swfID) ) { return; }
			swfLive = navigator.userAgent.match(/MSIE/) ? window[this.swfID] : document[this.swfID];
			Event.observe(document, "mousewheel",     this.onMouseWheel.bind(this), false);
			Event.observe(document, "DOMMouseScroll", this.onMouseWheel.bind(this), false); // Firefox
			Event.observe(window, "unload",this.onUnload.bind(this), false);
		},
		onUnload : function(ev) {
			if ( swfLive && swfLive.xi_unload ) {
				swfLive.xi_unload();
			}
		},
		onMouseWheel : function(ev) {
			var wheel = Event.wheel(ev);
			//console.log("[onMouseWheel]wheel: "+wheel);
			if( swfLive && swfLive.xi_scroll ){
				var ret = swfLive.xi_scroll(wheel);
				if( ret ){
					ev.stop();
				}
			}
		}
	}
}

if (typeof(Koebu.Userpage) == "undefined") Koebu.Userpage = {};
Koebu.Userpage.Donate = new function() {
	var text_not_enough_points = "指定のポイント数をカンパするために、十分なポイントが残っていません！ マイページで残りポイントを確認後、ポイントを購入いただき、再度お試しください。";
	var text_confirm_tmpl = new Template('あなたのポイント残高は #{remainder_points} ポイントです。\r\n#{target} さんに #{give_points} ポイントをカンパします。よろしいですか？');
	return {
		load : function() {
			// カンパ
			var btn_donate = $('btn_donate');
			var give_points = $('give_points');
			if ( !btn_donate || !give_points ) { return; }

			btn_donate.observe('click', function(ev) {
				ev.stop();
                var give_points_value = $F('give_points');
				if ( ! (give_points_value > 0) ) { return; }
				new Ajax.Request( '/api/point', {
					method : 'get',
					onComplete : function(o) {
						var remainder_points = o.responseJSON.result.points;
						if ( give_points.value > remainder_points ) {
							alert( text_not_enough_points );
							return;
						}
						var text_confirm = text_confirm_tmpl.evaluate({
							remainder_points : remainder_points,
							target           : page_owner_full_name, // from global
							give_points      : give_points_value
						});
						if ( !confirm(text_confirm) ) { return; }
						this.donate( give_points_value );
					}.bind( this )
				});
			}.bindAsEventListener(this) );
		},
		donate : function( points ) {
			new Ajax.Request( '/api/point/donate',{
				method : 'post',
				parameters : {
					point : points,
					user  : page_owner_screen_name	// from global
				},
				onComplete : function(o) {
					if ( o.responseJSON.result == "ok" ) {
						alert("ポイントのカンパを行いました。"+page_owner_full_name+" さんに代わりお礼申し上げます。\nありがとうございます！");
					}
					else {
						alert("カンパが行われませんでした。ポイント残高が足りない可能性がございます。マイページで残高をご確認ください。");
						// something wrong..
						console.log("[donate][onComplete]",o.responseJSON);
					}
				}
			});
		}
	}
}

if (typeof(Koebu.Point) == "undefined") Koebu.Point = {};
Koebu.Point = new function() {
	return {
		load : function() {
			// ポイント購入urlを携帯メールに送る
			var btn = $('btn_point_send_url_to_mobile');
			if ( btn ) {
				btn.observe('click', function(ev) {
					ev.stop();
					this.lock_button();
					new Ajax.Request( '/api/point/email_notify', {
						method : 'post',
						parameters: {
							ticket : $('point_send_url_to_mobile_ticket').value,
							email  : $('point_send_url_to_mobile').value,
							type   : $('send_url_to_mobile_type').value
						},
						onComplete : function(o) {
							this.unlock_button();
							var res = o.responseJSON;
							if ( res.error ) {
								alert("有効なメールアドレスを入力してください");
							}
							else {
								btn.innerHTML = "送信済み";
							}
						}.bind( this )
					});
				}.bindAsEventListener(this) );
			}

			// ポイント履歴のページ遷移
			var month_selector = $('selectMonth');
			if ( month_selector ) {
				month_selector.observe('change',function(ev) {
					location.href = '/point/history?ym=' + month_selector.value;
				}.bindAsEventListener(this) );
			}

			// 銀行振り込み口座をメールに知らせる
			var bank_btn = $('btn_point_send_bank_info');
			if ( bank_btn ) {
				bank_btn.observe('click', function(ev) {
					ev.stop();
					this.lock_bank_button();
					new Ajax.Request( '/api/point/email_notify', {
						method : 'post',
						parameters: {
							ticket : $('point_send_url_to_mobile_ticket').value,
							type   : "bank"
						},
						onComplete : function(o) {
							var res = o.responseJSON;
							if ( res.error ) {
								console.log("bank api err: ",res.error);
								this.unlock_bank_button();
							}
							else {
								alert('メールをお送りいたしました。ご確認ください');
							}
						}.bind( this )
					});
				}.bindAsEventListener(this) );
			}
		},
		lock_bank_button: function() {
			var btn = $('btn_point_send_bank_info');
			btn.disabled = "disabled";
			btn.innerHTML = "送信済み";
		},
		unlock_bank_button: function() {
			var btn = $('btn_point_send_bank_info');
			btn.disabled = "";
			btn.innerHTML = "送信";
		},
		lock_button: function() {
			$("btn_point_send_url_to_mobile").disabled = "disabled";
		},
		unlock_button: function() {
			var btn = $('btn_point_send_url_to_mobile');
			btn.disabled = "";
			btn.innerHTML = "送信";
		}
	}
}

Koebu.Point.Premium = new function() {
	var confirm_message_template_joined = 'あなたのポイント残高は #{remainder_points} ポイントです。\r\n#{use_points} ポイントを使用してプレミアム部員の期限を延長します。よろしいですか？';
	var confirm_message_template_new    = 'あなたのポイント残高は #{remainder_points} ポイントです。\r\n#{use_points} ポイントを使用してプレミアム部員になります。よろしいですか？';
	return {
		form : null,
		form_manager : null,
		load : function() {
			// プレミアム部員になる
			this.form = $('buyPremium');
			if ( ! this.form ) { return; }

			this.form_manager = new Koebu.Form({
				form         : this.form,
				validate_url : '/api/point/premium/validate',
				post_action  : function( obj ) {
					var template = obj.is_premium ? confirm_message_template_joined : confirm_message_template_new;
					var tt = new Template(template);
					var message = tt.evaluate( obj );
					if ( confirm(message) ) {
						this.form.submit();
					}
				}.bind(this)
			});

		}
	}
}

if (typeof(Koebu.Koe) == "undefined") Koebu.Koe = {};
Koebu.Koe.Edit = new function() {
	return {
		form : null,
		form_manager : null,
		load : function() {
			// こえ情報を編集する
			this.form = $('koe_edit_form');
			if ( ! this.form ) { return; }

			this.form_manager = new Koebu.Form({
				form         : this.form,
				validate_url : '/api/koe/edit/validate'
			});

			var btn_koe_delete = $('btn_koe_delete');
			if ( btn_koe_delete ) {
				btn_koe_delete.observe('click', function(ev) {
					ev.stop();
					// マイページで自分のこえを削除する
					if( confirm("この声を削除します。よろしいでしょうか？削除後、マイページへ戻ります") ) {
						var koe_uid   = this.form.koe.value;
						new Ajax.Request( "/api/koe/delete", {
							method:     "post",
							parameters: "id="+koe_uid,
							onComplete: function(o){
								location.href = '/mypage';
							}
						});
					}
				}.bindAsEventListener(this) );
			}
		}
	}
}

Koebu.Koe.Blogparts = new function() {
	return {
		load : function() {
			this.textarea = $('tagBpMini');
			if ( ! this.textarea ) { return; }

			this.form = $('form_blogparts');
			this.color = Cookie.get('bpcolor') || 'black';
			$('bpType_'+this.color).checked = true;

			this.renew_blogparts();
			this.renew_tag();

			this.observer = new Form.Observer( this.form, 0.3, function() {
				var new_color = this.form.serialize(true).color;
				if ( new_color == this.color ) { return; }
				this.color = new_color;
				Cookie.set('bpcolor',new_color,3650); // 10 years
				if ( swfPlayer && typeof(swfPlayer.xi_bpcolor) != "undefined" ) {
					swfPlayer.xi_bpcolor(new_color);
				}
				this.renew_tag();
				this.renew_blogparts();
			}.bind(this));

			this.textarea.observe('click',function() {
				this.select();
				this.focus();
			});
		},
		renew_tag : function() {
			this.textarea.value = this.maketag( this.uid(), this.color );
		},
		renew_blogparts : function() {
			var so = new SWFObject("/swf/bp/miniPlayer.swf", "externalMiniBlogparts", "270", "70", "9", "#FFFFFF");
			so.addParam("allowScriptAccess", "always");
			so.addParam("align", "middle");
			so.addVariable("koe",this.uid());
			so.addVariable("color",this.color);
			so.useExpressInstall('/swf/expressinstall.swf');
			so.write("blogparts_swf_container");
		},
		uid : function() {
			if ( this._uid ) { return this._uid; }
			var matched = location.pathname.match('^/koe/([a-f0-9]{40})/?$');
			this._uid = matched[1];
			return this._uid;
		},
		maketag : function( uid, color ) {
			var bp_width  = 270; // ミニタイプ
			var bp_height =  70;
			return '<div class="bpKoebuSide" style="width: 270px; margin: 0; padding: 0; border: none;"><script type="text/javascript" src="http://koebu.com/js/bp2.js#mode=mini&width=' + bp_width + '&height=' + bp_height + '&color=' + color + '&koe=' + uid + '"></script><noscript><p><a href="http://get.adobe.com/jp/flashplayer/"><img src="http://koebu.com/img/about/blogparts/bp_side_none.gif" alt="" /></a></p></noscript><p style="margin: 0 0 2px; padding: 0; text-align: center; font-size: 11px;line-height: 1;">-<a href="http://koebu.com/" title="声優.アナウンサー.朗読など、声で遊びたい仲間と出会うコミュニティ" style=" text-decoration:none;">声で遊ぶコミュニティ</a>-</p></div>';
		}
	};
};

if (typeof(Koebu.User) == "undefined") Koebu.User = {};
Koebu.User.Blogparts = new function() {
	return {
		load : function() {
			this.textarea = $('tagBpUser');
			if ( ! this.textarea ) { return; }

			this.form = $('form_blogparts');
			this.color = Cookie.get('bpcolor') || 'black';
			$('bpType_'+this.color).checked = true;

			this.renew_blogparts();
			this.renew_tag();

			this.observer = new Form.Observer( this.form, 0.3, function() {
				var new_color = this.form.serialize(true).color;
				if ( new_color == this.color ) { return; }
				this.color = new_color;
				Cookie.set('bpcolor',new_color,3650); // 10 years
				if ( swfPlayer && typeof(swfPlayer.xi_bpcolor) != "undefined" ) {
					swfPlayer.xi_bpcolor(new_color);
				}
				this.renew_tag();
				this.renew_blogparts();
			}.bind(this));

			this.textarea.observe('click',function() {
				this.select();
				this.focus();
			});
		},
		renew_tag : function() {
			this.textarea.value = this.maketag( this.username(), this.color );
		},
		renew_blogparts : function() {
			var so = new SWFObject("/swf/bp/bigPlayer.swf", "externalMiniBlogparts", "160", "300", "9", "#FFFFFF");
			so.addParam("allowScriptAccess", "always");
			so.addParam("align", "middle");
		    so.addVariable("user",this.username());
			so.addVariable("color",this.color);
			so.useExpressInstall('/swf/expressinstall.swf');
			so.write("blogparts_swf_container");
		},
		username : function() {
			if ( this._username ) { return this._username; }
			var matched = location.pathname.match('^/user/([0-9a-z_]+)/?');
			this._username = matched[1];
			return this._username;
		},
		maketag : function( username, color ) {
			var bp_width  = 160; // サイドバー
			var bp_height = 300;
			return '<div class="bpKoebuSide" style="width: 160px; margin: 0; padding: 0; border: none;"><script type="text/javascript" src="http://koebu.com/js/bp2.js#mode=user&width=' + bp_width + '&height=' + bp_height + '&color=' + color + '&user=' + username + '"></script><noscript><p><a href="http://get.adobe.com/jp/flashplayer/"><img src="http://koebu.com/img/about/blogparts/bp_side_none.gif" alt="" /></a></p></noscript><p style="margin: 0 0 2px; padding: 0; text-align: center; font-size: 11px;line-height: 1;">-<a href="http://koebu.com/" title="声優.アナウンサー.朗読など、声で遊びたい仲間と出会うコミュニティ" style=" text-decoration:none;">声で遊ぶコミュニティ</a>-</p></div>';
		}
	};
};


if (typeof(Koebu.Playlist) == "undefined") Koebu.Playlist = {};
Koebu.Playlist.Blogparts = new function() {
	return {
		load : function() {
			this.textarea = $('tagBpPlaylist');
			if ( ! this.textarea ) { return; }

			this.form = $('form_blogparts');
			this.color = Cookie.get('bpcolor') || 'black';
			$('bpType_'+this.color).checked = true;

			this.renew_blogparts();
			this.renew_tag();

			this.observer = new Form.Observer( this.form, 0.3, function() {
				var new_color = this.form.serialize(true).color;
				if ( new_color == this.color ) { return; }
				this.color = new_color;
				Cookie.set('bpcolor',new_color,3650); // 10 years
				if ( swfPlayer && typeof(swfPlayer.xi_bpcolor) != "undefined" ) {
					swfPlayer.xi_bpcolor(new_color);
				}
				this.renew_tag();
				this.renew_blogparts();
			}.bind(this));

            this.playlist_observer = new PeriodicalExecuter( function() {
                var title = this.title();
                if  ( title == this.last_title ) { return; }
                this.last_title = title;
                this.renew_tag();
                this.renew_blogparts();
            }.bind(this), 0.3 );

			this.textarea.observe('click',function() {
				this.select();
				this.focus();
			});
		},
		renew_tag : function() {
			this.textarea.value = this.maketag( this.username(), this.title(), this.color );
		},
		renew_blogparts : function() {
			var so = new SWFObject("/swf/bp/bigPlayer.swf", "externalPlaylistBlogparts", "160", "300", "9", "#FFFFFF");
			so.addParam("allowScriptAccess", "always");
			so.addParam("align", "middle");
		    so.addVariable("user",this.username());
		    so.addVariable("title", encodeURIComponent( this.title() ));
			so.addVariable("color",this.color);
			so.useExpressInstall('/swf/expressinstall.swf');
			so.write("blogparts_swf_container");
		},
		username : function() {
			if ( this._username ) { return this._username; }
			var matched = location.pathname.match('^/user/([0-9a-z_]+)/?');
			this._username = matched[1];
			return this._username;
		},
        title : function() {
            var li = $$('#contMylist li.mylistSelected')[0];
            return li.getElementsBySelector('p.ttlList a')[0].title;
        },
		maketag : function( username, title, color ) {
			var bp_width  = 160; // サイドバータイプ
			var bp_height = 300;
			return '<div class="bpKoebuSide" style="width: 160px; margin: 0; padding: 0; border: none;"><script type="text/javascript" src="http://koebu.com/js/bp2.js#mode=playlist&width=' + bp_width + '&height=' + bp_height + '&color=' + color + '&user=' + username + '&title=' + encodeURIComponent(title) + '"></script><noscript><p><a href="http://get.adobe.com/jp/flashplayer/"><img src="http://koebu.com/img/about/blogparts/bp_side_none.gif" alt="" /></a></p></noscript><p style="margin: 0 0 2px; padding: 0; text-align: center; font-size: 11px;line-height: 1;">-<a href="http://koebu.com/" title="声優.アナウンサー.朗読など、声で遊びたい仲間と出会うコミュニティ" style=" text-decoration:none;">声で遊ぶコミュニティ</a>-</p></div>';
		}
	};
};

document.observe("dom:loaded", Topic.load.bind(Topic));
document.observe("dom:loaded", Live.load.bind(Live));
document.observe("dom:loaded", Koebu.Userpage.Donate.load.bind(Koebu.Userpage.Donate));
document.observe("dom:loaded", Koebu.Point.load.bind(Koebu.Point));
document.observe("dom:loaded", Koebu.Point.Premium.load.bind(Koebu.Point.Premium));
document.observe("dom:loaded", Koebu.Koe.Blogparts.load.bind(Koebu.Koe.Blogparts));
document.observe("dom:loaded", Koebu.User.Blogparts.load.bind(Koebu.User.Blogparts));
document.observe("dom:loaded", Koebu.Playlist.Blogparts.load.bind(Koebu.Playlist.Blogparts));
Event.observe(window, "load", Koebu.Koe.Edit.load.bind(Koebu.Koe.Edit));

