var can_geolocate = false; var submit_clicked = null; Storage.prototype.setObject = function(key, value) { this.setItem(key, JSON.stringify(value)); }; Storage.prototype.getObject = function(key) { var item = this.getItem(key); // if we try to parse an empty thing on Android then // it falls over :( if ( item ) { return JSON.parse(item); } else { return null; } }; function touchmove(e) { e.preventDefault(); } /* location code */ function show_around( lat, long, use_transition ) { var options = { transition: 'slide' }; if ( use_transition ) { options = { transition: use_transition, reverse: true }; } pc = $('#pc').val(); localStorage.latitude = lat; localStorage.longitude = long; localStorage.pc = pc || ''; $.mobile.changePage('around.html', options ); 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 location_error( msg ) { if ( msg === '' ) { $('#location_error').remove(); return; } if ( $('#location_error').length === 0 ) { $('#postcodeForm').after('

'); } $('#location_error').text( msg ); } function lookup_string(q) { var i; 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, 'slideup' ); } else if ( valid_locations === 0 ) { location_error('Location not found'); $('#pc').select(); } else { location_error(''); $('#multiple').remove(); var multiple_html = ''; $('#front-howto').hide(); $('#postcodeForm').after( multiple_html ); } } else { location_error("Could not find your location"); } }); return false; } function locate() { $("#multiple").remove(); delete localStorage.currentReport; 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' ) { show_around( data.wgs84_lat, data.wgs84_lon, 'slideup' ); } else { alert('Could not locate postcode'); } }); } else { lookup_string(pc); } return false; } var watch_id = null; function foundLocation(myLocation) { var lat = myLocation.coords.latitude; var long = myLocation.coords.longitude; $('#accuracy').text('have position within ' + parseInt(myLocation.coords.accuracy, 10) + ' meters'); if ( myLocation.coords.accuracy < 100 ) { navigator.geolocation.clearWatch(watch_id); show_around( lat, long ); watch_id = null; } } var location_error_str = ''; function notFoundLocation() { $.mobile.loading( 'hide' ); if ( watch_id ) { location_error_str = 'Could not find location'; navigator.geolocation.clearWatch(watch_id); watch_id = null; $.mobile.changePage('frontpage-form.html'); } else { console.log('should not be here'); } } function getPosition() { $.mobile.loading( 'show' ); $('#have_saved').hide(); $('#locating').show(); if ( !can_geolocate ) { window.setTimeout( getPosition, 200 ); return; } if ( !watch_id ) { watch_id = navigator.geolocation.watchPosition(foundLocation, notFoundLocation, { timeout: 7000, enableHighAccuracy: true } ); } else { alert('currently locating'); } } function have_gps(myLocation) { navigator.geolocation.clearWatch(watch_id); if ( watch_id ) { watch_id = null; var lat = myLocation.coords.latitude; var long = myLocation.coords.longitude; $('#have-gps').text('Determined location using GPS'); $('#make-report').show(); localStorage.latitude = lat; localStorage.longitude = long; } } function do_not_have_gps(err) { console.log(err); if ( watch_id ) { navigator.geolocation.clearWatch(watch_id); watch_id = null; $('#have-gps').text('Cannot determine location'); $('#make-report').hide(); } } function check_for_gps() { if ( !can_geolocate ) { window.setTimeout( check_for_gps, 200 ); return; } if ( !watch_id ) { watch_id = navigator.geolocation.watchPosition(have_gps, do_not_have_gps, { timeout: 7000, enableHighAccuracy: true } ); } else { alert('currently locating'); } } /* report editing/creation */ function validation_error( id, error ) { var el_id = '#' + id; var el = $(el_id); var err = '
' + error + '
'; if ( $('div[for='+id+']').length === 0 ) { el.before(err); el.addClass('form-error'); } } function clear_validation_errors() { $('div.form-error').remove(); $('.form-error').removeClass('form-error'); } function get_current_report() { var report; if ( localStorage.currentReport ) { report = new Report(); report.load(localStorage.currentReport); } return report; } function get_current_report_or_new() { var report = get_current_report(); if ( !report ) { report = new Report(); report.save(); localStorage.currentReport = report.id(); } return report; } function prep_photo_page() { var report = get_current_report_or_new(); if ( report.file() ) { $('#form_photo').val(report.file()); $('#photo').attr('src', report.file()); $('#add_photo').hide(); $('#display_photo').show(); $('#photo-next-btn .ui-btn-text').text('Next'); } else { $('#photo-next-btn .ui-btn-text').text('Skip'); } } function photo_next() { var report = get_current_report(); if ( $('#form_photo').val() !== '' ) { fileURI = $('#form_photo').val(); report.file( fileURI ); } else { report.file(''); } report.save(); } function prep_detail_page() { var report = get_current_report(); $('#form_title').val( report.title() ); $('#form_detail').val( report.detail() ); if (localStorage.offline !== 1) { $.getJSON( CONFIG.FMS_URL + 'report/new/ajax', { latitude: localStorage.latitude, longitude: localStorage.longitude }, function(data) { if (data.error) { // XXX If they then click back and click somewhere in the area, this error will still show. $('#side-form').html('

Reporting a problem

' + data.error + '

'); return; } // XXX cache this... $('#councils_text').html(data.councils_text); $('#form_category_row').html(data.category); var report = get_current_report(); if ( report.category() ) { $('#form_category').val(report.category()); } }); } } function detail_nav(e) { var report = get_current_report(); var valid = 1; if ( !$('#form_title').val() ) { valid = 0; validation_error( 'form_title', validation_strings.title ); } if ( !$('#form_detail').val() ) { valid = 0; validation_error( 'form_detail', validation_strings.detail ); } var cat = $('#form_category').val(); if ( cat == '-- Pick a category --' && localStorage.offline !== 1 ) { valid = 0; validation_error( 'form_category', validation_strings.category ); } if ( valid ) { clear_validation_errors(); report.title($('#form_title').val()); report.detail($('#form_detail').val()); report.category($('#form_category').val()); report.save(); } else { e.preventDefault(); return false; } } function prep_submit_page() { var report = get_current_report(); $('#form_phone').val( report.phone() ); if ( report.may_show_name() === 1 ) { $('#form_may_show_name').prop('checked', true); } else if ( report.may_show_name() === 0 ) { $('#form_may_show_name').prop('checked', false); } if ( localStorage.username ) { $('#signed_in').show(); $('#signed_out').hide(); $('#name_details').insertAfter($('#confirm_details')); $('#username').text( localStorage.username ); $('#form_name').val( localStorage.name ); } else { $('#form_email').val( report.email() ); $('#form_name').val( report.name() ); $('#name_details').insertAfter($('#let_me_confirm')); $('#signed_out').show(); $('#signed_in').hide(); } } function _submit_save_report() { var r = get_current_report(); r.may_show_name( $('#form_may_show_name').prop('checked') ? 1 : 0 ); r.phone( $('#form_phone').val() ); if ( localStorage.username && localStorage.password && localStorage.name ) { //r.name( localStorage.name ); //r.email( localStorage.username ); //params.password_sign_in = localStorage.password; } else { r.name( $('#form_name').val() ); r.email( $('#form_email').val() ); //params.password_sign_in = $('#password_sign_in').val(); } r.save(); return r; } function submit_nav() { _submit_save_report(); } function create_offline() { $.mobile.changePage('photo.html'); } function save_report() { _submit_save_report(); delete localStorage.currentReport; $.mobile.changePage('my_reports.html'); } function validate_user_details() { var valid = 1; if ( localStorage.username ) { } else { if (!$('#form_email').val()) { valid = 0; validation_error( 'form_email', validation_strings.email.required ); } if ( submit_clicked.attr('id') != 'submit_sign_in' ) { var name = $('#form_name').val(); if (!name) { valid = 0; validation_error( 'form_name', validation_strings.name.required ); } else { var validNamePat = /\ba\s*n+on+((y|o)mo?u?s)?(ly)?\b/i; if ( name.length < 6 || !name.match( /\S/ ) || name.match( validNamePat ) ) { valid = 0; validation_error( 'form_name', validation_strings.name.validName ); } } } } return valid; } /* photo handling */ function takePhotoSuccess(imageURI) { $('#form_photo').val(imageURI); $('#photo').attr('src', imageURI ); $('#add_photo').hide(); $('#display_photo').show(); $('#photo-next-btn .ui-btn-text').text('Next'); } function delPhoto() { $('#form_photo').val(''); $('#photo').attr('src', '' ); $('#display_photo').hide(); $('#add_photo').show(); $('#photo-next-btn .ui-btn-text').text('Skip'); } function takePhotoFail(message) { if ( message != 'no image selected' && message != 'Selection cancelled.' && message != 'Camera cancelled.') { navigator.notification.alert('There was a problem taking your photo', null, 'Photo'); console.log('error taking picture: ' + message); } } function takePhoto(type) { var save_to_album = false; if ( type == navigator.camera.PictureSourceType.CAMERA ) { save_to_album = true; } navigator.camera.getPicture(takePhotoSuccess, takePhotoFail, { saveToPhotoAlbum: save_to_album, quality: 50, destinationType: Camera.DestinationType.FILE_URI, sourceType: type, correctOrientation: true }); } 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 remove_saved_report() { if ( localStorage.currentReport ) { var r = new Report(); r.remove(localStorage.currentReport); delete localStorage.currentReport; } } function fileUploadSuccess(r) { $.mobile.loading('hide'); 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'); } remove_saved_report(); } 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() { $.mobile.loading('hide'); alert('Could not submit report'); $('input[type=submit]').prop("disabled", false); } function postReport(e) { $.mobile.loading( 'show' ); var report = get_current_report(); if ( 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; } if ( !validate_user_details() ) { $.mobile.loading('hide'); return; } var params = { service: device.platform, title: report.title(), detail: report.detail(), may_show_name: $('#form_may_show_name').attr('checked') ? 1 : 0, category: report.category(), lat: report.lat(), lon: report.lon(), phone: $('#form_phone').val(), pc: report.pc() }; 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 { if ( $('#form_name').val() !== '' ) { 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 ( report.file() && report.file() !== '' ) { fileURI = report.file(); 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; if ( !localStorage.name && $('#password_sign_in').val() ) { localStorage.name = $('#form_name').val(); localStorage.username = $('#form_email').val(); localStorage.password = $('#password_sign_in').val(); } $.mobile.changePage('report_created.html'); } else { $.mobile.changePage('email_sent.html'); } remove_saved_report(); } else { if ( data.check_name ) { check_name( data.check_name, data.errors.name ); } $.mobile.loading('hide'); $('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.username ) { $('#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 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") ); var r = get_current_report_or_new(); if ( localStorage.pc ) { r.pc( localStorage.pc ); } r.lat( position.lat ); r.lon( position.lon ); r.save(); localStorage.latitude = position.lat; localStorage.longitude = position.lon; $.mobile.changePage('photo.html'); } function mark_here() { fixmystreet.state_pins_were_hidden = true; if ( fixmystreet.markers.getVisibility() ) { fixmystreet.state_pins_were_hidden = false; fixmystreet.markers.setVisibility(false); fixmystreet.select_feature.deactivate(); } fixmystreet.nav.deactivate(); $('#sub_map_links').hide(); var $map_box = $('#map_box'); $map_box.append( '' ); $('#mark-here').hide(); $('#try_again').on('vclick', function(e){ e.preventDefault(); fixmystreet.bbox_strategy.activate(); fixmystreet.markers.refresh( { force: true } ); if ( !fixmystreet.state_pins_were_hidden ) { // If we had pins hidden when we clicked map (which had to show the pin layer as I'm doing it in one layer), hide them again. fixmystreet.markers.setVisibility(true); fixmystreet.select_feature.activate(); } $('#sub_map_links').show(); $('#mob_sub_map_links').remove(); $('#mark-here').show(); fixmystreet.nav.activate(); }); $('#mob_ok').on('vclick', set_location ); } function forget_user_details() { delete localStorage.name; delete localStorage.username; delete localStorage.password; localStorage.signed_out = 1; jQuery.ajax( { url: CONFIG.FMS_URL + "auth/ajax/sign_out", type: 'POST' } ); display_account_page(); } function onDeviceReady() { can_geolocate = true; } function display_saved_reports() { var i; 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 ) { var date_o = new Date( parseInt(r[i].time, 10) ); date = date_o.getDate() + '/' + ( date_o.getMonth() + 1 ) + '/' + date_o.getFullYear(); date = date + ' ' + date_o.getHours() + ':' + date_o.getMinutes(); } 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 = new Report(); r.load(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()); $('#report-img').show(); } else { $('#report-img').hide(); } } function complete_report() { var r = new Report(); r.load(localStorage.currentReport); if ( r.lat() && r.lon() ) { show_around( r.lat(), r.lon() ); } else { getPosition(); } } function delete_report() { var r = new Report(); r.load(localStorage.currentReport); r.remove(); $.mobile.changePage('my_reports.html'); } var geocheck_count = 0; function prep_front_page() { $('#accuracy').text(''); } function keep_saved_report() { delete localStorage.currentReport; getPosition(); } function delete_saved_report() { remove_saved_report(); getPosition(); } function decide_front_page() { $.mobile.loading( 'show' ); if ( !can_geolocate && ( !navigator.network || !navigator.network.connection ) ) { geocheck_count++; window.setTimeout( decide_front_page, 1000 ); return; } // sometime onDeviceReady does not fire so set this here to be sure can_geolocate = true; geocheck_count = 0; localStorage.offline = 0; if ( localStorage.currentReport ) { $.mobile.loading( 'hide' ); $('#have_saved').show(); return; } $('#locating').show(); if ( navigator && navigator.network && ( navigator.network.connection.type == Connection.NONE || navigator.network.connection.type == Connection.UNKNOWN ) ) { localStorage.offline = 1; $.mobile.changePage( 'no_connection.html' ); } else { getPosition(); } } function locate_page_display() { $.mobile.loading( 'hide' ); if ( watch_id ) { navigator.geolocation.clearWatch(watch_id); watch_id = null; } if ( location_error_str !== '' ) { location_error( location_error_str ); location_error_str = ''; } } document.addEventListener("deviceready", onDeviceReady, false); $(document).on('pageshow', '#report-created', function() { var uri = CONFIG.FMS_URL + 'report/' + localStorage.report; $('#report_url').html( '' + uri + '' ); }); $(document).on('pagebeforeshow', '#photo-page', prep_photo_page); $(document).on('pagebeforeshow', '#details-page', prep_detail_page); $(document).on('pagebeforeshow', '#submit-page', prep_submit_page); $(document).on('pagebeforeshow', '#front-page', prep_front_page); $(document).on('pageshow', '#front-page', decide_front_page); $(document).on('pageshow', '#account-page', display_account_page); $(document).on('pageshow', '#my-reports-page', display_saved_reports); $(document).on('pageshow', '#report-page', display_saved_report); $(document).on('pageshow', '#no-connection-page', check_for_gps); $(document).on('pageshow', '#locate-page', locate_page_display); $(document).bind('pageinit', function() { $('#signInForm').on('submit', sign_in); $('#postcodeForm').on('submit', locate); }); $(document).on('vclick', '#save_report', save_report); $(document).on('vclick', '#forget', forget_user_details); $(document).on('vclick', '.saved-report', open_saved_report_page); $(document).on('vclick', '#mark-here', mark_here); $(document).on('vclick', '#create_report', create_offline); $(document).on('vclick', '#complete_report', complete_report); $(document).on('vclick', '#delete_report', delete_report); $(document).on('vclick', '#id_photo_button', function() {takePhoto(navigator.camera.PictureSourceType.CAMERA);}); $(document).on('vclick', '#id_existing', function() {takePhoto(navigator.camera.PictureSourceType.SAVEDPHOTOALBUM);}); $(document).on('vclick', '#submit-page :input[type=submit]', function(e) { submit_clicked = $(this); postReport(e); }); $(document).on('vclick', '#id_del_photo_button', delPhoto); //$(document).on('vclick', '#submit-header a.ui-btn-left', submit_back); $(document).on('vclick', '#photo-page a.ui-btn-right', photo_next); $(document).on('vclick', '#details-page a.ui-btn-right', detail_nav); $(document).on('vclick', '#details-page a.ui-btn-left', detail_nav); $(document).on('vclick', '#submit-page a.ui-btn-left', submit_nav); $(document).on('vclick', '#front-page #use_saved', complete_report); $(document).on('vclick', '#front-page #delete_saved', delete_saved_report); $(document).on('vclick', '#front-page #continue', keep_saved_report); $(document).on( 'pagebeforeshow', '.ui-page', function() { $('a.ui-btn').buttonMarkup({ corners: false, shadow: false, iconshadow: false }); });