// вспомогательная функция для создания ноды
function createNode( name, klasses) {
var n = document.createElement ( name) ;
n.className = klasses;
return n;
}
function l( x) {
console.dir ( x) ;
}
function hasClass( node, cls) {
var pattern = "\\ b" + cls + "\\ b" ;
var regEx = new RegExp( pattern, "gi" ) ;
return regEx.test ( node.className ) ;
}
function addClass( node, cls) {
if ( hasClass( node, cls) ) {
return null ;
}
node.className += " " + cls;
return node;
}
function removeClass( node, cls) {
if ( ! hasClass( node, cls) ) {
return null ;
}
var pattern = "\\ b" + cls + "\\ b" ;
var regEx = new RegExp( pattern, "gi" ) ;
var temp = node.className .replace ( regEx, "" ) ;
temp = temp.replace ( /\s{2,}/ , " " ) .trim ( ) ;
node.className = temp;
return node;
}
l( hasClass( createNode( 'div' , 'test' ) , 'test' ) ) ; // true
l( hasClass( createNode( 'div' , 'test' ) , 'tes' ) ) ; // false
l( hasClass( createNode( 'div' , 'test1 test2' ) , 'tes' ) ) ; // false
l( hasClass( createNode( 'div' , 'test1 test2' ) , 'test1' ) ) ; // true
l( addClass( createNode( 'div' , 'test1' ) , 'test2' ) ) ;
l( addClass( createNode( 'div' , 'test1' ) , 'test1' ) ) ;
l( removeClass( createNode( 'div' , 'test1 test2 test3' ) , 'test1' ) ) ;
l( removeClass( createNode( 'div' , 'test1 test2 test3' ) , 'test2' ) ) ;
l( removeClass( createNode( 'div' , 'test1' ) , 'test2' ) ) ;
l( removeClass( createNode( 'div' , 'test1' ) , 'test1' ) ) ;
Ly8g0LLRgdC/0L7QvNC+0LPQsNGC0LXQu9GM0L3QsNGPINGE0YPQvdC60YbQuNGPINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINC90L7QtNGLCmZ1bmN0aW9uIGNyZWF0ZU5vZGUobmFtZSwga2xhc3NlcykgewogICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpOwogICAgbi5jbGFzc05hbWUgPSBrbGFzc2VzOwogICAgcmV0dXJuIG47Cn0KCmZ1bmN0aW9uIGwoeCkgewogICAgY29uc29sZS5kaXIoeCk7Cn0KCmZ1bmN0aW9uIGhhc0NsYXNzKG5vZGUsIGNscykgewogICAgdmFyIHBhdHRlcm4gPSAiXFxiIiArIGNscyArICJcXGIiOwogICAgdmFyIHJlZ0V4ICAgPSBuZXcgUmVnRXhwKHBhdHRlcm4sICJnaSIpOwogICAgcmV0dXJuIHJlZ0V4LnRlc3Qobm9kZS5jbGFzc05hbWUpOwp9CgpmdW5jdGlvbiBhZGRDbGFzcyhub2RlLCBjbHMpIHsKICAgIGlmIChoYXNDbGFzcyhub2RlLCBjbHMpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBub2RlLmNsYXNzTmFtZSArPSAiICIgKyBjbHM7CiAgICByZXR1cm4gbm9kZTsKfQoKZnVuY3Rpb24gcmVtb3ZlQ2xhc3Mobm9kZSwgY2xzKSB7CiAgICBpZiAoIWhhc0NsYXNzKG5vZGUsIGNscykpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBwYXR0ZXJuID0gIlxcYiIgKyBjbHMgKyAiXFxiIjsKICAgIHZhciByZWdFeCAgID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCAiZ2kiKTsKICAgIHZhciB0ZW1wID0gbm9kZS5jbGFzc05hbWUucmVwbGFjZShyZWdFeCwgIiIpOwogICAgdGVtcCA9IHRlbXAucmVwbGFjZSgvXHN7Mix9LywgIiAiKS50cmltKCk7CiAgICBub2RlLmNsYXNzTmFtZSA9IHRlbXA7CiAgICByZXR1cm4gbm9kZTsKfQoKbChoYXNDbGFzcyhjcmVhdGVOb2RlKCdkaXYnLCAndGVzdCcpLCAndGVzdCcpKTsgLy8gdHJ1ZQpsKGhhc0NsYXNzKGNyZWF0ZU5vZGUoJ2RpdicsICd0ZXN0JyksICd0ZXMnKSk7IC8vIGZhbHNlCgpsKGhhc0NsYXNzKGNyZWF0ZU5vZGUoJ2RpdicsICd0ZXN0MSB0ZXN0MicpLCAndGVzJykpOyAvLyBmYWxzZQpsKGhhc0NsYXNzKGNyZWF0ZU5vZGUoJ2RpdicsICd0ZXN0MSB0ZXN0MicpLCAndGVzdDEnKSk7IC8vIHRydWUKCmwoYWRkQ2xhc3MoY3JlYXRlTm9kZSgnZGl2JywgJ3Rlc3QxJyksICd0ZXN0MicpKTsKbChhZGRDbGFzcyhjcmVhdGVOb2RlKCdkaXYnLCAndGVzdDEnKSwgJ3Rlc3QxJykpOwoKbChyZW1vdmVDbGFzcyhjcmVhdGVOb2RlKCdkaXYnLCAndGVzdDEgdGVzdDIgdGVzdDMnKSwgJ3Rlc3QxJykpOwpsKHJlbW92ZUNsYXNzKGNyZWF0ZU5vZGUoJ2RpdicsICd0ZXN0MSB0ZXN0MiB0ZXN0MycpLCAndGVzdDInKSk7CmwocmVtb3ZlQ2xhc3MoY3JlYXRlTm9kZSgnZGl2JywgJ3Rlc3QxJyksICd0ZXN0MicpKTsKbChyZW1vdmVDbGFzcyhjcmVhdGVOb2RlKCdkaXYnLCAndGVzdDEnKSwgJ3Rlc3QxJykpOw==