Legado

En la versión 1.2 usamos require y eso nos ha permitido ordenar un poco más el código. Anteriormente esto era la aplicación:

/**
 * Welcome to Pebble.js!
 *
 * This is where you write your app.
 */

var UI = require('ui');
var paradas = require('ajax');
var llegadas = require('ajax');
var Vector2  = require('vector2');
var Settings = require('settings');

var splashWindow = new UI.Window();

var text = new UI.Text({
  position: new Vector2(0, 0),         
  size: new Vector2(144, 168),
  text: 'Buscando paradas cercanas',
  font: 'GOTHIC_28_BOLD',
  color: 'white',
  textOverflow: 'wrap',
  textAlign: 'center',
  backgroundColor: 'black'
});

var distancia = Settings.data('distancia');

if (!distancia) {
  distancia = 150;
  Settings.data('distancia', distancia);
}

/* ESTA ES LA ZONA DONDE ESTÁN LAS FUNCIONES NECESARIAS PARA LA GEOLOCALIZACIÓN
   Y LA BUSQUEDA DE LOS TIEMPOS DE ESPERA DE LAS PARADAS */

// Genera los elementos del menú de paradas cercanas
var parseaParadas = function (stops) {
  var items = [];
  for (var i = 0; i < stops.length; i++) {
    var title = stops[i].stopId;
//    var subtitle = data.stop[i].postalAddress.replace(/\W+/g, " ");
    var subtitle = stops[i].postalAddress;
    console.log('Prueba: ' + title + ' ' + subtitle);
    items.push({
      title: title,
      subtitle: subtitle
    });
  }                     
  return items;
};


// Genera los elementos del menú de paradas cercanas
var parseaLlegadas = function (data) {
  var items = [];
  var arrives = data.arrives;
  if (arrives.constructor !== Array) {
    console.log('Llegadas no es un array');
    arrives = new Array(arrives);
  }
  for (var i = 0; i < arrives.length; i++) {
    var title = arrives[i].lineId + ' - ' + arrives[i].destination;
    var time;
    var distance;
    if (arrives[i].busTimeLeft == 999999 ) {
      time = 'Más de 20 min.';
    } else {
      time = Math.round(arrives[i].busTimeLeft / 60) + ' min.';
    }
    if (arrives[i].busDistance == -1) {
      distance = '';
    } else {
      distance = ' - ' + arrives[i].busDistance + 'm';
    }
    var subtitle = time + distance;

    items.push({
      title: title,
      subtitle: subtitle
    });
  }                     
  return items;
};


var proximasLlegadas = function (Parada) {
  
  text.text('Obteniendo próximas llegadas');
  splashWindow.add(text);
  splashWindow.show();
  
  var arrivesURL = 'http://openbus.emtmadrid.es/emtmadrid/arrives/' + Parada.stopId;
  llegadas(
    {
      url: arrivesURL,
      type: 'json'
    },
    function(data) {
      if ('arrives' in data) {
        var llegadasMenuItems = parseaLlegadas(data);
        var llegadasMenu = new UI.Menu({
          sections: [{
            title: 'Datos de la parada',
            items: [{title: Parada.stopId, subtitle: Parada.postalAddress}]
          },
          {
            title: 'Próximas llegadas',
            items: llegadasMenuItems
          }]
        }); 
    
        llegadasMenu.show();
        splashWindow.hide();
      } else {
        text.text('Parada sin servicio');
      }
    },
    function(error){
      console.log('Ha ocurrido un error al recuperar las llegadas: ' + error);
      text.text('Servicio no disponible \nPrueba más tarde');
    }
  );
};

