text: // We had to sacrafice a bit of the beauty of this structure to accommodate OS 1.1
  // If/when we drop OS <2 just switch all onclick events to ontouchend events.
  
  var elements; // Shortcut to handle html elements
  var header = 0; // Used in swap_header
  var method; //The method we use, touchend or onclick
  var active_index;
  var active_url;
  
  // Get ourselves the method based on OS
  method = cookie.get('method');
  if (method === null) {
  	if (document.createTouch) {
  		method = 'touchend';
  	} else {
  		method = 'click';
  	}
  	cookie.set('method',method,365);
  }
  
  // Active
  active_index = 0;
  active_url = cookie.get('lastpage');
  if (active_url === null) {
  	active_url = 'start.php';
  }
  
  // Data sent in HTML comments
  var title = null;
  var back_url = null;
  var back_name = null;
  
  function main () {
  	// Basic html structure utilized for transitions
  	elements = {
  		buttons:[$('#first_button'),$('#second_button')],
  		titles:[$('#first_title'),$('#second_title')],
  		pages:[$('#first_page'),$('#second_page')]
  	};
  
  	// Transform on load
  	elements.pages[1].style.webkitTransform = 'translateX(100%)';
  
  	// Set event handlers
  	elements.titles[0].addEventListener(method, swap_header, false);
  	elements.titles[1].addEventListener(method, swap_header, false);
  
  	elements.buttons[0].addEventListener(method, go_back, false);
  	elements.buttons[1].addEventListener(method, go_back, false);
  
  	elements.pages[0].addEventListener('webkitTransitionEnd', transition_ended, false);
  	Transitions.DEFAULTS.duration = 0.35;
  
  	// Load the content
  	ajax.get(active_url, function (response) {
  		get_headers(response);
  		elements.titles[0].innerHTML = title;
  		elements.pages[0].innerHTML = response;
  		if (back_name) {
  			elements.buttons[0].textContent = back_name;
  		}
  	});
  
  	// Hide the address bar
  	setTimeout(function() {
  		window.scrollTo(0, 1);
  		setTimeout(function() {
  			window.scrollTo(0, 0);
  		},0);
  	}, 500);
  };
  
  // Tap header to swap for ratio
  function swap_header() {
  	//$('#search').style.display = 'block';
  }
  
  // Back button alias
  function go_back() {
  	load(back_url,false);
  }
  
  // Get data from comments
  function get_headers(response) {
  	title = response.match(/\<\!\-\-Title\:(.+?)\-\-\>/i)[1];
  	if (response.match(/\<\!\-\-Back\:(.+?)\:(.+?)\-\-\>/i)) {
  		back_name = response.match(/\<\!\-\-Back\:(.+?)\:(.+?)\-\-\>/i)[1];
  		back_url = response.match(/\<\!\-\-Back\:(.+?)\:(.+?)\-\-\>/i)[2];
  	} else {
  		back_name = null;
  		back_url = null;
  	}
  }
  
  // Load content
  function load(url,forward,formid) {
  	if (forward === undefined) {
  		forward = true;
  	}
  	if (transitions_in_progress && document.createTouch) { // OS 2
  		return;
  	}
  	if (moved_after_touch) {
  		return;
  	}
  	if (formid === undefined) {
  		ajax.get(url, function (response) {
  			get_headers(response);
  			transition_to_new_element(response, forward);
  		});
  		cookie.set('lastpage',url,7);
  	} else {
  		ajax.post(url,formid);
  	}
  };
  
  // Moves
  var moved_after_touch = false;
  function touch_started () {
  	moved_after_touch = false;
  };
  function touch_moved () {
  	moved_after_touch = true;
  };
  
  // Transitions
  var transitions_in_progress = false;
  function transition_ended () {
  	transitions_in_progress = false;
  };
  function transition_to_new_element (data, going_forward) {
  	transitions_in_progress = true;
  
  	var from_index = active_index;
  	var to_index = (active_index == 1) ? 0 : 1;
  
  	//Make other page visible
  	//elements.pages[to_index].style.height = '';
  
  	Transitions.DEFAULTS.properties = ['opacity', '-webkit-transform'];
  	var transitions = new Transitions();
  
  	transitions.add({
  		element: elements.titles[from_index],
  		duration: [0.5],
  		properties: ['opacity'],
  		from: [1],
  		to: [0]
  	});
  
  	transitions.add({
  		element : elements.titles[to_index],
  		duration: [0.5],
  		properties: ['opacity'],
  		from : [0],
  		to : [1]
  	});
  
  	transitions.add({
  		element: elements.buttons[from_index],
  		duration: [0.5],
  		properties: ['opacity'],
  		from: [1],
  		to: [0]
  	});
  
  	transitions.add({
  		element : elements.buttons[to_index],
  		duration: [0.5],
  		properties: ['opacity'],
  		from : [0],
  		to : [1]
  	});
  
  	// we only change the transform for the page transitions
  	Transitions.DEFAULTS.properties = ['-webkit-transform'];
  
  	transitions.add({
  		element : elements.pages[from_index],
  		from : ['translateX(0%)'],
  		to : ['translateX(' + ((going_forward) ? -150 : 150) + '%)']
  	});
  
  	transitions.add({
  		element : elements.pages[to_index],
  		from : ['translateX(' + ((going_forward) ? 150 : -150) + '%)'],
  		to : ['translateX(0%)']
  	});
  
  	elements.pages[to_index].textContent = '';
  	elements.pages[to_index].innerHTML = data;
  	elements.titles[to_index].textContent = title;
  	elements.buttons[to_index].textContent = back_name;
  
  	//Hide other page to avoid excess scroll at the bottom
  	//elements.pages[from_index].style.height = '0px';
  
  	active_index = to_index;
  
  	transitions.apply();
  };
  
  // Initate main function
  window.addEventListener('load', main, false);
  