var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var base64DecodeChars = new Array(
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
    -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);

function base64encode(str)
/* {{{ */
{
    var out, i, len;
    var c1, c2, c3;

    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
	c1 = str.charCodeAt(i++) & 0xff;
	if(i == len)
	{
	    out += base64EncodeChars.charAt(c1 >> 2);
	    out += base64EncodeChars.charAt((c1 & 0x3) << 4);
	    out += "==";
	    break;
	}
	c2 = str.charCodeAt(i++);
	if(i == len)
	{
	    out += base64EncodeChars.charAt(c1 >> 2);
	    out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
	    out += base64EncodeChars.charAt((c2 & 0xF) << 2);
	    out += "=";
	    break;
	}
	c3 = str.charCodeAt(i++);
	out += base64EncodeChars.charAt(c1 >> 2);
	out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
	out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
	out += base64EncodeChars.charAt(c3 & 0x3F);
    }
    return out;
} /* }}} */

function base64decode(str)
/* {{{ */
{
    var c1, c2, c3, c4;
    var i, len, out;

    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
	/* c1 */
	do {
	    c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
	} while(i < len && c1 == -1);
	if(c1 == -1)
	    break;

	/* c2 */
	do {
	    c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
	} while(i < len && c2 == -1);
	if(c2 == -1)
	    break;

	out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));

	/* c3 */
	do {
	    c3 = str.charCodeAt(i++) & 0xff;
	    if(c3 == 61)
		return out;
	    c3 = base64DecodeChars[c3];
	} while(i < len && c3 == -1);
	if(c3 == -1)
	    break;

	out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));

	/* c4 */
	do {
	    c4 = str.charCodeAt(i++) & 0xff;
	    if(c4 == 61)
		return out;
	    c4 = base64DecodeChars[c4];
	} while(i < len && c4 == -1);
	if(c4 == -1)
	    break;
	out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    }
    return out;
} /* }}} */

// http://www.quirksmode.org/js/events_properties.html#key
function shortCut(e)
{
//  var kc=YAHOO.util.Event.getCharCode(e);
  var kc;
  if(!e){ var e = window.event; }
  if( e.keyCode ){ kc = e.keyCode; }
  else if( e.which ){ kc = e.which; }

  var c = String.fromCharCode(kc);
  switch(c.toLowerCase()){
  case 'n':
    if( $('page_link_next') ){ window.location = $('page_link_next').href; }
    break;
  case 'p':
    if( $('page_link_previous') ){ window.location = $('page_link_previous').href; }
    break;
  }
}


/*
 * Media Wagonで使われる
 */
var MediaWagon = Class.create();
MediaWagon.prototype =
/* {{{ */
{
  dialog: null,
  initialize: function(id,info){},
  CreateDialog: function(params){
    if( params.view_id ){

    }else if( params.url ){
      var w = (params.width===undefined)?650:params.width;
      var h = (params.height===undefined)?400:params.height;
      MediaWagon.prototype.dialog = new Window({title:params.title,url:params.url,width:w,height:h,showEffectOptions:{duration:1.5}});
//      var win = new Window({title:"Ruby on Rails",width:300,height:200,url:"http://www.rubyonrails.org/",showEffectOptions:{duration:1.5}});
      MediaWagon.prototype.dialog.setDestroyOnClose();
      MediaWagon.prototype.dialog.showCenter(true);
    }
  },
  CreateSimpleDialog: function(html,params){
    if( params===undefined ){ params={}; }
    var w = (params.width===undefined)?500:params.width;
    var h = (params.height===undefined)?400:params.height;
    MediaWagon.prototype.dialog = new Window({width:w,height:h});
    MediaWagon.prototype.dialog.setDestroyOnClose();
    MediaWagon.prototype.dialog.getContent().innerHTML = html;
    MediaWagon.prototype.dialog.showCenter(true);
  },
  CloseDialog: function(){
    Windows.close(MediaWagon.prototype.dialog.element.id)
//    MediaWagon.prototype.dialog.close();
  },

  AjaxRequest: function(method,url,pars,func,func_params){
//alert("MediaWagon.AjaxRequest("+method+","+url+","+pars+")");
    var myAjax = new Ajax.Request(
      url,
      {
	method: method,
	parameters: pars+'&timestamp='+new Date().getTime(),
	onComplete: function(originalRequest){

//alert(originalRequest.responseText);
/*
alert(originalRequest.responseText);
if(!originalRequest.responseText.match(/html_content/)){
var debug="MediaWagon.AjaxRequest("+method+","+url+","+pars+") => \nresponseText="+originalRequest.responseText;
alert(debug);
}
*/
	  var json = MediaWagon.prototype.GetJSON(originalRequest);
//	  var json = MediaWagon.prototype.GetResponseText(originalRequest);
	  func(json,func_params);
	}
      }
    );
  },

  // http://kawa.at.webry.info/200511/article_9.html
  // for Safari
  GetResponseText: function(request){
    var text = request.responseText;
    if( navigator.appVersion.indexOf("KHTML")>-1 ){
      var esc = escape(text);
      if( esc.indexOf("%u")<0 && esc.indexOf("%")>-1 ){
	text = decodeURIComponent(esc);
      }
    }
    return text;
  },
  GetJSON: function(request)
  {
    var xml = request.responseXML;
    var json = xml.getElementsByTagName('html_content')[0].firstChild.data;
    if( json.length==4096 ){ // FF
      json = request.responseText.split(/html_content>/);
      json = json[1];
      json = json.substring(0,json.length-2);
    }
    return json;
  }
}; /* }}} */

/*
 * Mediaを管理するクラス
 */
var Media = Class.create();
Media.prototype = new MediaWagon();
Media.prototype =
/* {{{ */
{
  info: {},
  medias:{},
  hash_medias:{},
  selected_medias:{},
  query: "",

  initialize: function(id,info){
//    Media.prototype.info = info;
    this.id = id;
    this.info[id] = info;
  },
  GetInfo: function(id){
    if( id===undefined ){
      id = this.id;
    }
    if( id===undefined ){
      id = Media.prototype.id;
    }
    var info = (this.info===undefined)?Media.prototype.info:this.info;
    return info[id];
  },
  CreateDialog: function(params){
    MediaWagon.prototype.CreateDialog(params);
  },
  OpenMedia: function(params){
    var url = 'http://'+params.user_name+'.'+SERVER_NAME+'/'+params.media_type+'/'+params.id;
    window.open(url);
  },

  /*
   * 選択されたものをハイライト表示して、ページをまたがったアイテムも
   * 選択できるようにした。
   */
  ToggleAndSelect: function(obj,mode){
    // Clickできるのは、classにCLICKABLEがあるタグのみ
    while( !Element.hasClassName(obj,'CLICKABLE') ){
      if( obj.tagName.toLowerCase()=='html' ){
	return;
      }
      obj = obj.parentNode;
    }
    if( Element.hasClassName(obj,'hi') ){
      Element.removeClassName(obj,'hi');
      delete Media.prototype.selected_medias[mode][obj.id];
    }else{
      Element.addClassName(obj,'hi');
      Media.prototype.PushSelect(mode,obj.id,Media.prototype.hash_medias[mode][obj.id]);
//      Media.prototype.selected_medias[mode][obj.id] = Media.prototype.hash_medias[mode][obj.id];
    }
//var_dump(Media.prototype.selected_medias);
  },
  HighlightAgain: function(view_id,mode){
    var elements = $(view_id).getElementsByClassName('CLICKABLE');
    for(var i=0;i<elements.length;i++){
      if( Media.prototype.selected_medias[mode][elements[i].id] ){
	Element.addClassName(elements[i],'hi');
      }
    }
  },
  PushSelect: function(namespace,key,value){
    if( Media.prototype.selected_medias[namespace] === undefined ){
      Media.prototype.selected_medias[namespace] = {};
    }
    Media.prototype.selected_medias[namespace][key] = value;
  },


  /*
   * Archive
   */
  ViewArchive: function(p){
    var info = this.GetInfo('archive');
    var url = "/api/view_media";
    var query = Media.prototype.query||"";
    var pars = 'mode='+info.media_type+'&p='+p;
    if( query ){
      pars+="&q="+query;
    }
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Media.prototype.ViewArchiveRender,info);
  },
  ViewArchiveRender: function(json,params){
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
// TODO:setClipboard(json);
    }
//var_dump(params);

    // 選択されたとき必要な検索結果を保存。
    Media.prototype.medias = data.my_media;
    Media.prototype.hash_medias['archive'] = Util.prototype.Array2Hash(data.my_media);
