$(function(){

  // Exclude admin users from Google analytics stats
  if (window.location.pathname == '/admin') {
    _gaq.push['_setVar','admin'];
  }

  $.ajaxSetup({
    cache: false
  })

  oZoom.tabs();
  oZoom.setOwnerTimeout(15);
  oZoom.tableRowActions({ scope : 'body.accounts-show' });
  oZoom.setupCheckoutForm();

  $.facebox.settings = $.extend($.facebox.settings, oZoom.faceboxSettings);
  $('a[rel*=facebox]').facebox();

  $("body:not(.welcome) header h1 a, input[title]").tipsy({ gravity: 'w', fade: true });

  $("body.restaurants a[data-click-campaign]").click(function(){
    event.preventDefault();
    oZoom.clickToCall($(this).attr("data-click-campaign"));
  });

  $("body.restaurants a#geocode-address").geoCodeAndFillOnClick();
  $("body.subscriptions a#geocode-address").geoCodeAndFillOnClick({
    latSelector: "#subscription_account_attributes_restaurants_attributes_0_lat",
    lngSelector: "#subscription_account_attributes_restaurants_attributes_0_lng"
  });

  if ($("body.restaurants.show").length) {
    point = oZoom.currentLatLng()
    map1  = oZoom.drawMap({ canvasId: "map_canvas", point: point });
    map2  = oZoom.drawMap({ canvasId: "square_map_canvas", point: point });
    // redraw map on tab switching
    $("ul.tabs li a").click(function(){
      oZoom.refreshMap(map1);
      oZoom.refreshMap(map2);
      return false;
    });
  }

  $('ul.actions > li > a').actionButton();

  $('#hours .slider').hourSlider();

  // Enables adding multiple hours from the schedule form
  $('a#new-hour').click(function(){
    oZoom.newFromTemplate({
      template: hour,
      appendTo: '#hours',
      success: function(){
        $('#hours .slider').hourSlider();
      }
    });
    event.preventDefault();
  });

  $('body.schedules span.remove-hour a').live('click', function(){
    event.preventDefault();
    $(this).parents(".hour").remove();
  });

  $('body.foods a.remove-option').live('click', function(){
    event.preventDefault();
    $(this).parents(".option").remove();
  });

  $('a#new-option').click(function(){
    oZoom.newFromTemplate({
      template: option,
      appendTo: '#options'
    });
    event.preventDefault();
  });

  $("a#newPhone").click(function(){
    event.preventDefault();
    oZoom.newFromTemplate({
      template: phone,
      appendTo: '#phones',
      success: function() {
        $("#noPhones").remove();
      }
    });
  });

  $('input[type=checkbox][name=restaurant[accepts_pickup_orders]]').bindCheckbox({
    checked: function(){ $('#pickup-lead-time, #business-schedule').show(); },
    unchecked: function(){
      $('#pickup-lead-time').hide();
      if (!$("input[type=checkbox][name=restaurant[offers_dine_in_service]]:checked").val()) {
        $('#business-schedule').hide();
      }
    }
  });

  $("input[type=checkbox][name=restaurant[offers_dine_in_service]]").bindCheckbox({
    checked: function(){ $('#business-schedule').show(); },
    unchecked: function(){
      if (!$("input[type=checkbox][name=restaurant[accepts_pickup_orders]]:checked").val()) {
        $('#business-schedule').hide();
      }
    }
  });

  $("input[type=checkbox][name=restaurant[accepts_delivery_orders]]").bindCheckbox({
    checked: function() { $('#delivery-lead-time, #delivery-schedule, #delivery-min-amount').show(); },
    unchecked: function() { $('#delivery-lead-time, #delivery-schedule, #delivery-min-amount').hide(); }
  });

  // Menus and Cart
  if ( $('body.restaurants.show').length ) {

    $('section#menus').loadMenus();

    // Initialize cart
    $.getJSON('/cart', function(data){
      oZoom.cart = data;
      $('.cart').renderCart();
    });

    // Setup interface event handlers
    $('dl.foods dt.has-details').live('click', function() {
      $(this).next('dd').slideToggle();
    });

    $('a.add-to-cart').live('click', function (event) {
      $(this).parents('form').addToCart();
      event.preventDefault();
    });

    $('.cart span.remove').live('click', function (event) {
      oZoom.deleteCartItemAtIndex( $(this).parents('tr').index() );
      event.preventDefault();
    });

    $('a.delete-cart').live('click', function (event) {
      oZoom.cart = { items: [] };
      $.post('/cart', { cart: JSON.stringify(oZoom.cart) }, function() {
        $('.cart').renderCart(oZoom.cart);
      });
      event.preventDefault();
    });
    
    $('a.action').live('click', function(event) {
      event.preventDefault();
    });
  }

  $('form#directions_form').submit(function (e) {
    e.preventDefault();
    originAddress       = $(this).find('input[type=text]').val();
    destinationAddress  = $('p.restaurantAddress').html()
    directionsService   = new google.maps.DirectionsService();
    directionsRenderer  = new google.maps.DirectionsRenderer();
    directionsService.route({
      origin: originAddress,
      destination: destinationAddress,
      travelMode: google.maps.DirectionsTravelMode.DRIVING,
      unitSystem: google.maps.DirectionsUnitSystem.METRIC
    }, function (directionsResult, directionsStatus) {
      if (directionsStatus == google.maps.DirectionsStatus.OK) {
        directionsMap = new google.maps.Map(document.getElementById("map_canvas"), {
          zoom: 13,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        })
        directionsRenderer.setMap(directionsMap)
        directionsRenderer.setPanel(document.getElementById("directions_panel"))
        directionsRenderer.setDirections(directionsResult);
      }
    });
  })
});

