|
/*jslint browser: true */ |
|
(function (window, document) { |
|
'use strict'; |
|
|
|
var createElement = function (tagName) { |
|
return document.createElement(tagName); |
|
}, |
|
|
|
getElements = function (tagName) { |
|
return document.getElementsByTagName(tagName); |
|
}, |
|
|
|
appendChild = function (parent, child) { |
|
parent.appendChild(child); |
|
}, |
|
|
|
addEvent = function (element, type, callback) { |
|
if (element.addEventListener) { |
|
element.addEventListener(type, callback, false); |
|
} else if (element.attachEvent) { |
|
element.attachEvent('on' + type, callback); |
|
} else { |
|
element['on' + type] = callback; |
|
} |
|
}, |
|
|
|
initialize = function (select, classNamePrefix) { |
|
var parent = select.parentNode, |
|
wrapper = createElement('div'), |
|
spanOuter = createElement('span'), |
|
spanMiddle = createElement('span'), |
|
spanInner = createElement('span'), |
|
getSelectedText = function () { |
|
return select.options[select.selectedIndex].text; |
|
}, |
|
createLabel = function () { |
|
return document.createTextNode(getSelectedText()); |
|
}, |
|
label = createLabel(), |
|
removeClass = function () { |
|
spanOuter.className = spanOuter.className.replace(classNamePrefix + '-active ', ''); |
|
}, |
|
addClass = function () { |
|
removeClass(); |
|
spanOuter.className = classNamePrefix + '-active ' + spanOuter.className; |
|
}, |
|
change = function () { |
|
spanInner.removeChild(label); |
|
label = createLabel(); |
|
select.setAttribute('title', getSelectedText()); |
|
appendChild(spanInner, label); |
|
}; |
|
|
|
select.setAttribute('title', getSelectedText()); |
|
|
|
select.className += ' replaced'; |
|
wrapper.className = classNamePrefix + '-container'; |
|
spanOuter.className = classNamePrefix + '-label'; |
|
spanInner.className = classNamePrefix + '-text'; |
|
|
|
spanOuter.setAttribute('aria-hidden', 'true'); |
|
|
|
appendChild(parent, wrapper); |
|
appendChild(wrapper, select); |
|
appendChild(wrapper, spanOuter); |
|
appendChild(spanOuter, spanMiddle); |
|
appendChild(spanMiddle, spanInner); |
|
appendChild(spanInner, label); |
|
|
|
addEvent(select, 'keyup', change); |
|
addEvent(select, 'change', change); |
|
addEvent(select, 'mouseover', addClass); |
|
addEvent(select, 'mouseout', removeClass); |
|
addEvent(select, 'focus', addClass); |
|
addEvent(select, 'blur', removeClass); |
|
}; |
|
|
|
window.customSelectors = function (classNameFilter, classNamePrefix) { |
|
var i, |
|
selectElements = getElements('select'); |
|
|
|
for (i = 0; i < selectElements.length; i += 1) { |
|
if (selectElements[i].className.indexOf(classNameFilter) >= 0) { |
|
initialize(selectElements[i], classNamePrefix); |
|
} |
|
} |
|
}; |
|
|
|
}(window, document)); |