//var_dump(Media.prototype.hash_medias);


    var page = new Pager({link_url:'Media.prototype.ViewArchive',start:data.start/data.display_count,total:data.total,display_count:data.display_count,mode:'straight'});
    page.previous_text_ = MSG_PREVIOUS;
    page.next_text_ = MSG_NEXT;
    data['pagenate'] = page.display();

    var html = TrimPath.processDOMTemplate(params.template,data);
    $(params.view_id).innerHTML = html;

    Media.prototype.HighlightAgain('media_table','archive');
  },
  SubmitArchive: function()
  {
    var i=0;
    var ids = new Array();
//var_dump(Media.prototype.selected_medias['archive']);
    var selected = Media.prototype.selected_medias['archive'];
    for(e in selected ){
      ids.push(selected[e].id);
      i++;
    }
    // JavaScriptのhashは、lengthで返せなさそう。
    if( i<=0 ){
      alert(MSG_CHOOSE_ANY_ITEM);
      return;
    }
    // ここだけは、特別に\001ではなく、,で区切る。
    // amazon,flickr,youtubeは、\001
    document.manage_media_form.hidden_media.value = ids.join(",");
    document.manage_media_form.submit();
  },
/*
  ViewPhoto: function(p){

    MediaWagon.prototype.AjaxRequest('GET','/api/admin/manage_photo','p='+p,Media.prototype.ViewRender,Media.prototype.info);
  },
  ViewRender: function(json,params)
  {
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
// TODO:setClipboard(json);
    }
    data.pagenation = "[TODO:pagenation]";
    var html = TrimPath.processDOMTemplate(params.view.template,data);
    $(params.view.view_id).innerHTML = html;
  },
*/
  /*
   * Upload
   */
  KickUploadMedia: function(){
    // 不要なiframeを削除する
    var iframes = document.getElementsByTagName('iframe');
    for( var i=0;i<iframes.length;i++ ){
      var media = window.frames[i].document.iframe_form['media'];
      if( media && media.value.length>0 ){
      }else{
	window.frames[i].document.iframe_form.minus.onclick();
	Watcher.prototype.next_id--;
      }
    }
    Media.prototype.KickUploadMedia = function(){ alert("Duplicate upload protection."); }
    Media.prototype.UploadMedia(0);
  },
  UploadMedia: function(i)
  {
    var theDoc = window.frames[i].document;
    theDoc.getElementById('indicator').style.display = 'inline';
//var_dump(Media.prototype.info);

    var parent_form = document[Media.prototype.info.upload.parent_form];
    var upload_form = window.frames[i].document[Media.prototype.info.upload.upload_form];

/*
    var keys = ["media_type","tags","visible_mode","comment_mode","trackback_mode"];
    for(var i=0;i<keys.length;i++){
alert("keys="+keys[i]);
      upload_form["data[Media]["+keys[i]+"]"].value = parent_form["data[Media]["+keys[i]+"]"].value;
    }
*/
//alert(parent_form["media/tags"].value+","+parent_form["media/visible_mode"].length);
    var visible_mode = $A(parent_form["media/visible_mode"]).find(function(element){return element.checked;});
    var comment_mode = $A(parent_form["media/comment_mode"]).find(function(element){return element.checked;});
    var trackback_mode = $A(parent_form["media/trackback_mode"]).find(function(element){return element.checked;});
    var visible_group = $F(parent_form["media/visible_group"]);

    upload_form["media/media_type"].value = parent_form["media_type"].value;
    upload_form["media/tags"].value = parent_form["media/tags"].value;
    upload_form["media/visible_mode"].value = visible_mode.value;
    upload_form["media/comment_mode"].value = comment_mode.value;
    upload_form["media/trackback_mode"].value = trackback_mode.value;
    upload_form["media/visible_group"].value = visible_group;

    upload_form.submit();
    Watcher.prototype.current_id = i;
  },
  /*
   * Amazon
   */
  FindByAmazon: function(p)
  {
    var genre = $F(document.amazon_form.genre);
    var keyword = $F(document.amazon_form.keyword);
    var image_url = 'medium_image';

    Element.show($('amazon_searching'));
    if( keyword.length<=0 ){
      alert(MSG_EMPTY_SEARCH_WORD);
      return;
    }

    var args = {
    view_id: "amazon_table",
    template: "textarea_find_amazon"
    };
    // 先に投稿フォームを表示
    $('amazon_post_form').style.display = 'block';
    MediaWagon.prototype.AjaxRequest('GET','/api/find_product/','genre='+genre+'&keyword='+encodeURIComponent(keyword)+'&image_url='+image_url+'&p='+parseInt(p),Media.prototype.AmazonViewRender,args);
  },
  AmazonViewRender: function(json,params)
  {
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
// TODO:setClipboard(json);
    }
    Element.hide($('amazon_searching'));

    // 選択されたとき必要な検索結果を保存。
    Media.prototype.medias = data.my_media;
    Media.prototype.hash_medias['amazon'] = Util.prototype.Array2Hash(data.my_media);
//var_dump(Media.prototype.hash_medias);
//alert("selected_medias="+Media.prototype.selected_medias.inspect());

    var page = new Pager({link_url:'Media.prototype.FindByAmazon',start:data.start,total:data.total,display_count:data.display_count,mode:'count_up'});
    page.previous_text_ = MSG_PREVIOUS;
    page.next_text_ = MSG_NEXT;
    data['pagenate'] = page.display();


    var html = TrimPath.processDOMTemplate(params.template,data);
    $(params.view_id).innerHTML = html;

    // ページをまたがっているアイテムも選択可能にするため、
    // amazon_table内のCLICKABLEの中から既に選択されているものを探す
    Media.prototype.HighlightAgain(params.view_id,'amazon');
  },
  SubmitAmazon: function(){
    var i=0;
    var artists = new Array();
    var urls = new Array();
    var large_images = new Array();
    var medium_images = new Array();
    var small_images = new Array();
    var titles = new Array();
    var selected = Media.prototype.selected_medias['amazon'];
    for(e in selected ){
      artists.push(selected[e].artist);
      urls.push(selected[e].url);
      large_images.push(selected[e].large_image);
      medium_images.push(selected[e].medium_image);
      small_images.push(selected[e].small_image);
      titles.push(selected[e].title);

      i++;
    }
    // JavaScriptのhashは、lengthで返せなさそう。
    if( i<=0 ){
      alert(MSG_CHOOSE_ANY_ITEM);
      return;
    }

    document.amazon_form.artists.value = artists.join("\001");
    document.amazon_form.urls.value = urls.join("\001");
    document.amazon_form.large_images.value = large_images.join("\001");
    document.amazon_form.medium_images.value = medium_images.join("\001");
    document.amazon_form.small_images.value = small_images.join("\001");
    document.amazon_form.titles.value = titles.join("\001");

    document.amazon_form.submit();
  },
  FindByRakuten: function(p)
  {
    var genre = $F(document.rakuten_form.genre);
    var keyword = $F(document.rakuten_form.keyword);
    var media_type = $F(document.rakuten_form.media_type);
    p=(p===undefined)?0:p;

    Element.show($('rakuten_searching'));
    if( keyword.length<=0 ){
      alert(MSG_EMPTY_SEARCH_WORD);
      return;
    }
    keyword = encodeURIComponent(keyword);
//alert('/api/rakuten?media_type='+media_type+'&genre='+genre+'&keyword='+keyword+'&p='+p);
    // 先に投稿フォームを表示
    $('rakuten_post_form').style.display = 'block';
    MediaWagon.prototype.AjaxRequest('GET','/api/rakuten','media_type='+media_type+'&genre='+genre+'&keyword='+keyword+'&p='+p,Media.prototype.RakutenViewRender,{view_id:"rakuten_table",template:"textarea_find_rakuten"});
  },
  RakutenViewRender: function(json,params){
//alert("json="+json);
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
//setClipboard(json);
    }
    Element.hide($('rakuten_searching'));
//var_dump(data);
    Media.prototype.medias = data.my_media;
    Media.prototype.hash_medias['rakuten'] = Util.prototype.Array2Hash(data.my_media);