function showFieldsForSelectedFullfillmentType() {
  var selectedFullfillmentType = $("ul#kind-of-order li input:checked").val();
  if (selectedFullfillmentType == undefined) return;
  if (selectedFullfillmentType == "pickup") {
    $(".field.phone").show();
    $(".field.address").hide();
    $("#next-available-time .delivery").hide()
    $("#next-available-time .pickup").show()
    $("#other-available-time .delivery").hide()
    $("#other-available-time .pickup").show()
  } else {
    $(".field.phone").show();
    $(".field.address").show();
    $("#next-available-time .pickup").hide()
    $("#next-available-time .delivery").show()
    $("#other-available-time .pickup").hide()
    $("#other-available-time .delivery").show()
  }
}

function showFieldsForSelectedTimeType() {
  var nextAvailable = $("ul#when-ready li input:checked").val();
  if (nextAvailable == undefined) return;
  if (nextAvailable == "true") {
    $("#next-available-time").show();
    $("#other-available-time").hide();
  } else {
    $("#next-available-time").hide();
    $("#other-available-time").show();
  }
}

var oZoom = {}

oZoom.tabs = function() {
  
  if (!$(".panes").length) return; // don't bother if there aren't any panes on the page.
  if ($(".error-message").length) {
    initialPane = "#" + $(".error-message").parents(".pane").attr("id");
  } else {
    if (window.location.hash == '') {
      initialPane = "#" + $(".panes .pane:first-child").attr('id');
    } else {
      initialPane = window.location.hash;
    }
  }
  
  $('ul.tabs li a').click(function(){
    $('ul.tabs li a').removeClass('active');
    $(this).addClass('active');
    $('.pane').hide();
    $(this.hash).show();
    return false;
  });
  
  $('.pane:not(' + initialPane + ')').hide();
  $('a[href=' + initialPane + ']').trigger("click");
};

oZoom.mapOptions = { zoom: 16, mapTypeId: google.maps.MapTypeId.ROADMAP, scrollwheel: false };

oZoom.currentLatLng = function() {
  restaurantLat = parseFloat($('meta[name=restaurant-lat]').attr('content'))
  restaurantLng = parseFloat($('meta[name=restaurant-lng]').attr('content'))
  return restaurantLatLng = new google.maps.LatLng(restaurantLat, restaurantLng);
}

oZoom.addressFromFields = function(addressFieldSelectors) {
  address = ""
  $.each(addressFieldSelectors, function(){
    value = $(this.toString()).val()
    if (value) { if (address == "") { address = value + ", " } else { address = address + value + ", " }}
  });
  return address.replace(/, $/,'')
};

