/*
* fixmystreet.js
* FixMyStreet JavaScript
*/
function form_category_onchange() {
var cat = $('#form_category');
var args = {
category: cat.val()
};
if ( typeof fixmystreet !== 'undefined' ) {
args.latitude = fixmystreet.latitude;
args.longitude = fixmystreet.longitude;
} else {
args.latitude = $('input[name="latitude"]').val();
args.longitude = $('input[name="longitude"]').val();
}
$.getJSON('/report/new/category_extras', args, function(data) {
if ( data.category_extra ) {
if ( $('#category_meta').size() ) {
$('#category_meta').html( data.category_extra);
} else {
$('#form_category_row').after( data.category_extra );
}
} else {
$('#category_meta').empty();
}
});
}
/*
* general height fixing function
*
* elem1: element to check against
* elem2: target element
* offest: this will be added (if present) to the final value, useful for height errors
*/
function heightFix(elem1, elem2, offset){
var h1 = $(elem1).height(),
h2 = $(elem2).height();
if(offset === undefined){
offset = 0;
}
if(h1 > h2){
$(elem2).css({'min-height':h1+offset});
}
}
/*
* very simple tab function
*
* elem: trigger element, must have an href attribute (so probably needs to be an )
*/
function tabs(elem)
{
var target = elem.attr('href');
if(!$(target).hasClass('open'))
{
//toggle class on nav
$('.tab-nav .active').removeClass('active');
elem.addClass('active');
//hide / show the right tab
$('.tab.open').removeClass('open').hide();
$(target).addClass('open').show();
}
}
$(function(){
if(Modernizr.mq('only screen and (max-width:48em)')) {
$('html').addClass('mobile');
}
$('html').removeClass('no-js').addClass('js');
$('#pc').focus();
$('input[type=submit]').removeAttr('disabled');
/*
$('#mapForm').submit(function() {
if (this.submit_problem) {
$('input[type=submit]', this).prop("disabled", true);
}
return true;
});
*/
if (!$('#been_fixed_no').prop('checked') && !$('#been_fixed_unknown').prop('checked')) {
$('#another_qn').hide();
}
$('#been_fixed_no').click(function() {
$('#another_qn').show('fast');
});
$('#been_fixed_unknown').click(function() {
$('#another_qn').show('fast');
});
$('#been_fixed_yes').click(function() {
$('#another_qn').hide('fast');
});
var timer;
function email_alert_close() {
$('#email_alert_box').hide('fast');
}
// FIXME - needs to use translated string
jQuery.validator.addMethod('validCategory', function(value, element) {
return this.optional(element) || value != '-- Pick a category --'; }, validation_strings.category );
jQuery.validator.addMethod('validName', function(value, element) {
var validNamePat = /\ba\s*n+on+((y|o)mo?u?s)?(ly)?\b/i;
return this.optional(element) || value.length > 5 && value.match( /\S/ ) && !value.match( validNamePat ); }, validation_strings.category );
var form_submitted = 0;
var submitted = false;
$("form.validate").validate({
rules: {
title: { required: true },
detail: { required: true },
email: { required: true },
update: { required: true },
rznvy: { required: true }
},
messages: validation_strings,
onkeyup: false,
errorElement: 'div',
errorClass: 'form-error',
// we do this to stop things jumping around on blur
success: function (err) { if ( form_submitted ) { err.addClass('label-valid').removeClass('label-valid-hidden').html( ' ' ); } else { err.addClass('label-valid-hidden'); } },
errorPlacement: function( error, element ) {
element.parent('div').before( error );
},
submitHandler: function(form) {
if (form.submit_problem) {
$('input[type=submit]', form).prop("disabled", true);
}
form.submit();
},
// make sure we can see the error message when we focus on invalid elements
showErrors: function( errorMap, errorList ) {
if ( submitted && errorList.length ) {
$(window).scrollTop( $(errorList[0].element).offset().top - 40 );
}
this.defaultShowErrors();
submitted = false;
},
invalidHandler: function(form, validator) { submitted = true; }
});
$('input[type=submit]').click( function(e) { form_submitted = 1; } );
/* set correct required status depending on what we submit
* NB: need to add things to form_category as the JS updating
* of this we do after a map click removes them */
$('#submit_sign_in').click( function(e) {
$('#form_category').addClass('required validCategory').removeClass('valid');
$('#form_name').removeClass();
} );
$('#submit_register').click( function(e) {
$('#form_category').addClass('required validCategory').removeClass('valid');
$('#form_name').addClass('required validName');
} );
$('#problem_submit > input[type="submit"]').click( function(e) {
$('#form_category').addClass('required validCategory').removeClass('valid');
$('#form_name').addClass('required validName');
} );
$('#update_post').click( function(e) {
$('#form_name').addClass('required').removeClass('valid');
} );
$('#email_alert').click(function(e) {
if (!$('#email_alert_box').length) {
return true;
}
e.preventDefault();
if ($('#email_alert_box').is(':visible')) {
email_alert_close();
} else {
var pos = $(this).position();
$('#email_alert_box').css( { 'left': ( pos.left - 20 ) + 'px', 'top': ( pos.top + 20 ) + 'px' } );
$('#email_alert_box').show('fast');
$('#alert_rznvy').focus();
}
}).hover(function() {
window.clearTimeout(timer);
}, function() {
timer = window.setTimeout(email_alert_close, 2000);
});
$('#email_alert_box').hover(function() {
window.clearTimeout(timer);
}, function() {
timer = window.setTimeout(email_alert_close, 2000);
});
$('#form_category').change( form_category_onchange );
// Geolocation
if (geo_position_js.init()) {
$('#postcodeForm').append(' Or locate me automatically').css({ "padding-bottom": "0.5em" });
$('#geolocate_link').click(function(e) {
e.preventDefault();
// Spinny thing!
$('#geolocate_para').append(' ');
geo_position_js.getCurrentPosition(function(pos) {
$('#geolocate_para img').remove();
var latitude = pos.coords.latitude;
var longitude = pos.coords.longitude;
location.href = '/around?latitude=' + latitude + ';longitude=' + longitude;
}, function(err) {
$('#geolocate_para img').remove();
if (err.code == 1) { // User said no
} else if (err.code == 2) { // No position
$('#geolocate_para').html("Could not look up location");
} else if (err.code == 3) { // Too long
$('#geolocate_para').html("No result returned");
} else { // Unknown
$('#geolocate_para').html("Unknown error");
}
}, {
timeout: 10000
});
});
}
/*
* Report a problem page
*/
//desktop
if($('#report-a-poblem-sidebar:visible').length > 0){
heightFix('#report-a-poblem-sidebar:visible', '.content', 26);
}
//show/hide notes on mobile
$('.mobile #report-a-poblem-sidebar').after('How to send successful reports').hide();
$('.mobile').on('click', '.rap-notes-trigger', function(e){
e.preventDefault();
//check if we've already moved the notes
if($('.rap-notes').length > 0){
//if we have, show and hide .content
$('.mobile .content').hide();
$('.rap-notes').show();
}else{
//if not, move them and show, hiding .content
$('.mobile .content').after('