dojo.require('dojox.rpc.Service');
dojo.require('dojox.rpc.JsonRPC');
dojo.require('dojox.form.DropDownSelect');
dojo.require('dijit.Dialog');
dojo.require('dijit.form.Form');

var cluemapper = {};

cluemapper.init = function() {
    if (cluemapper.service != null)
        return;

    dojo.addClass(dojo.body(), 'tundra');

    var url = window.location.href;
    if (url.indexOf('#') > -1)
        url = url.split('#')[0];

    var pos = url.indexOf('/pm');

    cluemapper.url = url.substring(0, pos);
    cluemapper.app_url = cluemapper.url + '/pm/';
    cluemapper.dashboard_url = cluemapper.app_url;
    cluemapper.projects_base_url = cluemapper.app_url + 'p/';
    cluemapper.service_url = cluemapper.app_url+'json';

    if (url.indexOf(cluemapper.projects_base_url) == 0) {
        /* we're inside a project, lets track some info */
        var remain = url.substring(cluemapper.projects_base_url.length);
        cluemapper.current_prjid = remain.split('/')[0];
        cluemapper.project_url = cluemapper.projects_base_url + cluemapper.current_prjid;
    }

    cluemapper.setup_services();
};

cluemapper.setup_services = function() {
    cluemapper.service = new dojox.rpc.Service({
        envelope: 'JSON-RPC-1.0',
        transport: 'POST',
        target: cluemapper.service_url,
        contentType: 'application/json',
        services: {
            create_project: {
            },
            delete_project: {
            },
            get_projects: {
            },
            get_project_details: {
            },
            get_themes: {
            },
            get_owned_tickets: {
            },
            get_watched_tickets: {
            },
            login: {
            }
        }
    });
};

cluemapper.display_quickjump = function() {
    var dropdown = dijit.byId('cluemapper-quickjump-dropdown');
    if (dropdown == null) {
        dropdown = new dojox.form.DropDownSelect({}, dojo.doc.createElement('select'));
        cluemapper.refresh_quickjump(dropdown);

        var div = dojo.doc.createElement('div');
        dojo.attr(div, 'id', 'cluemapper-quickjump');
        var label = dojo.doc.createElement('label');
        label.innerHTML = 'Jump:';
        div.appendChild(label);

        div.appendChild(dropdown.domNode);

        dropdown.addOption('$empty', '- Quick Jump -');
        dropdown.addOption(cluemapper.dashboard_url, 'ClueMapper Home');
        dropdown.addOption('', 'separate');
        dropdown.startup();

        dojo.place(div, dojo.body(), 'first');
    }
};

cluemapper.quick_jump = function(url) {
    if (url.indexOf('$') == 0)
        return;
    var here = window.location.href;
    if (url.indexOf(cluemapper.projects_base_url) != 0 || here.indexOf(url) != 0)
        window.location.href = url;
};

cluemapper.refresh_quickjump = function(dropdown) {
    if (cluemapper.quickjump_handle != null)
        dojo.disconnect(cluemapper.quickjump_handle);

    var dd = dropdown;
    if (dd == null)
        dd = dijit.byId('cluemapper-quickjump-dropdown');

    cluemapper.service.get_projects().addCallback(
        function(result) {
            while (dd.options.length > 0)
                dd.removeOption(dd.options.length-1);

            var opts = new Array();
            var selected = null;
            dojo.forEach(result.projects, function(item, index, array) {
                var url = cluemapper.projects_base_url+item.prjid;
                var v = {value: url, label: item.name}
                opts.push(v);
                if (window.location.href.indexOf(url) == 0)
                    selected = v;
            });
            dd.addOption(opts);
            if (selected != null)
                dd.setValue(selected.value);

            cluemapper.quickjump_handle = dojo.connect(dropdown, 'onChange', null, cluemapper.quick_jump);
        }
    );
};