oZoom.drawMap = function(options) {
  var map = new google.maps.Map( document.getElementById(options.canvasId), oZoom.mapOptions );
  map.setCenter(options.point)
  var marker = new google.maps.Marker({ map: map, position: options.point });
  return map;
}

oZoom.refreshMap = function(map) {
  google.maps.event.trigger(map, "resize");
  map.setCenter(oZoom.currentLatLng())
}

oZoom.clickToCall = function(campaignId, number) {
  htmlTemplate = '\
    <form action="http://orderzoom.adtrack.calls.net/euinc/ctc/call" method="POST">\
      <input type="hidden" name="cmp" value="' + campaignId + '"/>\
      <input type="hidden" name="delay" value="0" />\
      <div class="field">\
        <label for="number">You number</label>\
        <input type="text" name="number" value="" placeholder="602-555-1234" />\
      </div>\
      <div class="field">\
        <input type="submit" name="submit" value="Call me!" />\
      </div>\
    </form>';
  $.facebox(htmlTemplate)
}

oZoom.setOwnerTimeout = function(timeoutMinutes) {
  timeoutMs = (timeoutMinutes - 1) * 60000;
  isOwner = $("meta[name=user-is-account-owner]").attr("content") == "true";
  confirmationMessage = "You are about to be logged out for security purposes. Click OK to reload the page and maintain your session.";

  if (isOwner) {
    setTimeout(function() {
      if (confirm(confirmationMessage)) { window.location.reload() }
    }, timeoutMs)
  }
}

oZoom.faceboxHtml = '\
<div id="facebox" style="display:none;">\
  <div class="popup">\
    <table>\
      <tbody id="facebox-tbody">\
        <tr>\
          <td class="tl"/><td class="b"/><td class="tr"/>\
        </tr>\
        <tr>\
          <td class="b"/>\
          <td class="body">\
            <div class="content">\
            </div>\
            <div class="footer">\
              <a href="#" class="close">\
                <img src="/javascripts/lib/facebox/closelabel.gif" title="close" class="close_image" />\
              </a>\
            </div>\
          </td>\
          <td class="b"/>\
        </tr>\
        <tr>\
          <td class="bl"/><td class="b"/><td class="br"/>\
        </tr>\
      </tbody>\
    </table>\
  </div>\
</div>';

oZoom.faceboxSettings = {
  faceboxHtml:  oZoom.faceboxHtml,
  loadingImage: '/javascripts/lib/facebox/loading.gif',
  closeImage:   '/javascripts/lib/facebox/closelabel.gif'
};

oZoom.minToHumanTime = function(int){
  if (int == 1440) {
    return "12:00 am"
  } else {
    var ampm = 'am';
    var hours = int / 60;
        hours = parseInt(hours);
    var minutes = '' + int % 60;
    while (minutes.length < 2) { minutes = '0' + minutes; }
    if (hours >= 13) {
      hours = hours - 12;
      ampm = 'pm';
    } else {
      if (hours == 12) {
        ampm = 'pm'
      }
      if (hours == 0) {
        hours = 12
      }
    }
    time = '' +hours + ":" + minutes + " " + ampm;
    return time
  }
}

oZoom.tableRowActions = function(options) {
  $('ul.action-list', options.scope).hide();
  $('a.button').click(function(){
    event.preventDefault();
    $('ul.action-list', options.scope).hide();
    $row = $(this).closest('tr')

    if ($row.hasClass('active')) {
      $row.removeClass('active');
    } else {
      $(options.scope).find('table tr').removeClass('active');
      $row.addClass('active');
      $row.find('ul.action-list').show();
    }
  });
}

oZoom.newFromTemplate = function(options) {
  var newId = new Date().getTime();
  $(options.appendTo).append(options.template.replace(/NEW_RECORD/g, newId));
  if(options.success) options.success();
}

