
  
  jQuery.noConflict();
  
  var searching = false;
  var searchedArtistName = '';
  var topRankCountryMap = {'UK' : 'uk', 'USA' : 'us', 'JPN' : 'jp'};
  var topRankDispMap = {'CLOSE' : '0', 'HIDE' : '1', 'SHOW' : '2'};
  var topRankAmazonNodeMap = {'uk' : '229816', 'us' : '5174', 'jp' : '561956'};
  var topRankItmsCountryMap = {'uk' : 'gb', 'us' : 'us', 'jp' : 'jp'};
  var threadId;
  var loadingCnt = 0;

  var myMooFlowPage = {
  
        start: function(){
            var div = new Element('div').inject($('album'), 'top');
            var mf = new MooFlow(div, {
                startIndex: 3,
                bgColor: '#080808',
                offsetY: 40,
                useCaption: true,
                useMouseWheel: true,
                useKeyInput: true,
                useViewer: true,
                onEmptyinit: function(){
                    openNowLoading();
                    this.loadJSON('/pipe/lastfm2/artist/album/art.php?artistName=' + encodeURIPlusX(encodeURIPlusX($("artistName").value)) + '&power=' + ($("power").checked ? '1' : '0'));
                },
                onClickView: function(obj){
                    var a = new Element('a',{
                        'class':'remooz-element',
                        'href':obj.href,
                        'title':'<div class="links"><a href="' + obj.alt + '" target="lastfm">last.fm</a></div>' 
                                + '<div class="links"><a href="/pipe/amazon/20090331/?artistName=' +  encodeURIPlusX(searchedArtistName) + '&albumTitle=' + encodeURIPlusX(obj.title) + '" target="amazon">Amazon</a></div>' 
                                + '<div class="links"><a href="/pipe/itms/view/?artistName=' +  encodeURIPlusX(encodeURIPlusX(searchedArtistName)) + '&albumTitle=' + encodeURIPlusX(encodeURIPlusX(obj.title)) + '" target="itunes">iTunes</a></div>',
                        'styles':{'border':'none'}
                    });
                    var img = new Element('img',{
                        'src':obj.src,
                        'title':obj.title,
                        'alt':obj.alt,
                        'styles':obj.coords
                    }).setStyles({
                        'position':'absolute',
                        'border':'none'
                    }).inject(a);
                    a.inject(document.body);
                    var remooz = new ReMooz(a, {
                        centered: true,
                        resizeFactor: 0.8,
                        origin: img,
                        onCloseEnd: function(){
                            a.destroy();
                            delete remooz;
                        }
                    }).open();
                },
                onRequest: function() {
                  closeNowLoading();
                },
                onStart: function() {
                }
            });
        }
  };
    
  jQuery(function(){ 
    initialize();
    jQuery("#search").click(function() {
      ajaxSearch();
    });
    jQuery("#clear").click(function() {
      window.location.reload();
    });
    jQuery("#artistName").keypress(function(e) {
      if (e.keyCode == 13) {
        ajaxSearch();
      } else {
        return true;
      }
    });
    jQuery("#header-tool").html('Ranking : ' + getRankConfig() + '<span id="help"><a href="help/" target="help">HELP</a></span>')
    .find(".rank-disp a").click(function() {
      var rankDialog = jQuery("#flow-rank").parent().parent();
      var existRankDialog = rankDialog.is(".ui-dialog");
      jQuery.cookie('rank-disp', topRankDispMap[jQuery(this).text()], {expires:14});
      if (jQuery(this).text() == 'CLOSE' || jQuery(this).text() == 'HIDE') {
        if (existRankDialog) {
          rankDialog.fadeOut();
        }
      } else if (jQuery(this).text() == 'SHOW') {
        if (existRankDialog) {
          rankDialog.fadeIn(function(){
            jQuery(this).css("filter", "alpha(opacity=95)");
          });
        } else {
          rankSearch();
        }
      }
    });
    if (jQuery.cookie('rank-disp') == null && jQuery.cookie('rank-country') == null) {
      firstTime();
    }
    if (jQuery.cookie('rank-disp') == null) {
      jQuery.cookie('rank-disp', topRankDispMap['SHOW'], {expires:14});
    }
    if (jQuery.cookie('rank-country') == null) {
      jQuery.cookie('rank-country', topRankCountryMap['JPN'], {expires:14});
    }
    if (jQuery.cookie('rank-disp') != topRankDispMap['CLOSE']) {
      rankSearch();
    }
    jQuery("#artist").append('<div class="logo-img"></div>');
  });
  
  // -------- Search ----------------
  var ajaxSearch = function() {
    if (searching) {
      return;
    }
    if (!validate()) {
      openLinks('<div class="message">アーティスト名を入力してください。</div>', 80, getWindowWidth() / 2);
      return;
    }
    searching = true;
    searchedArtistName = jQuery("#artistName").val();
    initialize();
    myMooFlowPage.start();
    jQuery.ajax({
      url : "/pipe/lastfm2/artist/similar/",
      dataType : "jsonp",
      data : {
        artistName : encodeURIPlusX(jQuery("#artistName").val()),
        callback : 'callback'
      },
      cache: false
    });
    jQuery.ajax({
      url : "/pipe/lastfm2/artist/",
      dataType : "jsonp",
      data : {
        artistName : encodeURIPlusX(jQuery("#artistName").val()),
        callback : 'callbackArtistInfo'
      },
      cache: false
    });
    jQuery.ajax({
      url : "/pipe/lastfm2/artist/track/",
      dataType : "jsonp",
      data : {
        artistName : encodeURIPlusX(jQuery("#artistName").val()),
        callback : 'callbackArtistTopTrack'
      },
      cache: false
    });
  }

  // -------- Search Result ----------------
  var callback = function(json) {
    if (json.lfm.error) {
      searching = false;
      if (getArt().responseText == '{"images":[]}') {
        closeNowLoading();
        jQuery("#artist").html('<div class="message">' + json.lfm.error + '</div>');
        jQuery("#album").html('<div class="message">' + json.lfm.error + '</div>');
      }
      return;
    }
    if (json.lfm.similarartists.length < 1) {
      searching = false;
      if (getArt().responseText == '{"images":[]}') {
        closeNowLoading();
        jQuery("#artist").html('<div class="message">' + json.lfm.error + '</div>');
        jQuery("#album").html('<div class="message">' + json.lfm.error + '</div>');
      }
      return;
    }
    var list = '<ul class="artist-list">';
    list += '<li class="title">Artists Recommended ( by ' + htmlEscape(jQuery("#artistName").val()) + ' Listener )</li>';
    var i = 1;
    jQuery.each(json.lfm.similarartists.artist, function(){
      list += '<li class="etr">';
      list += '<div class="artist-img"><img src="' + (this.image[2] == '' ? '/pipe/lastfm2/img/no_image_artist_20081128.png' : this.image[2]) + '" /><div class="rank">' + (i++) + '</div></div>';
      list += '<div class="artist-name">' + this.name + '</div>';
      list += '</li>';
    });
    list += '</ul>';
    jQuery("#similar-artist").append(list).show()
    .find(".etr").mouseover(function() {
      jQuery(this).addClass("result-mouseover");
    }).mouseout(function() {
      jQuery(this).removeClass("result-mouseover");
    }).click(function() {
      var nextArtistName = jQuery(this).find(".artist-name").text();
      jQuery("#artistName").val(nextArtistName);
      ajaxSearch();
    });
    
    var rankDialog = jQuery("#flow-rank").parent().parent();
    var existRankDialog = rankDialog.is(".ui-dialog");
    if (jQuery.cookie('rank-disp') == topRankDispMap['SHOW']) {
      if (existRankDialog) {
        rankDialog.animate({top: "26px", left: (getWindowWidth() / 2 + 410) + "px"}, "slow");
      }
    } else {
      if (existRankDialog) {
        rankDialog.fadeOut();
      }
    }
    searching = false;
  }
  
  var callbackArtistInfo = function(json) {
    if (json.lfm.error) {
      return;
    }
    // {"lfm":{"artist":""}}
    if (json.lfm.artist == '') {
      return;
    }
    var artist = '<div class="artist-img"></div>';
    artist += '<div class="artist-name">' + json.lfm.artist.name + '</div>';
    jQuery("#artist").append(artist).click(function(ev) {
      var nextArtistName = jQuery(this).children(".artist-name").text();
      var links = '<div class="links"><a href="javascript:artistSearch(\'' + allReplace(nextArtistName, "\'", "\\\'") + '\');" onclick="closeLinks();">' + nextArtistName + ' &gt; jemomo</a></div>';
      links += '<div class="links"><a href="' + json.lfm.artist.url + '" target="wikipedia" onclick="closeLinks();">' + nextArtistName + ' &gt; last.fm</a></div>';
      links += '<div class="links"><a href="/pipe/amazon/20090331/?artistName=' +  encodeURIPlusX(nextArtistName) + '" target="amazon">' + nextArtistName + ' &gt; Amazon</a></div>';
      links += '<div class="links"><a href="/pipe/itms/view/?artistName=' +  encodeURIPlusX(encodeURIPlusX(nextArtistName)) + '" target="itunes">' + nextArtistName + ' &gt; iTunes</a></div>';
      links += '<div class="links"><a href="http://ja.wikipedia.org/wiki/?search=' + encodeURIPlusX(nextArtistName) + '" target="wikipedia" onclick="closeLinks();">' + nextArtistName + ' &gt; wikipedia</a></div>';
      openLinks(links, ev.pageY, ev.pageX);
    }).children(".artist-img").css({backgroundImage: 'url(' + (json.lfm.artist.image[2] == '' ? '/pipe/lastfm2/img/no_image_artist_20081128.png' : json.lfm.artist.image[2]) + ')', 
      backgroundRepeat:'no-repeat', 
      backgroundPosition:'center center'});
  }
  
  var callbackArtistTopTrack = function(json) {
    if (json.lfm.error) {
      return;
    }
    // {"lfm":{"toptracks":""}}
    if (json.lfm.toptracks == '') {
      return;
    }
    var topTrack = '<div class="title">Popular Tracks</div>';
    var i = 1;
    jQuery.each(json.lfm.toptracks.track, function(){
      topTrack += '<div class="track"><span class="rank">' + (i<10 ? '&nbsp;' : '') + i++ + '.</span><span class="artist-name">' + this.artist.name + '</span><span class="track-name">' + this.name + '</span><span class="link-url">' + this.url + '</span></div>';
      topTrack += '<div class="playcount"><span class="bar">&nbsp;</span><span class="count">' + this.listeners + '</span></div>';
    });
    jQuery("#top-track").append(topTrack).show()
    .children(".track").click(function(ev) {
      var nextArtistName = jQuery(this).children(".artist-name").text();
      var nextTrackName = jQuery(this).children(".track-name").text();
      var nextLinkUrl = jQuery(this).children(".link-url").text();
      var links = '<div class="links"><a href="' + nextLinkUrl + '" target="lastfm" onclick="closeLinks();">' + nextTrackName + ' &gt; last.fm</a></div>';
      links += '<div class="links"><a href="/pipe/itms/view/?artistName=' +  encodeURIPlusX(encodeURIPlusX(nextArtistName)) + '&trackTitle=' + encodeURIPlusX(encodeURIPlusX(nextTrackName)) + '", target="itms" onclick="closeLinks();">' + nextTrackName + ' &gt; iTunes</a></div>';
      links += '<div class="links"><a href="http://www.youtube.com/results?search_query=' +  encodeURIPlusX(nextArtistName) + '+' + encodeURIPlusX(nextTrackName) + '", target="youtube" onclick="closeLinks();">' + nextTrackName + ' &gt; YouTube</a></div>';
      links += '<div class="links"><a href="javascript:similarTrackSearch(\'' + allReplace(nextArtistName, "\'", "\\\'") + '\', \'' + allReplace(nextTrackName, "\'", "\\\'") + '\', \'' + (ev.pageY + 20) + '\', \'' + (ev.pageX + 20) + '\');" onclick="closeLinks();">' + nextTrackName + ' &gt; Recommend</a></div>';
      openLinks(links, ev.pageY, ev.pageX);
    }).mouseover(function() {
      jQuery(this).addClass("track-mouseover");
    }).mouseout(function() {
      jQuery(this).removeClass("track-mouseover");
    });
    playCountBar();
  }
  
  // -------- Similar Track ----------------
  var similarTrackSearch = function(nextArtistName, nextTrackName, top, left) {
    jQuery.ajax({
      url : "/pipe/lastfm2/artist/track/similar/",
      dataType : "jsonp",
      data : {
        artistName : encodeURIPlusX(nextArtistName),
        trackName : encodeURIPlusX(nextTrackName),
        callback : 'callbackSimilarTrackInfo'
      },
      cache: false
    });
    jQuery("#flow-similar-track").html("").dialog({height:"1000px", width:"800px"})
    .parent().parent().fadeIn(function(){jQuery(this).css("filter", "alpha(opacity=95)");})
    .css({ top: top + "px", left: left + "px" }).focus()
    .find("#ui-dialog-title-flow-similar-track").empty().append('Tracks Recommended ( by ' + nextArtistName + ' / ' + nextTrackName + ' Listener ) ');
  }
  
  var callbackSimilarTrackInfo = function(json) {
    if (json.lfm.error) {
      return;
    }
    // '{"lfm":{"similartracks":[]}}'
    if (json.lfm.similartracks.length < 1) {
      jQuery("#flow-similar-track").html('<div class="message">No Result</div>');
      return;
    }
    var max = 50;
    var size = json.lfm.similartracks.track.length;
    var similarTrack = '';
    var i = 1;
    jQuery.each(json.lfm.similartracks.track, function(){
      if (i % 25 == 1) {
        similarTrack += '<span class="track-block">';
      }
      similarTrack += '<div class="track"><span class="rank">' + (i<10 ? '&nbsp;' : '') + i + '.</span><span class="artist-name">' + this.artist.name + '</span><span class="track-name">' + this.name + '</span><span class="link-url">' + this.url + '</span></div>';
      similarTrack += '<div class="match"><span class="bar">&nbsp;</span><span class="count">' + this.match + '</span></div>';
      if (i % 25 == 0 || max == i || size == i) {
        similarTrack += '</span>';
        if (max == i) {return false;} // break
      }
      i++;
    });
    jQuery("#flow-similar-track").append(similarTrack).children(".track-block").children(".track")
    .children(".artist-name").click(function(ev) {
      var nextArtistName = jQuery(this).text();
      var nextTrackName = jQuery(this).next(".track-name").text();
      var nextLinkUrl = jQuery(this).next(".link-url").text();
      var links = '<div class="links"><a href="javascript:artistSearch(\'' + allReplace(nextArtistName, "\'", "\\\'") + '\');" onclick="closeLinks();">' + nextArtistName + ' &gt; jemomo</a></div>';
      openLinks(links, ev.pageY, ev.pageX);
    }).mouseover(function() {
      jQuery(this).addClass("track-name-mouseover");
    }).mouseout(function() {
      jQuery(this).removeClass("track-name-mouseover");
    }).next(".track-name").click(function(ev) {
      var nextArtistName = jQuery(this).prev(".artist-name").text();
      var nextTrackName = jQuery(this).text();
      var nextLinkUrl = jQuery(this).next(".link-url").text();
      var links = '<div class="links"><a href="' + nextLinkUrl + '" target="lastfm" onclick="closeLinks();">' + nextTrackName + ' &gt; last.fm</a></div>';
      links += '<div class="links"><a href="/pipe/itms/view/?artistName=' +  encodeURIPlusX(encodeURIPlusX(nextArtistName)) + '&trackTitle=' + encodeURIPlusX(encodeURIPlusX(nextTrackName)) + '", target="itms" onclick="closeLinks();">' + nextTrackName + ' &gt; iTunes</a></div>';
      links += '<div class="links"><a href="http://www.youtube.com/results?search_query=' +  encodeURIPlusX(nextArtistName) + '+' + encodeURIPlusX(nextTrackName) + '", target="youtube" onclick="closeLinks();">' + nextTrackName + ' &gt; YouTube</a></div>';
      openLinks(links, ev.pageY, ev.pageX);
    }).mouseover(function() {
      jQuery(this).addClass("track-name-mouseover");
    }).mouseout(function() {
      jQuery(this).removeClass("track-name-mouseover");
    });
  }
  
  // -------- Top Rank ----------------
  var rankSearch = function() {
    jQuery.ajax({
      url : "/pipe/amazon/20090331/rank/salesrank/",
        dataType : "jsonp",
      data : {
        country : jQuery.cookie('rank-country'),
        browseNodeId : topRankAmazonNodeMap[jQuery.cookie('rank-country')],
        callback : 'callbackAmazonSalesRank'
      },
      cache: false
    });
    jQuery.ajax({
      url : "/pipe/all/json.php",
      dataType : "json",
      data: {
        url:"http://itunes.apple.com/" + topRankItmsCountryMap[jQuery.cookie('rank-country')] + "/rss/topalbums/limit=10/json"
      },
      success: function(json){callbackItmsRank(json);},
      cache: false
    });
    jQuery.ajax({
      url : "/pipe/all/json.php",
      dataType : "json",
      data: {
        url:"http://itunes.apple.com/" + topRankItmsCountryMap[jQuery.cookie('rank-country')] + "/rss/topsongs/limit=30/json"
      },
      success : function(json){callbackItmsTrackRank(json);},
      cache: false
    });
    var rankDialog = jQuery("#flow-rank").parent().parent();
    var existRankDialog = rankDialog.is(".ui-dialog");
    rankDialog.find("#flow-rank").children().text("").addClass("show");
    rankDialog.find("#rank-info").append(getRankCountry()).parent().dialog({height:'2236px', width:'800px', position:'center', resizable:false})
    .parent().parent().css("borderBottom", "1px solid #2c2c2c")
    .find("#ui-dialog-title-flow-rank").empty().append('Below is '+ getKey(topRankCountryMap, jQuery.cookie('rank-country')) + ' Ranking !')
    .parent().parent().find(".rank-country a").click(function() {
      jQuery.cookie('rank-country', topRankCountryMap[jQuery(this).text()], {expires:14});
      rankSearch();
    });
    if (!existRankDialog) {
      jQuery("#flow-rank").parent().parent().css({top:"415px", left:(getWindowWidth() / 2 - 401) + "px"});
    }
  }
  
  var callbackAmazonSalesRank = function(json) {
    var amazonRank = '<div class="title">Amazon Album Sales Rank</div>';
    var r = 1;
    jQuery.each(json.ItemSearchResponse.Items.Item, function(){
      amazonRank += '<div class="etr">';
      amazonRank += '<div class="album-img"><img src="' + (this.MediumImage == null ? '/pipe/lastfm2/img/cover_med_b_b_b_100.jpg' : this.MediumImage.URL) + '" /><div class="rank">' + r + '</div></div>';
      amazonRank += '<div class="info">';
      amazonRank += '<div class="artist-name">' + (this.ItemAttributes.Artist == undefined ? this.ItemAttributes.Actor : this.ItemAttributes.Artist) + '</div>';
      amazonRank += '<div class="album-name">' + this.ItemAttributes.Title + '</div>';
      amazonRank += '</div>';
      amazonRank += '</div>';
      r++;
    });
    jQuery("#amazon-rank").append(amazonRank)
    .children(".etr").mouseover(function() {
      jQuery(this).addClass("result-mouseover");
    }).mouseout(function() {
      jQuery(this).removeClass("result-mouseover");
    }).click(function(ev) {
      var nextArtistName = jQuery(this).find(".artist-name").text();
      var nextAlbumName = jQuery(this).find(".album-name").text();
      var links = '<div class="links"><a href="javascript:artistSearch(\'' + allReplace(nextArtistName, "\'", "\\\'") + '\');" onclick="closeLinks();">' + nextArtistName + ' &gt; jemomo</a></div>';
      links += '<div class="links"><a href="/pipe/amazon/20090331/?artistName=' +  nextArtistName + '&albumTitle=' + nextAlbumName + '", target="amazon" onclick="closeLinks();">' + nextArtistName + '&nbsp;-&nbsp;' + nextAlbumName + ' &gt; Amazon</a></div>';
      openLinks(links, ev.pageY, ev.pageX);
    });
  }
  
  var callbackItmsRank = function(json) {
    var r = 1;
    var itmsRank = '<div class="title">iTunes Album Sales Rank</div>';
    jQuery.each(json.feed.entry, function(){
      itmsRank += '<div class="etr">';
      itmsRank += '<div class="album-img"><img src="' + this['im:image'][2].label + '" /><div class="rank">' + r + '</div></div>';
      itmsRank += '<div class="info">';
      itmsRank += '<div class="artist-name">' + this['im:artist'].label + '</div>';
      itmsRank += '<div class="album-name">' + this['im:name'].label + '</div>';
      itmsRank += '</div>';
      itmsRank += '</div>';
      r++;
    });
    jQuery("#itms-rank").append(itmsRank)
    .children(".etr").mouseover(function() {
      jQuery(this).addClass("result-mouseover");
    }).mouseout(function() {
      jQuery(this).removeClass("result-mouseover");
    }).click(function(ev) {
      var nextArtistName = jQuery(this).find(".artist-name").text();
      var nextAlbumName = jQuery(this).find(".album-name").text();
      var links = '<div class="links"><a href="javascript:artistSearch(\'' + allReplace(nextArtistName, "\'", "\\\'") + '\');" onclick="closeLinks();">' + nextArtistName + ' &gt; jemomo</a></div>';
      links += '<div class="links"><a href="/pipe/itms/view/?artistName=' +  encodeURIPlusX(encodeURIPlusX(nextArtistName)) + '&albumTitle=' + encodeURIPlusX(encodeURIPlusX(nextAlbumName)) + '", target="itms" onclick="closeLinks();">' + nextArtistName + '&nbsp;-&nbsp;' + nextAlbumName + ' &gt; iTunes</a></div>';
      openLinks(links, ev.pageY, ev.pageX);
    });
  }
  
  var callbackItmsTrackRank = function(json) {
    var r = 1;
    var itmsRank = '<div class="title">iTunes Track Sales Rank</div>';
    jQuery.each(json.feed.entry, function(){
      itmsRank += (r % 5 > 0 ? '<span class="etr">' : '<div class="etr">');
      itmsRank += '<span class="track-img"><img src="' + this['im:image'][2].label + '" /><div class="rank">' + r + '</div></span>';
      itmsRank += '<span class="info">';
      itmsRank += '<div class="artist-name">' + this['im:artist'].label + '</div>';
      itmsRank += '<div class="track-name">' + this['im:name'].label + '</div>';
      itmsRank += '</span>';
      itmsRank += (r % 5 > 0 ? '</span>' : '</div>');
      r++;
    });
    jQuery("#itms-track-rank").append(itmsRank).css("height", (Math.round(r / 5) * 160) + 48 + "px")
    .children(".etr").mouseover(function() {
      jQuery(this).addClass("result-mouseover");
    }).mouseout(function() {
      jQuery(this).removeClass("result-mouseover");
    }).click(function(ev) {
      var nextArtistName = jQuery(this).find(".artist-name").text();
      var nextTrackName = jQuery(this).find(".track-name").text();
      var links = '<div class="links"><a href="javascript:artistSearch(\'' + allReplace(nextArtistName, "\'", "\\\'") + '\');" onclick="closeLinks();">' + nextArtistName + ' &gt; jemomo</a></div>';
      links += '<div class="links"><a href="/pipe/itms/view/?artistName=' +  encodeURIPlusX(encodeURIPlusX(nextArtistName)) + '&trackTitle=' + encodeURIPlusX(encodeURIPlusX(nextTrackName)) + '", target="itms" onclick="closeLinks();">' + nextArtistName + '&nbsp;-&nbsp;' + nextTrackName + ' &gt; iTunes</a></div>';
      openLinks(links, ev.pageY, ev.pageX);
    });
  }
  
  var initialize = function() {
    jQuery("#artistName").removeClass("artistName-invalid");
    jQuery("#artist").empty();
    jQuery("#album").empty();
    jQuery("#similar-artist").empty();
    jQuery("#top-track").empty();
    jQuery("#sub-content").children().hide();
    jQuery("#artistName").focus();
  }
  
  var validate = function() {
    if (jQuery("#artistName").val() == '') {
      return false;
    }
    return true;
  }
  
  var encodeURIPlusX = function(src) {
    var utftext = "";
    for (var n = 0; n < src.length; n++) {
      var c = src.charCodeAt(n);
      // &のみ2重にエンコード処理を行う.
      if (c == 38) {
//        utftext += escape(String.fromCharCode(c));
        utftext += String.fromCharCode(c);
      } else {
        utftext += String.fromCharCode(c);
      }
    }
    return encodeURIPlus(utftext);
  }
  
  var getArt = function() {
    // チェックロジックと同期させるため同期通信
    return jQuery.ajax({
      url : "/pipe/lastfm2/artist/album/art.php",
      dataType : "json",
      data : {
        artistName : encodeURIPlusX(jQuery("#artistName").val())
      },
      async: false,
      cache: false
    });
  }
  
  var playCountBar = function() {
    var barWidth = 120;
    var max = parseInt(jQuery(".playcount:first").children(".count").text());
    var i = 1;
    jQuery(".playcount").each(function() {
      if (max < parseInt(jQuery(this).children(".count").text())) {
        max = parseInt(jQuery(this).children(".count").text());
      }
    }).each(function() {
      var par = parseInt(jQuery(this).children(".count").text()) / max;
      jQuery(this).children(".bar").css({backgroundColor:"#446688", color:"white", textAlign:"left", paddingLeft:(Math.round(par * barWidth)) + "px"});
    });
  }
  
  var getRankConfig = function() {
    var rankConfig = '<span class="rank-disp">';
    rankConfig += '<a href="javascript:void(0);" class="SHOW">SHOW</a>|';
    rankConfig += '<a href="javascript:void(0);" class="HIDE">HIDE</a>|';
    rankConfig += '<a href="javascript:void(0);" class="CLOSE">CLOSE</a>';
    rankConfig += '</span>';
    return rankConfig;
  }
  var getRankCountry = function() {
    var rankCountry = '<div class="rank-country">';
    rankCountry += '<a href="javascript:void(0);" class="JPN">JPN</a>|';
    rankCountry += '<a href="javascript:void(0);" class="USA">USA</a>|';
    rankCountry += '<a href="javascript:void(0);" class="UK">UK</a>';
    rankCountry += '</div>';
    return rankCountry;
  }
  
  var artistSearch = function(nextArtistName) {
    jQuery("#artistName").val(nextArtistName);
    ajaxSearch();
  }
  
  var firstTime = function() {
    jQuery("#message").addClass("first-time-message").css({top: "200px", left: (getWindowWidth() / 2 - 60) + "px", width: "380px"})
    .hide().append('はじめての方は右上の<a href="help/" target="help">HELP</a>をご覧ください。').fadeIn(2000);
  }
  
  var openNowLoading = function() {
    jQuery("#message").empty().addClass("now-loading-message").css({top: "200px", left: (getWindowWidth() / 2) + "px"});
    loadingCnt = 0;
    threadId = setInterval('writeNowLoading()', 1000);
    var a = '';
  }
  
  var writeNowLoading = function() {
    var max = 4;
    if (loadingCnt % max == 0) {
      jQuery("#message").text('Now Loading');
    } else {
      jQuery("#message").append('.');
    }
    loadingCnt++;
  }
  
  var closeNowLoading = function() {
    loadingCnt = 0;
    clearInterval(threadId);
    jQuery("#message").empty();
  }
  
  var openLinks = function(links, top, left) {
    var maxZIndex = 0;
    jQuery(".ui-dialog").each(function() {
      maxZIndex = jQuery(this).css("zIndex") > maxZIndex ? jQuery(this).css("zIndex") : maxZIndex;
    });
    maxZIndex++;
    jQuery("#flow-link").html("").append(links).dialog()
    .parent().parent().fadeIn(function(){jQuery(this).css("filter", "alpha(opacity=95)");})
    .css({ top: top + "px", left: left + "px", zIndex: maxZIndex+""}).focus()
    .find(".ui-dialog-titlebar").addClass("ui-dialog-titlebar-links")
    .next(".ui-dialog-content").addClass("ui-dialog-content-links");
  }
  
  var closeLinks = function() {
    var flowLinkDialog = jQuery("#flow-link").parent().parent();
    if (flowLinkDialog.is(".ui-dialog")) {
      flowLinkDialog.fadeOut();
    }
  }
