var fjTAB = {
  agent_path: "http://fjbears.web.infoseek.co.jp/cgi-bin/tabajx.cgi"
  //agent_path: "http://127.0.0.1/cgi-bin/tabajx2.cgi"
};

fjTAB.SiteManager = Class.create({
  initialize: function(_menu) {
    this.xmluri = fjTAB.agent_path;
    this.event_div = "events";
    this.menu = _menu;
    this.cur_lang = "ja";
    this.cur_page = 1;
    this.ajax_item = null;
    this.ajax_running = false;
    this.loadingEffect = null;
  },
  callajax: function(item, page) {
    var pxurl = this.xmluri + "?cid=" + item.tabid + "&lang=" + this.cur_lang + "&page=" + page;
    this.ajax_running = true;
    this.ajax_item = item;
    this.cur_page = page;

    fjTAB.ajx.openLoadingMessage();
    new Ajax.Updater(this.event_div, pxurl, { 
      method: 'get', onSuccess: fjTAB.ajx.onSuccess, 
      onComplete: fjTAB.ajx.onComplete,
      onException: fjTAB.ajx.onException
    });

    /* IEでは、ブロックされているようでここの部分はonComplete以降に流れてくるので注意 */
    /* FireFox他は、ブロックされずに通過 */
  },
  browse: function(page) {
    this.callajax(this.ajax_item, page);
  }
});

fjTAB.Menu = Class.create({
  initialize: function(_menuitems, _divc, _classname) {
    this.itemset = _menuitems;
    this.divc = _divc;
    this.classname = _classname;
    this.cur_item = this.itemset[0];
    
    var me = this;
    this.itemset.each(function(item) {
      item.menu = me;
    });
  },
  draw: function() {
    var target = $(this.divc);
    var cname = this.classname;
    target.update('');
    this.itemset.each(function(item) {
      item.draw(target, cname);
    });
  },
  setAction: function(_actions) {
    this.itemset.each(function(item) {
      item.setAction(_actions);
    });
  },
  getActive: function() {
    return this.cur_item;
  },
  setActive: function(item) {
    this.cur_item = item;
  },
  getItem: function() {
    var m;
    if ((m = this.cur_item.submenu) != null) {
      return(m.getItem());
    }
    return(this.cur_item);
  },
  foreach_i: function(func) {
    this.itemset.each(function(item) {
      func(item);
    });
  }
});

fjTAB.MenuItem = Class.create({
  initialize: function(_id, _jname, _ename, _tabid) {
    this.mid = _id;
    this.jname = _jname;
    this.ename = _ename;
    this.tabid = _tabid;
    this.submenu = null;
    this.actions = null;
    this.divelm = null;
    this.menu = null;
  },
  setSubMenu: function(_submenu) {
    this.submenu = _submenu;
  },
  setAction: function(_actions) {
    this.actions = _actions;
  },
  isActive: function() {
    return (this == this.menu.getActive())
  },
  exec: function() {
    /*alert("is action=" + $A(arguments).inspect());*/
    if ((callback = arguments[0]) != null) {
      callback(this);
    }
  },
  select: function() {
    if (this.menu != null) {
      this.menu.setActive(this);
    }
  },
  draw: function(target, classname) {
    var element = $(document.createElement('div'));
    element.update(this.getname());
    element.addClassName(classname);
    element.id =  this.mid;
    
    if (this.actions != null) {
      var me = this;
      if (this.actions != null) {
        this.actions.each(function(e) {
          element.observe(e.key, me.exec.bind(me, e.value));
        });
      }
    }
    target.appendChild(element);
    this.divelm = element;
  },
  getname: function() {
    return((fjTAB.Site.cur_lang == 'ja')?(this.jname):(this.ename));
  }
});