//    var page = new pager('Media.prototype.FindByRakuten',data.start/data.display_count,data.total,data.display_count,'straight');
    var page = new Pager({link_url:'Media.prototype.FindByRakuten',start:data.start/data.display_count,total:data.total,display_count:data.display_count,mode:'straight'});
    page.previous_text_ = MSG_PREVIOUS;
    page.next_text_ = MSG_NEXT;
    data['pagenate'] = page.display();

    var html = TrimPath.processDOMTemplate(params.template,data);
    $(params.view_id).innerHTML = html;

    // ページをまたがっているアイテムも選択可能にするため、
    // amazon_table内のCLICKABLEの中から既に選択されているものを探す
    Media.prototype.HighlightAgain(params.view_id,'rakuten');

  },
  SubmitRakuten: function(){
    var i=0;
    var urls = new Array();
    var titles = new Array();
    var large_images = new Array();
    var medium_images = new Array();
//    var small_images = new Array();
    var selected = Media.prototype.selected_medias['rakuten'];
    for(e in selected ){
      titles.push(selected[e].title);
      urls.push(selected[e].url);
      medium_images.push(selected[e].medium_image);
      large_images.push(selected[e].large_image);

      i++;
    }
    // JavaScriptのhashは、lengthで返せなさそう。
    if( i<=0 ){
      alert(MSG_CHOOSE_ANY_ITEM);
      return;
    }

    document.rakuten_form.titles.value = titles.join("\001");
    document.rakuten_form.urls.value = urls.join("\001");
    document.rakuten_form.medium_images.value = medium_images.join("\001");
    document.rakuten_form.large_images.value = large_images.join("\001");

    document.rakuten_form.submit();
  },

  /*
   * Flickr
   */
  FindByFlickrMyhome: function(p)
  {
    p=(p===undefined)?0:p;
    var params = {};
    MediaWagon.prototype.AjaxRequest('GET','/api/find_flickr_myphoto','p='+p,Media.prototype.FlickrViewRender,params);

  },
  FindByFlickr: function(p)
  {
    var keyword = $F(document.flickr_form.keyword);
    p=(p===undefined)?0:p;

    if( $('flickr_searching') ){
      Element.show($('flickr_searching'));
    }
    if( keyword.length<=0 ){
      alert(MSG_EMPTY_SEARCH_WORD);
      return;
    }

    var params = {};
    MediaWagon.prototype.AjaxRequest('GET','/api/find_flickr','keyword='+encodeURIComponent(keyword)+'&p='+p,Media.prototype.FlickrViewRender,params);
  },
  FlickrViewRender: function(json,params)
  {
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
// TODO:setClipboard(json);
    }
    Element.hide($('flickr_searching'));
    // 選択されたとき必要な検索結果を保存。
    Media.prototype.medias = data.my_media;
    Media.prototype.hash_medias['flickr'] = Util.prototype.Array2Hash(data.my_media);
//alert(data.inspect());
    var page = new Pager({link_url:'Media.prototype.FindByFlickr',start:data.start,total:data.total,display_count:data.display_count,mode:'same'});
    page.previous_text_ = MSG_PREVIOUS;
    page.next_text_ = MSG_NEXT;
    data['pagenate'] = page.display();

    var html = TrimPath.processDOMTemplate("textarea_find_flickr",data);
    $('flickr_table').innerHTML = html;

    Media.prototype.HighlightAgain('flickr_table','flickr');
  },
  SubmitFlickr: function(){
//    var ids = "";
    var i=0;
    var ids = new Array();
    var thumbnails = new Array();
    var image_urls = new Array();
    var titles = new Array();
    var selected = Media.prototype.selected_medias['flickr'];
    for( e in selected ){
      ids.push(selected[e].id);
      thumbnails.push(selected[e].thumbnail);
      image_urls.push(selected[e].image_url);
      titles.push(selected[e].title);
      i++;
    }
    // JavaScriptのhashは、lengthで返せなさそう。
    if( i<=0 ){
      alert(MSG_CHOOSE_ANY_ITEM);
      return;
    }
    document.flickr_form.ids.value = ids.join("\001");
    document.flickr_form.titles.value = titles.join("\001");
    document.flickr_form.thumbnails.value = thumbnails.join("\001");
    document.flickr_form.image_urls.value = image_urls.join("\001");

    document.flickr_form.submit();
  },
  FindByYoutube: function(p)
  {
    var keyword = $F(document.youtube_form.keyword);
    p=(p===undefined)?0:p;
    if( keyword.length<=0 ){
      alert(MSG_EMPTY_SEARCH_WORD);
      return;
    }

    Element.show($('youtube_searching'));
    $('youtube_table').innerHTML = '<b>'+MSG_SEARCHING+'</b>';
    // 先に投稿フォームを表示
    $('youtube_post_form').style.display = 'block';
    var params = {};
    MediaWagon.prototype.AjaxRequest('GET','/api/find_youtube','keyword='+keyword+'&p='+p,Media.prototype.YoutubeViewRender,params);
  },
  YoutubeViewRender: function(json,params)
  {
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
// TODO:setClipboard(json);
    }
//alert(json);

    Element.hide($('youtube_searching'));
    // 選択されたとき必要な検索結果を保存。
    Media.prototype.medias = data.my_media;
    Media.prototype.hash_medias['youtube'] = Util.prototype.Array2Hash(data.my_media);

    var html = TrimPath.processDOMTemplate("textarea_find_youtube",data);
    $('youtube_table').innerHTML = html;

    Media.prototype.HighlightAgain('youtube_table','youtube');
  },
  SubmitYoutube: function(){
    var i=0;
    var urls = new Array();
    var images = new Array();
    var titles = new Array();
    var artists = new Array();
    var selected = Media.prototype.selected_medias['youtube'];
    for( e in selected ){
      urls.push(selected[e].url);
      images.push(selected[e].image);
      titles.push(selected[e].title);
      artists.push(selected[e].artist);
      i++;
    }
//alert("SubmitYoutube:"+i);
    // JavaScriptのhashは、lengthで返せなさそう。
    if( i<=0 ){
      alert(MSG_CHOOSE_ANY_ITEM);
      return;
    }

    document.youtube_form.urls.value = urls.join("\001");
    document.youtube_form.images.value = images.join("\001");
    document.youtube_form.titles.value = titles.join("\001");
    document.youtube_form.artists.value = artists.join("\001");

    document.youtube_form.submit();
  }
}; /* }}} */


