  var landscape = true;
  var palindromesCookie;
  var settingsCookie;
  var lastId = 0;
  var palindrome = null;
	    
  function setup() {
    landscape = window.innerWidth < window.innerHeight;    
    setTimeout(function() {window.scrollTo(0,1)}, 1);
    $("Loading").style.visibility = "hidden";
    $("List").innerHTML = "";
    palindromesCookie = new Cookie("Palindrome-IDs");
    if (palindromesCookie.get()) {
      var data = "";//eval(palindromesCookie.get());
      for (var i = data.length - 1; i >= 0; i--) {
      	var id = data[i];
      	if (lastId < id) {
      	  lastId = id;
      	}  
        addPalindrome(data[i]);
      }
      if (data.length == 0) {
        loadDefaults();
      }
    }
    else {
      loadDefaults();
    }  
    settingsCookie = new Cookie("PalindromeSettings");
    if (settingsCookie.get()) {
      try {
        var settings = eval("new Object({" + settingsCookie.get() + "})");
      }
      catch (e) {
        alert(e);
      }  
    }
    newPalindrome();
  }
  
  function loadDefaults() {
    palindrome = {
        text: "Step on "
        ,isOdd: true
        ,withSpaces: true
    };
    savePalindrome();
    palindrome = {
        text: "No devil "
        ,isOdd: true
        ,withSpaces: true
    };
    savePalindrome();
    palindrome = {
        text: "An"
        ,isOdd: false
        ,withSpaces: false
    };
    savePalindrome();
  }
  
  function newPalindrome() {
    palindrome = {
      text: ""
      ,isOdd: true
      ,withSpaces: true
    };
    $("ReplaceButton").style.display = "none";
    loadPalindrome();
  }
  
  function loadPalindrome() {
    $("TextInput").value = palindrome.text;
    $("OddCheck").checked = palindrome.isOdd;
    $("SpaceCheck").checked = palindrome.withSpaces;
    update();
    window.scrollTo(0, 0);
  }
  
  function update() {
    palindrome.text = $("TextInput").value;
    palindrome.isOdd = $("OddCheck").checked;
    palindrome.withSpaces = $("SpaceCheck").checked;
    var result = createPalindrome(palindrome);
    $("Palindrome").innerHTML = "";
    $("Palindrome").appendChild(document.createTextNode(result));
    if (result.length == 0) {
      $("Palindrome").innerHTML = "Palindrome";
      $("Palindrome").className = "empty";
      $("Buttons").style.display = "none";
    }
    else {
      $("Palindrome").className = "";
      $("Buttons").style.display = "block";
    }  
  }
  
  function createPalindrome(palindrome) {
    var result = palindrome.text;
    if (!palindrome.withSpaces) {
      result = result.replace(/\s/g, "");
    }
    var startIndex = result.length - 1;
    if (palindrome.isOdd) {
      startIndex--;
    }
    for ( var i = startIndex; i >= 0; i--) {
      result += result.charAt(i).toLowerCase();
    }
    return result;
  }
  
  function replacePalindrome() {
    if (palindrome.id) {
      savePalindrome(palindrome.id);
      palindrome.element.innerHTML = "";
      palindrome.element.appendChild(document.createTextNode(createPalindrome(palindrome)));
    }  
  }
  
  function savePalindrome(id) {
    if (!id) {
      lastId++;
      id = lastId;
    }  
    var cookie = new Cookie("Palindrome" + id);
    var text = "text:'" + encode(palindrome.text) + "'";
    text += ",isOdd:" + palindrome.isOdd;
    text += ",withSpaces:" + palindrome.withSpaces;
    cookie.store(text);
    addPalindrome(id);
  }
  
  function encode(text) {
    text = text.replace(/\n/g, "\\n");
    return text.replace(/\'/g, "\\'");
  }
  
  function addPalindrome(id) {    
    var list = $("List");
    var li = document.createElement("li");

    var cookie = new Cookie("Palindrome" + id);
    if (cookie.get()) {
      try {
        li.palindrome = eval("new Object({" + cookie.get() + "})");
        li.palindrome.id = id;
        li.cookie = cookie;
      }
      catch (e) {
        alert(e + " " + cookie.get());
        return;
      }  
    }  
    else {
      return;
    }
    
    list.insertBefore(li, list.firstChild);      
    
    var remove = document.createElement("img");
    remove.li = li;
    remove.src = "close4.png";
    remove.className = "listClose";
    remove.onclick = function() {
      if (confirm("Do you really want to remove this palindrome?")) {
        this.li.cookie.remove();
        this.li.parentNode.removeChild(this.li);
        savePalindromes();
      }  
    }
    li.appendChild(remove);

    var text = document.createElement("div");
    text.className = "listTitle";
    text.innerHTML = createPalindrome(li.palindrome);
    li.appendChild(text);
    li.className = "listEntry";
    li.palindromeId = id;
    text.onclick = function() {
      var entry = this.parentNode;
      if (entry.parentNode) {
        palindrome = entry.palindrome;
        palindrome.element = this;
        //$("ReplaceButton").style.display = "inline";
        loadPalindrome();
      }  
    }
    savePalindromes();
  }
  
  function savePalindromes() {
    var data = "[";
    var list = $("List");
    var lis = list.childNodes;
    for (var i = 0; i < lis.length; i++) {
    	if (i > 0) {
    	  data += ',';
    	} 
    	data += lis[i].palindromeId;
    }
    data += "]";
    palindromesCookie.store(data);
  }
  
  function emailPalindrome() {
    var body = "Hi,<br><br>I found this cool new palindrome:" +
        "<br><br>" + createPalindrome(palindrome) +
        "<br><br>" +
        "Created on my iPhone with:" +
        "<br>http://palindrome.speedymarks.com" +
        "<br><br>Best regards";
    window.open("mailto:?subject=Palindrome on the iPhone&body=" + body, "_self");  
  }

  function saveSettings() {
    var text = "";
    settingsCookie.store(text);
  }

  function tellFriend() {
    var body = "Hi,<br><br>I just stumbled upon this iPhone palindrome application:" +
        "<br><br>http://palindrome.speedymarks.com<br><br>" +
        "Create Palindromes on your iPhone." +
        "<br><br>Best regards";
    window.open("mailto:?subject=Palindrome on the iPhone&body=" + body, "_self");  
  }

	function orientationChanged() {
    landscape = window.innerWidth < window.innerHeight;
    pause();
    window.scrollTo(0,1);
  }
	
  function debug(msg) {
    var e = document.getElementById("Debug");
    e.innerHTML += msg + "<br>";
  }
  
  function $(id) {
    return document.getElementById(id);
  }