// ==UserScript==
// @name                Adminspotting
// @version             1.2
// @date                2010-11-02
// @author              Ian Malpass ( ian AT etsyhacks DOT com )
// @namespace           etsy.com
// @description         Spots and reports posts by admins to the forums
// @include             http://www.etsy.com/forums_thread.php?*
// @include             http://www.etsy.com/forums_main.php*
// @include             http://www.etsy.com/forums_board.php?*
// @include             http://www.etsy.com/forums_user_threads.php*
// @include             http://www.etsy.com/forums_search.php?*
// ==/UserScript==

var starUri = "data:image/gif,GIF89a%0C%00%0B%00%84%1D%00%FF%A0%40%FF%A3F%FF%A6M%FF%A7F%FF%A7O%FF%A8H%FF%A8Q%FF%ABM%FF%ADQ%FF%ADZ%FF%B0%60%FF%B2k%FF%B6i%FF%B8%5E%FF%B9%60%FF%B8t%FF%BAc%FF%BFg%FF%BE%81%FF%C1i%FF%C3v%FF%C4p%FF%C6%7D%FF%C9%83%FF%C9%8A%FF%CB%8E%FF%CE%93%FF%D3%9E%FF%DE%B6%FF%FF%FF%FF%FF%FF%FF%FF%FF!%F9%04%01%00%00%1F%00%2C%00%00%00%00%0C%00%0B%00%00%05-%E0'%8Ed)b%989b%D3%94%AAU%5B%95mmOc%DCF%08%20%D0%AD%01%00%60j%15%86D%DA%01%99%24%01%12%12I%A2%A9*%85%00%00%3B";

function decorateForumList () {
    var links = document.getElementsByTagName( 'a' );
    var extractThread = /forums_thread.php\?thread_id=(\d+)$/;
    for ( var l = 0; l < links.length; l++ ) {
        var link = links[ l ];
        if ( link.href ) {
            var match = extractThread.exec( link.href );
            if ( match ) {
                var hasAdmin = false;
                var thread_id = match[ 1 ];
                var rowNode = link.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
                if ( GM_getValue( thread_id ) != null ) {
                    hasAdmin = true;
                }
                var imgs = rowNode.getElementsByTagName( 'img' );
                if ( imgs.length > 0 ) {
                    rowNode.className = 'orange_link';
                    insertPage( thread_id, 1 );
                    hasAdmin = true;
                }
                if ( hasAdmin ) {
                    rowNode.cells[ 0 ].innerHTML = '<div style="position: absolute;"><img style="position: relative; left: -13px; top: 2px;" width="12" height="11" src="' + starUri + '" /></div>' + rowNode.cells[ 0 ].innerHTML;
                    var insertCount = buildLinks( rowNode, thread_id );
                    l += insertCount;
                }
            }
        }
    }
}

if ( document.location.href.indexOf( 'forums_thread.php' ) > -1 ) {
    highlightAdmin();
} else {
    update();
    decorateForumList();
}

function highlightAdmin () {
    var table = document.getElementsByClassName( 'row_grey' )[ 1 ].parentNode;
    var thread_id = ( document.location.search.match( /thread_id=(\d+)/ ) )[ 1 ];
    var match = document.location.search.match( /page=(\d+)/ );
    var page = ( match ) ? match[ 1 ] : 1;
    var posts = GM_getValue( thread_id );
    posts = ( posts == null ) ? [] : eval( posts );
    var known = false;
    var offset = 2;
    if ( table.rows[ table.rows.length - 1 ].getElementsByTagName( 'textarea' ).length ) {
        offset++;
    }
    for ( var r = 0; r < table.rows.length - offset; r++ ) {
        var row = table.rows[ r ];
        var imgs = row.getElementsByTagName( 'img' );
        var isAdmin = false;
        for ( var i = 0; i < imgs.length; i++ ) {
            if ( imgs[ i ].src.indexOf( 'icon_etsy_admin.gif' ) > -1 ) {
                isAdmin = true;
                break;
            }
        }
        if ( ! isAdmin ) continue;
        row.style.background = '#f9e2b7';
        if ( ! known ) {
            for ( var p = 0; p < posts.length; p++ ) {
                if ( posts[ p ] == page ) {
                    known = true;
                    break;
                }
            }
            if ( ! known ) {
                update( thread_id, page );
                insertPage( thread_id, page );
                known = true;
            }
        }            
    }        
}

function update ( thread_id, page ) {
    var lastUpdate = GM_getValue( 'lastUpdate' ) || 0;
    var url = 'http://www.indecorous.com/hacks/admin.cgi?last_update=' + lastUpdate;
    if ( thread_id && page ) {
        url += '&thread=' + thread_id + '&page=' + page;
    } else {
        var last = GM_getValue( 'lastUpdateLocal' ) || 0;
        last = Number( last );
        var now = new Date;
        if ( ( now.valueOf() - last ) < 600000 ) {
            return;
        }
    }
    GM_xmlhttpRequest( {
        method: 'GET',
        url: url,
        onload: parseUpdate
    } );
}

