// UKNova navbar dropdowns

var nav_dropdown= null;


// Abstract base class for all nav dropdowns
//
js_class('Dropdown', null, function() {
    this.WIDTH= 128;

    this._init= function(link, align) {
        if (!link) return;

        this.align= align==null? 0 : align;
        var data= null;
        var comments= dom_getComments(link);
        if (comments.length==1) data= eval(comments[0].data);
        if (!this.createDrop(data)) return;

        var sep= document.createElement('span');
        sep.className= 'sep-drop';
        this.button= document.createElement('span');
        this.button.className= 'drop-button';
        this.button.style.cursor= CURSOR_POINTER;
        this.button.appendChild(img_create('/theme/'+THEME+'/img/arrow/s.gif', '+', 'open drop-down'));
        this.button.onclick= js_callback(this, 'onclick');

        var sibling= link.nextSibling;
        link.parentNode.insertBefore(sep, sibling);
        link.parentNode.insertBefore(this.button, sibling);
        document.getElementById('header').appendChild(this.drop);
    };

    this.createDrop= function(data) {
        this.drop= document.createElement('div');
        this.drop.className= 'drop folded';
        this.drop.id= 'drop-'+this.NAME;
        var wrap= document.createElement('div');
        wrap.className= 'wrap';
        this.drop.appendChild(wrap);
        return wrap;
    };

    this.onclick= function() {
         if (nav_dropdown!=null) {
            nav_dropdown.close();
            if (nav_dropdown===this) {
                nav_dropdown= null;
                return;
            }
         }
         this.open();
         nav_dropdown= this;
    };
    this.open= function() {
        var position= domext_getPosition(this.button);
        var left= 0;
        if (position!=null)
            left= position[0]+(position[2]-this.WIDTH+1)*(1-this.align);
        this.drop.style.left= left+'px';
        dom_setClass(this.drop, 'folded', false);
        dom_setClass(this.button, 'selected', true);
    };
    this.close= function() {
        dom_setClass(this.drop, 'folded', true);
        dom_setClass(this.button, 'selected', false);
    };
});


// Abstract base class for dropdowns that provide a search box
//
js_class('FindDropdown', 'Dropdown', function() {
    this.PARAMETER= 'title';
    this.createDrop= function(data) {
        var wrap= Dropdown.prototype.createDrop.call(this, data);
        var form= document.createElement('form');
        form.method= 'get';
        form.action= '/wsgi/'+this.NAME+'/find';

        var input= document.createElement('input');
        input.type= 'text';
        input.name= this.PARAMETER;
        var button= document.createElement('input');
        button.className= 'default';
        button.type= 'submit';
        button.value= 'Find';

        var table= document.createElement('table');
        table.insertRow(0).insertCell(0);
        table.insertRow(1).insertCell(0);
        table.rows[0].cells[0].className= 'f-f';
        table.rows[0].cells[0].appendChild(input);
        table.rows[1].cells[0].appendChild(button);
        form.appendChild(table);
        wrap.appendChild(form);
        return wrap;
    };
    this.open= function() {
        Dropdown.prototype.open.call(this);
        this.drop.getElementsByTagName('input')[0].focus();
    };
});