$.fn.geoCodeAndFillOnClick = function(options) {
  defaults = {
    addressFieldSelectors: ['input.address1','input.city','.state select','input.zip'],
    canvasId: "map_canvas",
    geoCodeFailureMessage: "We couldn't geocode your address, please check the fields for accuracy",
    latSelector: ".lat",
    lngSelector: ".lng"
  }

  options = $.extend({}, defaults, options)
  return this.each(function(){
    $(this).click(function(){
      geocoder = new google.maps.Geocoder();
      address  = oZoom.addressFromFields(options.addressFieldSelectors);
      geocoder.geocode( { 'address': address }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          oZoom.drawMap({
            canvasId: options.canvasId,
            point: results[0].geometry.location
          });
          $(options.latSelector).val(results[0].geometry.location.lat())
          $(options.lngSelector).val(results[0].geometry.location.lng())
        } else {
          alert(options.geoCodeFailureMessage);
        };
      });
      return false;
    });
    if (oZoom.addressFromFields(options.addressFieldSelectors) != "") {
      $(this).trigger("click");
    }
  });
}

$.fn.loadMenu = function(){
  return this.each(function(){
    $this = $(this);
    $("ul#sections a").live('click', function(){
      event.preventDefault();
      menu = $this.data('menu')
      link = this;
      $(link).parents("ul").find("li").removeClass('active');
      $(link).parent().addClass("active");
      section = null;
      $.each(menu.sections, function(i, s){
        if (s.name == link.innerHTML) section = s; 
      });
      sectionHTML = ""
      $.each(section.foods, function(i, food) {
        price = parseFloat(food.price).toFixed('2').toString()
        html = '<div class="food" id="food-' + food.id + '"><span class="name">' + food.name + '</span><span class="price">$' + price + '</span></div>'
        sectionHTML = sectionHTML + html
      })
      $('#section').html(sectionHTML)
    })
    
    $.getJSON(location.pathname + '/menu.json', function(menu){
      $this.data("menu",menu)
      $this.append('<h1>' + menu.name + '</h1>')
      sections = "";
      $.each(menu.sections, function(i, section){
        sections = sections + '<li><a id="section-' + i + '">' + section.name + '</a></li>';
      });
      $this.append($('<ul id="sections">' + sections + '</ul>'));
      $this.append($('<div id="section">'))
      $this.find("ul#sections li:first-child a").trigger('click')
    });
  });
}

$.fn.actionButton = function() {
  return this.each(function(){
    $link = $(this)
    $link.click(function(event){
      $list = $(this).closest('ul')
      if ($list.hasClass("active")) {
        $list.removeClass("active")
      } else {
        $list.addClass("active")
      }
      event.preventDefault()
    })
  })
}

$.fn.hourSlider = function() {
  this.each(function(){
    $(this).slider({
      range: true,
      min: 0,
      max: 1440,
      step: 5,
      values: [
        $(this).parent().find('input.open').val(),
        $(this).parent().find('input.close').val()
      ],
      slide: function(event, ui) {
        $(this).parent().find('span.open').html(oZoom.minToHumanTime(ui.values[0]));
        $(this).parent().find('span.close').html(oZoom.minToHumanTime(ui.values[1]));
        $(this).parent().find('input.open').val(ui.values[0]);
        $(this).parent().find('input.close').val(ui.values[1]);
      }
    });
  });
}

$.fn.updateThis = function() {
  return this.each(function(){
    $this = $(this)
    $.PeriodicalUpdater(window.location.pathname.toString(), {
      minTimeout: 1000,
      maxTimeout: 30000
    }, function(data) {
      newHtml = $(data).find('#' + $this.attr('id')).html()
      oldHtml = $this.html()
      if (newHtml != oldHtml) { $this.html(newHtml) }
    });
  });
}

$.fn.bindCheckbox = function(options) {
  return this.each(function(){ 
    $(this).change(function(){
      if ($(this).filter(':checked').val()) {
        options.checked();
      } else {
        options.unchecked();
      }
    }).trigger('change');
  });
}

$.fn.loadMenus = function(){
  return this.each(function(){
    $menuSection = $(this);
    $.getJSON(window.location.pathname + '/menus', function(menus){
      if (menus.length == 1) {
        oZoom.loadMenuInto('#menu', menus[0]);
      } else {

        menusListHTML = Mustache.to_html(oZoom.menuListTemplate, { menus : menus })
        $menuSection.prepend(menusListHTML);

        $menuSection.find('ul li a.menu').click(function (event){
          index = $(this).parents('li').index();
          oZoom.loadMenuInto('#menu', menus[index], true);
          $('.menusList').hide();
          event.preventDefault();
        });

      }
    });
  })
}