var Manage = Class.create();
Manage.prototype = new MediaWagon();
Manage.prototype =
{
  medias: {},
  comments: null,
  trackbacks: null,
  spam_trackbacks: null,
  initialize: function(id,info){},

  ToggleAll: function(mode)
  {
    if(mode==undefined){
      mode='select';
    }
    var elements = document.getElementsByClassName('CLICKABLE');
    for(var i=0;i<elements.length;i++){
      if( mode=='select' ){
	Element.addClassName(elements[i],'hi');
      }else{
	Element.removeClassName(elements[i],'hi');
      }
    }
  },


  /*
   * Manage Media
   */
  DeleteMediaDialog: function(media_type)
  {
    var entry_ids = document.getElementsByClassName('hi',document.manage_media_form);
//alert(Manage.prototype.medias.length+':'+entry_ids.length);
    var data = [];
    data['media_type'] = media_type;
    data['medias'] = new Array();
    for(var i=0;i<entry_ids.length;i++){
      for(var j=0;j<Manage.prototype.medias.length;j++){
	if( entry_ids[i].id == Manage.prototype.medias[j].id ){
	  data.medias.push(Manage.prototype.medias[j]);
	}
      }
    }
    if( data.medias.length>0 ){
      var html = TrimPath.processDOMTemplate("textarea_delete_media_dialog",data);
      MediaWagon.prototype.CreateSimpleDialog(html);
    }else{
      alert(MSG_CHOOSE_ANY_ITEM);
    }
  },
  DeleteOneDialog: function(media_type,id,from){
    var res = confirm(MSG_CONFIRM_DELETE_DESCRIPTION);
    if( !res ){ return; } // Canceled

    var url = '/api/delete_media/'+id;
    var pars = 'media_type='+media_type;
    var myAjax = new Ajax.Request(
      url,
      {
	method: 'get',
	parameters: pars,
	onComplete: function(originalRequest){
	  if( from=='blog' ){
	    location.reload();
	  }
	}
      }
    );
  },
  DeleteMedia: function(media_type)
  {
    var media_ids = document.getElementsByClassName('hi',document.manage_entry_form);
    var ids = new Array();
    for(var i=0;i<media_ids.length;i++){
      ids.push(media_ids[i].id);
    }
    var url = '/api/delete_media/'+ids.join(',');
    var pars = 'media_type='+media_type;
//alert(url+'?'+pars);
    var myAjax = new Ajax.Request(
      url,
      {
	method: 'get',
	parameters: pars,
	onComplete: function(originalRequest){
//	  var json = GetJson(originalRequest);
	  switch(media_type){
	  case 'entry':
	    Manage.prototype.ViewEntry(0);
	    break;
	  case 'photo':
	    Manage.prototype.ViewPhoto(0);
	    break;
	  case 'movie':
	    Manage.prototype.ViewMovie(0);
	    break;
	  case 'music':
	    Manage.prototype.ViewMusic(0);
	    break;
	  case 'product':
	    Manage.prototype.ViewProduct(0);
	    break;
	  case 'bookmark':
	    Manage.prototype.ViewBookmark(0);
	    break;
	  }
	}
      }
    );
    MediaWagon.prototype.CloseDialog();
  },

  // 最終的にメディアを描画する。
  ViewManageRender: function(json,params){
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
//      setClipboard(json);
    }
    if( params.pager_method=='straight' ){
      var page = new Pager({link_url:params.func_name,start:data.start/data.display_count,total:data.total,display_count:data.display_count,mode:params.pager_method});
    }else if( params.pager_method=='count_up' ){
      var page = new Pager({link_url:params.func_name,start:data.start,total:data.total,display_count:data.display_count,mode:params.pager_method});
    }
    page.previous_text_ = '&laquo;';
    page.next_text_ = '&raquo;';
    page.separator = '';
    data['pagenate'] = page.display();
    if( data.media ){ Manage.prototype.medias = data.media; }
    if( data.comments ){ Manage.prototype.comments = data.comments; }
    if( data.trackbacks ){ Manage.prototype.trackbacks = data.trackbacks; }

    var html = "";
    if( data.total>0 ){
      data['pagenation'] = TrimPath.processDOMTemplate("textarea_pagenation",data);
      html = TrimPath.processDOMTemplate(params.template,data);
    }else{
      html = params.no_title;
    }
    $('media_list').innerHTML = html;
    if( myTimer!=null ){ clearTimeout(myTimer); }
  },
  //
  // 記事の管理
  ViewEntry: function(p){
    $('manage_media_title').innerHTML = MSG_MANAGE_ENTRY;
    $('media_list').innerHTML = '<img src="'+INDICATOR+'" /><a href="javascript:location.reload();">'+MSG_RELOAD+'</a>';
    $('add_media').innerHTML = '';
    if( p===undefined ){ p=0; }
    var url = '/api/manage_media';
    var pars = 'media_type=entry&p='+p;
    var func_params = {
      func_name: 'Manage.prototype.ViewEntry',
      template: 'textarea_manage_detail',
      pager_method: 'straight',
      no_title: MSG_NO_ENTRY
    };
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ViewManageRender,func_params);
  },
  //
  // フォトの管理
  ViewPhoto: function(p)
  {
    $('manage_media_title').innerHTML = MSG_MANAGE_PHOTO;
    $('media_list').innerHTML = '<img src="'+INDICATOR+'" /><a href="javascript:location.reload();">'+MSG_RELOAD+'</a>';
    $('add_media').innerHTML = '<a href="#manage_photo" onclick="MediaWagon.prototype.CreateDialog({url:\'/popup/insert_photo?upload_mode=1\'})">'+MSG_ADD_PHOTO+'</a>';
    if( p===undefined ){ p=0; }
    var url = '/api/manage_media';
    var pars = 'media_type=photo&p='+p;
    var func_params = {
      func_name: 'Manage.prototype.ViewPhoto',
      template: 'textarea_manage_scale',
      pager_method: 'straight',
      no_title: MSG_NO_PHOTO
    };
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ViewManageRender,func_params);
  },
  //
  // ムービの管理
  ViewMovie: function(p)
  {
    $('manage_media_title').innerHTML = MSG_MANAGE_MOVIE;
    $('media_list').innerHTML = '<img src="'+INDICATOR+'" /><a href="javascript:location.reload();">'+MSG_RELOAD+'</a>';
    $('add_media').innerHTML = '<a href="#manage_movie" onclick="MediaWagon.prototype.CreateDialog({url:\'/popup/insert_movie?upload_mode=1\'})">'+MSG_ADD_MOVIE+'</a>';
    if( p===undefined ){ p=0; }
    var url = '/api/manage_media';
    var pars = 'media_type=movie&p='+p;
    var func_params = {
      func_name: 'Manage.prototype.ViewMovie',
      template: 'textarea_manage_scale',
      pager_method: 'straight',
      no_title: MSG_NO_MOVIE
    };
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ViewManageRender,func_params);
  },
  //
  // ミュージックの管理
  ViewMusic: function(p)
  {
    $('manage_media_title').innerHTML = MSG_MANAGE_MUSIC;
    $('media_list').innerHTML = '<img src="'+INDICATOR+'" /><a href="javascript:location.reload();">'+MSG_RELOAD+'</a>';
    $('add_media').innerHTML = '<a href="#manage_music" onclick="MediaWagon.prototype.CreateDialog({url:\'/popup/insert_music?upload_mode=1\'})">'+MSG_ADD_MUSIC+'</a>';
    if( p===undefined ){ p=0; }
    var url = '/api/manage_media';
    var pars = 'media_type=music&p='+p;
    var func_params = {
      func_name: 'Manage.prototype.ViewMusic',
      template: 'textarea_manage_scale',
      pager_method: 'straight',
      no_title: MSG_NO_MUSIC
    };
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ViewManageRender,func_params);
  },
  //
  // グッズの管理
  ViewProduct: function(p)
  {
    $('manage_media_title').innerHTML = MSG_MANAGE_PRODUCT;
    $('media_list').innerHTML = '<img src="'+INDICATOR+'" /><a href="javascript:location.reload();">'+MSG_RELOAD+'</a>';
    $('add_media').innerHTML = '<a href="#manage_product" onclick="MediaWagon.prototype.CreateDialog({url:\'/popup/insert_product?upload_mode=1\'})">'+MSG_ADD_PRODUCT+'</a>';
    if( p===undefined ){ p=0; }
    var url = '/api/manage_media';
    var pars = 'media_type=product&p='+p;
    var func_params = {
      func_name: 'Manage.prototype.ViewProduct',
      template: 'textarea_manage_scale',
      pager_method: 'straight',
      no_title: MSG_NO_PRODUCT
    };
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ViewManageRender,func_params);
  },
  //
  // ブックマークの管理
  ViewBookmark: function(p)
  {
    $('manage_media_title').innerHTML = MSG_MANAGE_BOOKMARK;
    $('media_list').innerHTML = '<img src="'+INDICATOR+'" /><a href="javascript:location.reload();">'+MSG_RELOAD+'</a>';
    $('add_media').innerHTML = '<a href="/myhome/post_bookmark">'+MSG_ADD_BOOKMARK+'</a>';
    if( p===undefined ){ p = 0; }
    var url = '/api/manage_media';
    var pars = 'media_type=bookmark&p='+p;
    var func_params = {
      func_name: 'Manage.prototype.ViewBookmark',
      template: 'textarea_manage_detail',
      pager_method: 'straight',
      no_title: MSG_NO_BOOKMARK
    };
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ViewManageRender,func_params);
  },
  //
  // お気に入りの管理
  ViewFavorite: function(p)
  {
    $('manage_media_title').innerHTML = MSG_MANAGE_FAVORITE;
    $('media_list').innerHTML = '<img src="'+INDICATOR+'" /><a href="javascript:location.reload();">'+MSG_RELOAD+'</a>';
    $('add_media').innerHTML = '';
    if( p===undefined ){ p = 0; }
    var url = '/api/manage_favorite';
    var pars = 'p='+p;
//alert(url+'?'+pars);
    var func_params = {
      func_name: 'Manage.prototype.ViewFavorite',
      template: 'textarea_manage_scale',
      pager_method: 'straight',
      no_title: MSG_NO_FAVORITE
    };
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ViewManageRender,func_params);
  },
  //
  // コメント関連
  // コメントの表示
  ViewComment: function(p)
  {
    $('manage_media_title').innerHTML = MSG_MANAGE_COMMENT;
    $('add_media').innerHTML = '';
    if( p===undefined ){ p=0; }
    var url = "/api/manage_comment";
    var pars = 'p='+p;
//alert(url+'?'+pars);
    var func_params = {
      func_name: 'Manage.prototype.ViewComment',
      template: 'textarea_manage_comment',
      pager_method: 'count_up',
      no_title: MSG_NO_COMMENT
    };
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ViewManageRender,func_params);
  },
  RemoveComment: function(){
    var comment_ids = document.getElementsByClassName('hi');
    var comment_id = '';
    var media_type = '';
    for(var i=0;i<comment_ids.length;i++){
      comment_id+=','+comment_ids[i].id;
      for(var j=0;j<Manage.prototype.comments.length;j++){
	if( Manage.prototype.comments[j].id==comment_ids[i].id ){
	  media_type+=','+Manage.prototype.comments[j].media_type;
	}
      }
    }
    comment_id = comment_id.substr(1);
    media_type = media_type.substr(1);
//alert(Manage.comments.length+" => "+comment_id);
    if( comment_id.length>0 ){
      var res = confirm(MSG_CONFIRM_DELETE_DESCRIPTION);
      if( !res ){ return; } // Canceled

      var url = '/api/comment/delete_comment';
      var pars = 'id='+comment_id+'&media_type='+media_type;
//alert(url+'?'+pars);
      MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.RemoveCommentExecute,{});
    }
  },
  RemoveCommentExecute: function(){
    Manage.prototype.ViewComment(0);
  },
  GetCheckedCommentIds: function(status){
//alert("GetCheckedCommentIds("+status);
    var comment_ids = document.getElementsByClassName('hi');
    var comment_id = '';
    if( comment_ids.length>0 ){
      var hash_comments = Util.prototype.Array2Hash(Manage.prototype.comments);
      for(var i=0;i<comment_ids.length;i++){
//var_dump(hash_comments[comment_ids[i].id]);
	if( status===undefined ){
	  comment_id+=','+comment_ids[i].id;
	}else if( status & hash_comments[comment_ids[i].id].visible_mode ){
	  comment_id+=','+comment_ids[i].id;
	}
      }
    }
    return comment_id.substr(1);
  },

  MakeCommentPrivate: function(){
    // publicかgroupに公開されているコメントを取得する
    var comment_ids = Manage.prototype.GetCheckedCommentIds(MEDIA_VISIBLE_PUBLIC|MEDIA_VISIBLE_GROUP);
    if( comment_ids.length>0 ){
      var url = '/api/comment/change_comment';
      var pars = 'id='+comment_ids+'&status='+MEDIA_COMMENT_PRIVATE;
      MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ReloadComment,{});
    }
  },
  MakeCommentPublic: function(){
    var comment_ids = Manage.prototype.GetCheckedCommentIds(MEDIA_VISIBLE_PRIVATE);
    if( comment_ids.length>0 ){
      var url = '/api/comment/change_comment';
      var pars = 'id='+comment_ids+'&status='+MEDIA_COMMENT_PUBLIC;
      MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ReloadComment,{});
    }
  },
  ReloadComment: function(){
    Manage.prototype.ViewComment(0);
  },
  //
  // トラックバック関連
  ViewTrackback: function(p)
  {
    $('media_list').innerHTML = '<img src="'+INDICATOR+'" /><a href="javascript:location.reload();">'+MSG_RELOAD+'</a>';
    $('manage_media_title').innerHTML = MSG_MANAGE_TRACKBACK;
    $('add_media').innerHTML = '';
    if( p===undefined ){ p=0; }
    var url = "/api/manage_trackback";
    var pars = 'p='+p;
    var func_params = {
      func_name: 'Manage.prototype.ViewTrackback',
      template: 'textarea_manage_trackback',
      pager_method: 'count_up',
      no_title: MSG_NO_TRACKBACK
    }
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ViewManageRender,func_params);
  },
  // 指定されたステータス(public/private)を満たすものを取得する
  // ステータスが指定されなければ、全て取得
  GetCheckedTrackbackIds: function(status){
    var trackback_ids = document.getElementsByClassName('hi');
    var trackback_id = '';
    if( trackback_ids.length>0 ){
      for(var i=0;i<trackback_ids.length;i++){
//alert("status="+status+","+Manage.trackbacks[i].status);
	if(status===undefined){
	  trackback_id+=','+trackback_ids[i].id;
	}else if( status==Manage.prototype.trackbacks[i].status){
	  trackback_id+=','+trackback_ids[i].id;
	}
      }
    }else{
alert("[GetCheckedTrackbackIds]not implement");
return;
      if( trackback_ids.checked ){
	if(status===undefined){
	  trackback_id += ','+trackback_ids.value;
	}else if( status==Manage.prototype.trackbacks[0].status){
	  trackback_id+=','+trackback_ids.value;
	}
      }
    }
//alert(trackback_id);
    return trackback_id.substr(1);
  },
  RemoveTrackback: function(){
    var trackback_id = Manage.prototype.GetCheckedTrackbackIds();
    if( trackback_id.length>0 ){
      var res = confirm(MSG_CONFIRM_DELETE_DESCRIPTION);
      if( !res ){ return; } // Canceled

      var url = '/api/delete_trackback';
      var pars = 'id='+trackback_id;
//alert(url+'?'+pars);
//      this.AjaxRequest('get',url,pars,this.Reload);
      MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ReloadTrackback,{});
    }
  },
  ReloadTrackback: function(){
    Manage.prototype.ViewTrackback(0);
  },
  ReloadSpamTrackback: function(){
    Manage.prototype.ViewSpamTrackback(0);
  },
  // トラックバックを公開にする
  MakeTrackbackPublic: function(){
    var trackback_id = Manage.prototype.GetCheckedTrackbackIds(MEDIA_VISIBLE_PRIVATE);
    if( trackback_id.length>0 ){
      var url = '/api/change_trackback';
      var pars = 'id='+trackback_id+'&status='+MEDIA_TRACKBACK_PUBLIC;
//alert(url+'?'+pars);
      MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ReloadTrackback,{});
    }
  },
  // トラックバックを非公開にする
  MakeTrackbackPrivate: function(){
    var trackback_id = Manage.prototype.GetCheckedTrackbackIds(MEDIA_VISIBLE_PUBLIC);
    if( trackback_id.length>0 ){
      var url = '/api/change_trackback';
      var pars = 'id='+trackback_id+'&status='+MEDIA_TRACKBACK_PRIVATE;
//alert(url+'?'+pars);
      MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ReloadTrackback,{});
    }
  },
  // スパムトラックバックとして報告
  ReportTrackbackAsSpam: function(){
    var trackback_id = Manage.prototype.GetCheckedTrackbackIds();
    if( trackback_id.length>0 ){
      var url = '/api/toggle_trackback';
      var pars = 'id='+trackback_id+'&spam=1';
//alert(url+'?'+pars);
      MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ReloadTrackback,{});
    }
  },
  //
  // SpamTrackback
  ViewSpamTrackback: function(p){
    $('media_list').innerHTML = '<img src="'+INDICATOR+'" /><a href="javascript:location.reload();">'+MSG_RELOAD+'</a>';
    $('manage_media_title').innerHTML = MSG_MANAGE_SPAM_TRACKBACK;
    $('add_media').innerHTML = '';
    if( p===undefined ){ p=0; }
    var url = "/api/manage_trackback";
    var pars = 'p='+p+'&type=spam';
    var func_params = {
      func_name: 'Manage.ViewSpamTrackback',
      template: 'textarea_manage_trackback',
      pager_method: 'count_up',
      no_title: MSG_NO_SPAM_TRACKBACK
    };

    MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ViewManageRender,func_params);
  },
  RemoveSpamTrackback: function(){
    var trackback_id = Manage.prototype.GetCheckedTrackbackIds();
    if( trackback_id.length>0 ){
      var res = confirm(MSG_CONFIRM_DELETE_DESCRIPTION);
      if( !res ){ return; } // Canceled

      var url = '/api/delete_trackback';
      var pars = 'id='+trackback_id+'&spam=1';
//alert(url+'?'+pars);
      MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ReloadSpamTrackback,{});
    }
  },
  // スパムトラックバック解除
  BackToTrackback: function(){
    var trackback_id = Manage.prototype.GetCheckedTrackbackIds();
    if( trackback_id.length>0 ){
      var url = '/api/toggle_trackback';
      var pars = 'id='+trackback_id+'&spam=0';
//alert(url+'?'+pars);
      MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ReloadSpamTrackback,{});
    }
  },
  Empty: function(){
    var res = confirm(MSG_CONFIRM_EMPTY_DESCRIPTION);
    if( !res ){ return; }
    var url = '/api/empty_spam_trackback';
    var pars = '';
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ReloadSpamTrackback,{});
  },
  //
  // フォルダーの管理
  ViewFolder: function(p)
  {
    $('manage_media_title').innerHTML = MSG_MANAGE_FOLDER;
    $('media_list').innerHTML = '<img src="'+INDICATOR+'" /><a href="javascript:location.reload();">'+MSG_RELOAD+'</a>';
    $('add_media').innerHTML = '';
    var href = location.href;
    var folder_id = null;
    if( href.match(/.*#(.*):(.*)/i) ){
      folder_id = RegExp.$2;
    }
    if( !folder_id ){ return; }
    if( p===undefined ){ p = 0; }
    var url = '/api/manage_folder';
    var pars = 'folder_id='+folder_id+'&p='+p;
//alert(url+'?'+pars);
    var func_params = {
      func_name: 'Manage.prototype.ViewFolder',
      template: 'textarea_manage_scale',
      pager_method: 'straight',
      no_title: '<a href="javascript:void(0);" onclick="Folder.prototype.DeleteDialog({height:300});">'+MSG_DELETE_FOLDER_TITLE+'</a><br />'+MSG_NO_ITEM
    };
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Manage.prototype.ViewManageRender,func_params);
  }
};