cluemapper.confirm = function(title, message, okcallback, cancelcallback,
                              oktext, canceltext) {
    if (oktext == null)
        oktext = 'ok';
    if (canceltext == null)
        canceltext = 'cancel';

    var dialog = new dijit.Dialog({title: title});
    var content = dojo.doc.createElement('div');

    var p = dojo.doc.createElement('p');
    p.innerHTML = message;
    content.appendChild(p);

    var ok = new dijit.form.Button({label: oktext, onClick: function() {
        if (okcallback != null)
            okcallback();
        dialog.hide();
        dialog.destroy();
    }});
    content.appendChild(ok.domNode);
    var cancel = new dijit.form.Button({label: canceltext,
                                        onClick: function() {
        if (cancelcallback != null)
            cancelcallback();
        dialog.hide();
        dialog.destroy();
    }});
    content.appendChild(cancel.domNode);

    dialog.setContent(content);
    dialog.show();
};

cluemapper.setup_login = function(loginel) {
    var link = loginel;
    if (link == null)
        link = dojo.byId('cluemapper-login');
    if (link == null)
        return;

    var dialog = new dijit.TooltipDialog({title: 'Login'});
    var div = dojo.doc.createElement('div');
    dojo.addClass(div, 'cluemapper-form');
    dialog.setContent(div);
    var form = new dijit.form.Form();
    div.appendChild(form.domNode);

    var parent = dojo.doc.createElement('div');
    form.containerNode.appendChild(parent);

    var field = dojo.doc.createElement('div');
    parent.appendChild(field);
    dojo.addClass(field, 'field');
    var label = dojo.doc.createElement('label');
    field.appendChild(label);
    label.innerHTML = 'Username:';
    var input = new dijit.form.TextBox({id: 'login-username'});
    field.appendChild(input.domNode);

    field = dojo.doc.createElement('div');
    parent.appendChild(field);
    dojo.addClass(field, 'field');
    label = dojo.doc.createElement('label');
    field.appendChild(label);
    label.innerHTML = 'Password:';
    input = new dijit.form.TextBox({id: 'login-password', type: 'password'});
    field.appendChild(input.domNode);

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

    var status = dojo.doc.createElement('div');
    dojo.attr(status, 'id', 'cluemapper-login-status');
    actions.appendChild(status);

    var login = new dijit.form.Button({label: 'Login', type: 'submit'});
    actions.appendChild(login.domNode);

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

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

    dojo.connect(form, 'onSubmit', null, function(evt) {
        if (evt != null) {
            evt.preventDefault();
            evt.stopPropagation();
        }

        var username = dojo.trim(dijit.byId('login-username').getValue());
        var password = dojo.trim(dijit.byId('login-password').getValue());

        if (username != null && username.length > 0
                && password != null && password.length > 0) {

            cluemapper.set_login_status('Authenticating...', true);
            var d = cluemapper.service.login(username, password);
            d.addCallback(function(result) {
                var authenticated = result['authenticated'];
                if (authenticated == 0)
                    cluemapper.set_login_status('Bad username/password', false, true);
                else {
                    cluemapper.set_login_status('Refreshing page', true);
                    window.location.reload();
                }

            });
        }

        return false;
    });

    dojo.attr(link, 'href', '#');
    dojo.connect(link, 'onclick', dialog, function(evt) {
        cluemapper.open_tooltip_dialog(link, dialog);
    });
};

cluemapper.set_login_status = function(msg, loading, error) {
    var div = dojo.byId('cluemapper-login-status');
    if (loading == true)
        dojo.addClass(div, 'loading');
    else
        dojo.removeClass(div, 'loading');

    if (error == true)
        dojo.addClass(div, 'error');
    else
        dojo.removeClass(div, 'error');

    if (msg != null && msg.length > 0) {
        div.innerHTML = msg;
    } else {
        dojo.removeClass(div, 'loading');
        div.innerHTML = '';
    }
};

cluemapper.open_tooltip_dialog = function(node, dialog) {

    var close = function() {
        cluemapper.close_tooltip_dialog(dialog);
    };
    dijit.popup.open({
        parent: node,
        popup: dialog,
        around: node,
        orient: {'BL':'TL', 'BR':'TR', 'TL':'BL', 'TR':'BR'},
	onExecute: close,
	onCancel: close,
	onClose: function() { dialog._opened = false; }
    });

    dojo.connect(dialog, 'onBlur', null, close);
    dialog._opened = true;
};

cluemapper.close_tooltip_dialog = function(dialog) {
    if(dialog._opened) {
        dijit.popup.close(dialog);
        dialog._opened = false;
    }
};

dojo.addOnLoad(function() {
    cluemapper.init();
});
