/*
 * sso-user.js
 *  Detect whether a user is logged in, and possibly provide simple 
 *  access to SSO user metadata, for contracts that send a cleartext cookie
 *
 *  Synopsis:
 *    <!-- Load dependencies -->
 *    <script src="/js/Base64.js"></script>
 *    <script src="/js/sso-user.js"></script>
 *    <script>
 *
 *      // If a user is logged in....
 *      if (sso.is_user_logged_in()) { ... }
 *
 *      // A user is logged in, and the subsite contract sent a cleartext cookie with metadata
 *      if (sso.user) {
 *        var u = sso.user;
 *        var value;
 *
 *        value = u.sso_id;
 *        value = u.email;
 *        value = u.first_name;
 *        value = u.last_name;
 *        value = u.state_code;
 *        value = u.city;
 *        value = u.country_code;
 *        
 * These are returneed as JavaScript Date objects:
 *        value = u.created_date; 
 *        value = u.update_time;
 *        value = u.birthdate;
 *
 *      }
 *    </script>
 *
 */

// Namespace
var sso;
if (!sso) { sso = new Object };

sso.user = null;
sso._user_logged_in = false;

sso._user_cookies = new Object;
sso.contract_name = null;
sso._date_fields = {'birthdate':1 };
sso._timestamp_fields = {'created_date':1, 'update_time':1};

// Parse all incoming cookies
sso.parse_cookies = function() {
    var cookies = document.cookie.split(/;\s*/);
    var re = new RegExp('(.+)_(b64|sso)_token$');
    for (var c = 0; c < cookies.length; c++) {
        var nv = cookies[c].split('=');
        sso._user_cookies[nv[0]] = unescape(nv[1]);
        // Does it look like an SSO cookie?
        var md = re.exec(nv[0]);
        if (md) {
            sso.contract_name = md[1];
        }
    }
}
sso.parse_cookies();

sso.is_user_logged_in = function() {
    return sso.contract_name != null;
}

sso._read_metadata_from_cookie = function() {
    if (sso.is_user_logged_in()) {
        var data = sso._user_cookies[sso.contract_name + '_b64_token'];
        if (!data) { return; }
        // B64 armored JSON
        data = Base64.decode(data);
        try {
            // Exec JSON
            data = eval('(' + data + ')');
        } catch (err) {
            // Abort
            return;
        }
        
        // Make user object
        sso.user = { 
            sso_id : data.sso_id,
            _data : data,
            /* deprecated */
            subsite_metadata : function(arg1, arg2) {
                var cname = arg2 ? arg1 : sso.contract_name;
                var fname = arg2 ? arg2 : arg1;
                return this['_data'][cname + '::' + fname];
            },
            /* deprecated */
            list_subsite_metadata : function() {
                var fields = new Array();
                var re = new RegExp('^' + sso.contract_name + '::(.+)$');
                for (var fn in this['_data']) {
                    var md = re.exec(fn);
                    if (md) { fields.push(md[1]); }
                }
                return fields;
            }
        };

        // Make properties with nice names
        for (var field in data) {
            var propname = field.replace('sso_', '');
            if (sso._date_fields[propname]) {
                var parts = data[field].split('-');
                sso.user[propname] = new Date(parts[0], parts[1], parts[2], 0,0,0,0);
            } else if (sso._timestamp_fields[propname]) {
                // 2008-01-15 11:59:49.100592
                var re = /(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})\.(\d+)/;
                var d = re.exec(data[field]);
                //                             y     m     d     h     m     s     ms
                sso.user[propname] = new Date(d[1], d[2], d[3], d[4], d[5], d[6], d[7]);
            } else {
                sso.user[propname] = data[field];
            }
        }
    }
}

sso._read_metadata_from_cookie();