// PostMedia
// 記事投稿時のコメントやトラックバックのチェックボックスの権限更新。
var Watcher = Class.create();
Watcher.prototype =
/* {{{ */
{
  next_id:1,
  current_id:0,
  info: {},
  initialize: function(id,info){
    // [id] = {key1:val1,key2:val2}のように、idに対して
    this.id = id;
    this.info[id] = info;
//alert(info.form+","+info.visibles+","+info.form[info.visibles].length);
    var visible_modes = info.form[info.visibles];
    for(var i=0;i<visible_modes.length;i++){
      Event.observe(visible_modes[i],'click',this.CheckComment.bindAsEventListener(this),false);
    }
    this.CheckComment();
  },
  AddMedia: function(media_id){
//alert("id="+this.id+":cur="+Watcher.prototype.current_id);
//var_dump(this.info);
//    var parent_form = parent.document.upload_media_form;
    var parent_form = document.upload_media_form;
    if( parent_form.hidden_media.value.length>0 ){
      parent_form.hidden_media.value += ',';
    }
    parent_form.hidden_media.value += media_id;
    Watcher.prototype.current_id++;
    if( Watcher.prototype.current_id>=Watcher.prototype.next_id ){
      parent_form.submit();
    }else{
      Media.prototype.UploadMedia(Watcher.prototype.current_id);
    }
  },
  CheckComment:function ()
  /* {{{ */
  {
    var blog_comment_mode = this.info[this.id].blog_comment_mode;
    var blog_trackback_mode = this.info[this.id].blog_trackback_mode;

    var form = this.info[this.id]['form'];
    var visible_modes = form["media/visible_mode"];
    var comment_modes = form["media/comment_mode"];
    var trackback_modes = form["media/trackback_mode"];
    // radioボタンのチェックされているものを探す。
    var visible_mode = $A(visible_modes).find(function(element){return element.checked;});

//alert("blog_comment_mode="+blog_comment_mode+",blog_trackback_mode="+blog_trackback_mode);

    if( visible_mode.value == MEDIA_VISIBLE_PUBLIC ){

      for(var i=0;i<comment_modes.length;i++){
	comment_modes[i].disabled = "";
      }


      for(var i=0;i<trackback_modes.length;i++){
	trackback_modes[i].disabled = "";
      }
    }else if( visible_mode.value == MEDIA_VISIBLE_GROUP ){
      if( comment_modes[0].checked ){
	comment_modes[1].checked = true;
      }
      comment_modes[0].disabled = "disabled";
      comment_modes[1].disabled = "";

      if( trackback_modes[0].checked ){
	trackback_modes[1].checked = true;
      }
      trackback_modes[0].disabled = "disabled";
    }else if( visible_mode.value == MEDIA_VISIBLE_PRIVATE
     || visible_mode.value == MEDIA_VISIBLE_PASSWORD
    ){
      comment_modes[2].checked = true;
      for(var i=0;i<comment_modes.length-1;i++){
	comment_modes[i].disabled = "disabled";
      }
      if( trackback_modes[0].checked ){
	trackback_modes[1].checked = true;
      }
      trackback_modes[0].disabled = "disabled";
    }else{
  alert("no such mode:("+MEDIA_VISIBLE_PUBLIC+","+MEDIA_VISIBLE_GROUP+","+MEDIA_VISIBLE_PRIVATE+")"+visible_mode.value);
    }

    if( blog_comment_mode == MEDIA_COMMENT_PRIVATE ){
      comment_modes[2].checked = "checked";
      comment_modes[0].disabled = "disabled";
      comment_modes[1].disabled = "disabled";
    }
    if( blog_trackback_mode == MEDIA_TRACKBACK_PRIVATE ){
      trackback_modes[1].checked = "checked";
      trackback_modes[0].disabled = "disabled";
    }

  } /* }}} */,
  CheckUpload: function()
  /* {{{ */
  {
    var upload_count = 0;
    var filled_count = 0;
    var iframes = document.getElementsByTagName('iframe');

//alert("CheckUpload="+iframes.length);
    for(var i=0;i<iframes.length;i++){
//window.frames[i].document.iframe_form['data[Media][file]']
      var media = window.frames[i].document.iframe_form['media'];
      if( media && media.value.length>0 ){
	filled_count++;
      }
      upload_count++;
    }
    if( filled_count>=upload_count ){
      var div_obj = document.createElement('div');
      div_obj.id = "iframe_"+Watcher.prototype.next_id;
      var iframe_obj = document.createElement('iframe');
//      iframe_obj.id = "iframe_"+Watcher.prototype.next_id;
      iframe_obj.src = "/popup/upload/"+Watcher.prototype.next_id;
      iframe_obj.className = "upload_file";
      iframe_obj.frameBorder = 0;
      iframe_obj.scrolling = "no";
      div_obj.appendChild(iframe_obj);
      $('extra_iframes').appendChild(div_obj);
      Watcher.prototype.next_id++;
    }
  } /* }}} */,
  DeleteIframe: function(id){
    $('extra_iframes').removeChild($('iframe_'+id));
  }
}; /* }}} */

