// ==UserScript==
// @name          TV Programme selector
// @namespace     http://www.atleta.hu/gm/port.hu
// @description   v0.3 A Port.hu-n az egyeni beallitasoknal TV musorok kivalasztasat teszi kenyelmesebbe (hasznalhatova)
// @include       http://www.port.hu/pls/w/tv.personal*
// @include       http://port.hu/pls/w/tv.personal*
// @include       http://www.port.hu/pls/tv/tv.personal*
// @include       http://port.hu/pls/tv/tv.personal*
// ==/UserScript==

/*        Author: Laszlo Marai / atleta
          Date:   2007-08-30
	  License: General Public License
*/

(
function() {
    const PROGRAMMES_XPATH = "//form/table/tbody/tr/td[1]/table/tbody/tr[position()>2]";

    var progs = toArray( document.evaluate( PROGRAMMES_XPATH,
                                    document, null, 0, null ) );
    var progTable = toArray( document.evaluate( PROGRAMMES_XPATH,
                                    document, null, 0, null ) );
    
    var selection = { selected: null };
    var handler = createClickHandler( selection );
    var first = 0;
    var last = progs.length - 1;
    var prevIndex = 1;
    
    progs[first].limit = true;
    progs[last].limit = true;
    
    for ( i = first; i <= last; i++ ) {
        progs[i].addEventListener( 'click', handler, true );
        
        // Try too guess the right ordinal for the channels that have '*' instead
        var ordinal = progs[i].cells[2].getElementsByTagName( "select" )[0];
        if ( ! Number( ordinal.options[ordinal.selectedIndex].value ) ) {
            ordinal.selectedIndex = prevIndex + 1;
        }
        
        prevIndex = ordinal.selectedIndex;
    }
    
    createButtons( progs[1].parentNode.insertRow( 1 ) );
    
    function createButtons( row ) {
        var cell = row.insertCell( 0 );
        cell.colSpan = 3;
        cell.innerHTML = //"<TABLE WIDTH='100%'><TBODY><TR><TD><DIV id='user.script.ButtonDown' align='center'>Le</DIV></TD><TD><DIV id='user.script.ButtonUp' align='center'>Fel</DIV></TD></TR></TBODY></TABLE>"
            "<TABLE WIDTH='100%'>" +
                "<TBODY>" +
                    "<TR>"+
                        "<TD>" +
                            "<!--A HREF='#' STYLE='text-decoration:none'-->" +
                                "<DIV id='user.script.ButtonDown' align='center'>" +
                                    "Le" +
                                "</DIV>" + 
                            "<!--/A-->" +
                        "</TD>" +
                        "<TD>" +
                            "<!--A HREF='#' STYLE='text-decoration:none'-->" + 
                                "<DIV id='user.script.ButtonUp' align='center'>" +
                                    "Fel" +
                                "</DIV>" +
                            "<!--/A-->" +
                        "</TD>" +
                    "</TR>" +
                "</TBODY>" +
            "</TABLE>";
        setupButton( "user.script.ButtonDown", createButtonHandler( new DownHelper() ) );
        setupButton( "user.script.ButtonUp", createButtonHandler( new UpHelper() ) );
    }
    
    function setupButton( name, handler ) {
        var button = document.getElementById( name );
        button.style.border = "2px solid";
        button.style.background = "#aeae20";
        button.style.MozUserSelect = "none";
        button.addEventListener( "click", handler, true );
        return button;
    }
    
    function toArray( xpathResult ) {
        var item;
        var array = [];
        
        while ( item = xpathResult.iterateNext() ) {
            array.push( item );
        }
        
        return array;
    }
    
    function createClickHandler( param ) {
        var previous;
        return function( event ) {
            if ( this != previous ) {
                this.saveBgr = this.style.background;
                this.style.background = "#ffff00";
                
                if ( previous ) {
                    previous.style.background = previous.saveBgr;
                }
                param.selected = this;
                previous = this;
            }
            
            event.stopPropagation();
            event.preventDefault();
        }
    }
    
    function createButtonHandler( helper ) {
        return function( event ) {
            var table = selection.selected.parentNode;
            var rows = helper.getRows( selection.selected );
            rows[1].cells[2].getElementsByTagName( "select" )[0].selectedIndex++;
            rows[0].cells[2].getElementsByTagName( "select" )[0].selectedIndex--;
            table.removeChild( rows[0] );
            table.insertBefore( rows[0], rows[1] );
        }
    }
    
    function DownHelper() {
        this.getRows = function( row ) {
            var nextRow = row.nextSibling;
            while ( nextRow.nodeName.toLowerCase() != "tr" ) {
                nextRow = nextRow.nextSibling;
            }
            
            return [nextRow, row];
        }
    }
    
    function UpHelper() {
        this.getRows = function( row ) {
            var prevRow = row.previousSibling;
            
            while ( prevRow.nodeName.toLowerCase() != "tr" ) {
                prevRow = prevRow.previousSibling;
            }
            
            return [row, prevRow];
        }
    }
}
)();