fjTAB.Genre1 = new fjTAB.MenuItem('t101', 'テーマ', 'THEMA', 'event_thema');
fjTAB.SubMenu1 = new fjTAB.Menu([
    new fjTAB.MenuItem('g101', '最も人気', 'Popular', 'event_mostpopular'),
    new fjTAB.MenuItem('g102', 'スタート間近', 'Coming Soon', 'event_comingsoon'),
    new fjTAB.MenuItem('g103', 'オープニング', 'Opening', 'event_opening'),
    new fjTAB.MenuItem('g104', 'ついに開始', 'Just started', 'event_juststarted'),
    new fjTAB.MenuItem('g105', 'もうすぐ終了', 'Lastdays', 'event_lastdays'),
    new fjTAB.MenuItem('g106', 'ファミリー向け', 'Kids', 'event_kids'),
    //new fjTAB.MenuItem('g107', '入場無料', 'Free', 'event_free'),
    //new fjTAB.MenuItem('g108', '遅くまで開館', 'Open late', 'event_openlate'),
    new fjTAB.MenuItem('g109', '常設展', 'Permanent', 'event_permanent')
  ],
  'itemblock', 'subitem');
fjTAB.Genre1.setSubMenu(fjTAB.SubMenu1);

fjTAB.Genre2 = new fjTAB.MenuItem('t102', '2D', '2D', 'event_2d');
fjTAB.SubMenu2 = new fjTAB.Menu([
    new fjTAB.MenuItem('g201', '書道', 'Calligraphy', 'event_type_print_calligraphy'),
    new fjTAB.MenuItem('g202', 'イラスト', 'llustration', 'event_type_print_illustration'),
    new fjTAB.MenuItem('g203', 'デッサン', 'Drawing' ,'event_type_print_drawing'),
    new fjTAB.MenuItem('g204', 'グラフィックス', 'Graphicdesign' ,'event_type_print_graphicdesign'),
    new fjTAB.MenuItem('g205', '絵画', 'Painting' ,'event_type_print_painting'),
    new fjTAB.MenuItem('g206', '写真', 'Photo' ,'event_type_print_photo'),
    new fjTAB.MenuItem('g207', '版画', 'Prints' ,'event_type_print_prints'),
    new fjTAB.MenuItem('g208', 'その他', 'Other', 'event_type_print_other')
  ],
  'itemblock', 'subitem');
fjTAB.Genre2.setSubMenu(fjTAB.SubMenu2);

fjTAB.Genre3 = new fjTAB.MenuItem('t103', '3D', '3D', 'event_3d');
fjTAB.SubMenu3 = new fjTAB.Menu([
    new fjTAB.MenuItem('g301', '建築', 'Architecture', 'event_type_3D_architecture'),
    new fjTAB.MenuItem('g302', '彫刻・立体', 'Sculpture', 'event_type_3D_sculpture'),
    new fjTAB.MenuItem('g303', '工芸品', 'Crafts', 'event_type_3D_crafts'),
    new fjTAB.MenuItem('g304', 'ファッション', 'Fashion', 'event_type_3D_fashion'),
    new fjTAB.MenuItem('g305', '家具', 'Furniture', 'event_type_3D_furniture'),
    new fjTAB.MenuItem('g306', 'インスタレーション', 'Installation', 'event_type_3D_installation'),
    new fjTAB.MenuItem('g307', 'プロダクト', 'Productdesign', 'event_type_3D_productdesign'),
    new fjTAB.MenuItem('g308', '陶芸', 'Ceramics', 'event_type_3D_ceramics'),
    new fjTAB.MenuItem('g309', 'その他', 'Other', 'event_type_3D_other')
  ],
  'itemblock', 'subitem');
fjTAB.Genre3.setSubMenu(fjTAB.SubMenu3);

fjTAB.Genre4 = new fjTAB.MenuItem('t104', 'エリア', 'AREA', 'event_area');
fjTAB.SubMenu4 = new fjTAB.Menu([
    new fjTAB.MenuItem('g401', '銀座・新橋', 'Ginza', 'event_area_ginza_marunouchi'),
    new fjTAB.MenuItem('g402', '上野', 'Ueno', 'event_area_ueno_yanaka'),
    new fjTAB.MenuItem('g403', '清澄・お台場', 'Odaiba', 'event_area_koto_odaiba'),
    new fjTAB.MenuItem('g404', '日本橋・九段下', 'Nihonbashi', 'event_area_nihonbashi'),
    new fjTAB.MenuItem('g405', '表参道・青山', 'Aoyama', 'event_area_aoyama_omotesando'),
    new fjTAB.MenuItem('g406', '新宿', 'Shinjuku', 'event_area_shinjuku'),
    new fjTAB.MenuItem('g407', '渋谷・世田谷', 'Shibuya', 'event_area_shibuya_setagaya'),
    new fjTAB.MenuItem('g408', '六本木・赤坂', 'Akasaka', 'event_area_akasaka_roppongi'),
    new fjTAB.MenuItem('g409', '中目黒・恵比寿', 'Ebisu', 'event_area_ebisu_nakame_daikan'),
    new fjTAB.MenuItem('g410', '武蔵野・多摩', 'Tama', 'event_area_musashino_tama'),
    new fjTAB.MenuItem('g412', '横浜・神奈川', 'Kanagawa', 'event_area_kanagawa'),
    new fjTAB.MenuItem('g413', 'その他関東', 'Other', 'event_area_other')
  ],
  'itemblock', 'subitem');
