function highlight( s, o ) {
    var d = document ;

    if( !s || /^\s*$/.test(s) ) {
        return 0;
    }

    o = [ o || d.documentElement || d.body ];
    var r = new RegExp( s, 'gi' ),
        h = d.createElement('span'), i = 0, j, k, l, m, n=0, t;

    h.style.backgroundColor = '#ff0';
    h.style.color = '#000';

    do {
        m = o[i];
        if( m.nodeType === 3 ) {
            r.lastIndex = 0;
            l = r.exec(m.nodeValue);

            if( l !== null ) {
                k = l[0].length;
                if( r.lastIndex > k ) {
                    m.splitText( r.lastIndex - k );
                    m = m.nextSibling;
                }
                if( m.nodeValue.length > k ) {
                    m.splitText(k);
                    o[i++] = m.nextSibling;
                }
                t = h.cloneNode( true );
                t.appendChild( d.createTextNode( l[0] ) );n++;
                m.parentNode.replaceChild( t, m );
            }
        } else {
            j = m.childNodes.length;
            while (j) {
                o[i++] = m.childNodes.item(--j);
            }
        }
    } while(i--);

    return n;
};
