(function () {
var Lang = YAHOO.lang,
UA = YAHOO.env.ua,
ButtonPrototype = YAHOO.widget.Button.prototype,
fnButtonInitAttributes = ButtonPrototype.initAttributes,
ButtonGroupPrototype = YAHOO.widget.ButtonGroup.prototype,
fnButtonGroupInitAttributes = ButtonGroupPrototype.initAttributes,
fnButtonGroupAddButton = ButtonGroupPrototype.addButton,
m_bUseARIA = (UA.gecko && UA.gecko >= 1.9) || (UA.ie && UA.ie >= 8),
// Private constants for strings
_ARIA_PREFIX = "aria-",
_USE_ARIA = "usearia",
_CHECKED = "checked",
_TYPE = "type",
_MENU = "menu",
_SPLIT = "split",
_HAS_POPUP = "haspopup",
_RENDER = "render",
_RADIO = "radio",
_CHECKBOX = "checkbox",
_ROLE = "role",
_CHECKED_CHANGE = "checkedChange",
_PRESENTATION = "presentation",
_ELEMENT = "element",
_RADIO_GROUP = "radiogroup",
_CHECKED_BUTTON_CHANGE = "checkedButtonChange",
_APPEND_TO = "appendTo",
_LABELLED_BY = "labelledby",
_DESCRIBED_BY = "describedby",
_ID = "id";
if (m_bUseARIA) {
ButtonPrototype.RADIO_DEFAULT_TITLE = "";
ButtonPrototype.RADIO_CHECKED_TITLE = "";
ButtonPrototype.CHECKBOX_DEFAULT_TITLE = "";
ButtonPrototype.CHECKBOX_CHECKED_TITLE = "";
}
// Button ARIA plugin
var setARIARole = function (element, role) {
element.setAttribute(_ROLE, role);
};
var setARIAProperty = function (element, property, value) {
element.setAttribute((_ARIA_PREFIX + property), value);
};
var enableARIAForMenu = function (type, args, button) {
this.cfg.setProperty(_USE_ARIA, true);
this.cfg.setProperty(_LABELLED_BY, button.get(_ID));
};
var onAppendTo = function () {
this._menu.subscribe(_RENDER, enableARIAForMenu, this);
};
var toggleARIACheckedState = function (event) {
setARIAProperty(this._button, _CHECKED, event.newValue);
};
Lang.augmentObject(ButtonPrototype, {
_setUseARIA: function (p_bUseARIA) {
var sType = this.get(_TYPE),
oButtonEl = this._button;
if (p_bUseARIA) {
switch (sType) {
case _MENU:
case _SPLIT:
setARIAProperty(oButtonEl, _HAS_POPUP, true);
this.on(_APPEND_TO, onAppendTo);
break;
case _RADIO:
case _CHECKBOX:
setARIARole(oButtonEl, sType);
setARIAProperty(oButtonEl, _CHECKED, this.get(_CHECKED));
this.on(_CHECKED_CHANGE, toggleARIACheckedState);
break;
}
}
},
initAttributes: function (p_oAttributes) {
/**
* @attribute usearia
* @description Boolean indicating if use of the WAI-ARIA Roles and States should
* be enabled.
* @type Boolean
* @default true for Firefox 3 and IE 8, false for all other browsers.
*/
this.setAttributeConfig(_USE_ARIA, {
value: p_oAttributes.usearia || m_bUseARIA,
validator: Lang.isBoolean,
writeOnce: true,
method: this._setUseARIA
});
fnButtonInitAttributes.apply(this, arguments);
if (m_bUseARIA) {
this.set(_USE_ARIA, true);
}
}
}, "initAttributes", "_setUseARIA");
// ButtonGroup ARIA plugin
var updateTabIndex = function (event) {
var oPreviousButton = event.prevValue;
if (oPreviousButton) {
oPreviousButton._button.tabIndex = -1;
}
event.newValue._button.tabIndex = 0;
};
Lang.augmentObject(ButtonGroupPrototype, {
addButton: function (p_oButton) {
var oButton = fnButtonGroupAddButton.call(this, p_oButton),
oButtonEl,
oParentNode;
if (this.get(_USE_ARIA)) {
oButton.set(_USE_ARIA, true);
oButtonEl = oButton._button;
oParentNode = oButtonEl.parentNode;
setARIARole(oParentNode, _PRESENTATION);
setARIARole(oParentNode.parentNode, _PRESENTATION);
oButtonEl.tabIndex = oButton.get(_CHECKED) ? 0 : -1;
}
return oButton;
},
_setUseARIA: function (p_bUseARIA) {
if (p_bUseARIA) {
setARIARole(this.get(_ELEMENT), _RADIO_GROUP);
this.on(_CHECKED_BUTTON_CHANGE, updateTabIndex);
}
},
_setLabelledBy: function (id) {
if (this.get(_USE_ARIA)) {
setARIAProperty(this.get(_ELEMENT), _LABELLED_BY, id);
}
},
_setDescribedBy: function (id) {
if (this.get(_USE_ARIA)) {
setARIAProperty(this.get(_ELEMENT), _DESCRIBED_BY, id);
}
},
initAttributes: function (p_oAttributes) {
/**
* @attribute usearia
* @description Boolean indicating if use of the WAI-ARIA Roles and States should
* be enabled.
* @type Boolean
* @default true for Firefox 3 and IE 8, false for all other browsers.
*/
this.setAttributeConfig(_USE_ARIA, {
value: p_oAttributes.usearia || m_bUseARIA,
validator: Lang.isBoolean,
writeOnce: true,
method: this._setUseARIA
});
/**
* @attribute labelledby
* @description String representing the id of the element that labels the ButtonGroup.
* Maps directly to the
* aria-labelledby
attribute.
* @type String
* @default null
*/
this.setAttributeConfig(_LABELLED_BY, {
value: p_oAttributes.labelledby,
validator: Lang.isString,
method: this._setLabelledBy
});
/**
* @attribute describedby
* @description String representing the id of the element that describes the ButtonGroup.
* Maps directly to the
* aria-describedby
attribute.
* @type String
* @default null
*/
this.setAttributeConfig(_DESCRIBED_BY, {
value: p_oAttributes.describedby,
validator: Lang.isString,
method: this._setDescribedBy
});
fnButtonGroupInitAttributes.apply(this, arguments);
if (m_bUseARIA) {
this.set(_USE_ARIA, true);
}
}
}, "initAttributes", "_setUseARIA", "_setLabelledBy", "_setDescribedBy", "addButton");
}());
YAHOO.register("buttonariaplugin", YAHOO.widget.Button, {version: "@VERSION@", build: "@BUILD@"});