fjTAB.Genre4.setSubMenu(fjTAB.SubMenu4);

fjTAB.mmAction = $H({
  mouseover: function(item) {
    if (!item.isActive()) { item.divelm.addClassName('mouseover_mitem'); }
  },
  mouseout: function(item) {
    if (!item.isActive()) { item.divelm.removeClassName('mouseover_mitem'); }
  },
  click: function(item) {
    if (!fjTAB.Site.ajax_running && !item.isActive()) {
      var citem = item.menu.getActive();
      if (citem != null) { citem.divelm.removeClassName('highlight_mitem'); }
      item.select();
      item.divelm.removeClassName('mouseover_mitem');
      item.divelm.addClassName('highlight_mitem');
      item.submenu.draw();
    }
  }
});

fjTAB.smAction = $H({
  mouseover: function(item) {
    if (!item.isActive()) { item.divelm.addClassName('mouseover_sitem'); }
  },
  mouseout: function(item) {
    if (!item.isActive()) { item.divelm.removeClassName('mouseover_sitem'); }
  },
  click: function(item) {
    if (!fjTAB.Site.ajax_running) {
      var citem = item.menu.getActive();
      if (citem) { citem.divelm.removeClassName('highlight_sitem'); }
      item.select();
      item.divelm.removeClassName('mouseover_sitem');
      item.divelm.addClassName('highlight_sitem');
      fjTAB.Site.callajax(item, 1);
    }
  }
});

fjTAB.Genre = [fjTAB.Genre1, fjTAB.Genre2, fjTAB.Genre3, fjTAB.Genre4];
fjTAB.SubMenu = [fjTAB.SubMenu1, fjTAB.SubMenu2, fjTAB.SubMenu3, fjTAB.SubMenu4];
fjTAB.MainMenu = new fjTAB.Menu(fjTAB.Genre, 'mainblock', 'mainmenu');
fjTAB.MainMenu.setAction(fjTAB.mmAction);

fjTAB.SubMenu.each(function(m) {
  m.setAction(fjTAB.smAction);
});

fjTAB.Site = new fjTAB.SiteManager(fjTAB.MainMenu);

/* for navigation menu */
fjTAB.Navi1 = new fjTAB.MenuItem('n101', 'TAB', 'TAB', 'TABHOME');
fjTAB.Navi2 = new fjTAB.MenuItem('n102', 'English', 'Japanese', 'LANG');
fjTAB.Navi3 = new fjTAB.MenuItem('n103', 'NEW YORK', 'NEW YORK', 'NEWYORK');
fjTAB.Navi4 = new fjTAB.MenuItem('n104', 'MY WORK', 'MY WORK', 'TOPPAGE');
fjTAB.NaviMenu = new fjTAB.Menu([fjTAB.Navi1, fjTAB.Navi2, fjTAB.Navi3, fjTAB.Navi4], 'naviblock', 'mainmenu');

fjTAB.nmAction = $H({
  mouseover: function(item) {
    item.divelm.addClassName('mouseover_navi');
  },
  mouseout: function(item) {
    item.divelm.removeClassName('mouseover_navi');
  },
  click: function(item) {
    item.select();
    switch(item.tabid) {
      case 'TABHOME':
        location.href = (fjTAB.Site.cur_lang == 'en')?("http://www.tokyoartbeat.com/index.en"):("http://www.tokyoartbeat.com/");
        break;
      case 'LANG':
        location.href = (fjTAB.Site.cur_lang == 'en')?("/tab/ja/"):("/tab/en/");
        break;
      case 'NEWYORK':
        location.href = "/tab/ny/";
        break;
      case 'TOPPAGE':
        location.href = "/";
        break;
    }
  }
});