// Concrete find-box dropdowns
//
js_class('TorrentDropdown', 'FindDropdown', function() {
    this.NAME= 'torrent';
    this.PARAMETER= 'title';
    this.createDrop= function(data) {
        var wrap= FindDropdown.prototype.createDrop.call(this, data);
        if (PAGEDATA.canup) {
            var a= document.createElement('a');
            a.href= '/wsgi/torrent/find?creator='+encodeURIComponent(PAGEDATA.username);
            a.appendChild(document.createTextNode('My uploads...'));
            wrap.appendChild(a);
        }
        if (PAGEDATA.canfind) {
            var a= document.createElement('a');
            a.href= '/wsgi/comment/find?creator='+encodeURIComponent(PAGEDATA.username);
            a.appendChild(document.createTextNode('My comments...'));
            wrap.appendChild(a);
        }
        return wrap;
    }
});
js_class('ForumDropdown', 'FindDropdown', function() {
    this.NAME= 'forum';
    this.PARAMETER= 'title';
    this.createDrop= function(data) {
        var wrap= FindDropdown.prototype.createDrop.call(this, data);
        if (PAGEDATA.canfind) {
            var a= document.createElement('a');
            a.href= '/wsgi/forum/find?creator='+encodeURIComponent(PAGEDATA.username);
            a.appendChild(document.createTextNode('My posts...'));
            wrap.appendChild(a);
        }
        return wrap;
    }
});
js_class('ScheduleDropdown', 'FindDropdown', function() {
    this.NAME= 'schedule';
    this.PARAMETER= 'title';
    this.createDrop= function(data) {
        var wrap= FindDropdown.prototype.createDrop.call(this, data);
        if (PAGEDATA.canup) {
            var a= document.createElement('a');
            a.href= '/wsgi/schedule/find?creator='+encodeURIComponent(PAGEDATA.username);
            a.appendChild(document.createTextNode('My caps...'));
            wrap.appendChild(a);
        }
        return wrap;
    }
});
js_class('AccountDropdown', 'FindDropdown', function() {
    this.NAME= 'account';
    this.PARAMETER= 'username';
});


// Account info and AJAX catchup button
//
js_class('UsernameDropdown', 'Dropdown', function() {
    this.NAME= 'username';
    this.createDrop= function(data) {
        var wrap= Dropdown.prototype.createDrop.call(this, data);
        var form=this.form= document.createElement('form');
        form.id= 'catchup';
        form.method= 'post';
        form.action= '/wsgi/catchup';
        form.onsubmit= js_callback(this, 'onsubmit');
        form.appendChild(document.createElement('div'));
        form.appendChild(document.createElement('div'));
        var hidden= document.createElement('input');
        hidden.type= 'hidden';
        hidden.name= 'submit';
        hidden.id= 'catchup-submit';
        hidden.value= PAGEDATA.key;
        var button= document.createElement('input');
        button.type= 'submit';
        button.value= 'Catch up';
        this.timespan= document.createElement('span');
        this.timespan.className= 'time';
        this.timespan.title= PAGEDATA.visitr;
        this.timespan.appendChild(document.createTextNode(PAGEDATA.visit));

        form.firstChild.appendChild(document.createTextNode('Score: '));
        form.firstChild.appendChild(document.createElement('span'));
        form.firstChild.lastChild.appendChild(document.createTextNode(''+PAGEDATA.score));
        form.firstChild.lastChild.className= 'score-'+PAGEDATA.scorec+' totals-'+PAGEDATA.totalsc;
        form.lastChild.appendChild(document.createTextNode('Previous visit:'));
        form.lastChild.appendChild(document.createElement('div'));
        form.lastChild.lastChild.className= 'notes';
        form.lastChild.lastChild.appendChild(this.timespan);
        form.lastChild.appendChild(hidden);
        form.lastChild.appendChild(button);
        wrap.appendChild(form);
        return wrap;
    };
    this.onsubmit= function() {
        new CatchupRequest().send(this);
        return false;
    };
});
js_class('CatchupRequest', 'AsyncRequest', function() {
    this.send= function(drop) {
        this.drop= drop;
        var pars= Object();
        pars.submit= document.getElementById('catchup-submit').value;
        this.open(true, '/wsgi/catchup', pars, 10000); // timeout after 10s
    };
    this.oncancel= function() {
        var status= this.drop.timespan.firstChild;
        status.data= 'Timed out';
    };
    this.oncomplete= function(results) {
        var status= this.drop.timespan.firstChild;
        if (!results.ok) {
            status.data= results.error;
            return;
        };
        status.data= results.visited;

        // remove all 'new' icons from page
        //
        for (var i= document.images.length; i-->0;) { var img= document.images[i];
            if (dom_isClass(img, 'icon-new') || dom_isClass(img, 'icon-replies'))
                img.parentNode.removeChild(img);
        }
        this.drop.close();
        nav_dropdown= null;
    };
});

