var landscape = false;
var numbers = [];

var dataCookie = null;
var factorCookie = null;

function setup() {
  orientationChanged();
  dataCookie = new Cookie("AverageData");
  if (dataCookie.get()) {
    $("NumbersEdit").value = dataCookie.get();
  }  
  factorCookie = new Cookie("AverageFactor");
  if (factorCookie.get()) {
    $("Factor").value = factorCookie.get();
  }
  parseParameters();
  stopEdit();
}

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

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

function clearEdit() {
  $("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> ";
    }
  }
  $("Numbers").innerHTML = result;
  calculate();
}

function calculate() {
  //count
  $("Count").innerHTML = numbers.length;  
  
  //arithmetic
  var aa = 0;
  for ( var i = 0; i < numbers.length; i++) {
    aa += numbers[i];
  }
  if (numbers.length > 0) {
    aa = aa / numbers.length;
  }
  $("Arithmetic").innerHTML = prepareNumber(aa);
  
  //geometric
  var ga = 1;
  for ( var i = 0; i < numbers.length; i++) {
    ga *= numbers[i];
  }
  if (ga >= 0 && numbers.length > 0) {
    ga = Math.pow(ga, 1 / numbers.length);
  }  
  $("Geometric").innerHTML = prepareNumber(ga);

  //harmonic
  var ha = 0;
  for ( var i = 0; i < numbers.length; i++) {
    ha += 1.0 / numbers[i];
  }
  if (!isNaN(ha) && ha != 0) {
    ha = numbers.length / ha;
  }  
  $("Harmonic").innerHTML = prepareNumber(ha);
  
  //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);
  }
  $("Standard").innerHTML = prepareNumber(dv);
  
  //Confidence
  var factor = parseFloat($("Factor").value);
  confidence = factor * dv;
  if (numbers.length > 0) {
    confidence = confidence / Math.sqrt(numbers.length);
  }
  else {
    confidence = 0;
  }  
  $("Confidence").innerHTML = "&plusmn;" + prepareNumber(confidence);
  factorCookie.store($("Factor").value);
}

function prepareNumber(number) {
  return number.toPrecision(6);
}

function parseParameters() {
  try {
    var search = location.search;
    if (search != null && search.length > 0) {
      var data = getParameter(search, "data", null);
      if (data != null) {
        $("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: " + $("NumbersEdit").value + "<br>";
  body += "<br>Count: " + $("Count").innerHTML;
  body += "<br>Arithmetic: " + $("Arithmetic").innerHTML;
  body += "<br>Geometric: " + $("Geometric").innerHTML;
  body += "<br>Harmonic: " + $("Harmonic").innerHTML;
  body += "<br>";
  body += "<br>Standard Deviation: " + $("Standard").innerHTML;
  body += "<br>Confidence Interval(" + $("Factor").options[$("Factor").selectedIndex].text 
          + "): " + $("Confidence").innerHTML;
  body += "<br><br>Open it: " + encodeURIComponent("http://average.speedymarks.com?data=" + encodeURIComponent($("NumbersEdit").value));
  body += "<br><br>Average Calculator in the App Store: http://www.itunes.com/app/averagecalculator";
  window.open("mailto:?subject=Average&body=" + body, "_self");  
}

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

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

function tellFriend() {
  var body = "Hi,<br><br>I just stumbled upon this iPhone average calculator:" +
      "<br><br>http://www.itunes.com/app/averagecalculator<br><br>" +
      "Quickly calculate the average and standard deviation of a set of numbers." +
      "<br><br>Best regards";
  window.open("mailto:?subject=Average 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;
  }  
  setTimeout(function() {window.scrollTo(0,1)}, 1);
}