function parseUpdate( response ) {
    if ( response.status == 200 ) {
        var bits = response.responseText.split( /,/ );
        GM_setValue( 'lastUpdate', bits[ 0 ] );    
        var date = new Date;
        GM_setValue( 'lastUpdateLocal', String( date.valueOf() ) );
        //window.alert( 'setting ' + GM_getValue( 'lastUpdateLocal' ) );
        for ( var p = 1; p < bits.length; p += 2 ) {
            insertPage( bits[ p ], bits[ p + 1 ] );
            //window.alert( bits[ p ] + ' ' + bits[ p + 1 ] );
        }
    }
}

function insertPage( thread_id, page ) {
    var posts = GM_getValue( thread_id );
    posts = ( posts == null ) ? [] : eval( posts );
    var known = false;
    for ( var p = 0; p < posts.length; p++ ) {
        if ( posts[ p ] == page ) {
            known = true;
            break;
        }
    }
    if ( ! known ) {
        posts.push( page );
        posts = posts.sort( function ( a, b ) { return Number( a ) - Number( b ) } );
        GM_setValue( thread_id, uneval( posts ) );
    }
}

function buildLinks ( rowNode, thread_id ) {
    // build the "jump to" links
    var nodes = getElementsByClassName( 'fwJumpTo', rowNode );
    var div;
    if ( nodes.length == 0 ) {
        div = document.createElement( 'div' );
        // format the div
        div.className = 'fwJumpTo dark_grey_text';
        div.style.width = '100%';
        div.style.borderTop = '1px solid rgb(218, 219, 214)';
        div.style.marginTop = '2px';
        div.style.paddingTop = '2px';
        div.style.fontSize = '10px';
        // add it to the row
        rowNode.cells[ rowNode.cells.length - 1 ].appendChild( div );
    } else {
        div = nodes[ 0 ];
    }

    // create the links
    var fragment = document.createDocumentFragment();
    var nodes = getElementsByClassName( 'postsLink', rowNode );
    if ( nodes.length ) {
        postsLink = nodes[ 0 ];
        var divs = getElementsByClassName( 'linksDiv', rowNode );
        linksDiv = divs[ 0 ];
        linksDiv.appendChild( document.createElement( 'br' ) );
    } else {
        if ( div.firstChild ) {
            fragment.appendChild( document.createTextNode( ' ' + String.fromCharCode( '8226' ) + ' ' ) );
        } else {
            fragment.insertBefore( document.createTextNode( 'Jump to: ' ), fragment.firstChild );
        }
        postsLink = document.createElement( 'a' );
        postsLink.className = 'postsLink';
        postsLink.innerHTML = "post";
        postsLink.style.cursor = 'pointer';
        postsLink.href = "#";
        fragment.appendChild( postsLink );
        linksDiv = document.createElement( 'div' );
        linksDiv.className = 'dark_grey_text linksDiv';
        linksDiv.style.width = '100%';
        linksDiv.style.marginTop = '2px';
        linksDiv.style.paddingTop = '2px';
        linksDiv.style.fontSize = '10px';
        linksDiv.style.display = 'none';
        rowNode.cells[ rowNode.cells.length - 1 ].appendChild( linksDiv );
        postsLink.addEventListener( 'click', genClick( linksDiv ), false );
    }

    div.appendChild( fragment );
    linksDiv.innerHTML += 'Admin posts:';
    var pages = eval( GM_getValue( thread_id ) );
    for ( var p = 0; p < pages.length; p++ ) {
        if ( p > 0 ) linksDiv.innerHTML += ',';
        linksDiv.innerHTML += ' <a href="forums_thread.php?thread_id=' + thread_id + '&page=' + pages[ p ] + '">' + pages[ p ] + '</a>';
    }
    return 1 + pages.length;
}

function genClick( linksDiv ) {
    return function ( event ) {
        if ( linksDiv.style.display == 'none' ) {
            linksDiv.style.display = '';
        } else {
            linksDiv.style.display = 'none';
        }
        event.preventDefault();
    };
}

// utility function to replicate getElementsByClassName() on older Firefoxes
function getElementsByClassName ( class, node ) {
    if ( node == null ) node = document;
    if ( node.getElementsByClassName ) {
        return node.getElementsByClassName( class );
    } else {
        var classElements = new Array();
        var els = node.getElementsByTagName( '*' );
        var elsLen = els.length;
        var pattern = new RegExp("(^|\\s)"+class+"(\\s|$)");
        for (i = 0, j = 0; i < elsLen; i++) {
            if ( pattern.test(els[i].className) ) {
                classElements[j] = els[i];
                j++;
            }
        }
        return classElements;
    }
}




