The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
<h1>[%l('User Roles')%]</h1>

<h2>[% person.forum_name %] ([%person.first_name%] [%person.last_name%])</h2>

<form>
    <table class="user_permission_list">
        <tbody>

            [% WHILE (role = roles.next) %]
            [% toggler = (1 - (toggler||0)) %]
            <tr class="row [% row_styles.$toggler %]">
                <td width="25%">
                    <label for="userrole_[%role.id%]">
                        [% role.description %]
                    </label>
                </td>
                <td>
                    [% has_role = person.check_user_roles(role.name) %]
                    <input type="checkbox" class="role_checkbox" id="userrole_[%role.id%]" [%IF has_role%]checked="checked"[%END%]/>
                    <span id="status_[%role.id%]"></span>
                </td>
            </tr>
            [% END %]

        </tbody>
    </table>
</form>

<div class="top_padded">
<a href="[%c.uri_for('/site/users/')%]">Back to User Management</a>
</div>

<script type="text/javascript">
    var YU  = YAHOO.util,
        Dom = YAHOO.util.Dom;

    var items = Dom.getElementsByClassName('role_checkbox');

    update_role = function() {
        var elID = this.id,
            checked = (this.checked ? 1 : 0);
        var roleID = elID.split('_')[1];
        var statusDiv = Dom.get('status_' + roleID);

        var handleSuccess = function(o) {
            var data = eval('(' + o.responseText + ')');
            // show the status message
            //o.argument.msg_node.innerHTML = data.message;
            // clear the loader-gif
            o.argument.msg_node.innerHTML = '';

            // show any returned errors
            if (data.error) {
                if (data.error.message!=undefined) {
                    o.argument.msg_node.innerHTML = data.error.message;
                }

                // reset the checkbox
                Dom.get(o.argument.cb_node).checked =
                    (1 - o.argument.value);
            }
        };
        var handleFailure = function(o) {
            // show the status message
            o.argument.msg_node.innerHTML = o.responseText;

            // reset the checkbox
            Dom.get(o.argument.cb_node).checked =
                (1 - o.argument.value);
        };

        // where to post to
        var sUrl = '[%c.uri_for('/site/roleSaveHandler')%]';

        // postdata is a query string ... how irksome!!
        var postData =
               'person='    + [%person.id%]
            +  '&role='     + roleID
            +  '&value='    + checked
        ;

        // some visual feedback that something is happening
        statusDiv.innerHTML = '<img src="[%c.uri_for('/static/images/loader-bar.gif')%]" />';

        var request = YAHOO.util.Connect.asyncRequest(
            'POST',
            sUrl,
            {
                success:  handleSuccess,
                failure:  handleFailure,
                argument: {
                    msg_node: statusDiv,
                    cb_node:  elID,
                    value:    checked
                }
            },
            postData
        );
    };

    YU.Event.addListener(
        items,
        'change',
        update_role
    );
</script>