// Login/out
//
js_class('LoginDropdown', 'Dropdown', function() {
    this.NAME= 'login';
    this.createDrop= function(data) {
        var wrap= Dropdown.prototype.createDrop.call(this, data);
        var form= document.createElement('form');
        form.id= 'login';
        form.method= 'get';
        form.action= '/wsgi/login';

        var table= document.createElement('table');
        var ids= new Array('username-label', 'username', 'password-label', 'password', 'status', 'submit');
        for (var i= 0; i<ids.length; i++)
            table.insertRow(i).insertCell(0).id= 'login-'+ids[i];
        table.rows[1].cells[0].className=table.rows[3].cells[0].className= 'f-f';
        form.appendChild(table); // login.js will fill in form content
        wrap.appendChild(form);
        return wrap;
    };
    this.open= function() {
        Dropdown.prototype.open.call(this);
        var inputs= this.drop.getElementsByTagName('input');
        if (inputs.length!=0) inputs[0].focus();
    };
});
js_class('LogoutDropdown', 'Dropdown', function() {
    this.NAME= 'logout';
    this.createDrop= function(data) {
        var wrap= Dropdown.prototype.createDrop.call(this, data);
        var form= document.createElement('form');
        form.method= 'post';
        form.action= '/wsgi/logout/logout';
        var button= document.createElement('input');
        button.type= 'submit';
        button.value= 'Logout';
        var hidden= document.createElement('input');
        hidden.type= 'hidden';
        hidden.name= 'submit';
        hidden.value= PAGEDATA.key;
        form.appendChild(document.createElement('div'));
        form.firstChild.appendChild(hidden);
        form.firstChild.appendChild(button);
        wrap.appendChild(form);
        return wrap;
    };
});


// Group messaging list (doesn't appear unless you're staff/support)
//
js_class('MessageDropdown', 'Dropdown', function() {
    this.NAME= 'message';
    this.createDrop= function(data) {
        if (data==null || data.length<2) return null;
        var wrap= Dropdown.prototype.createDrop.call(this, data);
        for (var i= 0; i<data.length; i++) {
            var link= document.createElement('a');
            link.href= '/wsgi/message/view/'+data[i][0];
            link.appendChild(document.createTextNode(data[i][1]+' '));
            if (data[i][2]) {
                var img= img_create('/theme/'+THEME+'/img/icon/new.gif', '*', 'contains new messages');
                img.className= 'icon-new';
                link.appendChild(img);
            }
            wrap.appendChild(link);
        }
    return wrap;
    };
});

// Info page list
//
js_class('InfoDropdown', 'Dropdown', function() {
    this.NAME= 'info';
    this.createDrop= function(data) {
        if (data==null || data.length==0) return null;
        var wrap= Dropdown.prototype.createDrop.call(this, data);
        for (var i= 0; i<data.length; i++) {
            var link= document.createElement('a');
            if (i!=0) link.href='/wsgi/info/view/'+data[i][0];
            else link.href= '/wsgi/info';
            link.appendChild(document.createTextNode(data[i][1]));
            wrap.appendChild(link);
        }
        return wrap;
    };
});

// Admin page list
//
js_class('AdminDropdown', 'Dropdown', function() {
    this.NAME= 'admin';
    this.createDrop= function(data) {
        if (data==null || data.length<2) return null;
        var wrap= Dropdown.prototype.createDrop.call(this, data);
        for (var i= 0; i<data.length; i++) {
            var link= document.createElement('a');
            link.href= '/wsgi/admin/'+data[i][0];
            link.appendChild(document.createTextNode(data[i][1]));
            wrap.appendChild(link);
        }
        return wrap;
    };
});

// Pass it to the theme script to decide what dropdowns to use or not, and
// possibly customise by subclassing
//
theme_nav();
