dojo.require('dijit.Dialog');
dojo.require('dijit.TitlePane');
dojo.require('dijit.form.Button');
dojo.require('dijit.form.TextBox');
dojo.require('dojo.cookie');

cluemapper.dashboard = {};

cluemapper.dashboard.init = function() {
    var url = window.location.href;
    if (url.indexOf('#') > -1)
        url = url.split('#')[0];
    var dashboard = cluemapper.dashboard;
    dojo.addClass(dojo.body(), 'tundra');

    dashboard.base_url = url;
};

cluemapper.dashboard.refresh_project_list = function() {
    var projectlist = dojo.byId('cluemapper-dashboard-project-list');
    if (projectlist == null) {
        var projectspane = new dijit.TitlePane({title: 'Projects'});
        dojo.place(projectspane.domNode, dojo.byId('cluemapper-dashboard'), 'last');

        var table = dojo.doc.createElement('table');
        dojo.attr(table, 'cellspacing', 0);
        dojo.attr(table, 'cellpadding', 0);

        projectlist = dojo.doc.createElement('tbody');
        dojo.attr(projectlist, 'id', 'cluemapper-dashboard-project-list');
        table.appendChild(projectlist);

        var container = dojo.doc.createElement('div');
        container.appendChild(table);
        dojo.attr(container, 'id', 'cluemapper-dashboard-projects');

        if (cluemapper.can_manage_projects == true) {
            var dialog = new dijit.TooltipDialog({title: 'New Project'});
            var creatediv = dojo.doc.createElement('form');
            dojo.attr(creatediv, 'id', 'cluemapper-new-project');
            dialog.setContent(creatediv);
            var newproject = new dijit.form.DropDownButton(
                {label: 'New Project', id: 'cluemapper-new-project-button',
                 dropDown: dialog});
            dojo.place(newproject.domNode, container, 'first');

            cluemapper.dashboard.fill_newproject_form(newproject, dialog, creatediv);
        }

        projectspane.setContent(container);
    }

    var container = dojo.byId('cluemapper-dashboard-projects');
    var loading = dojo.doc.createElement('span');
    dojo.addClass(loading, 'loading');
    loading.innerHTML = 'Loading . . .';
    container.appendChild(loading);

    var deferred = cluemapper.service.get_projects();
    deferred.addCallback(function(result) {
        container.removeChild(loading);
        cluemapper.dashboard.fill_project_list(result.projects);
    });
};

cluemapper.dashboard.fill_newproject_form = function(button, dialog, creatediv) {
    var form = new dijit.form.Form();
    creatediv.appendChild(form.domNode);
    var parent = form.containerNode;
    dojo.addClass(parent, 'cluemapper-form');

    var field = dojo.doc.createElement('div');
    parent.appendChild(field);
    dojo.addClass(field, 'field');
    var label = dojo.doc.createElement('label');
    field.appendChild(label);
    label.innerHTML = 'Name:';
    var nameinput = new dijit.form.TextBox();
    field.appendChild(nameinput.domNode);

    field = dojo.doc.createElement('div');
    parent.appendChild(field);
    dojo.addClass(field, 'field');
    label = dojo.doc.createElement('label');
    field.appendChild(label);
    label.innerHTML = 'Theme:';
    var themeselect = dojo.doc.createElement('select');
    field.appendChild(themeselect);
    cluemapper.service.get_themes().addCallback(function(result) {
        dojo.forEach(result.themes, function(item, index, array) {
            var opt = dojo.doc.createElement('option');
            themeselect.appendChild(opt);
            opt.value = item.themeid;
            opt.innerHTML = item.name;
        });
    });


    var createfunc = function(ev) {
        if (ev != null) {
            ev.preventDefault();
            ev.stopPropagation();
        }

        var name = dojo.trim(nameinput.value);
        var deferred = cluemapper.service.create_project(name, themeselect.value);
        button._closeDropDown();
        cluemapper.dashboard.info('Creating project . . .', true);
        deferred.addCallback(function(result) {
            cluemapper.dashboard.refresh_project_list();
            cluemapper.dashboard.info('Project successfully created');
        });
        deferred.addErrback(function(result) {
            cluemapper.dashboard.error('An error occurred while trying to create new project: '+result.message);
        });

        return false;
    };
    dojo.connect(form, 'onSubmit', null, createfunc);

    var actions = dojo.doc.createElement('div');
    parent.appendChild(actions);
    dojo.addClass(actions, 'actions');
    var create = new dijit.form.Button({label: 'Create', onClick: createfunc});
    actions.appendChild(create.domNode);

    var cancel = new dijit.form.Button({label: 'Cancel', onClick: function() {
        button._closeDropDown();
    }});
    actions.appendChild(cancel.domNode);

    var footer = dojo.doc.createElement('div');
    parent.appendChild(footer);
    dojo.addClass(footer, 'footer');

};