var Folder = Class.create();
Folder.prototype = new MediaWagon();
Folder.prototype =
/* {{{ */
{
  info: {},
  folders: {},
  initialize: function(id,info){
  },
  View: function(view_id){
    MediaWagon.prototype.AjaxRequest('GET','/api/view_folder','',Folder.prototype.ViewRender,{view_id:view_id,template:"textarea_folder_view"});
  },
  ViewRender: function(json,params){
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
// TODO:setClipboard(json);
    }
    var data = {folders:folders};
    Folder.prototype.folders = folders;
    var html = TrimPath.processDOMTemplate(params.template,data);
    $(params.view_id).innerHTML = html;
  },
  CreateDialog: function(params){
    if( params===undefined ){ params = {}; }
    var html = TrimPath.processDOMTemplate("textarea_folder_create_dialog",{});
    MediaWagon.prototype.CreateSimpleDialog(html,params);
  },
  Create: function(){
    var folder_name = $F(document.folder_form.folder_name);
    var visible_mode = $A(document.folder_form.visible_mode).find(function(element){return element.checked;}).value;
    var visible_group = $A(document.folder_form.visible_group).find(function(element){return element.selected;}).value;
    if( folder_name ){
      MediaWagon.prototype.AjaxRequest('GET','/api/create_folder','folder_name='+encodeURIComponent(folder_name)+'&visible_mode='+visible_mode+'&visible_group='+visible_group,Folder.prototype.CreateDone,{});
    }else{
      alert(MSG_INPUT_FOLDER_NAME);
    }
  },
  CreateDone: function(){
    $('folder_form_div').innerHTML = MSG_ADD_FOLDER;
    MediaWagon.prototype.CloseDialog();
    Folder.prototype.View('folder_div');
    $('media_list').innerHTML = MSG_ADD_FOLDER;
  },
  InsertMediaDialog: function(media_id,params){
    if( params===undefined ){
      params = {height:300};
    }
    var data = {folders:Folder.prototype.folders,media_id:media_id};
    var html = TrimPath.processDOMTemplate("textarea_folder_insert_dialog",data);
    MediaWagon.prototype.CreateSimpleDialog(html,params);
  },
  InsertMedia: function(media_id){
    var folder_id = $A(document.insert_folder_form.folders).find(function(element){return element.selected;}).value;
    if( folder_id===undefined || media_id===undefined ){
      alert(MSG_NOT_SPECIFIED_FOLDER_OR_MEDIA);
      return;
    }
    MediaWagon.prototype.AjaxRequest('GET','/api/insert_folder','folder_id='+folder_id+'&media_id='+media_id,MediaWagon.prototype.CloseDialog,{});
  },
  RemoveMediaDialog: function(){
    var elements = document.getElementsByClassName('hi');
    if( elements.length<=0 ){
      alert(MSG_CHOOSE_ANY_ITEM);
      return;
    }
    var hash_medias = Util.prototype.Array2Hash(Manage.prototype.medias);
    for(var i=0;i<elements.length;i++){
      if( hash_medias[elements[i].id] ){
	Media.prototype.PushSelect('manage',elements[i].id,hash_medias[elements[i].id]);
      }
    }
    var data = {media:Media.prototype.selected_medias['manage']};
    var html = TrimPath.processDOMTemplate("textarea_folder_remove_media_dialog",data);
    MediaWagon.prototype.CreateSimpleDialog(html);
  },
  RemoveMedia: function(){
    // TODO(priority:low):ここは、かっこ悪い。
    var href = location.href;
    var folder_id = null;
    if( href.match(/.*#(.*):(.*)/i) ){
      folder_id = RegExp.$2;
    }
    if( !folder_id ){
      return;
    }
    var selected = Media.prototype.selected_medias['manage'];
    var media_ids = new Array();
    for(e in selected){
      media_ids.push(selected[e].id);
    }
    MediaWagon.prototype.AjaxRequest('GET','/api/remove_media','media_id='+media_ids.join(',')+'&folder_id='+folder_id,Folder.prototype.ReRender,{});
  },
  ReRender: function(json,params){
    if( params.msg!==undefined ){
      $(params.view_id).innerHTML = params.msg;
    }
    MediaWagon.prototype.CloseDialog();
    // TODO:Manage
//    Folder.prototype.View('folder_div');
    location.reload();
  },
  DeleteDialog: function(params){
    if( params===undefined ){ params = {}; }
    var href = location.href;
    var folder_id = null;
    if( href.match(/.*#(.*):(.*)/i) ){
      folder_id = RegExp.$2;
    }
    if( !folder_id ){
      return;
    }
    var data;
    for(var i=0;i<Folder.prototype.folders.length;i++){
      if( Folder.prototype.folders[i].id == folder_id ){
	data = Folder.prototype.folders[i];
	break;
      }
    }
    var html = TrimPath.processDOMTemplate("textarea_folder_delete_dialog",data);
    MediaWagon.prototype.CreateSimpleDialog(html,params);
  },
  Delete: function(){
    var href = location.href;
    var folder_id = null;
    if( href.match(/.*#(.*):(.*)/i) ){
      folder_id = RegExp.$2;
    }
    if( !folder_id ){
      return;
    }
    MediaWagon.prototype.AjaxRequest('GET','/api/delete_folder/'+folder_id,'',Folder.prototype.DeleteDone,{});
  },
  DeleteDone: function(json,params){
    Folder.prototype.View('folder_div');
    MediaWagon.prototype.CloseDialog();
    $('media_list').innerHTML = MSG_DELETE_FOLDER;
  }
}; /* }}} */

var Member = Class.create();
Member.prototype = new MediaWagon();
Member.prototype =
/* {{{ */
{
  initialize: function(id,info){},
  ViewGroup: function(p){
    var url = "/api/view_group";
    var pars = "start="+p;
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Member.prototype.ViewGroupRender,{view_id:"div_group",template:"textarea_view_group"});
  },
  ViewGroupRender: function(json,params){
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
// TODO:setClipboard(json);
    }
    var page = new Pager({link_url:'Member.prototype.ViewGroup',start:data.start,total:data.total,display_count:5,mode:'count_up'});
    page.previous_text_ = MSG_PREVIOUS;
    page.next_text_ = MSG_NEXT;
    data['pagenate'] = page.display();
    data['now'] = new Date().getTime();

    var html = TrimPath.processDOMTemplate(params.template,data);
    $(params.view_id).innerHTML = html;
  },
  AddGroup: function(){
    var str = $F(document.add_group_form.group_name).strip();
    if( str.length<=0 ){
      alert(MSG_EMPTY_GROUP_NAME);
      return;
    }
    var group_name = encodeURIComponent(str);
    var url = "/api/add_group";
    var pars = "group_name="+group_name;
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Member.prototype.AddGroupDone,{});
  },
  AddGroupDone: function(json,params){
    Member.prototype.ViewGroup(0);
  },
  DeleteGroup: function(id){
    var result = confirm(MSG_CONFIRM_DELETE_DESCRIPTION);
    if( !result ){
      return;
    }
    var url = "/api/delete_group";
    var pars = "id="+id;
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Member.prototype.DeleteGroupDone,{});
  },
  DeleteGroupDone: function(json,params){
    Member.prototype.ViewGroup(0);
  }
}; /* }}} */