fjTAB.ajx  = {
  onSuccess: function oncsuccess(req) {
    fjTAB.Site.ajax_running = false;
  },
  onException: function oncerror(req) {
    fjTAB.ajx.closeLoadingMessage();
    fjTAB.Site.ajax_running = false;
    alert("Error: reload page and restart, please.");
  },
  onComplete: function onctest(req) {
    var bt = null;
    if ((bt = $('brtarget')) != null) {
      bt.innerHTML = fjTAB.Site.ajax_item.getname();
    }
    fjTAB.setEventImageAction();
    fjTAB.setEventVnameAction();
    fjTAB.setBrowseButtonAction();
    fjTAB.Site.ajax_running = false;
    fjTAB.ajx.closeLoadingMessage();
  },
  closeLoadingMessage: function() {
    if (fjTAB.Site.loadingEffect) {
      fjTAB.Site.loadingEffect.cancel();
      fjTAB.Site.loadingEffect = null;
    }
    /* Fadeした後は、hiddenにしてmouseoverイベントを拾われてしまうのを防ぐ */
    new Effect.Fade('loadingmsg', {duration: 0.25, afterFinishInternal: function(){ $('loadingmsg').style.visibility = 'hidden';}});
  },
  openLoadingMessage: function() {
    var point = document.documentElement.scrollTop || document.body.scrollTop;
    if (point > 10) {
      $('tabtitle').scrollTo();
    }
    $('loadingmsg').style.visibility = 'visible'; /* visibleにしないと、appearしても表示されない */
    this.loadingEffect = new Effect.Appear('loadingmsg', { duration:1.0, afterFinishInternal: function(){}});
  }
}

fjTAB.setEventImageAction = function() {
  var i = 0;
  while (imgobj = $('img' + (i += 1))) {
    imgobj.observe('mouseover', function(item, i) {
      item.addClassName('mouseover_image');
      $('price' + i).style.visibility = 'visible';
    }.bind(imgobj, imgobj, i));
    imgobj.observe('mouseout', function(item, i) {
      item.removeClassName('mouseover_image');
      $('price' + i).style.visibility = 'hidden';
    }.bind(imgobj, imgobj, i));
  }
}

fjTAB.setEventVnameAction = function() {
  var i = 0;
  while (vn = $('vname' + (i += 1))) {
    vn.observe('mouseover', function(item) {
      item.addClassName('mouseover_vname');
    }.bind(vn, vn));
    vn.observe('mouseout', function(item) {
      item.removeClassName('mouseover_vname');
    }.bind(vn, vn));
  }
}

fjTAB.setBrowseButtonAction = function() {
  var i = 0;
  while (pgobj = $('page' + (i += 1))) {
    pgobj.observe('mouseover', function(item, pn) {
      if (pn != fjTAB.Site.cur_page) { item.addClassName('mouseover_pitem'); }
    }.bind(pgobj, pgobj, i));
    pgobj.observe('mouseout', function(item, pn) {
      if (pn != fjTAB.Site.cur_page) { item.removeClassName('mouseover_pitem'); }
    }.bind(pgobj, pgobj, i));
    pgobj.observe('click', function(item, pn) {
      if (!fjTAB.Site.ajax_running) {
        fjTAB.Site.browse(pn);
      }
    }.bind(pgobj, pgobj, i));
  }
}

fjTAB.NaviMenu.setAction(fjTAB.nmAction);

function siteStart(lang) {
  var bt = null;
  $('loadingmsg').hide();

  fjTAB.Site.cur_lang = lang;
  fjTAB.MainMenu.draw();
  fjTAB.NaviMenu.draw();
  fjTAB.SubMenu1.draw();

  fjTAB.MainMenu.getActive().divelm.addClassName('highlight_mitem');
  fjTAB.MainMenu.getItem().divelm.addClassName('highlight_sitem');
  if ((bt = $('brtarget')) != null) {
    bt.innerHTML = fjTAB.MainMenu.getItem().getname();
  }
  fjTAB.setEventImageAction();
  fjTAB.setEventVnameAction();
  fjTAB.setBrowseButtonAction();
  fjTAB.Site.ajax_item = fjTAB.MainMenu.getItem();
}