cluemapper.dashboard.fill_project_list = function(projects) {
    var parent = dojo.byId('cluemapper-dashboard-project-list');

    cluemapper.dashboard.clear_children(parent);

    var tr = null;
    var td = null;
    if (projects.length == 0) {
        tr = dojo.doc.createElement('tr');
        parent.appendChild(tr);
        td = dojo.doc.createElement('td');
        dojo.attr(td, 'colspan', '2');
        td.innerHTML = 'No projects are accessible';
        tr.appendChild(td);
        return;
    }

    dojo.forEach(projects, function(item, index, array) {
        if (tr == null || tr.childNodes.length >= 2) {
            tr = dojo.doc.createElement('tr');
            parent.appendChild(tr);
        }

        td = dojo.doc.createElement('td');
        if (parent.childNodes.length % 2 == 0 && tr.childNodes.length == 0)
            dojo.addClass(td, 'diff');
        else if (parent.childNodes.length % 2 == 1 && tr.childNodes.length == 1)
            dojo.addClass(td, 'diff');

        var col = (index % 2) + 1;
        dojo.addClass(td, 'col'+col);

        dojo.connect(td, 'onclick', null, function() {
            window.location.href = item.url;
        });

        var dl = dojo.doc.createElement('dl');
        dojo.attr(dl, 'id', 'cluemapper-project-info-'+item.prjid);
        td.appendChild(dl);
        var dt = dojo.doc.createElement('dt');
        dl.appendChild(dt);
        var name = dojo.doc.createElement('div');
        dojo.addClass(name, 'name');
        name.innerHTML = item.name;
        dt.appendChild(name);
        dojo.addClass(dt, 'project-header');

        if (cluemapper.can_manage_projects == true) {
            var deletediv = dojo.doc.createElement('div');
            dojo.addClass(deletediv, 'action');
            deletediv.innerHTML = 'delete';
            dt.appendChild(deletediv);

            dojo.connect(deletediv, 'onclick', null, function(ev) {
                ev.preventDefault();
                ev.stopPropagation();
                cluemapper.dashboard.delete_project(item.prjid);
            });
        }

        /* TODO: finish adding info link for projects on dashboard */
        /*
        var info = dojo.doc.createElement('div');
        dojo.addClass(info, 'action');
        info.innerHTML = 'info';
        dt.appendChild(info);

        dojo.connect(info, 'onclick', null, function(ev) {
            ev.preventDefault();
            ev.stopPropagation();
            cluemapper.dashboard.display_project_details(item.prjid);
        });
        */

        var footer = dojo.doc.createElement('div');
        dojo.addClass(footer, 'footer');
        dt.appendChild(footer);

        var dd = dojo.doc.createElement('dd');
        if (item.status == null) {
            dd.innerHTML = item.description;
        } else {
            dd.innerHTML = item.status;
            dojo.addClass(dd, 'warning');
            dojo.addClass(name, 'warning');
        }
        dl.appendChild(dd);

        tr.appendChild(td);
    });
};

cluemapper.dashboard.display_project_details = function(prjid) {
    var container = dojo.byId('cluemapper-project-info-'+prjid);
    dojo.query('dt', container).forEach(function(item) { if (dojo.hasClass(item, 'project-header')) return; container.removeChild(item); });
    dojo.query('dd', container).forEach(function(item) { container.removeChild(item); });

    cluemapper.service.get_project_details(prjid).addCallback(
        function(result) {
            dojo.forEach(result.details, function(item, index, array) {
                if (item['key'] == 'name')
                    return;

                var dt = dojo.doc.createElement('dt');
                dojo.addClass(dt, 'details');
                container.appendChild(dt);
                dt.innerHTML = item['label'];

                var dd = dojo.doc.createElement('dd');
                dojo.addClass(dd, 'details');
                container.appendChild(dd);
                dd.innerHTML = item['value'];
            });
        }
    );
};

cluemapper.dashboard.delete_project = function(prjid) {
    var del = function() {
        cluemapper.dashboard.info('Deleting project . . . this could take a while on a large project so please be patient . . .', true);
        var deferred = cluemapper.service.delete_project(prjid);
        deferred.addCallback(
            function(result) {
                cluemapper.dashboard.info('Successfully deleted project');
                cluemapper.dashboard.refresh_project_list();
            }
        );
        deferred.addErrback(
            function(result) {
                cluemapper.dashboard.error('An error occurred while trying to delete project: '+result.message);
            }
        );
    };
    cluemapper.confirm('Really Delete?',
                       'Are you sure you want to delete '+prjid+'?',
                       del);
};

cluemapper.dashboard.clear_children = function(node) {
    while (node.childNodes.length > 0) {
        node.removeChild(node.childNodes[0]);
    }
};