var Friend = Class.create();
Friend.prototype = new MediaWagon();
Friend.prototype =
/* {{{ */
{
  friends:[],
  initialize: function(id,info){},
  View: function(p){
    var url = "/api/view_friend";
    var pars = "start="+p;
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Friend.prototype.ViewRender,{view_id:"div_friend",template:"textarea_friend_display"});
  },
  ViewRender: function(json,params){
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
// TODO:setClipboard(json);
    }
    if( data.total>0 ){
      Friend.prototype.friends = Util.prototype.Array2Hash(data.friends);
      var page = new Pager({link_url:'Friend.prototype.View',start:data.start,total:data.total,display_count:5,mode:'count_up'});
      page.previous_text_ = MSG_PREVIOUS;
      page.next_text_ = MSG_NEXT;
      data['pagenate'] = page.display();
    }else{
      data['pagenate'] = "";
    }
    var html = TrimPath.processDOMTemplate(params.template,data);
    $(params.view_id).innerHTML = html;
  },
  EditDialog: function(id){
    var data = {friend:Friend.prototype.friends[id]};
    var html = TrimPath.processDOMTemplate("textarea_friend_edit",data);
    MediaWagon.prototype.CreateSimpleDialog(html,{height:200});
  },
  Edit: function(){
    var id = $F(document.edit_friend_form.id);
    var visible_mode = $A(document.edit_friend_form.visible_mode).find(function(element){return element.checked;}).value;
    var visible_group = $F(document.edit_friend_form.visible_group);
    if( id===undefined || visible_mode===undefined || visible_group===undefined ){
      alert(MSG_SYSTEM_ERROR);
      return;
    }

    var url = "/api/edit_friend/"+id;
    var pars = "visible_mode="+visible_mode+"&visible_group="+visible_group;
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Friend.prototype.EditDone,{});
  },
  EditDone: function(json,params){
    MediaWagon.prototype.CloseDialog();
    Friend.prototype.View(0);
  },
  Find: function(){
    var friend_name = $F(document.find_user_form.friend_name).strip();
    if( friend_name.length<=0 ){
      alert(MSG_EMPTY_LOGIN_NAME_OR_EMAIL);
      return;
    }
    var url = "/api/find_user";
    var pars = "friend_name="+friend_name;
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Friend.prototype.FindRender,{friend_name:friend_name,view_id:"find_user_result",template:"textarea_find_friend"});
  },
  FindRender: function(json,params){
//alert(json);
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
      setClipboard(json);
    }
    var friend_name = params.friend_name;
    if( friend_name.indexOf('@')!=-1 ){
      data['link_option'] = '?email='+friend_name;
    }else{
      data['link_option'] = '';
    }
    var html = TrimPath.processDOMTemplate(params.template,data);
    $(params.view_id).innerHTML = html;
  }
}; /* }}} */

var Moblog = Class.create();
Moblog.prototype = new MediaWagon();
Moblog.prototype =
/* {{{ */
{
  id: null,
  moblog_configs: {},
  hash_moblog_configs: {},
  groups: null,
  new_moblog_email: null,
  initialize: function(id,info){},
  View: function(){
    var url = '/api/view_moblog_config';
    var pars = '';
    var params = {
      main:{
	view_id:"moblog_master_config",
	template:"textarea_view_moblog"
      },
      sub:{
	view_id:"moblog_sub_config",
	template:"textarea_view_moblog"
      }
    };
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Moblog.prototype.ViewRender,params);
  },
  ViewRender: function(json,params){
//var_dump(params);
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
      //setClipboard(json);
    }
    Moblog.prototype.moblog_configs = data.moblog_configs;
    Moblog.prototype.hash_moblog_configs = Util.prototype.Array2Hash(data.moblog_configs);
    Moblog.prototype.groups = data.groups;
    Moblog.prototype.new_moblog_email = data.new_moblog_email;
    var main = {
    mode: "main",
    moblog_configs: [Moblog.prototype.moblog_configs[0]],
    groups: Moblog.prototype.groups,
    new_moblog_email: data.new_moblog_email
    };

    var html = TrimPath.processDOMTemplate(params.main.template,main);
    $(params.main.view_id).innerHTML = html;

    var sub = {
    mode: "sub",
    moblog_configs: Moblog.prototype.moblog_configs,
    groups: Moblog.prototype.groups,
    new_moblog_email: data.new_moblog_email
    };

    html = TrimPath.processDOMTemplate(params.sub.template,sub);
    $(params.sub.view_id).innerHTML = html;
  },
  AddDialog: function(){
    var data = {
      moblog_config:{
	mobile_email: Moblog.prototype.new_moblog_email,
	visible_mode: MEDIA_VISIBLE_PUBLIC,
	comment_mode: MEDIA_COMMENT_PUBLIC,
	trackback_mode: MEDIA_TRACKBACK_PUBLIC
      },
      groups: Moblog.prototype.groups
    };
    var html = TrimPath.processDOMTemplate("textarea_edit_moblog",data);
    MediaWagon.prototype.CreateSimpleDialog(html);
  },
  Add: function(){
    var form = document.moblog_config_form;
    var id;
    try{
    id= $F(form['id']);
    }catch(e){
      id = '';
    }
    var visible_mode = $A(form["media/visible_mode"]).find(function(element){return element.checked;}).value;
    var comment_mode = $A(form["media/comment_mode"]).find(function(element){return element.checked;}).value;
    var trackback_mode = $A(form["media/trackback_mode"]).find(function(element){return element.checked;}).value;
    var tags = $F(form["media/tags"]);
    var mobile_email = $F(form.mobile_email);
    var visible_group = $F(form["media/visible_group"]);

    var url = "/api/edit_moblog_config/"+id;
    var pars = "visible_mode="+visible_mode+"&visible_group="+visible_group+"&comment_mode="+comment_mode+"&trackback_mode="+trackback_mode+"&tags="+encodeURIComponent(tags)+"&mobile_email="+mobile_email;
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Moblog.prototype.AddDone,{});
  },
  AddDone: function(json,params){
    MediaWagon.prototype.CloseDialog();
    Moblog.prototype.View();
  },
  EditDialog: function(id){
//var_dump(Moblog.prototype.hash_moblog_configs[id]);
    var data = {
    moblog_config:Moblog.prototype.hash_moblog_configs[id],
    groups:Moblog.prototype.groups
    };
    var html = TrimPath.processDOMTemplate("textarea_edit_moblog",data);
    MediaWagon.prototype.CreateSimpleDialog(html,{height:320});
    var moblog_watcher = new Watcher('moblog',{form:document.moblog_config_form,visibles:"media/visible_mode"});


  },
  Remove: function(id){
    var res = confirm(MSG_CONFIRM_DELETE_DESCRIPTION);
    if( !res ){
      return;
    }
    var url = '/api/remove_moblog_config/'+id;
    var pars = '';
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Moblog.prototype.AddDone,{});
  }
}; /* }}} */

