accessibility-8.x-1.x-dev/js/accessibility.js
js/accessibility.js
(function($) {
Drupal.accessibility = {
settings : false,
messages : { },
loadSettings : function(callback) {
if (typeof this.settings === 'object') {
callback(this.settings);
return;
}
var that = this;
$.getJSON(Drupal.settings.basePath + 'js/accessibility/tests.json', function(results) {
that.settings = results;
callback(that.settings);
});
},
checkElement : function(element, testFailed, complete, category) {
if(typeof testFailed === 'undefined' || !testFailed) {
testFailed = this.highlightElement;
}
if (typeof this.settings !== 'object') {
var that = this;
that.loadSettings(function() {
that.checkElement(element, testFailed, complete, category);
});
}
else {
var guideline = this.settings.guideline;
if (typeof category !== 'undefined') {
$.each(this.settings.tests, function(testName, test) {
if(test.tags.indexOf(category) === -1) {
guideline.splice(guideline.indexOf(testName), 1);
}
});
}
element.quail({ guideline : guideline,
jsonPath : Drupal.settings.basePath + Drupal.settings.accessibility.quail_path,
accessibilityTests : this.settings.tests,
testFailed : testFailed,
complete : complete,
reset : true
});
}
},
highlightElement : function(event, clickEvent) {
var that = Drupal.accessibility;
if (!event.element.hasClass('accessibility-result')) {
event.element.addClass('accessibility-result')
.addClass(event.severity);
var $image = $('<img>')
.attr('alt', Drupal.t('@severity error', { '@severity' : Drupal.t(event.severity) } ))
.attr('src', Drupal.settings.basePath + Drupal.settings.accessibility.icon_path + event.severity + '.png');
var $link = $('<a>')
.attr('href', '#accessibility-console')
.attr('role', 'command')
.addClass('accessibility-icon')
.addClass(event.severity)
.append($image);
event.element.before($link);
if(typeof clickEvent === 'undefined') {
Drupal.accessibility.attachHint(event);
}
else {
clickEvent(event);
}
}
var test = that.settings.tests[event.testName].testId;
if (typeof that.messages[test] == 'undefined') {
$.getJSON(Drupal.settings.basePath + 'accessibility-test/' + test + '/json', function(data) {
that.messages[test] = data;
});
}
var elementTests = event.element.data('accessibility-tests') || { };
elementTests[that.settings.tests[event.testName].testId] = that.settings.tests[event.testName].testId;
event.element.add(event.element.prev($('accessibility-icon'))).data('accessibility-tests', elementTests);
},
attachHint : function(event, $context) {
$context = $context || $('body');
var that = this;
event.element.add(event.element.prev($('.accessibility-icon')))
.on('click', function(event) {
var tests = $(this).data('accessibility-tests');
that.errorConsole.showTests(tests);
$('html, body').animate({
scrollTop: $(this).offset().top
}, 10);
that.errorConsole.setCurrentElement($(this), $context);
event.preventDefault();
});
},
cleanUpHighlight : function($context) {
$context = $context || $('html');
$context.find('.accessibility-result').each(function() {
$(this).removeClass('accessibility-result')
.removeClass('severe')
.removeClass('moderate')
.removeClass('suggestion');
});
$context.find('.accessibility-icon, .accessibility-icon-current').remove();
},
errorConsole : {
$console : false,
init : function() {
if($('#accessibility-console').length) {
return;
}
var that = this;
$('body').append('<div id="accessibility-console" class="visually-hidden">');
this.$console = $('#accessibility-console');
this.$console.append('<a name="accessibility-console">');
this.$console.append('<div class="accessibility-console-content" role="marquee">');
var $close = this.$console.append('<a role="button" class="close-console" href="#close" title="' +
Drupal.t('close accessibility console') +
'">×</a>');
$close.on('click', function() {
that.hide()
return false;
});
},
show : function() {
this.init();
this.$console.removeClass('visually-hidden');
$('body').trigger('accessibility-console-show')
.addClass('accessibility-console-shown');
},
hide : function() {
this.init();
this.$console.addClass('visually-hidden');
$('body').trigger('accessibility-console-hide')
.removeClass('accessibility-console-shown');
},
addTest : function(test) {
this.$console.append('<h3>' + Drupal.accessibility.messages[test].title + '</h3>');
},
showTests : function(tests) {
var that = this;
that.init();
var $content = that.$console.find('.accessibility-console-content');
$content.html('');
$.each(tests, function(index, test) {
$content.append('<h3>' + Drupal.accessibility.messages[test].title + '</h3>');
$content.append(Drupal.accessibility.messages[test].content);
});
that.show();
},
setCurrentElement : function(element, $context) {
$context = $context || $('body');
$context.find('.accessibility-icon-current').remove();
var $image = $('<img>')
.attr('alt', Drupal.t('Current element'))
.attr('role', 'note')
.addClass('accessibility-icon-current')
.attr('src', Drupal.settings.basePath + Drupal.settings.accessibility.icon_path + 'highlighted.png');
element.prev('.accessibility-icon').before($image);
}
}
};
})(jQuery);