var can_geolocate = false;
Storage.prototype.setObject = function(key, value) {
this.setItem(key, JSON.stringify(value));
};
Storage.prototype.getObject = function(key) {
return JSON.parse(this.getItem(key));
};
function touchmove(e) {
e.preventDefault();
}
function show_around( lat, long ) {
pc = $('#pc').val();
localStorage.latitude = lat;
localStorage.longitude = long;
localStorage.pc = pc;
$.mobile.changePage('around.html');
return false;
}
function valid_postcode(pc) {
var out_pattern = '[A-PR-UWYZ]([0-9]{1,2}|([A-HIK-Y][0-9](|[0-9]|[ABEHMNPRVWXY]))|[0-9][A-HJKSTUW])';
var in_pattern = '[0-9][ABD-HJLNP-UW-Z]{2}';
var full_pattern = '^' + out_pattern + in_pattern + '$';
var postcode_regex = new RegExp(full_pattern);
pc = pc.toUpperCase().replace(/\s+/, '');
if ( postcode_regex.test(pc) ) {
return true;
}
return false;
}
function checkConnection() {
var networkState = navigator.network.connection.type;
if ( networkState == Connection.NONE || networkState == Connection.UNKNOWN ) {
$('#main').hide();
$('#noconnection').show();
}
}
function use_lat_long( lat, long ) {
show_around( lat, long );
}
function location_error( msg ) {
if ( msg === '' ) {
$('#location_error').remove();
return;
}
alert(msg);
if ( !$('#location_error') ) {
$('#postcodeForm').after('
');
}
$('#location_error').text( msg );
}
function lookup_string(q) {
q = q.toLowerCase();
q = q.replace(/[^\-&\w ']/, ' ');
q = q.replace(/\s+/, ' ');
if (!q) {
location_error("Please enter location");
return false;
}
var url = "http://dev.virtualearth.net/REST/v1/Locations?q=" + escape(q);
url += '&c=en-GB&key=' + CONFIG.BING_API_KEY;
var x = jQuery.get( url, function(data, status) {
if ( status == 'success' ) {
var valid_locations = 0;
var latitude = 0;
var longitude = 0;
var multiple = [];
for ( i = 0; i < data.resourceSets[0].resources.length; i++ ) {
var details = data.resourceSets[0].resources[i];
if ( details.address.countryRegion != 'United Kingdom' ) { continue; }
var address = details.name;
latitude = details.point.coordinates[0];
longitude = details.point.coordinates[1];
latitude = latitude.toPrecision(6);
longitude = longitude.toPrecision(6);
multiple.push( { 'address': address, 'latitude': latitude, 'longitude': longitude } );
valid_locations += 1;
}
if ( valid_locations == 1 ) {
show_around( latitude, longitude );
} else if ( valid_locations === 0 ) {
location_error('Location not found');
$('#pc').select();
} else {
location_error('');
$('#multiple').remove();
var multiple_html = '- Multiple locations found, please select one:';
for ( i = 0; i < multiple.length; i++ ) {
multiple_html += '
- ' + multiple[i].address + '
';
}
multiple_html += '
';
$('#front-howto').hide();
$('#postcodeForm').after( multiple_html );
}
} else {
location_error("Could not find your location");
}
});
return false;
}
function locate() {
$("#multiple").remove();
var pc = $('#pc').val();
if (!pc) {
location_error( "Please enter your location" );
return false;
}
if ( valid_postcode( pc ) ) {
jQuery.get( CONFIG.MAPIT_URL + 'postcode/' + pc + '.json', function(data, status) {
if ( status == 'success' ) {
//activityStop();
show_around( data.wgs84_lat, data.wgs84_lon );
} else {
activityStop();
alert('Could not locate postcode');
}
});
} else {
lookup_string(pc);
}
return false;
}
var watch_id = null;
var watch_count = 0;
function foundLocation(myLocation) {
var lat = myLocation.coords.latitude;
var long = myLocation.coords.longitude;
watch_count++;
if ( myLocation.coords.accuracy < 100 ) {
navigator.geolocation.clearWatch(watch_id);
show_around( lat, long );
watch_id = null;
} else if ( watch_count > 10 ) {
navigator.geolocation.clearWatch(watch_id);
watch_id = null;
$.mobile.changePage( 'frontpage-form.html' );
}
}
function notFoundLocation() { if ( watch_id ) { location_error( 'Could not find location' ); } else { console.log('should not be here'); } }
function getPosition() {
if ( !can_geolocate ) {
window.setTimeout( getPosition, 200 );
return;
}
if ( !watch_id ) {
watch_count = 0;
watch_id = navigator.geolocation.watchPosition(foundLocation, notFoundLocation, { timeout: 60000, enableHighAccuracy: true } );
} else {
alert('currently locating');
}
}
function takePhotoSuccess(imageURI) {
$('#form_photo').val(imageURI);
$('#photo').attr('src', imageURI );
$('#add_photo').hide();
$('#display_photo').show();
}
function delPhoto() {
$('#form_photo').val('');
$('#photo').attr('src', '' );
$('#display_photo').hide();
$('#add_photo').show();
}
function takePhotoFail(message) {
alert('There was a problem taking your photo');
console.log('error taking picture: ' + message);
}
function takePhoto(type) {
navigator.camera.getPicture(takePhotoSuccess, takePhotoFail, { quality: 50, destinationType: Camera.DestinationType.FILE_URI, sourceType: type });
}
function check_name( name, msg ) {
$('#email_label').hide();
$('#form_email').hide();
$('#now_submit').hide();
$('#have_password').hide();
$('#form_sign_in_yes').hide();
$('#let_me_confirm').hide();
$('#password_register').hide();
$('#password_surround').hide();
$('#providing_password').hide();
$('#form_name').val( name );
if ( msg ) {
$('#form_name').focus();
if ( $('#form_name_error').length ) {
$('#form_name_error').text(msg);
} else {
$('#form_name').before('' + msg + '
' );
}
}
}
function fileUploadSuccess(r) {
if ( r.response ) {
var data;
try {
data = JSON.parse( decodeURIComponent(r.response) );
}
catch(err) {
data = {};
}
if ( data.success ) {
if ( data.report ) {
localStorage.report = data.report;
$.mobile.changePage('report_created.html');
} else {
$.mobile.changePage('email_sent.html');
}
} else {
if ( data.check_name ) {
check_name( data.check_name, data.errors.name );
} else {
alert('Could not submit report');
}
$('input[type=submit]').prop("disabled", false);
}
} else {
alert('Could not submit report');
$('input[type=submit]').prop("disabled", false);
}
}
function fileUploadFail() {
alert('Could not submit report');
$('input[type=submit]').prop("disabled", false);
}
var submit_clicked = null;
function postReport(e) {
e.preventDefault();
// the .stopImmediatePropogation call in invalidHandler should render this
// redundant but it doesn't seem to work so belt and braces :(
if ( !$('#mapForm').valid() ) { return; }
var params = {
service: 'iphone',
title: $('#form_title').val(),
detail: $('#form_detail').val(),
may_show_name: $('#form_may_show_name').attr('checked') ? 1 : 0,
category: $('#form_category').val(),
lat: $('#fixmystreet\\.latitude').val(),
lon: $('#fixmystreet\\.longitude').val(),
phone: $('#form_phone').val(),
pc: $('#pc').val()
};
if ( localStorage.username && localStorage.password && localStorage.name ) {
params.name = localStorage.name;
params.email = localStorage.username;
params.password_sign_in = localStorage.password;
params.submit_sign_in = 1;
} else {
params.name = $('#form_name').val();
params.email = $('#form_email').val();
params.password_sign_in = $('#password_sign_in').val();
if ( submit_clicked.attr('id') == 'submit_sign_in' ) {
params.submit_sign_in = 1;
} else {
params.submit_register = 1;
}
}
if ( $('#form_photo').val() !== '' ) {
fileURI = $('#form_photo').val();
var options = new FileUploadOptions();
options.fileKey="photo";
options.fileName=fileURI.substr(fileURI.lastIndexOf('/')+1);
options.mimeType="image/jpeg";
options.params = params;
options.chunkedMode = false;
var ft = new FileTransfer();
ft.upload(fileURI, CONFIG.FMS_URL + "report/new/mobile", fileUploadSuccess, fileUploadFail, options);
} else {
jQuery.ajax( {
url: CONFIG.FMS_URL + "report/new/mobile",
type: 'POST',
data: params,
timeout: 30000,
success: function(data) {
if ( data.success ) {
localStorage.pc = null;
localStorage.lat = null;
localStorage.long = null;
if ( data.report ) {
localStorage.report = data.report;
$.mobile.changePage('report_created.html');
} else {
$.mobile.changePage('email_sent.html');
}
if ( !localStorage.name && $('#password_sign_in').val() ) {
localStorage.name = $('#form_name').val();
localStorage.username = $('#form_email').val();
localStorage.password = $('#password_sign_in').val();
}
} else {
if ( data.check_name ) {
check_name( data.check_name, data.errors.name );
}
$('input[type=submit]').prop("disabled", false);
}
},
error: function (data, status, errorThrown ) {
alert( 'There was a problem submitting your report, please try again (' + status + '): ' + JSON.stringify(data), function(){}, 'Submit report' );
$('input[type=submit]').prop("disabled", false);
}
} );
}
return false;
}
function sign_in() {
$('#form_email').blur();
$('#password_sign_in').blur();
jQuery.ajax( {
url: CONFIG.FMS_URL + "auth/ajax/sign_in",
type: 'POST',
data: {
email: $('#form_email').val(),
password_sign_in: $('#password_sign_in').val(),
remember_me: 1
},
success: function(data) {
if ( data.name ) {
localStorage.name = data.name;
localStorage.username = $('#form_email').val();
localStorage.password = $('#password_sign_in').val();
$('#user-meta').html('You are signed in as ' + localStorage.username + '.
');
$('#form_sign_in_only').hide();
$('#forget_button').show();
$('#form_email').val('');
$('#password_sign_in').val('');
} else {
$('#form_email').before('There was a problem with your email/password combination.
');
}
}
} );
}
function display_account_page() {
if ( localStorage.signed_out == 1 ) {
$('#user-meta').html('You’ve been signed out.
');
$('#form_sign_in_only').show();
localStorage.signed_out = null;
}
if ( localStorage.name ) {
$('#user-meta').html('You are signed in as ' + localStorage.username + '.
');
$('#form_sign_in_only').hide();
$('#forget_button').show();
} else {
$('#forget_button').hide();
$('#form_sign_in_only').show();
}
}
function sign_out() {
jQuery.ajax( {
url: CONFIG.FMS_URL + "auth/ajax/sign_out?" + new Date().getTime(),
type: 'GET',
success: function(data) {
if ( data.signed_out ) {
localStorage.signed_out = 1;
localStorage.name = null;
$.mobile.changePage('sign_in.html');
}
}
} );
}
function sign_out_around() {
jQuery.ajax( {
url: CONFIG.FMS_URL + "auth/ajax/sign_out?" + new Date().getTime(),
type: 'GET',
success: function(data) {
$('#user-meta').html('');
$('#email_label').show();
$('#form_email').show();
$('#now_submit').show();
$('#have_password').show();
$('#form_sign_in_yes').show();
$('#let_me_confirm').show();
$('#password_register').show();
$('#password_surround').show();
$('#providing_password').show();
$('#form_name').val( '' );
$('.form-focus-hidden').hide();
}
} );
}
function set_location() {
var cross = fixmystreet.map.getControlsByClass(
"OpenLayers.Control.Crosshairs");
var position = cross[0].getMapPosition();
position.transform(
fixmystreet.map.getProjectionObject(),
new OpenLayers.Projection("EPSG:4326")
);
localStorage.latitude = position.lat;
localStorage.longitude = position.lon;
$.mobile.changePage('submit-problem.html');
}
function account() {
$('.mobile-sign-in-banner').show();
$('#account').show();
if ( localStorage.name ) {
if ( $('body').hasClass('signed-in-page') ) {
$('#user-meta').html('Hi ' + localStorage.name + '
');
}
if ( $('#form_sign_in').length ) {
check_name( localStorage.name );
$('.form-focus-hidden').show();
}
}
}
function forget() {
delete localStorage.name;
delete localStorage.username;
delete localStorage.password;
localStorage.signed_out = 1;
display_account_page();
}
function onDeviceReady() {
can_geolocate = true;
}
function get_report_params () {
var params = {
service: 'iphone',
title: $('#form_title').val(),
detail: $('#form_detail').val(),
may_show_name: $('#form_may_show_name').attr('checked') ? 1 : 0,
category: $('#form_category').val(),
lat: $('#fixmystreet\\.latitude').val(),
lon: $('#fixmystreet\\.longitude').val(),
phone: $('#form_phone').val(),
pc: $('#pc').val(),
time: new Date()
};
if ( localStorage.username && localStorage.password && localStorage.name ) {
params.name = localStorage.name;
params.email = localStorage.username;
params.password_sign_in = localStorage.password;
} else {
params.name = $('#form_name').val();
params.email = $('#form_email').val();
params.password_sign_in = $('#password_sign_in').val();
}
if ( $('#form_photo').val() !== '' ) {
fileURI = $('#form_photo').val();
params.file = fileURI;
}
return params;
}
function save_report() {
var params = get_report_params();
var r;
if ( localStorage.getObject( 'reports' ) ) {
r = localStorage.getObject( 'reports' );
} else {
r = [];
}
r.push( params );
localStorage.setObject('reports', r);
$.mobile.changePage('my_reports.html');
}
function display_saved_reports() {
if ( localStorage.getObject( 'reports' ) ) {
var r = localStorage.getObject('reports');
var list = $('');
for ( i = 0; i < r.length; i++ ) {
if ( r[i] && r[i].title ) {
var item = $('');
var date;
if ( r[i].time ) {
date = new Date( r[i].time );
date = date.getDate() + '-' + ( date.getMonth() + 1 ) + '-' + date.getFullYear();
date += ' ' + date.getHour() + ':' + date.getMinute();
} else {
date = '';
}
var content = $('' + r[i].title + '
' + date + '');
if ( r[i].file ) {
$('
').prependTo(content);
}
content.appendTo(item);
item.appendTo(list);
}
}
list.appendTo('#reports');
} else {
$("#reports").innerHTML('No Reports');
}
}
function open_saved_report_page(e) {
localStorage.currentReport = this.id;
$.mobile.changePage('report.html');
}
function display_saved_report() {
var r = localStorage.getObject('reports')[localStorage.currentReport];
fixmystreet.latitude = r.lat;
fixmystreet.longitude = r.lon;
fixmystreet.pins = [ [ r.lat, r.lon, 'yellow', '', "", 'big' ] ];
$('#title').text(r.title);
$('#details').text(r.detail);
if ( r.file ) {
$('#photo').attr('src', r.file);
$('#photo_link').attr('href', r.file);
$('#report-img').show();
} else {
$('#report-img').hide();
}
}
function submit_problem_show() {
if ( localStorage.name ) {
$('.form-focus-hidden').show();
} else {
$('.form-focus-hidden').hide();
}
}
$(document).bind('pageinit', function() {
$('#postcodeForm').submit(locate);
$('#mapForm').submit(postReport);
$('#signInForm').submit(sign_in);
$('#ffo').click(getPosition);
$('#forget').on('click', forget);
$('#save_report').on('click', save_report);
$('#mapForm :input[type=submit]').on('click', function() { submit_clicked = $(this); });
account();
});
document.addEventListener("deviceready", onDeviceReady, false);
$(document).delegate('#report-created', 'pageshow',function() {
var uri = CONFIG.FMS_URL + 'report/' + localStorage.report;
$('#report_url').html( '' + uri + '' );
});
function decide_front_page() {
if ( !can_geolocate ) {
window.setTimeout( decide_front_page, 100 );
return;
}
if ( navigator.network.connection.type == Connection.NONE ||
navigator.network.connection.type == Connection.UNKNOWN ) {
$.mobile.changePage( 'no_connection.html' );
} else {
getPosition();
}
}
$(document).delegate('#front-page', 'pageinit', decide_front_page);
$(document).delegate('#account-page', 'pageshow', display_account_page);
$(document).delegate('#my-reports-page', 'pageshow', display_saved_reports);
$(document).delegate('#report-page', 'pageshow', display_saved_report);
$(document).delegate('#submit-problem', 'pageshow', submit_problem_show);
$(document).delegate('.saved-report', 'click', open_saved_report_page);
$(document).delegate('#mark-here', 'click', set_location);