cluemapper.dashboard._fill_ticket_list = function(container, result) {
    container.innerHTML = '';
    var table = dojo.doc.createElement('table');
    dojo.place(table, container, 'first');
    dojo.addClass(table, 'listing');
    dojo.attr(table, 'id', 'cluemapper-mytickets-table');

    var thead = dojo.doc.createElement('thead');
    dojo.place(thead, table, 'first');
    var tr = dojo.doc.createElement('tr');
    dojo.place(tr, thead, 'first');

    var th = dojo.doc.createElement('th');
    th.innerHTML = 'Ticket';
    dojo.place(th, tr, 'last');

    th = dojo.doc.createElement('th');
    th.innerHTML = 'Status';
    dojo.place(th, tr, 'last');

    th = dojo.doc.createElement('th');
    th.innerHTML = 'Summary';
    dojo.place(th, tr, 'last');

    var tbody = dojo.doc.createElement('tbody');
    dojo.place(tbody, table, 'last');

    dojo.forEach(result.projects, function(item, index, array) {
        var project = item;
        var tr = dojo.doc.createElement('tr');
        dojo.place(tr, tbody, 'last');

        var th = dojo.doc.createElement('th');
        th.innerHTML = '<a href="'+project.url+'">'+project.name+'</a>';
        dojo.attr(th, 'colspan', 4);
        dojo.place(th, tr, 'first');

        dojo.forEach(project.tickets, function(item, index, array) {
            var ticket = item;
            var tr = dojo.doc.createElement('tr');
            dojo.place(tr, tbody, 'last');
            if (index % 2 == 0)
                dojo.addClass(tr, 'even');
            else
                dojo.addClass(tr, 'odd');

            var td = dojo.doc.createElement('td');
            td.innerHTML = '<a href="'+ticket.url+'">#'+ticket.ticketid+'</a>';
            dojo.place(td, tr, 'last');

            td = dojo.doc.createElement('td');
            td.innerHTML = '<a href="'+ticket.url+'">'+ticket.status+'</a>';
            dojo.place(td, tr, 'last');

            td = dojo.doc.createElement('td');
            td.innerHTML = '<a href="'+ticket.url+'">'+ticket.summary+'</a>';
            dojo.place(td, tr, 'last');
        });
    });

};

cluemapper.dashboard._refresh_ticket_list = function(title, parent, elid, callback) {
    var ticketlist = dojo.byId(elid);
    if (ticketlist == null) {
        var titlepane = new dijit.TitlePane({title: title});
        dojo.place(titlepane.domNode, parent, 'first');

        ticketlist = dojo.doc.createElement('div');
        dojo.addClass(ticketlist, 'ticketlist');
        dojo.attr(ticketlist, 'id', 'cluemapper-dashboard-ticket-list');
        titlepane.containerNode.appendChild(ticketlist);
    }

    ticketlist.innerHTML = '<span class="loading">Loading tickets...</span>';
    var deferred = callback();
    deferred.addCallback(function(result) {
        cluemapper.dashboard._fill_ticket_list(ticketlist, result);
    });
};

cluemapper.dashboard.refresh_ticket_lists = function() {
    var username = dojo.byId('cluemapper-username');
    if (username == null)
        return;

    var ticketcontainer = dojo.byId('cluemapper-ticket-container');
    var list1 = null;
    var list2 = null;
    if (ticketcontainer == null) {
        ticketcontainer = dojo.doc.createElement('div');
        dojo.attr(ticketcontainer, 'id', 'cluemapper-ticket-container');
        list1 = dojo.doc.createElement('div');
        dojo.addClass(list1, 'col1');
        ticketcontainer.appendChild(list1);
        list2 = dojo.doc.createElement('div');
        dojo.addClass(list2, 'col2');
        ticketcontainer.appendChild(list2);
        dojo.place(ticketcontainer, dojo.byId('cluemapper-dashboard'), 'last');

        var footer = dojo.doc.createElement('div');
        dojo.addClass(footer, 'footer');
        ticketcontainer.appendChild(footer);
    } else {
        list1 = ticketcontainer.childNodes[0];
        list2 = ticketcontainer.childNodes[1];
    }

    cluemapper.dashboard._refresh_ticket_list('My Tickets', list1, 'cluemapper-ownedtickets', cluemapper.service.get_owned_tickets);
    cluemapper.dashboard._refresh_ticket_list('Watched Tickets', list2, 'cluemapper-watchedtickets', cluemapper.service.get_watched_tickets);
};

cluemapper.dashboard.status = function(s, loading, extra_class) {
    var status = dojo.byId('cluemapper-status-message');
    dojo.attr(status, 'class', 'visible');
    if (extra_class)
        dojo.addClass(status, extra_class);
    if (loading == true) {
        var span = dojo.doc.createElement('span');
        dojo.addClass(span, 'loading');
        status.innerHTML = '';
        status.appendChild(span);
        status = span;
    }

    status.innerHTML = s;
};

cluemapper.dashboard.info = function(s, loading) {
    cluemapper.dashboard.status(s, loading, 'info');
};

cluemapper.dashboard.error = function(s, loading) {
    cluemapper.dashboard.status(s, loading, 'error');
};

dojo.addOnLoad(function() {
    cluemapper.dashboard.init();
    cluemapper.dashboard.refresh_project_list();
    cluemapper.dashboard.refresh_ticket_lists();
    cluemapper.setup_login();
});