// Datos para la localización
var paradasCercanas = function () {
  
  text.text('Buscando paradas cercanas');
  splashWindow.add(text);
  splashWindow.show();

  var locationOptions = {
    enableHighAccuracy: true, 
    maximumAge: 10000, 
    timeout: 10000
  };

  function locationSuccess(pos) {
    var stopsURL = 'http://openbus.emtmadrid.es/emtmadrid/stops?latitude=' + pos.coords.latitude + '&longitude=' + pos.coords.longitude + '&radius=' + distancia;
//    stopsURL = 'http://openbus.emtmadrid.es/emtmadrid/stops?latitude=40.413897&longitude=-3.692898&radius=250';
    paradas(
      {
        url: stopsURL,
        type: 'json'
      },
      function(data) {
        if ('stop' in data) {

          var stops = data.stop;
          if (stops.constructor !== Array) {
            stops = new Array(stops);
          }

          var paradasMenuItems = parseaParadas(stops);
    
          var paradasMenu = new UI.Menu({
            sections: [{
              title: 'Paradas cercanas',
              items: paradasMenuItems
            }]
          }); 
    
          paradasMenu.on('select', function(e) {
            var parada = stops[e.itemIndex];
            proximasLlegadas(parada);
          });
      
          paradasMenu.on('longSelect', function(e) {
            var favoritos = Settings.data('favoritos');
            if (!favoritos) {
              favoritos = [];
            }
            
            var parada = stops[e.itemIndex];

            var favoritoCard = new UI.Card({
              title: 'Guardar parada',
              subtitle: parada.stopId,
              action: {
                up: 'images/action_icon_discard.png',
                down: 'images/action_icon_check.png'
              }
            });
            
            favoritoCard.on('click', 'up', function(){
              favoritoCard.hide();
            });
            
            favoritoCard.on('click', 'down', function(){
              favoritos.push(parada);
              Settings.data('favoritos', favoritos);
              favoritoCard.hide();
            });
            
            favoritoCard.show();

          });
      
          paradasMenu.show();
          splashWindow.hide();

        } else {
          text.text('No hay ninguna parada en un radio de ' + distancia + ' metros');
        }
      },
      function(error) {
        console.log('Ha ocurrido un error al recuperar el listado de paradas: ' + error);
        text.text('Servicio no disponible \nPrueba más tarde');
      }
    );
  }

  function locationError(err) {
    console.log('location error (' + err.code + '): ' + err.message);
    text.text('Error de conexión \nAbre la app de Pebble en tu teléfono');
  }

  // Make an asynchronous request
  navigator.geolocation.getCurrentPosition(locationSuccess, locationError, locationOptions);  

};


var paradasFavoritas = function() {
  
  var favoritos = Settings.data('favoritos');
  
  if (!favoritos || favoritos.length === 0) {

    text.text('No hay favoritos guardados');
    splashWindow.add(text);
    splashWindow.show();

  } else {

    var paradasMenuItems = parseaParadas(favoritos);
    
    var paradasMenu = new UI.Menu({
      sections: [{
        title: 'Favoritas',
        items: paradasMenuItems
      }]
    }); 
    
    paradasMenu.on('select', function(e) {
      var parada = favoritos[e.itemIndex];
      proximasLlegadas(parada);
    });
    
    paradasMenu.on('longSelect', function(e) {
      var parada = favoritos[e.itemIndex];

      var favoritoCard = new UI.Card({
        title: 'Borrar parada',
        subtitle: parada.stopId,
        action: {
          up: 'images/action_icon_discard.png',
         down: 'images/action_icon_check.png'
        }
      });
            
      favoritoCard.on('click', 'up', function(){
        favoritoCard.hide();
      });
            
      favoritoCard.on('click', 'down', function(){
        favoritos.splice(e.itemIndex, 1);
        paradasMenuItems.splice(e.itemIndex, 1);
        Settings.data('favoritos', favoritos);
        paradasMenu.items(0, paradasMenuItems);
        favoritoCard.hide();
        
        if (favoritos.length === 0) {
          paradasMenu.hide();
        }
        
      });
            
      favoritoCard.show();

    });
  
    paradasMenu.show();
       
  }
  
};


var verAjustes = function() {

  var nuevaDistancia = distancia;
  var subtitle = nuevaDistancia + ' metros';
  var ajustesCard = new UI.Card({
    title: 'Radio de busqueda:',
    subtitle: subtitle,
    action: {
      up: 'images/action_icon_plus.png',
      select: 'images/action_icon_check.png',
      down: 'images/action_icon_minus.png'
    }
  });
  ajustesCard.on('click', 'up', function(){
    if (nuevaDistancia < 500) {
      nuevaDistancia += 10;
      ajustesCard.subtitle(nuevaDistancia + ' metros');
    }
  });
  ajustesCard.on('click', 'down', function(){
    if (nuevaDistancia > 100) {
      nuevaDistancia -= 10;
      ajustesCard.subtitle(nuevaDistancia + ' metros');
    }
  });
  ajustesCard.on('click', 'select', function(){
    distancia = nuevaDistancia;
    Settings.data('distancia', distancia);
    ajustesCard.hide();
  });
  ajustesCard.show();
};

// Pantalla de busqueda de paradas introduciendo el número de la misma

