
var StudyResultsChart = function (domain, username, language, application) {
  this.domain = domain;
  this.username = username;
  this.language = language;
  this.application = application;
  this.data_type = 'studied';
  if (arguments[4]) {
    this.data_type = arguments[4];
  }
  this.period = 'month';
}

StudyResultsChart.prototype = {

  study_results_data : {},
  chart_configuration : [
    {"bg_colour":"#FFFFFF"},
    {"y_ticks":"5,1,10"},
    {"y_axis_colour":"#cccccc"},
    {"y_grid_colour":"#eeeeee"},
    {"y_label_style":"8,#333333"},
    {"tooltip_background_color":"#FFFFFF"},
    {"tooltip_title_font_color":"#0689D0"},
    {"y_min":"0"},
    {"x_label_style":"1,#333333"},
    {"x_axis_colour":"#cccccc"},
    {"x_grid_colour":"#ffffff"},
    {"x_axis_steps":"1"},
    {"x_ticks":"6"},
    {"inner_background":"#FFFFFF"},
    {"line":"2,#FF9E0D"}
  ],
  labels : {
    'en': {
      'days_of_the_week' : ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
      'chart_titles' : {
        'iknow_studied': 'studied items',
        'iknow_completed': 'completed items',
        'iknow_study_time': 'study time in minutes',
        'dictation_study_time' : 'study time in minutes',
        'dictation_completed' : 'finished sentences'
      },
     'days_ago' : ' days ago',
     'today' : 'today',
     'month' : '/',
     'day' : ''
    },
    'ja': {
      'days_of_the_week' : ['日','月','火','水','木','金','土'],
      'chart_titles' : {
        'iknow_studied': '学習中アイテム数',
        'iknow_completed': '学習完了アイテム数',
        'iknow_study_time': '学習時間（分）',
        'dictation_study_time' :'学習時間（分）',
        'dictation_completed' : '学習完了センテンス数'
      },
     'days_ago' : '日前',
     'today' :  '本日',
     'month' : '月',
     'day' : '日'
    }
  },

  update_data : function (data) {
    /* conversion for our graph here! */
    var study_results_data = {};
    study_results_data['today'] = data['today'];
    study_results_data['completed'] = {};
    study_results_data['studied'] = {};
    study_results_data['study_time'] = {};
    var study_results = data['study_results'];
    var timestamp;
    for(var i=0; study_results.length > i; i++) {
      timestamp = parseInt(study_results[i]['timestamp']);
      study_results_data['completed'][timestamp] = study_results[i]['completed'];
      study_results_data['studied'][timestamp] = study_results[i]['seen'];
      study_results_data['study_time'][timestamp] = study_results[i]['seconds'];
    }
    this.study_results_data = study_results_data;
    this.redraw();
  },

  load_data : function () {
    var callback = this.instance_name + '.update_data';
    if (arguments[1]) {
      callback = arguments[1];
    }
    var url = 'http://' + this.domain + '/users/' + this.username + '/study_results/' + this.application + '.json?time_stamp=' + (new Date()).getTime() + '&callback=' + callback;
    this.include_js(url);
  },

  include_js : function(url) {
    var script = document.createElement('script');
    script.src = url;
    script.setAttribute('type', 'text/javascript');
    script.id = 'id_' + new String(Math.random()).replace(/\./, '');
    document.getElementsByTagName('head')[0].appendChild( script );
  },

  set_period : function (period) {
    this.period = period;
    this.redraw();
    return false;
  },

  set_data_type : function (data_type){
    this.data_type = data_type;
    this.redraw();
    return false;
  },

  get_label : function (key) {
    return this.labels[this.language][key];
  },

  redraw : function() {
    var chart_data = this.chart_configuration;
    var study_results = this.study_results_data[this.data_type];
    var values = new Array();
    var dates = new Array();
    var today = new Date(this.study_results_data['today'] * 1000);
    var date, result, timestamp;
    var x_label_style = "9,#999999,0";
    var days_ago = study_results.length;
    var highest_value = 5;

    if (this.period == 'week') {
      days_ago = 7;
      x_label_style += ',1';
    } else {
      days_ago = 28;
      x_label_style += ',27';
    }

    for(i = (days_ago-1); 0 <= i; i--) {
      timestamp = today - ((24*3600*1000)*i);
      study_result = study_results[Math.round(timestamp/1000)];
      date = new Date(timestamp);
      if (!study_result) {
        study_result = 0;
      }
      if (this.data_type == 'study_time' && study_result > 0) {
        study_result = study_result/60;
      }
      values.push(study_result);
      if(study_result > highest_value) {
        highest_value = study_result;
      }
      if (this.period == 'week') {
        dates.push(this.get_label('days_of_the_week')[date.getDay()]);
      } else {
        dates.push(date.getMonth()+1 + this.get_label('month') + date.getDate() + this.get_label('day'));
      }
    }

    var x_labels = days_ago + this.get_label('days_ago') + ',' + this.get_label('today');

    if (this.period == 'month') {
      dates[27] = this.get_label('today');
    }

    var x_labels = dates.join(',');

    chart_data.push({'x_labels': x_labels});
    chart_data.push({'values': values.join(',')});
    chart_data.push({'x_label_style': x_label_style});
    chart_data.push({'y_max': Math.round(highest_value * Math.max(4 - Math.floor(highest_value / 50 ), 1.6 ))});
    chart_data.push({"title": this.get_label('chart_titles')[this.application + '_' + this.data_type] + ", {font-size: 11px; color: #333;}"});

    var swf_name = this.instance_name + '_swf';
    var chart_swf = document.getElementById(swf_name);

    for (var i = 0; i < chart_data.length; i++) {
      var row = chart_data[i];
      for (var str in row) {
        chart_swf.SetVariable(str, row[str]);
      }
    }
    chart_swf.manuallyStart();
  },

  put_swf : function(instance_name) {
    this.instance_name = instance_name;
    var swf_name = instance_name + '_swf';
    var load_callback = this.instance_name + '.load_data';
    var so = new SWFObject('http://' + this.domain + '/widgets/study_results_chart.swf', swf_name, "600px", "200px", "8", "#FFFFFF");
    so.addParam("allowScriptAccess", "always");
    so.addParam("allowDomain", this.domain);
    so.addParam("allowFullScreen", "true");
    so.addParam("wmode", "transparent");
    so.addVariable("app_type", this.application);
    if (arguments[1]) {
      load_callback = arguments[1];
    }
    so.addVariable("onLoadCallback", load_callback);
    so.addVariable("needZoomFeature", "false");

    var container_id = swf_name + '_container';
    document.write('<div id="' + container_id + '" class="chart_swf_container"></div>');
    so.write(container_id);
  }
}
