/**
*
* Crunchbutton
*
* @author: Devin Smith (http://devin.la)
* @date: 2012-06-20
*
*/
var App = {
cartHighlightEnabled: false,
currentPage: null,
tagline: '',
service: '/api/',
cached: {},
community: null,
page: {},
config: null,
forceHome: false,
cookieExpire: new Date(3000,01,01),
order: {
cardChanged: false,
pay_type: 'card',
delivery_type: 'delivery',
tip: 'autotip'
},
signin : {},
suggestion : {},
restaurants: {
permalink : 'food-delivery',
list: false
},
defaultTip: 'autotip',
defaultRange : 2,
modal: {},
hasBack: false,
_init: false,
_pageInit: false,
_identified: false,
isDeliveryAddressOk : false,
tips: [0,10,15,18,20,25,30],
touchX: null,
touchY: null,
touchOffset: null,
crunchSoundAlreadyPlayed : false,
useCompleteAddress : false, /* if true it means the address field will be fill with the address found by google api */
completeAddressWithZipCode : true,
boundingBoxMeters : 8000,
useRestaurantBoundingBox : false
};
App.alert = function(txt) {
setTimeout(function() {
alert(txt);
});
};
App.loadRestaurant = function(id) {
App.cache('Restaurant', id,function() {
if (!this.open()) {
App.alert("This restaurant is currently closed. It will be open during the following hours (" + this._tzabbr + "):\n\n" + this.closedMessage());
App.busy.unBusy();
} else {
if (this.redirect) {
location.href = this.redirect;
return;
}
var loc = '/' + App.restaurants.permalink + '/' + this.permalink;
History.pushState({}, 'Crunchbutton - ' + this.name, loc);
}
});
};
/**
* Loads up "community" keyword pages
*/
App.routeAlias = function(id, success, error) {
id = id.toLowerCase();
alias = App.aliases[id] || false;
success = success || function(){};
error = error || function(){};
if (alias) {
// Get the location of the alias
var loc = App.locations[alias.id_community];
if (loc.loc_lat && loc.loc_lon) {
var res = {
lat: loc.loc_lat,
lon: loc.loc_lon,
prep: alias.prep,
city: alias.name_alt,
address: alias.name_alt
};
App.loc.range = loc.range || App.defaultRange;
success({alias: res});
return;
}
}
error();
};
App.loadHome = function(force) {
$('input').blur();
App.currentPage = 'home';
History.pushState({}, 'Crunchbutton', '/');
App.page.home(force);
};
App.render = function(template, data) {
var compiled = _.template($('.template-' + template).html());
return compiled(data);
};
App.showPage = function(params) {
// Hides the pacman
App.controlMobileIcons.hidePacman();
// Hides the gift card message
App.credit.hide();
// switch here for AB testing
App.currentPage = params.page;
if (params.title) {
document.title = params.title;
}
// #1227 - on mobile view switch change location and profile buttons
App.controlMobileIcons.process( params.page );
// track different AB pages
if (params.tracking) {
App.track(params.tracking.title, params.tracking.data);
}
};
App.NGinit = function() {
$('body').attr('ng-controller', 'AppController');
angular.bootstrap(document,['NGApp']);
App.loc.init();
};
var NGApp = angular.module('NGApp', []);
NGApp.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {
$routeProvider
.when('/location', {
action: 'location',
controller: 'location',
templateUrl: 'view/location.html'
})
.when('/food-delivery', {
action: 'restaurants',
controller: 'restaurants',
templateUrl: 'view/restaurants.html'
})
.when('/food-delivery/:id', {
action: 'user.view',
controller: 'user',
templateUrl: 'view/user.html'
})
.when('/legal', {
action: 'legal',
controller: 'legal',
templateUrl: 'view/legal.html'
})
.when('/help', {
action: 'help',
controller: 'help',
templateUrl: 'view/help.html'
})
.when('/order/:id', {
action: 'order',
controller: 'order',
templateUrl: 'view/order.html'
})
.when('/cities', {
action: 'cities',
controller: 'cities',
templateUrl: 'view/cities.html'
})
.when('/giftcard/:id', {
action: 'giftcard',
controller: 'giftcard',
templateUrl: 'view/giftcard.html'
})
.when('/reset', {
action: 'reset',
controller: 'reset',
templateUrl: 'view/reset.html'
})
.otherwise({
action: 'home.default',
controller: 'default',
templateUrl: 'view/home.html'
})
;
$locationProvider.html5Mode(true);
}]);
// global route change items
NGApp.controller('AppController', function ($scope, $route, $routeParams) {
render = function() {
$('.splash').fadeOut(200, function() {
$('.content').fadeIn(300);
});
var renderAction = $route.current.action;
var renderPath = renderAction.split('.');
$scope.renderAction = renderAction;
$scope.renderPath = renderPath;
};
$scope.$on(
'$routeChangeSuccess',
function ($currentRoute, $previousRoute) {
console.log('route change' , $currentRoute)
// Update the rendering.
render();
/*
if (App.isChromeForIOS()){
App.message.chrome();
}
*/
}
);
});
/**
* Router init
* @todo replace with router
*/
App.loadPage = function() {
return;
// If the user is using Chrome for iOS show the message:
App.signin.checkUser();
// Force it!
setTimeout( function(){App.signin.checkUser()}, 500 );
if (!App.config) {
return;
}
// hide whatever we have
if (App._pageInit) {
$('.main-content').css('visibility','0');
} else {
App._pageInit = true;
}
switch (true) {
case new RegExp( App.restaurants.permalink + '$', 'i' ).test( cleaned_url ):
App.page.foodDelivery();
break;
case restaurantRegex.test(url):
App.page.restaurant(path[1]);
break;
default:
App.routeAlias( path[ 0 ],
function( result ){
App.loc.realLoc = {
addressAlias: result.alias.address,
lat: result.alias.lat,
lon: result.alias.lon,
prep: result.alias.prep,
city: result.alias.city
};
App.loc.setFormattedLocFromResult();
App.page.foodDelivery( true );
});
$('.footer').removeClass('footer-hide');
setTimeout(scrollTo, 80, 0, 1);
setTimeout( function(){ App.signin.checkUser(); }, 100 );
break;
}
if (App.config.env == 'live') {
$('.footer').addClass('footer-hide');
}
App.refreshLayout();
$('.main-content').css('visibility','1');
setTimeout( function(){ App.signin.checkUser(); }, 300 );
};
/**
* Refresh the pages layout for a blank page
*/
App.refreshLayout = function() {
setTimeout(function() {
scrollTo(0, 1);
}, 80);
};
/**
* Sends a tracking item to mixpanel, or to google ads if its an order
*/
App.track = function() {
if (App.config.env != 'live') {
// return;
}
if (arguments[0] == 'Ordered') {
$('img.conversion').remove();
mixpanel.people.track_charge(arguments[1].total);
var i = $('
').appendTo($('body'));
}
if (arguments[1]) {
mixpanel.track(arguments[0],arguments[1]);
} else {
mixpanel.track(arguments[0]);
}
};
/**
* Tracks a property to mixpanel
*/
App.trackProperty = function(prop, value) {
// || App.config.env != 'live'
if (!App.config) {
return;
}
var params = {};
params[prop] = value;
mixpanel.register_once(params);
};
/**
* Itendity the user to mixpanel
*/
App.identify = function() {
if (App.config.env != 'live') {
//return;
}
if (App.config.user.uuid) {
mixpanel.identify(App.config.user.uuid);
mixpanel.people.set({
$name: App.config.user.name,
$ip: App.config.user.ip,
$email: App.config.user.email
});
}
};
/**
* generate ab formulas
*/
App.AB = {
options: {
tagline: [
{
name: 'tagline-for-free',
tagline: 'Order the top food %s. For free.
After you order, everything is saved for future 1 click ordering.
Choose a restaurant:'
},
{
name: 'tagline-no-free',
tagline: 'Order the top food %s.
After you order, everything is saved for future 1 click ordering.
Choose a restaurant:'
}
],
slogan: [
{
name: 'slogan-push-food',
slogan: 'Push a button. Get Food.'
}
],
restaurantPage: [
{
name: 'restaurant-page-noimage'
},
{
name: 'restaurant-page-image',
disabled: true
}
],
dollarSign: [
{
name : 'show'
},
{
name : 'hide'
}
],
changeablePrice: [
{
name : 'show'
},
{
name : 'hide'
}
]
},
init: function() {
if (!App.config.ab) {
// we dont have ab variables. generate them
App.AB.create(true);
}
App.AB.load();
},
create: function(clear) {
if (clear) {
App.config.ab = {};
}
_.each(App.AB.options, function(option, key) {
if (App.config.ab[key]) {
return;
}
var opts = _.filter(App.AB.options[key], function(o) { return o.disabled ? false : true; });
var opt = opts[Math.floor(Math.random()*opts.length)];
App.config.ab[key] = opt.name
App.trackProperty('AB-' + key, opt.name);
});
App.AB.save();
console.log(App.config.ab);
},
load: function() {
App.slogan = _.findWhere(App.AB.options.slogan, {name: App.config.ab.slogan});
App.tagline = _.findWhere(App.AB.options.tagline, {name: App.config.ab.tagline});
if (!App.slogan || !App.tagline) {
App.AB.create(true);
App.AB.load(true);
}
},
save: function() {
$.ajax({
url: App.service + 'config',
data: {ab: App.config.ab},
dataType: 'json',
type: 'POST',
complete: function(json) {
}
});
}
};
App.busy = {
isBusy: function() {
return $('.app-busy').length ? true : false;
},
makeBusy: function() {
//el.addClass('button-bottom-disabled');
var busy = $('
')
.append($(''))
$('body').append(busy);
},
unBusy: function() {
$('.app-busy').remove();
//el.removeClass('button-bottom-disabled');
}
};
App.test = {
card: function() {
$('[name="pay-card-number"]').val('4242424242424242');
$('[name="pay-card-month"]').val('1');
$('[name="pay-card-year"]').val('2020');
$('[name="pay-name"]').val('MR TEST');
$('[name="pay-phone"]').val('***REMOVED***');
$('[name="pay-address"]').val( App.restaurant.address || "123 main\nsanta monica ca" );
App.order.cardChanged = true;
App.creditCard.changeIcons( $( '[name="pay-card-number"]' ).val() );
},
logout: function() {
$.getJSON('/api/logout',function(){ location.reload()});
},
cart: function() {
App.alert(JSON.stringify(App.cart.items));
},
clearloc: function() {
$.cookie('community', '', { expires: new Date(3000,01,01), path: '/'});
$.cookie('location_lat', '', { expires: new Date(3000,01,01), path: '/'});
$.cookie('location_lon', '', { expires: new Date(3000,01,01), path: '/'});
location.href = '/';
},
init: function() {
$$('.test-card').tap(function() {
App.test.card();
});
$$('.test-logout').tap(function() {
App.test.logout();
});
$$('.test-cart').tap(function() {
App.test.cart();
});
$$('.test-clearloc').tap(function() {
App.test.clearloc();
});
}
};
App.processConfig = function(json, user) {
if (user && !json) {
App.config.user = user;
} else {
App.config = json;
}
App.AB.init();
if (App.config.user) {
App.identify();
App.order['pay_type'] = App.config.user['pay_type'];
App.order['delivery_type'] = App.config.user['delivery_type'];
var lastTip = App.config.user['last_tip'] || 'autotip';
lastTip = App.lastTipNormalize( lastTip );
App.order['tip'] = lastTip;
}
};
App.updateAutotipValue = function() {
var subtotal = App.cart.totalbreakdown().subtotal;
var autotipValue
if(subtotal === 0) {
autotipValue = 0;
}
else {
// the holy formula - see github/#940
autotipValue = Math.ceil(4*(subtotal * 0.107 + 0.85)) / 4;
}
$('[name="pay-autotip-value"]').val(autotipValue);
var autotipText = autotipValue ? ' (' + ( App.config.ab && App.config.ab.dollarSign == 'show' ? '$' : '' ) + autotipValue + ')' : '';
$('[name=pay-tip] [value=autotip]').html('Autotip' + autotipText);
};
App.lastTipNormalize = function( lastTip ){
if( lastTip === 'autotip' ) {
return lastTip;
}
lastTip = parseInt( lastTip );
if( App.config.user && App.config.user.last_tip_type && App.config.user.last_tip_type == 'number' ){
return App.defaultTip;
}
// it means the last tipped value is not at the permitted value, return default.
if( App.tips.indexOf( lastTip ) > 0 ){
lastTip = lastTip;
} else {
lastTip = App.defaultTip;
}
return lastTip;
}
App.trigger = {
delivery: function() {
$('.delivery-toggle-takeout').removeClass('toggle-active');
$('.delivery-toggle-delivery').addClass('toggle-active');
$('.delivery-only').show();
App.order['delivery_type'] = 'delivery';
App.cart.updateTotal();
},
takeout: function() {
$('.delivery-toggle-delivery').removeClass('toggle-active');
$('.delivery-toggle-takeout').addClass('toggle-active');
$('.delivery-only, .field-error-zip').hide();
App.order['delivery_type'] = 'takeout';
App.cart.updateTotal();
},
credit: function() {
$('.pay-toggle-cash').removeClass('toggle-active');
$('.pay-toggle-credit').addClass('toggle-active');
$('.card-only').show();
App.order['pay_type'] = 'card';
App.cart.updateTotal();
},
cash: function() {
$('.pay-toggle-credit').removeClass('toggle-active');
$('.pay-toggle-cash').addClass('toggle-active');
$('.card-only').hide();
App.order['pay_type'] = 'cash';
App.cart.updateTotal();
}
}
/**
* global event binding and init
*/
$(function() {
App.test.init();
$(document).on('touchclick', '.signout-button', function() {
App.signin.signOut();
});
$(document).on('touchclick', '.signup-add-facebook-button', function() {
App.signin.facebook.login();
});
$(document).on('touchclick', '.change-location-inline', function() {
App.loadHome(true);
});
$(document).on('submit', '.button-letseat-formform', function() {
$('.button-letseat-form').trigger('touchclick');
return false;
});
$(document).on('touchclick', '.button-letseat-form', function() {
var success = function() {
App.page.foodDelivery(true);
};
var error = function() {
$('.location-address').val('').attr('placeholder','Oops! We couldn\'t find that address!');
// Log the error
App.log.location( { 'address' : address } , 'address not found' );
};
var address = $.trim($('.location-address').val());
if (!address) {
// the user didnt enter any address
$('.location-address').val('').attr('placeholder','Please enter your address here');
} else if (address && address == App.loc.address()) {
// we already have a geocode result of that address. dont do it again
success();
} else {
// we need a new geocode result set
if(App.loc.aproxLoc && App.loc.aproxLoc.lat && App.loc.aproxLoc.lon ){
App.loc.geocodeLocationPage(address, success, error);
} else {
App.loc.geocode(address, success, error);
}
}
});
$(document).on('touchclick', '.delivery-toggle-delivery', function(e) {
e.preventDefault();
e.stopPropagation();
App.trigger.delivery();
App.track('Switch to delivery');
});
$(document).on('touchclick', '.delivery-toggle-takeout', function(e) {
e.preventDefault();
e.stopPropagation();
App.trigger.takeout();
App.track('Switch to takeout');
});
$(document).on('touchclick', '.pay-toggle-credit', function(e) {
e.preventDefault();
e.stopPropagation();
App.trigger.credit();
App.track('Switch to card');
App.giftcard.notesField.listener();
});
$(document).on('touchclick', '.pay-toggle-cash', function(e) {
e.preventDefault();
e.stopPropagation();
App.trigger.cash();
App.track('Switch to cash');
App.giftcard.notesField.listener();
});
$(document).on('touchclick', '.location-detect', function() {
// detect location from the browser
$('.location-detect-loader').show();
$('.location-detect-icon').hide();
var error = function() {
$('.location-address').val('Oh no! We couldn\'t locate you');
$('.location-detect-loader').hide();
$('.location-detect-icon').show();
};
var success = function() {
App.page.foodDelivery();
// $('.location-detect-loader').hide();
// $('.location-detect-icon').show();
// $('.button-letseat-form').click();
};
App.loc.getLocationByBrowser(success, error);
});
$(document).on({
mousedown: function() {
$(this).addClass('location-detect-click');
},
touchstart: function() {
$(this).addClass('location-detect-click');
},
mouseup: function() {
$(this).removeClass('location-detect-click');
},
touchend: function() {
$(this).removeClass('location-detect-click');
}
}, '.location-detect');
$$('.link-help').tap(function(e) {
e.stopPropagation();
e.preventDefault();
History.pushState({}, 'Crunchbutton - About', '/help');
});
$$('.link-legal').tap(function(e) {
console.log('LEGAL', e)
e.stopPropagation();
e.preventDefault();
History.pushState({}, 'Crunchbutton - Legal', '/legal');
});
$$('.link-orders').tap(function(e) {
e.stopPropagation();
e.preventDefault();
History.pushState({}, 'Crunchbutton - Orders', '/orders');
});
if (App.isMobile()) {
// prevent double trigger
$(document).on('touchclick','input[type="checkbox"]', function(e) {
e.stopPropagation();
e.preventDefault();
});
// manually rebind checkbox events
$$('input[type="checkbox"]').tap(function(e) {
e.stopPropagation();
e.preventDefault();
$(this).checkToggle();
});
// manually rebind labels
$$('label[for]').tap(function(e) {
e.stopPropagation();
e.preventDefault();
var target = document.getElementById($(this).attr('for'));
if (target && target.tagName == 'INPUT') {
switch ($(target).attr('type')) {
case 'text':
case 'password':
case 'number':
case 'phone':
case 'tel':
$(target).focus();
break;
case 'checkbox':
$(target).checkToggle();
break;
}
}
$(this).checkToggle();
});
// manually bind links
// @todo: intercept for native app
$$('a[href]').tap(function(e) {
var el = $(this);
var href = el.attr('href');
if (!href || e.defaultPrevented) {
return;
}
if ($(this).attr('target')) {
window.open($(this).attr('href'), $(this).attr('target'));
} else {
location.href = $(this).attr('href');
}
});
// ignore all click events from acidently triggering on mobile. only use touchclick
$(document).on('click', function(e, force) {
e.stopPropagation();
e.preventDefault();
});
// touch events for restaurant list
$(document).on({
touchstart: function(e) {
if (navigator.userAgent.toLowerCase().indexOf('android') > -1) {
//return;
}
App.startX = event.touches[0].pageX;
App.startY = event.touches[0].pageY;
App.startOffset = document.all? iebody.scrollLeft : pageYOffset;
$(this).addClass('meal-item-down');
},
touchmove: function(e) {
App.touchX = event.touches[0].pageX;
App.touchY = event.touches[0].pageY;
App.touchOffset = document.all? iebody.scrollLeft : pageYOffset;
var maxDistance = 25;
if (Math.abs(App.startX-App.touchX) > maxDistance || Math.abs(App.startY-App.touchY) > maxDistance || Math.abs(App.startOffset-App.touchOffset) > maxDistance) {
$(this).removeClass('meal-item-down');
}
},
touchend: function(e) {
if (navigator.userAgent.toLowerCase().indexOf('android') > -1) {
//return;
}
if (App.busy.isBusy()) {
return;
}
var maxDistance = 25;
var r = $(this).closest('.meal-item').attr('data-permalink');
var c = $(this).closest('.meal-item').attr('data-permalink-community');
if ((App.touchX == null && App.touchY == null) || (Math.abs(App.startX-App.touchX) < maxDistance && Math.abs(App.startY-App.touchY) < maxDistance && Math.abs(App.startOffset-App.touchOffset) < maxDistance)) {
if (r) {
App.loadRestaurant(r);
} else if (c) {
History.pushState({},c,c);
App.routeAlias(c);
}
}
App.touchX = null;
App.touchY = null;
App.touchOffset = null;
$(this).removeClass('meal-item-down');
}
}, '.meal-item-content');
} else {
$(document).on({
mousedown: function() {
if (App.busy.isBusy()) {
return;
}
if (navigator.userAgent.toLowerCase().indexOf('ios') > -1) {
return;
}
$(this).addClass('meal-item-down');
var self = $(this);
var r = self.closest('.meal-item').attr('data-permalink');
var c = self.closest('.meal-item').attr('data-permalink-community');
setTimeout(function() {
if (r) {
App.loadRestaurant(r);
} else if (c) {
App.routeAlias(c);
}
},100);
},
mouseup: function() {
$(this).removeClass('meal-item-down');
}
}, '.meal-item-content');
}
/* Issue 1362 - Replaced the tap by singleTap even */
$$('.dish-item').singleTap(function(e) {
if ($(this).attr('data-id_dish')) {
/* Issue 1368 - Simulate the blink effect at mobile screen, -webkit-tap-highlight-color isn't working at android devices */
if( App.isNarrowScreen() && !App.iOS() ){
var item = $( this );
item.addClass( 'blink' );
setTimeout( function(){ item.removeClass( 'blink' ); }, 60 );
}
App.cart.add($(this).attr('data-id_dish'));
} else if ($(this).hasClass('restaurant-menu')) {
return;
}
});
$$('.your-orders a').tap(function() {
if ($(this).attr('data-id_order')) {
History.pushState({},'Crunchbutton - Your Order', '/order/' + $(this).attr('data-id_order'));
}
});
$$('.cart-button-remove').tap(function() {
App.cart.remove($(this).closest('.cart-item'));
});
$$('.cart-button-add').tap(function() {
App.cart.clone($(this).closest('.cart-item'));
});
$$('.cart-item-config a').tap(function() {
App.cart.customize($(this).closest('.cart-item'));
});
$$('.button-submitorder-form').tap(function(e) {
e.preventDefault();
e.stopPropagation();
App.crunchSoundAlreadyPlayed = false;
App.isDeliveryAddressOk = false;
App.cart.submit($(this),true);
});
$(document).on('touchclick', '.button-deliver-payment, .dp-display-item a, .dp-display-item .clickable', function() {
$('.payment-form').show();
$('.delivery-payment-info, .content-padder-before').hide();
});
$(document).on({
mousedown: function() {
$(this).addClass('button-bottom-click');
},
touchstart: function() {
$(this).addClass('button-bottom-click');
},
mouseup: function() {
$(this).removeClass('button-bottom-click');
},
touchend: function() {
$(this).removeClass('button-bottom-click');
}
}, '.button-bottom');
$(document).on('change', '.cart-customize-select', function() {
App.cart.customizeItem($(this));
});
$$('.cart-customize-check').tap( function() {
// For some reason this tap event have to wait a little time before runs the customizeItem method
// if we ignore this time it will not read attr checked of the checkbox correctly
var checkbox = $(this);
setTimeout( function(){
App.cart.customizeItem( checkbox );
}, 1 );
});
$$('.cart-item-customize-item label').tap(function() {
$(this).prev('input').checkToggle();
App.cart.customizeItem( $(this).prev('input') );
});
$(document).on('change', '[name="pay-tip"]', function() {
App.order.tip = $(this).val();
App.order.tipHasChanged = true;
var total = App.cart.total();
App.cart.updateTotal();
});
$$('.nav-back').tap(function() {
// App.controlMobileIcons.showPacman( 'left', function(){ $('.nav-back').removeClass('nav-back-show'); } );
$('.nav-back').removeClass('nav-back-show');
if( App.loc.locationNotServed ){
App.loc.locationNotServed = false;
App.loadHome(true);
} else {
History.back();
}
});
$$('.link-home').tap(function() {
if( App.restaurants.list && App.restaurants.list.length > 0 ){
App.page.foodDelivery();
} else {
App.loadHome(true);
}
});
$(document).on('change', '[name="pay-card-number"], [name="pay-card-month"], [name="pay-card-year"]', function() {
if( !App.order.cardChanged ){
var self = $( this );
var cardInfo = [ '[name="pay-card-number"]', '[name="pay-card-month"]', '[name="pay-card-year"]' ];
$( cardInfo ).each( function( index, value ){
var input = $( value );
if( self.attr( 'name' ) != input.attr( 'name' ) ){
input.val( '' );
}
} )
}
App.order.cardChanged = true;
});
// Listener to verify if the user typed a gift card at the notes field
$(document).on('blur', '[name=notes]', function(){
App.giftcard.notesField.listener();
} );
$(document).on('change, keyup', '[name="pay-card-number"]', function() {
App.creditCard.changeIcons( $(this).val() );
} );
$(document).on('keyup', '[name="pay-phone"]', function() {
$(this).val( App.phone.format($(this).val()) );
});
// make sure we have our config loaded
var haveConfig = function(json) {
$(document).trigger('have-config');
App.processConfig(json);
App._init = true;
App.NGinit();
// App.loadPage();
};
if (App.config) {
haveConfig(App.config)
} else {
$.getJSON('/api/config', haveConfig);
}
$$('.cart-summary').tap(function(e) {
e.stopPropagation();
e.preventDefault();
$('html, body').animate({
scrollTop: $('.cart-items').position().top-80
}, {
duration: 500,
specialEasing: {
scrollTop: 'easeInOutQuart'
}
});
});
if (App.isMobile() && !App.isAndroid() ) {
setInterval(function() {
var focused = $(':focus');
if (!focused.length) {
$('[data-position="fixed"]').show();
return;
}
focused = focused.get(0);
if (focused.tagName == 'SELECT' || focused.tagName == 'INPUT' || focused.tagName == 'TEXTAREA') {
$('[data-position="fixed"]').hide();
} else {
$('[data-position="fixed"]').show();
}
}, 100);
}
/*
var unHideBars = function() {
$('[data-position="fixed"]').show();
}
$(document).on('focus', 'select, input, textarea', function() {
if ($(window).width() >= 768 || navigator.userAgent.toLowerCase().indexOf('android') > -1 || $(this).hasClass('location-address')) {
return;
}
clearTimeout(App.unHideBars);
$('[data-position="fixed"]').hide();
});
$(document).on('blur', 'select, input, textarea', function() {
if ($(window).width() >= 768) {
return;
}
clearTimeout(App.unHideBars);
setTimeout(unHideBars, 100);
});
*/
var checkForDistance = function() {
if (App.order['delivery_type'] == 'takeout') {
return;
}
};
$(document).on('blur', '[name="pay-address"]', function() {
clearTimeout(App.checkForDistance);
App.checkForDistance = setTimeout(checkForDistance, 100);
});
$(document).on('change', '[name="pay-address"]', function() {
clearTimeout(App.checkForDistance);
App.checkForDistance = setTimeout(checkForDistance, 1000);
});
$(document).on('touchclick', '.config-icon', function() {
if (App.isNarrowScreen() && $(this).hasClass('config-icon-back-home')) {
App.controlMobileIcons.backHome();
} else {
var pacmanSide = (App.currentPage == 'restaurants') ? 'right' : 'left';
App.controlMobileIcons.showPacman( pacmanSide, function(){ $( '.sign-in-icon' ).addClass( 'config-icon-mobile-hide' ); } );
App.loadHome(true);
}
});
$(document).on('change', '[name="pay-address"], [name="pay-name"], [name="pay-phone"], [name="pay-card-number"], [name="notes"]', function() {
App.config.user.name = $('[name="pay-name"]').val();
App.config.user.phone = App.phone.format($('[name="pay-phone"]').val());
App.config.user.address = $('[name="pay-address"]').val();
App.config.user.card = $('[name="pay-card-number"]').val();
App.config.user.notes = $('[name="notes"]').val();
App.config.user.card_exp_month = $('[name="pay-card-month"]').val();
App.config.user.card_exp_year = $('[name="pay-card-year"]').val();
});
$(document).on('touchclick', '.content-item-locations-city', function() {
$( '.main-content' ).html( '' );
var permalink = $( this ).attr( 'permalink' );
App.routeAlias( permalink, function( result ){
App.loc.realLoc = {
addressAlias: result.alias.address,
lat: result.alias.lat,
lon: result.alias.lon,
prep: result.alias.prep,
city: result.alias.city
};
App.loc.setFormattedLocFromResult();
App.page.foodDelivery( true );
});
});
App.signin.init();
App.signup.init();
App.suggestion.init();
App.recommend.init();
App.loc.init();
App.credit.tooltip.init();
});
App.modal.contentWidth = function(){
if( $( window ).width() > 700 ){
return 280;
}
if( $( window ).width() <= 700 ){
return $( window ).width() - 50;
}
}
App.getCommunityById = function( id ){
for (x in App.communities) {
if( App.communities[x].id_community == id ){
return App.communities[x];
}
}
return false;
}
App.message = {};
App.message.show = function( title, message ) {
if( $( '.message-container' ).length > 0 ){
$( '.message-container' ).html( '' + title + '
' + message + '
' );
} else {
var html = '' +
'
' + title + '
' +
'
' +
message +
'
' +
'
';
$('.wrapper').append(html);
}
$('.message-container')
.dialog({
modal: true,
dialogClass: 'modal-fixed-dialog',
width: App.modal.contentWidth(),
close: function( event, ui ) { App.modal.shield.close(); },
});
}
App.playAudio = function( audio, callback ){
var audio = $( '#' + audio ).get(0);
try{
audio.addEventListener( 'ended', function() {
if( callback ){
callback();
}
});
audio.play();
} catch( e ){}
}
App.registerLocationsCookies = function() {
$.cookie('location_lat', App.loc.lat, { expires: new Date(3000,01,01), path: '/'});
$.cookie('location_lon', App.loc.lon, { expires: new Date(3000,01,01), path: '/'});
$.cookie('location_range', ( App.loc.range || App.defaultRange ), { expires: new Date(3000,01,01), path: '/'});
}
App.message.chrome = function( ){
var title = 'How to use Chrome',
message = '' +
'Just tap "Request Desktop Site.' +
'
' +
'' +
'
' +
'
';
App.message.show(title, message);
}
// Issue #1227
App.controlMobileIcons = {};
App.controlMobileIcons.process = function( page ){
if( !App.isNarrowScreen() ){
return false;
}
App.controlMobileIcons.normalize();
App.loc.locationNotServed = false;
$( '.sign-in-icon' ).removeClass( 'config-icon-mobile-hide' );
$( '.config-icon' ).removeClass( 'config-icon-mobile-hide' );
switch( page ){
case 'restaurant':
case 'order':
$( '.config-icon' ).addClass( 'config-icon-mobile-hide' );
break;
case 'home':
$( '.config-icon' ).addClass( 'config-icon-back-home' );
break;
case 'orders':
$( '.sign-in-icon' ).addClass( 'config-icon-mobile-hide' );
$( '.config-icon' ).addClass( 'config-icon-mobile-hide' );
break;
case 'restaurants':
$( '.sign-in-icon' ).addClass( 'left' );
$( '.config-icon' ).addClass( 'right' );
break;
}
}
App.controlMobileIcons.backHome = function(){
if( App.loc.locationNotServed ){
App.page.home( true );
} else {
if( App.restaurants.list && App.restaurants.list.length > 0 ){
App.page.foodDelivery();
} else {
History.pushState( {}, 'Crunchbutton', '/bycity' );
}
}
}
App.controlMobileIcons.normalize = function(){
$( '.sign-in-icon' ).removeClass( 'left' );
$( '.config-icon' ).removeClass( 'right' );
$( '.config-icon' ).removeClass( 'config-icon-back-home' );
}
App.controlMobileIcons.showPacman = function( side, call ){
$( '.pacman-' + side ).addClass( 'pacman-show' );
if( call ){ call(); }
}
App.controlMobileIcons.hidePacman = function(){
$( '.pacman-loading' ).removeClass( 'pacman-show' );
}
NGApp.filter('iif', function () {
return function(input, trueValue, falseValue) {
return input ? trueValue : falseValue;
};
});
NGApp.directive('ngTap', function () {
return function(scope, element, attrs) {
var tapping;
tapping = false;
element.bind('touchstart', function(e) {
element.addClass('active');
tapping = true;
});
element.bind('touchmove', function(e) {
element.removeClass('active');
tapping = false;
});
element.bind('touchend', function(e) {
element.removeClass('active');
if (tapping) {
scope.$apply(attrs['ngTap'], element);
}
});
};
});