oZoom.loadMenuInto = function(el, menu, backbutton){
  $targetElement = $(el)
  $targetElement.
    data("menu-id", menu.id).
    empty().
    append('<div class="header"><h1></h1></div>').
    find('> .header').
      append(function(){
        if (menu.description) {
          return $(this).append('<p>' + menu.description + '</p>')
        }
      }).
      find('h1').
        html(menu.name).
        after(function(){
          if (backbutton) {
            return '<p><a class="back" href="#menus">All menus</a></p>'
          }
        }).
        end().
      find('a.back').click(function(){
        $targetElement.empty();
        $('.menusList').show();
      })

  $.each(menu.menu_sections, function(i, menu_section){
    $menuSection = $('<div class="menu-section"><div class="header"><h1>' + menu_section.name +'</h1></div><div class="contents"></div></div>').
      attr('id', 'menuSection-' + menu_section.id).
      data('menu_section', menu_section).
      find('.header').
        click(function(){
          $(this).parent('.menu-section').loadMenuSection();
        }).
        end().
      appendTo($targetElement);
  });
}

$.fn.loadMenuSection = function() {
  return this.each(function() {
    // $(this).click(function() {
      $menuSection = $(this)
      menu_section = $menuSection.data('menu_section')
      
      $contents = $menuSection.find('div.contents')
      
      if ($menuSection.data('loaded')) {
        $contents.slideToggle();
        return false
      } else {
        $contents.hide();
      }
      
      if (menu_section.description) {
        $contents.append('<p class="description">' + menu_section.description + '</p>')
      }
      
      // if (menu_section.foods.length > 0) {
      $contents.append('<dl class="foods"></dl>')
      
      $.each(menu_section.foods, function(i, food) {
        $food = $('<form class="food"></form>')
        
        $dt = $('<dt class="food has-details"><span class="name">' + food.name + '</span></dt>');
        $dd = $('<dd class="food-details"></dd>');

        if (parseFloat(food.price) > 0) {
          $dt.append(' <span class="price">' + oZoom.numberToCurrency(food.price) + '</span>');
        }
        
        if ( !food.description && (food.options.length == 0)) {
          
          $dt.removeClass("has-details");
          $dt.append(' <a href="#" class="action add-to-cart">Add to cart</a>');

        } else {

          if (food.description) {
            $dd.append('<p class="description">' + food.description + '</p>');
          }

          if (food.options.length > 0) {
            $dt.append('<a href="#" class="action">Customize...</a>');
            options = [];
            options.push('<ul>')
            $.each(food.options, function(i, option) {
              var checked = "",
                  price = '';

              if (option.included == true) { checked = ' checked'; }
              if (parseFloat(option.price) > 0) price = oZoom.numberToCurrency(option.price)
              options.push('\
              <li>\
                <input type="checkbox" name="option_ids[]"  value="' + option.id + '"' + checked + ' />\
                ' + option.name + ' \
                ' + price + '\
                <input type="hidden" name="option-' + option.id +'-name" value="' + option.name + '" />\
                <input type="hidden" name="option-' + option.id +'-price" value="' + option.price +'" />\
              </li>\
              ')
            })
            options.push('</ul>')
            $dd.append(options.join(''))
          } else {
            $dt.append(' <a href="#" class="action">More...</a>');
          }

          $dd.append('<p><a href="#" class="add-to-cart">Add to cart</a></p>').hide();
        }
        
        $dt.append(function() {
          return '\
          <input type="hidden" name="food-id" value="' + food.id + '" />\
          <input type="hidden" name="food-name" value="' + food.name + '" />\
          <input type="hidden" name="food-price" value="' + food.price + '" />'
        })
        
        $food.
          append($dt).
          append(function(){
           if ($dd.html() != '') return $dd
          })
        
        $contents.find('dl').append($food)

      });
      $contents.slideToggle(); // Slide to reveal on initial load
      $menuSection.data('loaded', true)
  })
}