var Favorite = Class.create();
Favorite.prototype = new MediaWagon();
Favorite.prototype =
/* {{{ */
{
  initialize: function(id,info){},
  AddDialog: function(id){

  },
  View: function(id){
    var url = '/api/find_favorite/'+id;
    var pars = '';
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Favorite.prototype.ViewRender,{id:id});
  },
  ViewRender: function(json,params){
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
// TODO:setClipboard(json);
    }
    Favorite.prototype.Toggle(params.id,favorite);
  },
  Toggle: function(id,sw){
    var favorite_div = $('addFavoriteDiv');
    if( sw ){
      favorite_div.innerHTML = MSG_DELETE_MEDIA_FROM_FAVORITE;
      favorite_div.href = "javascript:Favorite.prototype.DeleteDialog('"+id+"');";
    }else{
      favorite_div.innerHTML = MSG_ADD_MEDIA_INTO_FAVORITE;
      favorite_div.href = "javascript:Favorite.prototype.AddDialog('"+id+"');";
    }
  },
  AddDialog: function(id){
    var data = { media_id:id };
    var html = TrimPath.processDOMTemplate("textarea_favorite_add_dialog",data);
    if( $('movie') ){
      $('movie').style.display = 'none';
    }
    MediaWagon.prototype.CreateSimpleDialog(html);
  },
  Add: function(){
    if( $('movie') ){
      $('movie').style.display = 'block';
    }
    var form = document.edit_favorite_form;
    var media_id = $F(form.media_id);
    var media_type = $F(form.media_type);
    var visible_mode = $A(form.visible_mode).find(function(element){return element.checked;}).value;
    var visible_group = $F(form.visible_group);

    var url = "/api/add_favorite/"+media_id;
    var pars = "media_type="+media_type+"&visible_mode="+visible_mode+"&visible_group="+visible_group;
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Favorite.prototype.AddDone,{media_id:media_id,sw:1});
    MediaWagon.prototype.CloseDialog();
  },
  AddDone: function(json,params){
    Favorite.prototype.Toggle(params.media_id,params.sw);
  },
  DeleteDialog: function(id){
    if( id===undefined ){ // form manage
      var elements = document.getElementsByClassName('hi');
      var ids = new Array();
      for( var i=0;i<elements.length;i++ ){
	ids.push(elements[i].id);
      }
      id = ids.join(',');
    }
    var data = {media_id:id};
    if( id.length>0 ){
      var html = TrimPath.processDOMTemplate("textarea_favorite_delete_dialog",data);
      MediaWagon.prototype.CreateSimpleDialog(html);
    }else{
      alert(MSG_CHOOSE_ANY_ITEM);
    }
  },
  Delete: function(id){
    var url = "/api/delete_favorite/"+id;
    var pars = "";
    MediaWagon.prototype.AjaxRequest('GET',url,pars,Favorite.prototype.DeleteDone,{media_id:id,sw:0});
  },
  DeleteDone: function(json,params){
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
// TODO:setClipboard(json);
    }
    if( status=='success' ){
      Favorite.prototype.Toggle(params.media_id,params.sw);
    }
  }
}; /* }}} */

var User = Class.create();
User.prototype = new MediaWagon();
User.prototype =
{
  initialize: function(){},
  ChangePasswordDialog: function(){
    var html = TrimPath.processDOMTemplate("textarea_change_password",{});
    MediaWagon.prototype.CreateSimpleDialog(html,{height:250});
  },
  ChangePassword: function(){
    var old_password = $F(document.change_password_form.old_password);
    var new_password = $F(document.change_password_form.new_password);
    var new_password_confirm = $F(document.change_password_form.new_password_confirm);

//alert("old_password="+old_password+",new_password="+new_password+"new_password_confirm="+new_password_confirm);
    if( !old_password&&!new_password || !new_password_confirm ){
      alert(MSG_TYPE_PASSWORD);
      return;
    }
    if( new_password != new_password_confirm ){
      alert(MSG_NOT_MATCHED_PASSWORD);
      return;
    }
    var pars = 'old_password='+old_password+'&new_password='+new_password+'&new_password_confirm='+new_password_confirm;
    MediaWagon.prototype.AjaxRequest('GET','/api/change_password',pars,User.prototype.ChangePasswordDone,{});
  },
  ChangePasswordDone: function(json,params){
    MediaWagon.prototype.CloseDialog();
    try{
      eval(json);
    }catch(e){
      alert(e+"\n"+json);
//    setClipboard(json);
    }
    alert(message);
  }
};


var Util = Class.create();
Util.prototype =
/* {{{ */
{
  Array2Hash: function(ary,key_name){
    if( key_name==undefined ){ key_name = "id"; }
    var hash = {};
    for(var i=0;i<ary.length;i++){
      hash[ary[i].id] = ary[i];
    }
    return hash;
  },
  ParseUrl: function(url){
    var scheme,host,path,query,fragment;
    if( url.match(/([a-z]+):\/\/([^\/]+)(\/[^?&#]*)([?&]?[^#]*)(#?.*)/) ){
      scheme = RegExp.$1;
      host = RegExp.$2;
      path = RegExp.$3;
      query = RegExp.$4;
      fragment = RegExp.$5;
      return {scheme:scheme,host:host,path:path,query:query,fragment:fragment};
    }else{
      alert("[System Error]fail to ParseUrl: "+url);
    }
  },
  SetClipboard: function(str){
    if( window.clipboardData ){ // IE
      window.clipboardData.setData("text",str);
    }else{ // FF
      var url = [
	'data:text/html;charset=utf-8;base64,PGJvZHk+PC9ib2',
	'R5PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKGZ1',
	'bmN0aW9uKGVuY29kZWQpe3ZhciBzd2ZfZGF0YSA9IFsKICdkYX',
	'RhOmFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoO2Jhc2U2',
	'NCxRMWRUQjJ3JywKICdBQUFCNG5EUGdZbGpBd01qSTRNejAlMk',
	'YlMkY5JTJGZTJaZkJnYUdhV3dNRE1uNUthJywKICdrTU10TjRH',
	'ZGdaZ1NJTXdaWEZKYW01UUFFJTJCQm9iaTFCTG5uTXlDcFB6RW',
	'9oU0dJJywKICdQRnAlMkZBeHNEREJRa3BGWkRGUUZGQ2d1eVM4',
	'QXlqSTRBRVVCaXkwVndBJTNEJTNEJwpdLmpvaW4oIiIpOwpkb2',
	'N1bWVudC5ib2R5LmlubmVySFRNTCA9IFsKICc8ZW1iZWQgc3Jj',
	'PSInLHN3Zl9kYXRhLCciICcsCiAnRmxhc2hWYXJzPSJjb2RlPS',
	'csZW5jb2RlZCwnIj4nLAogJzwvZW1iZWQ+JwpdLmpvaW4oIiIp',
	'Owp9KSgi',
	base64encode( encodeURIComponent(str) + '")</'+'script>')
      ].join("");
      var tmp = document.createElement("div");
      tmp.innerHTML = [
	'<iframe src="',url,'"'
	,' width="0" height="0">'
	,'</iframe>'
      ].join("");
      with(tmp.style){
	position ="absolute";
       left = "-10px";
       top  = "-10px";
       visibility = "hidden";
      };
      document.body.appendChild(tmp);
      setTimeout(function(){document.body.removeChild(tmp)},1000);
    }
  }
}; /* }}} */