var searchWindow = function () {
  
  var inputWindow = new UI.Window();

  var numbers = [];
  var stopId = [0, 0, 0, 0];
  var begin = 7;
  var numberSelected = 0;
  
  var title = new UI.Text({
    position: new Vector2(0, 10),         
    size: new Vector2(123, 168),
    text: 'Parada',
    font: 'GOTHIC_28_BOLD',
    color: 'white',
    textOverflow: 'wrap',
    textAlign: 'center',
    backgroundColor: 'black'
  });
  
  inputWindow.add(title);
  inputWindow.action('up', 'images/action_icon_plus.png');
  inputWindow.action('down', 'images/action_icon_minus.png');
  inputWindow.action('select', 'images/action_icon_check.png');

  for (var i = 0; i < 4; i++) {
      begin = 7 + (i * 28);
    var number = new UI.Text({
      position: new Vector2(begin, 60),
      size: new Vector2(25, 40),
      text: stopId[i],
      font: 'GOTHIC_28_BOLD',
      color: 'white',
      textAlign: 'center',
      borderColor: 'white',
      backgroundColor: 'black'
    });
    numbers.push(number);
  }

  numbers[numberSelected].color('black');
  numbers[numberSelected].backgroundColor('white');

  for (i = 0; i < 4; i++) {
    inputWindow.add(numbers[i]);
  }

  inputWindow.show();

  inputWindow.on('click', 'up', function () {
    if (stopId[numberSelected] === 9) {
      stopId[numberSelected] = 0;
    } else {
      stopId[numberSelected] += 1;
    }
    numbers[numberSelected].text(stopId[numberSelected]);
  });

  inputWindow.on('click', 'down', function () {
    if (stopId[numberSelected] === 0) {
      stopId[numberSelected] = 9;
    } else {
      stopId[numberSelected] -= 1;
    }
    numbers[numberSelected].text(stopId[numberSelected]);
  });

  inputWindow.on('click', 'select', function() {
    if (numberSelected === 3) {
      var parada = stopId[0] * 1000 + stopId[1] * 100 + stopId[2] * 10 + stopId[3];
      var checkCard = new UI.Card({
        title: 'Próximas llegadas a parada:',
        subtitle: parada,
        action: {
          up: 'images/action_icon_discard.png',
          down: 'images/action_icon_check.png'
        }
      });
            
      checkCard.on('click', 'up', function(){
        numbers[numberSelected].color('white');
        numbers[numberSelected].backgroundColor('black');
        numberSelected = 0;
        numbers[numberSelected].color('black');
        numbers[numberSelected].backgroundColor('white');    
        checkCard.hide();
      });
            
      checkCard.on('click', 'down', function(){
        var paradaBuscar = {
          stopId: parada,
          postalAddress: ''
        };
        proximasLlegadas(paradaBuscar);
        checkCard.hide();
        inputWindow.hide();
      });
            
      checkCard.show();
  
    } else {
      numbers[numberSelected].color('white');
      numbers[numberSelected].backgroundColor('black');
      numberSelected += 1;
      numbers[numberSelected].color('black');
      numbers[numberSelected].backgroundColor('white');    
    }
  });
  
  inputWindow.on('longClick', 'select', function () {
    numbers[numberSelected].color('white');
    numbers[numberSelected].backgroundColor('black');
    numberSelected = 0;
    numbers[numberSelected].color('black');
    numbers[numberSelected].backgroundColor('white');    
  });
  
};

// ESTA ES LA ZONA DONDE SE DEFINE E INSTANCIA EL MENÚ PRINCIPAL

var principalMenu = new UI.Menu({
  sections: [{
    title: 'Paradas de la EMT',
    items: [{
      title: 'Cercanas',
      icon: 'images/menu_icon_location.png'
    }, {
      title: 'Favoritas',
      icon: 'images/menu_icon_starred.png'
    }, {
      title: 'Buscar',
      icon: 'images/menu_icon_search.png'
    }, {
      title: 'Ajustes',
      icon: 'images/menu_icon_settings.png'
    }]
  }]
});

principalMenu.on('select', function(e) {
  switch (e.itemIndex) {
    case 0:
      paradasCercanas();
      break;

    case 1:
      paradasFavoritas();
      break;

    case 2:
      searchWindow();
      break;

    case 3:
      verAjustes();
      break;

    default:
      paradasCercanas();
  }
});
      
principalMenu.show();