$.fn.addToCart = function(){
  return this.each(function(){
    $form = $(this)

    oZoom.cart.restaurant_id = $('meta[name=restaurant-id]').attr('content')
    menu_id = $('#menu').data('menu-id')

    // Set menuId of the cart and make sure it's consistent
    if (oZoom.cart.menu_id && (oZoom.cart.menu_id != menu_id)) {
      alert('please only add items from one menu');
      return false;
    } else {
      oZoom.cart.menu_id = menu_id
    }

    // Add JSON representation to cart
    oZoom.cart.items.push($form.buildCartItem())

    // Save to session cart
    $.post('/cart', { cart: JSON.stringify(oZoom.cart) }, function(){
      $('.cart').renderCart(oZoom.cart);
    });
  });
}

$.fn.buildCartItem = function(){
  $form = $(this)
  var cartItem = {
    'id'    : $form.find('input[name=food-id]').val(),
    'name'  : $form.find('input[name=food-name]').val(),
    'price' : $form.find('input[name=food-price]').val()
  }
  var option_ids = [];
  var options = [];

  $form.find('input[name=option_ids[]]:checked').each(function(){ option_ids.push($(this).val()) });

  if (option_ids.length) {
    $.each(option_ids, function(i, item_id){
      options.push({
       'id' : item_id,
       'name' : $form.find('input[name=option-' + item_id + '-name]').val(),
       'price' : $form.find('input[name=option-' + item_id + '-price]').val(),
      });
    });
  }
  if (options != undefined) cartItem.options = options;
  return cartItem;
}

$.fn.renderCart = function() {
  return this.each(function() {
    $el = $(this).empty();
    if ( oZoom.cart.items.length > 0 ) {
      $el.append(oZoom.cartTemplate);
      var items = []
      var item_prices = []

      $.each(oZoom.cart.items, function(i, cartItem) {
        price = parseFloat(cartItem.price);
        $.each(cartItem.options, function(i, option) {
          price = price + parseFloat(option.price);
        })

        cartItem = oZoom.cartItemTemplate.
          replace(/{{itemPrice}}/, oZoom.numberToCurrency(price)).
          replace(/{{itemName}}/, cartItem.name);
        items.push(cartItem);
      });
      summary = oZoom.cartSummaryTemplate.
        replace(/{{cartSubtotal}}/, oZoom.numberToCurrency(oZoom.totalForCart())).
        replace(/{{cartSalesTax}}/, oZoom.numberToCurrency(oZoom.salesTaxForCart())).
        replace(/{{cartGrandTotal}}/, oZoom.numberToCurrency(oZoom.grandTotalForCart()))
      $el.
        find('table').
          append(items.join('')).
          append(summary).
          append(function(){
            restaurantOpen = ($('meta[name=restaurant-open]').attr('content') == "true")
            if (restaurantOpen) {
              return '<p><a class="checkoutButton" href="/orders/new">Checkout</a></p>'
            } else {
              return '<p>Restaurant is currently closed</p>'
            }
          }).
          end().
        append(function(){
          deliveryFee = parseFloat($('meta[name=restaurant-delivery-fee]').attr('content'))
          if (deliveryFee > 0) {
            return '<p>A delivery fee of ' + oZoom.numberToCurrency(deliveryFee) + ' will be added to your total if you choose delivery.</p>'
          }
        })
    }
  });
}

oZoom.totalForCart = function() {
  total = 0;
  $.each(oZoom.cart.items, function(i, item) {
    total = total + parseFloat(item.price);
    
    if (item.options) {
      $.each(item.options, function(i, option) {
        total = total + parseFloat(option.price);
      })
    }
    
  })
  return total;
}

oZoom.salesTaxForCart = function() {
  total = parseFloat(oZoom.totalForCart());
  taxRate = parseFloat($('meta[name=restaurant-sales-tax-rate]').attr('content'));
  return total * taxRate;
}

oZoom.grandTotalForCart = function() {
  return oZoom.totalForCart() + oZoom.salesTaxForCart();
}

oZoom.restaurantIsDelivering = function() {
  if ($('meta[name=restaurant-delivering]').attr('content') == "true") return true
}

oZoom.restaurantIsOpen = function() {
  if ($('meta[name=restaurant-open]').attr('content') == "true") return true
}

