var landscape = false;
var numbers = [];

var settings = {
  showAverage: true,
  modeIndex: 0
}

var dataCookie = null;
var settingsCookie = null;

var modes = [
             {
               lines : {
                 show :true
               },
               points : {
                 show :true
               }
             },               {},
             {
               lines : {
                 show :false
               },
               points : {
                 show :true
               }
             },  
             {
                 lines : {
                   show :false
                 },
                 points : {
                   show :false
                 },
                 bars : {
                   show :true
                 }
               }
             ];

function setup() {
  dataCookie = new Cookie("QuickChartData");
  if (dataCookie.get()) {
    my$("NumbersEdit").value = dataCookie.get();
  }  
  settingsCookie = new Cookie("QuickChartSettings");
  if (settingsCookie.get()) {
    try {
      settings = eval("new Object({" + settingsCookie.get() + "})");
    }
    catch (e) {
    }  
  }
  my$("AverageCheck").checked = settings.showAverage;
  my$("Chart").onclick = function() {
    settings.modeIndex = (settings.modeIndex + 1) % modes.length;
    calculate();
  };
  parseParameters();
  stopEdit();
  orientationChanged();
}

function startEdit() {
  my$("NumbersSection").style.display = "none";
  my$("NumbersEditSection").style.display = "block";
  my$("NumbersEdit").focus();
}

function stopEdit() {
  my$("NumbersSection").style.display = "block";
  my$("NumbersEditSection").style.display = "none";
  parseEdit(my$("NumbersEdit").value);
}

function clearEdit() {
  my$("NumbersEdit").value = "";
  parseEdit("");
}

function parseEdit(text) {
  dataCookie.store(text);
  text = text.replace(/\,/g, " ");
  var search = /(\S+\s+)/g;
  var split = text.split(" ");//search.exec(text);
  numbers = [];
  var result = "";
  for ( var i = 0; i < split.length; i++) {
    if (split[i].length == 0 || split[i] == " ") {
      continue;
    }  
    var number = parseFloat(split[i]);
    if (!isNaN(number)) {
      numbers.push(number);
      result += number + " ";
    }
    else {
      result += "<span class='noNumber'>" + split[i] + "</span> ";
    }
  }
  my$("Numbers").innerHTML = result;
  calculate();
}

function calculate() {
  //arithmetic
  var aa = 0;
  for ( var i = 0; i < numbers.length; i++) {
    aa += numbers[i];
  }
  if (numbers.length > 0) {
    aa = aa / numbers.length;
  }

  //Deviation
  var aa2 = aa * aa;
  var dv = 0;
  for ( var i = 0; i < numbers.length; i++) {
    dv += numbers[i] * numbers[i] - aa2;
  }
  if (numbers.length > 1) {
    dv = Math.sqrt(1.0 / (numbers.length - 1) * dv);
  }
  
  //plot
  var data = new Array(numbers.length);
  for ( var i = 0; i < numbers.length; i++) {
    data[i] = [i, numbers[i]];
  }

  var options = modes[settings.modeIndex];
  options.grid ={tickColor: "rgba(0, 0, 0, 0.2)"};
  options.xaxis = {tickSize: Math.max(1, Math.round(numbers.length / 8))};

  settings.showAverage = my$("AverageCheck").checked;
  if (settings.showAverage) {
    var length = numbers.length - 1;
    if (options.bars) {
      length = numbers.length;
    }  
    data = [ {
      color :1,
      data : [ [ 0, aa ], [ length, aa ] ],
      points : {
        show :false
      },
      lines : {
        show :true,
        fill :true
      },
      bars : {
        show :false
      }
    }, data ];
  }
  else {
    data = [data];
  }
  $.plot($("#Chart"), data, options);
  var text = "showAverage:" + settings.showAverage + ",modeIndex:" + settings.modeIndex;
  settingsCookie.store(text);
}

function parseParameters() {
  try {
    var search = location.search;
    if (search != null && search.length > 0) {
      var data = getParameter(search, "data", null);
      if (data != null) {
        my$("NumbersEdit").value = data;
        dataCookie.store(data);
        location.search = "";
      }
    }
  }
  catch (e) {
    alert("Failed to parse URL parameters: " + e);
    location.search = "";
  }
}

function getParameter(src, key, defaultValue) {
  if (src.indexOf("&amp;") >= 0) {
    src = src.replace(/\&amp\;/g, "&");
  }
  var index = src.indexOf("&" + key + "=");
  if (index < 0) {
    index = src.indexOf("?" + key + "=");
  }
  if (index >= 0) {
    var index2 = src.indexOf("&", index + 1);
    if (index2 >= 0) {
      return decode(src.substring(index + key.length + 2, index2));
    }
    return decode(src.substring(index + key.length + 2));
  }
  return defaultValue;   
}

function decode(value) {
  var result = decodeURIComponent(value);
  return result.replace(/(\+)/g, " ");
}

function emailResults() {
  var body="";
  body += "Data: " + my$("NumbersEdit").value;
  body += "<br><br>Chart it: " + encodeURIComponent("http://quickchart.speedymarks.com?data=" + encodeURIComponent(my$("NumbersEdit").value));
  body += "<br><br>Quick Chart in the App Store: http://www.itunes.com/app/quickchart";
  if (navigator.userAgent.toLowerCase().indexOf("android") >= 0) {
    body = body.replace(/\<br\>/g, "%0A");
  }  
  window.open("mailto:?subject=Quick Chart&body=" + body, "_self");  
}

function openAverage() {
  var url = "http://average.speedymarks.com?data=" + encodeURIComponent(my$("NumbersEdit").value);;
  window.open(url, "_blank");  
}

function my$(id) {
  return document.getElementById(id);    
}

function tellFriend() {
  var body = "Hi,<br><br>I just stumbled upon this iPhone Quick Chart app:" +
      "<br><br>http://www.itunes.com/app/quickchart<br><br>" +
      "Quickly chart a set of numbers." +
      "<br><br>Best regards";
  if (navigator.userAgent.toLowerCase().indexOf("android") >= 0) {
    body = body.replace(/\<br\>/g, "%0A");
  }  
  window.open("mailto:?subject=Quick Chart on the iPhone&body=" + body, "_self");  
}

function orientationChanged() {
  if (window.orientation != undefined) {
    landscape = window.orientation != 0 && window.orientation != 180;
  }
  else {
    landscape = window.innerWidth > window.innerHeight;
  }
  calculate();
  setTimeout(function() {window.scrollTo(0,1)}, 1);
}
