$(document).ready(function() {
    initiate_geolocation(); 
});

function get_stations(position) {
    var latitude = position.coords.latitude;
    var longitude = position.coords.longitude;
    $.getJSON("stations/closest?lat="+latitude+"&long="+longitude+".json",function(data) {
        //console.info(data);
        $('div#loading').children().hide();
        $('h2#nearest_stations').show();
        render_results(data);
    });
};    

function initiate_geolocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(handle_geolocation_query,handle_errors); // get position
        navigator.geolocation.watchPosition(handle_position_change); // defines position change callback
    } else {
        $('#loading').children().hide();
        $('#unsupported').children().show();
    };
};

function handle_geolocation_query(position){
    global_position = position;
    get_stations(position);
};

function handle_position_change(position) {
    global_position = position;
    get_stations(position);
};

function handle_errors(error)
{
    switch(error.code)
    {
        case error.PERMISSION_DENIED: alert("user did not share geolocation data");
        break;

        case error.POSITION_UNAVAILABLE: alert("could not detect current position");
        break;

        case error.TIMEOUT: alert("retrieving position timed out");
        break;

        default: alert("unknown error");
        break;
    };
};

function calculateDistance(lat1, lon1, lat2, lon2) {
    var R = 6371; // km
    var dLat = toRad(lat2-lat1);
    var dLon = toRad(lon2-lon1); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c;
    return d;
};

function toRad(convert) {
    return convert * Math.PI / 180;
};

function render_results(closest_stations) {
    //console.info(closest_stations);
    var station = $('#results li.station:first').clone();
    var line = $('#results div.line:first').clone();
    var train = $('#results li.station:first li.train:first').clone();
    $('#results li.station.cloned').remove();
    for (var i=0; i < 3; i++) {
        var new_station = station.clone().show().addClass('cloned');
        $(new_station)
            .attr('id',closest_stations[i].Station.id)
            .find('h3').html(closest_stations[i].Station.name);
        $(new_station).find('span.miles').html(closest_stations[i].Station.distance);
        $(new_station).find('span.km').html((Math.round((closest_stations[i].Station.distance*1.61)*100)/100));
        $(new_station).find('span.walking_time').html(closest_stations[i].Station.walking_time); 
        $(new_station).find('a.maps_link').attr('href','http://maps.google.co.uk/maps?f=d&source=s_d&saddr='+global_position.coords.latitude+','+global_position.coords.longitude+'&daddr='+closest_stations[i].Station.latitude+','+closest_stations[i].Station.longitude+'&hl=en&dirflg=w');
        for (pre_index in closest_stations[i]) {
            if ($(closest_stations[i][pre_index]).attr('id')==undefined) {
                // loop through the lines
                for (line_index in closest_stations[i][pre_index]['Line']) {
                    var new_line = line.clone().show();
                    $(new_line).addClass(closest_stations[i].Station.Line[line_index].name).find('div.line_name').html("<span class='"+closest_stations[i].Station.Line[line_index].name+" line'>"+closest_stations[i].Station.Line[line_index].name+"</span>");
                    // loop through each train
                    for (train_index in closest_stations[i][pre_index]['Line'][line_index]) {
                        for (train_index1 in closest_stations[i][pre_index]['Line'][line_index][train_index]) {
                            //console.info(closest_stations[i][pre_index]['Line'][line_index][train_index][train_index1]);
                            var new_train = train.clone().show();
                            $(new_train).find('span.time').html(closest_stations[i][pre_index]['Line'][line_index][train_index][train_index1].time);
                            $(new_train).find('span.direction').html(closest_stations[i][pre_index]['Line'][line_index][train_index][train_index1].direction);
                            //console.info(closest_stations[i][pre_index]['Line'][line_index][train_index]);
                            $(new_train).find('span.destination').html(closest_stations[i][pre_index]['Line'][line_index][train_index][train_index1]['Destination'].name);
                            countdown(closest_stations[i][pre_index]['Line'][line_index][train_index][train_index1].departure,$(new_train).find('span.time_left'));
                            countdown(closest_stations[i][pre_index]['Line'][line_index][train_index][train_index1].party_time,$(new_train).find('span.party_time'));
                            if (closest_stations[i][pre_index]['Line'][line_index][train_index][train_index1]['Via']!="") {
                                $(new_train).find('div.via').show();
                                $(new_train).find('span.via').html(closest_stations[i][pre_index]['Line'][line_index][train_index][train_index1]['Via'].name);
                            };
                            $(new_line).find('ul.trains').append(new_train).show();
                        }
                    }
                    $(new_station).append(new_line).show();
                }
            };
        }
        $('#results').append(new_station);
    };
};

function countdown(end_time,element) {
    var start_time = new Date();
    ph1 = parseInt(start_time.getHours());
    ph2 = parseInt(end_time.hours);
    pm1 = parseInt(start_time.getMinutes());
    pm2 = parseInt(end_time.minutes);
    ps1 = parseInt(start_time.getSeconds());
    ps2 = parseInt(end_time.seconds);
    if (ph2<5) {
        ph2 += 24;
    };
    if(pm2 < pm1){
        pm2 = pm2 + 60;
        ph2 = ph2 - 1;
    }
    if (ps2 < ps1) {
        ps2 += 60;
        pm2 -= 1;
    };
    sdiff = ps2 - ps1;
    mdiff = pm2 - pm1;
    hdiff = ph2 - ph1;
    if(hdiff == 0) answer = mdiff + ' minutes and '+sdiff+' seconds';
    else if(hdiff == 1&&(mdiff!=1)) answer = '1 hour and ' + mdiff + ' minutes';
    else if(hdiff == 1) answer = '1 hour and ' + mdiff + ' minute';
    else if(hdiff > 1&&mdiff==1) answer = hdiff + ' hours and ' + mdiff + ' minute';
    else answer = hdiff + ' hours and ' + mdiff + ' minutes';
    $(element).html(answer);
    setTimeout(function(){countdown(end_time,element)},500);
};

function fnGetDomain(url) {
   return url.match(/:\/\/(.[^/]+)/)[1];
};

var global_position = null; // stores user's current position

// stores base url
var baseUrl = "http://"+fnGetDomain(window.location.href);