oZoom.deleteCartItemAtIndex = function(index) {
  oZoom.cart.items.splice(index, 1) // remove '1' item from position 'index'
  $.post('/cart', { cart: JSON.stringify(oZoom.cart) });
  $('.cart').renderCart(oZoom.cart);
}

oZoom.numberToCurrency = function(amount) {
	var i = parseFloat(amount);
	if(isNaN(i)) { i = 0.00; }
	var minus = '';
	if(i < 0) { minus = '-'; }
	i = Math.abs(i);
	i = parseInt((i + .005) * 100);
	i = i / 100;
	s = new String(i);
	if(s.indexOf('.') < 0) { s += '.00'; }
	if(s.indexOf('.') == (s.length - 2)) { s += '0'; }
	s = minus + s;
	s = '$' + s;
	return s;
}

oZoom.cart = { items: []}

oZoom.foodTemplate = '\
<form class="food">\
  <header>\
    <h2 class="name"></h2>\
  </header>\
  <ul class="options"></ul>\
  <input type="hidden" name="food-id" />\
  <input type="hidden" name="food-name" />\
  <input type="hidden" name="food-menu-id" />\
  <input type="hidden" name="food-price" />\
  <input type="submit" value="Add to cart">\
</form>'

oZoom.menuListTemplate = '\
<div class="menusList">\
  <h1>Menus</h1>\
  <p>Please choose from one of our available menus. Please note, you may only place an order containing items from one menu at a time.</p>\
  <ul class="menus">\
  {{#menus}}\
    <li><a href="#" class="menu">{{name}}</a></li>\
  {{/menus}}\
  </ul>\
</div>'

oZoom.cartTemplate = '\
<h2>Your order</h2>\
<p><a href="#" class="delete-cart">Delete cart</a></p>\
<table width="100%">\
  <thead>\
    <tr>\
      <th>Item</th>\
      <th>Price</th>\
    </tr>\
  </thead>\
</table>\
'

oZoom.cartItemTemplate = '\
<tr>\
  <td>{{itemName}} <span class="remove">[remove]</span></td>\
  <td>{{itemPrice}}</td>\
</tr>\
'

oZoom.cartSummaryTemplate = '\
<tr>\
  <th class="right">Subtotal</th>\
  <th class="total">{{cartSubtotal}}</th>\
</tr>\
<tr>\
  <th class="right">Tax</th>\
  <th class="total">{{cartSalesTax}}</th>\
</tr>\
<tr>\
  <th class="right">Grand Total</th>\
  <th class="total">{{cartGrandTotal}}</th>\
</tr>\
'

oZoom.updateCartTotal = function () {
  var type = $('input[name=order[kind]]').filter(':checked').val();
  if (type == 'delivery') {
    subTotal = parseFloat($(".delivery-subtotal").html())
  } else {
    subTotal = parseFloat($(".pickup-subtotal").html())
  }
  gratuity = parseFloat($('input#order_gratuity').val())
  if (isNaN(gratuity)) {
    gratuity = 0;
  }
  grandTotal = subTotal + gratuity;
  $('span.total').html(oZoom.numberToCurrency(grandTotal))
}

oZoom.adjustCheckoutFormForFulfillmentType = function (fulfillmentType) {
  $('tr.delivery-fee').hide()
  $('.address').hide();
  if (fulfillmentType == 'pickup') {
    $('tr.delivery-fee').hide()
    $('.address').remove();
  } else {
    if (fulfillmentType == 'delivery') {
      $('tr.delivery-fee').show()
      if ($('.address').length == 0) {
        oZoom.newFromTemplate({
          template: address,
          appendTo: '#order-contact-info'
        });
      }
      $('.address').show();
    }
  }
}

oZoom.setupCheckoutForm = function () {
  $('input[name=order[kind]]').change( function () {

    fulfillmentType = $(this).filter(':checked').val();
    oZoom.adjustCheckoutFormForFulfillmentType(fulfillmentType);
    oZoom.updateCartTotal();

  }).trigger('change');

  $('form').submit(function () {
    $.fancybox.showActivity();
  })

  $('input#order_gratuity').keyup(function(){
    oZoom.updateCartTotal();
  });
}
