e-lado
Version:
[](https://circleci.com/gh/sharetribe/sharetribe/tree/master) [](https://gemnasium.com/sharetribe/shar
900 lines (806 loc) • 28.5 kB
JavaScript
// Custom Javascript functions for Sharetribe
// Add custom validation methods
function add_validator_methods() {
/**
Take string representing number with either dot (.) or comma (,)
as decimal separator and get back number
*/
function toNumber(numberStr) {
return Number(numberStr.replace(",", "."));
}
function numberVal(el) {
return toNumber(el.val());
}
// If some element is required, it should be validated even if it's hidden
$.validator.setDefaults({ ignore: [] });
$.validator.
addMethod("accept",
function(value, element, param) {
return value.match(new RegExp(/(\.jpe?g|\.gif|\.png|^$)/i));
}
);
$.validator.
addMethod( "valid_username",
function(value, element, param) {
return value.match(new RegExp("(^[A-Za-z0-9_]*$)"));
}
);
$.validator.
addMethod("regex",
function(value, element, regexp) {
var re = new RegExp(regexp);
return re.test(value);
}
);
$.validator.
addMethod("email_list",
function(value, element, param) {
var emails = value.split(',');
var re = new RegExp(/^[A-Z0-9._%\-\+\~\/]+@([A-Z0-9-]+\.)+[A-Z]+$/i);
for (var i = 0; i < emails.length; i++) {
if (!re.test($.trim(emails[i]))) {
return false;
}
}
return true;
}
);
$.validator.
addMethod("min_date",
function(value, element, is_rideshare) {
if (is_rideshare == "true") {
return get_datetime_from_datetime_select() > new Date();
} else {
return get_date_from_date_select() > new Date();
}
}
);
$.validator.
addMethod("max_date",
function(value, element) {
var current_time = new Date();
var maximum_date = new Date(new Date(current_time).setMonth(current_time.getMonth()+6));
return get_date_from_date_select() < maximum_date;
}
);
$.validator.
addMethod( "positive_integer",
function(value, element, param) {
var n = ~~Number(value);
return String(n) === value && n >= 0;
}
);
$.validator.
addMethod( "minimum_price_required",
function(value, element, params) {
minimum_price = _.first(params) || "";
subunit_to_unit = _.first(_.rest(params));
if (minimum_price == "") {
return true
} else {
return minimum_price <= ST.paymentMath.parseSubunitFloatFromFieldValue(value, subunit_to_unit);
}
}
);
$.validator.
addMethod( "money",
function(value, element, minimum_price) {
var regex = /^\d*((\.|\,)\d{1,2})?$/;
return value && regex.test(value);
}
);
$.validator.
addMethod("max_bound",
function(value, element, otherName) {
var $otherInput = ST.utils.findElementByName(otherName);
return Number(toNumber(value)) > numberVal($otherInput);
}
);
$.validator.
addMethod("min_bound",
function(value, element, otherName) {
var $otherInput = ST.utils.findElementByName(otherName);
return Number(toNumber(value)) < numberVal($otherInput);
}
);
$.validator.
addMethod("number_conditional_decimals",
function(value, element, decimalCheckbox) {
var $otherInput = ST.utils.findElementByName(decimalCheckbox);
var allowDecimals = $otherInput.is(':checked');
var numberRegex = /^\d+?$/;
var decimalRegex = /^\d+((\.|\,)\d+)?$/;
var regexp = allowDecimals ? decimalRegex : numberRegex;
return regexp.test(value);
}
);
$.validator.addClassRules("required", {
required: true
});
$.validator.addClassRules("number-no-decimals", {
"number_no_decimals": true
});
$.validator.addClassRules("number-decimals", {
"number_decimals": true
});
$.validator.addClassRules("url", {
url: true
});
$.validator.
addMethod("number_no_decimals", function(value, element, opts) {
var numberRegex = /^\d+?$/;
return value.length === 0 ? true : numberRegex.test(value)
});
$.validator.
addMethod("number_decimals", function(value, element) {
var decimalRegex = /^\d+((\.|\,)\d+)?$/;
return value.length === 0 ? true : decimalRegex.test(value)
});
$.validator.
addMethod("number_min", function(value, element, min) {
return value.length === 0 ? true : toNumber(value) >= min;
});
$.validator.
addMethod("number_max", function(value, element, max) {
return value.length === 0 ? true : toNumber(value) <= max;
});
}
// Initialize code that is needed for every view
function initialize_defaults(locale) {
add_validator_methods();
translate_validation_messages(locale);
$('.flash-notifications').click(function() {
$('.flash-notifications').fadeOut('slow');
});
$('.ajax-notification').click(function() {
$('.ajax-notification').fadeOut('slow');
});
$('#login-toggle-button').click(function() {
$('#upper_person_login').focus();
});
}
function report_analytics_event(category, action, opt_label) {
if (window.ST != null && typeof window.ST.gtmPush === 'function') {
window.ST.gtmPush({
'event' : 'GAEvent',
'eventCategory' : category,
'eventAction' : action,
'eventLabel' : opt_label,
'eventValue' : undefined
});
}
var params_array = [category, action, opt_label];
if (typeof _gaq !== 'undefined' && Array.isArray(_gaq)) {
_gaq.push(['_trackEvent'].concat(params_array));
}
if (typeof ST.customerReportEvent === 'function') {
ST.customerReportEvent(category, action, opt_label);
}
}
function initialize_network_defaults(required_message, email_message) {
enableSamePageScroll();
}
function initialize_admin_edit_price($form, min_name, max_name, locale) {
translate_validation_messages(locale);
rules = {};
rules[min_name] = {
min_bound: max_name
};
rules[max_name] = {
max_bound: min_name
};
$form.validate({rules: rules})
}
var hideNotice = function() {
$('.flash-notifications').fadeOut('slow');
}
function initialize_user_feedback_form() {
form_id = "#new_feedback";
$(form_id).validate({
rules: {
"feedback[email]": {required: false, email: true},
"feedback[content]": {required: true, minlength: 1}
}
});
}
function initialize_email_members_form() {
form_id = "#new_member_email";
auto_resize_text_areas("email_members_text_area");
$(form_id).validate({
rules: {
"email[subject]": {required: true, minlength: 2},
"email[content]": {required: true, minlength: 2}
}
});
}
function initialize_login_form(password_forgotten) {
if (password_forgotten == true) {
$('#password_forgotten').slideDown('fast');
$("html, body").animate({ scrollTop: $(document).height() }, 1000);
$('input.request_password').focus();
}
$('#password_forgotten_link').click(function() {
$('#password_forgotten').slideToggle('fast');
$("html, body").animate({ scrollTop: $(document).height() }, 1000);
$('input.request_password').focus();
});
$('#login_form input.text_field:first').focus();
}
function initialize_send_message_form(locale) {
auto_resize_text_areas("text_area");
$('textarea').focus();
var form_id = "#new_listing_conversation";
$(form_id).validate({
rules: {
"listing_conversation[title]": {required: true, minlength: 1, maxlength: 120},
"listing_conversation[content]": {required: true, minlength: 1}
},
submitHandler: function(form) {
disable_and_submit(form_id, form, "false", locale);
report_analytics_event("message", "sent");
}
});
}
function initialize_send_person_message_form(locale) {
auto_resize_text_areas("text_area");
$('textarea').focus();
var form_id = "#new_conversation";
$(form_id).validate({
rules: {
"conversation[message_attributes][content]": {required: true, minlength: 1}
},
submitHandler: function(form) {
disable_and_submit(form_id, form, "false", locale);
report_analytics_event("message", "sent");
}
});
}
function initialize_reply_form(locale) {
auto_resize_text_areas("reply_form_text_area");
$('textarea').focus();
prepare_ajax_form(
"#new_message",
locale,
{"message[content]": {required: true, minlength: 1}}
);
}
function initialize_listing_view(locale) {
$('#listing-image-link').click(function() { $('#listing-image-lightbox').lightbox_me({centered: true, zIndex: 1000000}); });
auto_resize_text_areas("listing_comment_content_text_area");
$('textarea').focus();
prepare_ajax_form(
"#new_comment",
locale,
{"comment[content]": {required: true, minlength: 1}}
);
$('#send_comment_button').click(function() {
report_analytics_event("listing", "commented");
});
}
function updateSellerGetsValue(priceInputSelector, displayTargetSelector, currencySelector, communityCommissionPercentage, minCommission, showReversed) {
// true == Show the fee instead of what's left after the fee
showReversed = showReversed || false;
$display = $(displayTargetSelector);
$input = $(priceInputSelector);
$currency = $(currencySelector);
function updateYouWillGet() {
var sum = ST.paymentMath.parseFloatFromFieldValue($input.val());
var displaySum;
if (showReversed) {
displaySum = ST.paymentMath.totalCommission(sum, communityCommissionPercentage, minCommission);
} else {
displaySum = sum - ST.paymentMath.totalCommission(sum, communityCommissionPercentage, minCommission);
}
$display.text(
[ST.paymentMath.displayMoney(Math.max(0, displaySum)),
$currency.val()]
.join(" "));
}
$input.keyup(updateYouWillGet);
$currency.change(updateYouWillGet);
// Run once immediately
updateYouWillGet();
}
function initialize_give_feedback_form(locale, grade_error_message, text_error_message) {
auto_resize_text_areas("text_area");
$('textarea').focus();
var form_id = "#new_testimonial";
$(form_id).validate({
errorPlacement: function(error, element) {
if (element.attr("name") == "testimonial[grade]") {
error.appendTo(element.parent().parent());
} else {
error.insertAfter(element);
}
},
rules: {
"testimonial[grade]": {required: true},
"testimonial[text]": {required: true}
},
messages: {
"testimonial[grade]": { required: grade_error_message }
},
submitHandler: function(form) {
disable_and_submit(form_id, form, "false", locale);
}
});
}
function initialize_signup_form(locale, username_in_use_message, invalid_username_message, email_in_use_message, invalid_invitation_code_message, name_required, invitation_required) {
$('#help_invitation_code_link').click(function(link) {
//link.preventDefault();
$('#help_invitation_code').lightbox_me({centered: true, zIndex: 1000000 });
});
$('#terms_link').click(function(link) {
link.preventDefault();
$('#terms').lightbox_me({ centered: true, zIndex: 1000000 });
});
var form_id = "#new_person";
//name_required = (name_required == 1) ? true : false
$(form_id).validate({
errorPlacement: function(error, element) {
if (element.attr("name") == "person[terms]") {
error.appendTo(element.parent().parent());
} else {
error.insertAfter(element);
}
},
rules: {
"person[username]": {required: true, minlength: 3, maxlength: 20, valid_username: true, remote: "/people/check_username_availability"},
"person[given_name]": {required: name_required, maxlength: 30},
"person[family_name]": {required: name_required, maxlength: 30},
"person[email]": {required: true, email: true, remote: "/people/check_email_availability_and_validity"},
"person[terms]": "required",
"person[password]": { required: true, minlength: 4 },
"person[password2]": { required: true, minlength: 4, equalTo: "#person_password1" },
"invitation_code": {required: invitation_required, remote: "/people/check_invitation_code"}
},
messages: {
"person[username]": { valid_username: invalid_username_message, remote: username_in_use_message },
"person[email]": { remote: email_in_use_message },
"invitation_code": { remote: invalid_invitation_code_message }
},
onkeyup: false, //Only do validations when form focus changes to avoid exessive ASI calls
submitHandler: function(form) {
disable_and_submit(form_id, form, "false", locale);
report_analytics_event('user', "signed up", "normal form");
}
});
}
function initialize_terms_form() {
$('#terms_link').click(function(link) {
link.preventDefault();
$('#terms').lightbox_me({ centered: true, zIndex: 1000000 });
});
}
function initialize_update_profile_info_form(locale, person_id, name_required) {
auto_resize_text_areas("update_profile_description_text_area");
$('input.text_field:first').focus();
var form_id = "#edit_person_" + person_id;
$(form_id).validate({
rules: {
"person[street_address]": {required: false, address_validator: true},
"person[given_name]": {required: name_required, maxlength: 30},
"person[family_name]": {required: name_required, maxlength: 30},
"person[phone_number]": {required: false, maxlength: 25},
"person[image]": { accept: "(jpe?g|gif|png)" }
},
onkeyup: false,
onclick: false,
onfocusout: false,
onsubmit: true,
submitHandler: function(form) {
disable_and_submit(form_id, form, "false", locale);
}
});
}
function initialize_update_notification_settings_form(locale, person_id) {
var form_id = "#edit_person_" + person_id;
$(form_id).validate({
submitHandler: function(form) {
disable_and_submit(form_id, form, "false", locale);
}
});
}
function initialize_update_account_info_form(locale, change_text, cancel_text, email_in_use_message, one_email_must_receive_notifications_message) {
$('.account-new-email-link').click(
function(event) {
event.preventDefault();
$('.account-new-email-link').hide();
$('.account-settings-hidden-email-form').show();
$("#person_email_attributes_address").removeAttr("disabled");
$("#person_email_attributes_send_notifications").removeAttr("disabled");
}
);
$('.account-hide-new-email-link').click(
function(event) {
event.preventDefault();
$('.account-new-email-link').show();
$('.account-settings-hidden-email-form').hide();
$("#person_email_attributes_address").attr("disabled", "disabled");
$("#person_email_attributes_send_notifications").attr("disabled", "disabled");
}
);
var changeLinkVisible = true;
$('#account_password_link').click(function() {
if (changeLinkVisible) {
$('#account_password_form').show();
$(this).text(cancel_text);
$('#person_password').focus();
} else {
$('#account_password_form').hide();
$(this).text(change_text);
}
changeLinkVisible = !changeLinkVisible;
});
var email_form_id = "#email_form";
$(email_form_id).validate({
errorPlacement: function(error, element) {
if (element.attr("name") == "person[send_notifications][]") {
error.insertAfter($("#account-settings-email-content-rows"));
} else {
error.insertAfter(element);
}
},
rules: {
"person[email_attributes][address]": {required: true, email: true, remote: "/people/check_email_availability"},
"person[send_notifications][]": {required: true}
},
messages: {
"person[email_attributes][address]": { remote: email_in_use_message },
"person[send_notifications][]": { required: one_email_must_receive_notifications_message }
},
submitHandler: function(form) {
disable_and_submit(email_form_id, form, "false", locale);
}
});
var password_form_id = "#password_form";
$(password_form_id).validate({
rules: {
"person[password]": { required: true, minlength: 4 },
"person[password2]": { required: true, minlength: 4, equalTo: "#person_password" }
},
submitHandler: function(form) {
disable_and_submit(password_form_id, form, "false", locale);
}
});
}
function initialize_reset_password_form() {
var password_form_id = "#new_person";
$(password_form_id).validate({
errorPlacement: function(error, element) {
error.insertAfter(element);
},
rules: {
"person[password]": { required: true, minlength: 4 },
"person[password_confirmation]": { required: true, minlength: 4, equalTo: "#person_password" }
},
submitHandler: function(form) {
disable_and_submit(password_form_id, form, "false", locale);
}
});
}
function initialize_profile_view(profile_id) {
$('#load-more-listings a').on("click", function() {
var request_path = $(this).data().url;
$.get(request_path, function(data) {
$('#profile-listings-list').html(data);
});
return false;
});
$('#load-more-followed-people').on(
"ajax:complete", function(element, xhr) {
$("#profile-followed-people-list").html(xhr.responseText);
$(this).hide();
});
$('#load-more-testimonials').click(function() {
request_path = profile_id + "/testimonials";
$.get(request_path, {per_page: 200, page: 1}, function(data) {
$('#profile-testimonials-list').html(data);
});
return false;
});
// The code below is not used in early 3.0 version, but part of it will probably be used again soon, so kept here.
$('#description_preview_link').click(function() {
$('#profile_description_preview').hide();
$('#profile_description_full').show();
});
$('#description_full_link').click(function() {
$('#profile_description_preview').show();
$('#profile_description_full').hide();
});
}
function initialize_homepage() {
// make map/list button change the value in the filter form and submit the form
// in order to keep all filter values combinable and remembered
$('.map-button').click(
function() {
$("#hidden-map-toggle").val(true);
$("#homepage-filters").submit();
return false;
}
);
$('.list-button').click(
function() {
$("#hidden-map-toggle").val(undefined);
$("#homepage-filters").submit();
return false;
}
);
}
function initialize_invitation_form(locale, email_error_message, invitation_limit) {
$.validator.addMethod(
"max_invitations",
function(value) {
return value.split(",").length < invitation_limit;
},
$.validator.format(email_error_message)
);
$("#new_invitation").validate({
rules: {
"invitation[email]": {required: true, email_list: true, max_invitations: true},
"invitation[message]": {required: false, maxlength: 5000}
},
messages: {
"invitation[email]": { email_list: email_error_message}
},
onkeyup: false,
onclick: false,
onfocusout: false,
onsubmit: true,
submitHandler: function(form) {
disable_and_submit("#new_invitation", form, "false", locale);
}
});
}
function initialize_private_community_defaults(locale, feedback_default_text) {
add_validator_methods();
translate_validation_messages(locale);
$('select.language_select').selectmenu({style: 'dropdown', width: "100px"});
$('#close_notification_link').click(function() { $('#notifications').slideUp('fast'); });
// Make sure that Sharetribe cannot be used if js is disabled
$('.wrapper').addClass('js_enabled');
}
function initialize_admin_edit_tribe_form(locale, community_id) {
auto_resize_text_areas("new_tribe_text_area");
translate_validation_messages(locale);
$('#invite_only_help_text_link').click(function() { $('#invite_only_help_text').lightbox_me({centered: true}); });
var form_id = "#edit_community_" + community_id;
$(form_id).validate({
rules: {
"community[name]": {required: true, minlength: 2, maxlength: 50},
"community[slogan]": {required: true, minlength: 2, maxlength: 100},
"community[description]": {required: true, minlength: 2}
},
submitHandler: function(form) {
disable_and_submit(form_id, form, "false", locale);
}
});
}
function initialize_admin_edit_tribe_look_and_feel_form(locale, community_id, invalid_color_code_message) {
translate_validation_messages(locale);
var form_id = "#edit_community_" + community_id;
$(form_id).validate({
rules: {
"community[custom_color1]": {required: false, minlength: 6, maxlength: 6, regex: "^([a-fA-F0-9]+)?$"}
},
messages: {
"community[custom_color1]": { regex: invalid_color_code_message }
},
submitHandler: function(form) {
disable_and_submit(form_id, form, "false", locale);
}
});
}
function initialize_admin_social_media_form(locale, community_id, invalid_twitter_handle_message, invalid_facebook_connect_id_message, invalid_facebook_connect_secret_message) {
translate_validation_messages(locale);
var form_id = "#edit_community_" + community_id;
$(form_id).validate({
rules: {
"community[twitter_handle]": {required: false, minlength: 1, maxlength: 15, regex: "^([A-Za-z0-9_]+)?$"},
"community[facebook_connect_id]": {required: false, minlength: 1, maxlength: 16, regex: "^([0-9]+)?$"},
"community[facebook_connect_secret]": {required: false, minlength: 32, maxlength: 32, regex: "^([a-f0-9]+)?$"}
},
messages: {
"community[twitter_handle]": { regex: invalid_twitter_handle_message },
"community[facebook_connect_id]": {regex: invalid_facebook_connect_id_message },
"community[facebook_connect_secret]": {regex: invalid_facebook_connect_secret_message }
},
submitHandler: function(form) {
disable_and_submit(form_id, form, "false", locale);
}
});
}
function initialize_admin_listing_field_form_view(locale, form_id, option_count, min_count) {
translate_validation_messages(locale);
var $form = $(form_id);
var CATEGORY_CHECKBOX_NAME = "custom_field[category_attributes][][category_id]";
var MIN_NAME = "custom_field[min]";
var MAX_NAME = "custom_field[max]";
var DECIMAL_CHECKBOX = "custom_field[allow_decimals]";
var rules = {}
rules[CATEGORY_CHECKBOX_NAME] = {
required: true
};
rules[MIN_NAME] = {
min_bound: MAX_NAME,
number_conditional_decimals: DECIMAL_CHECKBOX
};
rules[MAX_NAME] = {
max_bound: MIN_NAME,
number_conditional_decimals: DECIMAL_CHECKBOX
};
$(form_id).validate({
rules: rules,
errorPlacement: function(error, element) {
// Custom placement for checkbox group
if (element.attr("name") === CATEGORY_CHECKBOX_NAME) {
var container = $("#custom-field-categories-container")
error.insertAfter(container);
} else {
error.insertAfter(element);
}
},
submitHandler: function(form) {
disable_and_submit(form_id, form, "false", locale);
}
});
// Create ST namespace if not exist
window.ST = window.ST || {}
ST.newOptionAdded = (function removeLinkEnabledState(initialCount, minCount, containerSelector, linkSelector) {
var enabled;
var count = initialCount;
update();
$(containerSelector).on("click", linkSelector, function(event) {
event.preventDefault();
if(enabled) {
var el = $(event.currentTarget);
var container = el.closest(".custom-field-option-container");
container.remove();
ST.customFieldOptionOrder.remove(container.data("field-id"));
count -= 1;
update();
}
});
function update() {
enabled = count > minCount;
$links = $(linkSelector);
$links.addClass(enabled ? "enabled" : "disabled");
$links.removeClass(!enabled ? "enabled" : "disabled");
}
return {
add: function() {
count += 1;
update();
}
};
})(option_count, min_count, "#options", ".custom-field-option-remove").add;
}
function initialize_admin_category_form_view(locale, form_id) {
translate_validation_messages(locale);
var $form = $(form_id);
var LISTING_SHAPE_CHECKBOX_NAME = "category[listing_shapes][][listing_shape_id]";
var rules = {}
rules[LISTING_SHAPE_CHECKBOX_NAME] = {
required: true
};
$(form_id).validate({
rules: rules,
errorPlacement: function(error, element) {
// Custom placement for checkbox group
if (element.attr("name") === LISTING_SHAPE_CHECKBOX_NAME) {
var container = $("#category-listing-shapes-container");
error.insertAfter(container);
} else {
error.insertAfter(element);
}
},
submitHandler: function(form) {
disable_and_submit(form_id, form, "false", locale);
}
});
}
function initialize_pending_consent_form(email_invalid_message, invitation_required, invalid_invitation_code_message) {
$('#help_invitation_code_link').click(function(link) {
$('#help_invitation_code').lightbox_me({centered: true, zIndex: 1000000 });
});
$('#terms_link').click(function(link) {
link.preventDefault();
$('#terms').lightbox_me({ centered: true, zIndex: 1000000 });
});
$('#pending_consent_form').validate({
errorPlacement: function(error, element) {
if (element.attr("name") == "form[consent]") {
error.appendTo(element.parent().parent());
} else {
error.insertAfter(element);
}
},
rules: {
"form[email]": {required: true, email: true, remote: "/community_memberships/check_email_availability_and_validity"},
"form[consent]": {required: true},
"form[invitation_code]": {required: invitation_required, remote: "/community_memberships/check_invitation_code"}
},
messages: {
"form[email]": { remote: email_invalid_message },
"form[invitation_code]": { remote: invalid_invitation_code_message }
}
});
}
function set_textarea_maxlength() {
var ignore = [8,9,13,33,34,35,36,37,38,39,40,46];
var eventName = 'keypress';
$('textarea[maxlength]')
.on(eventName, function(event) {
var self = $(this),
maxlength = self.attr('maxlength'),
code = $.data(this, 'keycode');
if (maxlength && maxlength > 0) {
return ( self.val().length < maxlength
|| $.inArray(code, ignore) !== -1 );
}
})
.on('keydown', function(event) {
$.data(this, 'keycode', event.keyCode || event.which);
});
}
function get_date_from_date_select() {
year = $('#listing_valid_until_1i').val();
month = $('#listing_valid_until_2i').val();
day = $('#listing_valid_until_3i').val();
date = new Date(year,month-1,day,"23","59","58");
return date;
}
function get_datetime_from_datetime_select() {
year = $('#listing_valid_until_1i').val();
month = $('#listing_valid_until_2i').val();
day = $('#listing_valid_until_3i').val();
hours= $('#listing_valid_until_4i').val();
minutes = $('#listing_valid_until_5i').val();
date = new Date(year,month-1,day,hours,minutes);
return date;
}
function enableSamePageScroll() {
function filterPath(string) {
return string
.replace(/^\//,'')
.replace(/(index|default).[a-zA-Z]{3,4}$/,'')
.replace(/\/$/,'');
}
var locationPath = filterPath(location.pathname);
var scrollElem = scrollableElement('html', 'body');
$('a[href*=#]').each(function() {
var thisPath = filterPath(this.pathname) || locationPath;
if ( locationPath == thisPath
&& (location.hostname == this.hostname || !this.hostname)
&& this.hash.replace(/#/,'') ) {
var $target = $(this.hash), target = this.hash;
if (target) {
var targetOffset = $target.offset().top;
$(this).click(function(event) {
event.preventDefault();
$(scrollElem).animate({scrollTop: targetOffset}, 400, function() {
location.hash = target;
});
});
}
}
});
// use the first element that is "scrollable"
function scrollableElement(els) {
for (var i = 0, argLength = arguments.length; i <argLength; i++) {
var el = arguments[i],
$scrollElement = $(el);
if ($scrollElement.scrollTop()> 0) {
return el;
} else {
$scrollElement.scrollTop(1);
var isScrollable = $scrollElement.scrollTop()> 0;
$scrollElement.scrollTop(0);
if (isScrollable) {
return el;
}
}
}
return [];
}
}