/*
if (!window.console) {
  window.console = {
    timers: {},
    openwin: function() {
      window.top.debugWindow =
          window.open("",
                      "Debug",
                      "left=0,top=0,width=300,height=700,scrollbars=yes,"
                      +"status=yes,resizable=yes");
      window.top.debugWindow.opener = self;
      window.top.debugWindow.document.open();
      window.top.debugWindow.document.write('<html><head><title>debug window</title></head><body><hr><pre>');
    },

    log: function(entry) {
      window.top.debugWindow.document.write(entry+"\n");
    },

    time: function(title) {
      window.console.timers[title] = new Date().getTime();
    },

    timeEnd: function(title) {
      var time = new Date().getTime() - window.console.timers[title];
      console.log(['<strong>', title, '</strong>: ', time, 'ms'].join(''));
    }

  }

  if (!window.top.debugWindow) { console.openwin(); }
}
*/

var HatebuDomainVisualization = {};

HatebuDomainVisualization.NAME = 'HatebuDomainVisualization';

HatebuDomainVisualization.Util = {};

update(HatebuDomainVisualization.Util, {
  NAME: 'HatebuDomainVisualization.Util',

  qw: function(list) {
      return list.split(/\s+/);
  },

  p: function() {
      forEach(arguments, compose(logDebug, repr) );
  },

  puts: function() {
      forEach(arguments, logDebug);
  },

  bEscapeURI: function(uri) {
    return uri.replace(/#/g, '%23');
  },

  bFavoriteImage: function(item) {
    return A( {'class': 'bimage', href: 'http://b.hatena.ne.jp/entry/' + bEscapeURI(item.link)},
             IMG({src: 'http://b.hatena.ne.jp/entry/image/' + bEscapeURI(item.link), title: item.title})
            );
  },

  fmap: function(/* fn... */) {
    var args = arguments;
    return function() {
      for (var i = 0; i < args.length; i++)
        args[i].apply(this, arguments);
    }
  },

  getproperty: function(obj, property) {
    return obj[property];
  },

  EXPORT_TAGS: {
    ':all': ['p', 'qw', 'bFavoriteImage', 'bEscapeURI', 'fmap', 'getproperty']
  }
});

nameFunctions(HatebuDomainVisualization.Util);
MochiKit.Base._exportSymbols(this, HatebuDomainVisualization.Util);

update(HatebuDomainVisualization, {
  run: function() {
    this.url = this.getJsonURL();
    var d = loadJSONDoc(this.url);
    this.result = $('result');
    this.loading = P({'class': 'loading'}, IMG({src:'/images/cinnamon-left.gif', alt:'now loading.'}), ' now loading...');
    appendChildNodes(this.result, this.loading);
    d.addCallback(this.onComplete);
  },

  getJsonURL: function() {
    return location.href.replace( /\/hatebu_domain_visualization/,'/hatebu_domain_visualization/json');
  },

  onComplete: function(data) {
    removeElement(this.loading);
	  var container = DIV({width:500, height:400, style:'margin-left: 180px;'});
    this.result.appendChild(container);

    var domains = this.getDomainsAndAllUsers(data);
    var allUsers = domains[1];
    domains = domains[0]; // FIXME DASAI

    if( /\d{4}\/\d{1,2}\/?$/.test(this.url)) {
      // month
      var threshold = 1;
    } else {
      var threshold = 1.5;
    }
    var sortedDomains = this.filterAndSortDomains(domains, allUsers, threshold);

		var options = {
			axisLabelFontSize: 12,
			axisLabelWidth: 300,
			drawBackground: false,
			pieRadius: 0.4,
			xTicks: map(function(domain, c) {return {
          v:c,
          label: domain.domain + ' - ' + domain.totalUsers + ' users'
        }; 
      }, sortedDomains, count(0))
		};
    update(options, officeRed());

    var sortedData = map(function(domain, c) {
      return [c, domain.totalUsers];
    }, sortedDomains, count(0));

	  var pie = EasyPlot('pie', options, container, [sortedData]);

    var list = OL({'class': 'domains'});
    forEach(sortedDomains, function(d) {
      if (domains[d.domain]) {
        var ul = UL(null);
        forEach(
          map(function(d2) { d2.users = parseInt(d2.users); return d2}, domains[d.domain]).sort(
            reverseKeyComparator('users')
          ), function(item) {
            // title link users
            ul.appendChild(LI(null, A({href: item.link}, item.title), bFavoriteImage(item)));
        });
        var li = LI(null, d.domain, ul);
        appendChildNodes(list, li);
      }
    });
    appendChildNodes(this.result,list);
    removeElementClass(this.result, 'break');
  },

  filterAndSortDomains: function(domains, allUsers, threshold) {
    var result = [];
    var other = {
      totalUsers: 0,
      domain: 'other'
    };
    forEach( map( partial(getproperty, domains), keys(domains)), function(domain) {
      var per = domain.totalUsers / allUsers * 100;
      if(per >= threshold) {
        result.push(domain);
      } else {
        other.totalUsers += domain.totalUsers;
      }
    });
    result = result.sort(reverseKeyComparator('totalUsers'));
    result.push(other);
    return result;
  },

  getDomainsAndAllUsers: function(data) {
    var domains = {};
    var allUsers = 0;
    forEach(data, function(site) {
      if (typeof domains[site.domain] == 'undefined') {
        domains[site.domain] = [];
        domains[site.domain].totalUsers = 0;
        domains[site.domain].domain = site.domain;
      }
      domains[site.domain].totalUsers += parseInt(site.users);
      allUsers += parseInt(site.users);
      domains[site.domain].push(site);
    });
    return [domains, allUsers];
  }
})

bindMethods(HatebuDomainVisualization);

connect(window, 'onload', partial(HatebuDomainVisualization.run));
