function get_yahoo_loop() {
  var url = 'yahooOAuthCallback.php'+
            '?method=contacts'+
            '&count=max' +
            '&format=json' +
            '&real_yahoo_callback=yahoo_get_friends_callback' +
            '&callback=?';
  $.getJSON(url,
            function(result) {
                if (result.error) {
                    debugLog('ERROR: ' + result.error);
                    resetYahoo();
                } else {
                    if (result.new_token) {
                        window.crap = result.new_token;
                        debugLog('renewing yahoo access token');
                        var session_lifetime = parseInt(result.new_token.oauth_authorization_expires_in) / (24*60*60);
                        var token_lifetime = parseInt(result.new_token.oauth_expires_in) / (24*60*60);
                        createCookie('knx_yahoo_oauth_token', result.new_token.oauth_token, session_lifetime);
                        createCookie('knx_yahoo_oauth_token_s', result.new_token.oauth_token_secret, session_lifetime);
                        createCookie('knx_yahoo_oauth_expires', result.new_token.oauth_expires_in, token_lifetime);
                        createCookie('knx_yahoo_oauth_session', result.new_token.oauth_session_handle, session_lifetime);
                        createCookie('knx_yahoo_guid', result.new_token.xoauth_yahoo_guid, session_lifetime);
                    }
                    inject_script_failsafe(result.Location, 
                                           'yahoo',
                                           function () {
yahoo_get_friends_callback({"error":{"lang":"en-US","description":"Please provide valid credentials. OAuth oauth_problem=\"token_expired\", realm=\"yahooapis.com\""}})
                                           });
                }
            });
}

function yahoo_get_friends_callback(data) {
    inject_script_ack('yahoo');
    if (data.error) {
        debugLog('ERROR: ' + data.error.description);
        resetYahoo();
        return;
    }
    debugLog('yahoo_get_friends_callback('+data.contacts.count+' of '+data.contacts.total+' entries)');
    var yahoo_friends = data.contacts.contact;
    var vcards = [];
    for (var ii = 0; ii < yahoo_friends.length; ii++) {
        var friend = yahoo_friends[ii];
        var fieldset = {};
        for (var j = 0; j < friend.fields.length; j++) {
            /* @@ n.b. the following will overwrite multiple addresses, jobs, etc with the last one */
            fieldset[friend.fields[j].type] = friend.fields[j].value;
        }
        if (fieldset['email'] == undefined) {
            if (fieldset['yahooid'] == undefined) {
                continue;
            } else { 
                fieldset['email'] = fieldset['yahooid'] + '@yahoo.com';
            }
        }
        var email = fieldset['email'];
        var title = (fieldset['jobTitle'] != undefined) ? fieldset['jobTitle'] : null;
        var screen_name = (fieldset['yahooid'] != undefined) ? fieldset['yahooid'] : email.split('@')[0];
        var org = fieldset['company'] ? fieldset['company'] : email.split('@')[1];
        if (fieldset['name'] == undefined) {
            var fn = title ? title : screen_name;
            var guessed_names = guess_names_from_string(fn);
            var givenName = guessed_names['given-name'];
            var familyName = guessed_names['family-name'];
        } else {
            var givenName = fieldset['name'].givenName;
            var familyName = fieldset['name'].familyName;
            var fn = givenName + ' ' + (fieldset['name'].middleName ? fieldset['name'].middleName + ' ' : '') + familyName;
         }
        var vcard = {
              fn:           fn,
             'given-name':  givenName,
             'family-name': familyName,
              socnet:    'yahoo',
              favicon:   'http://mail.yahoo.com/favicon.ico',
              url:       'mailto:' + email,
              email:      email,
              account_id: friend.id,
              nickname:   screen_name,
              org:        org,
              websites:   ['http://' + email.split('@')[1] + '/']
        }
        for (var j = 0; j < friend.fields.length; j++) {
            if (friend.fields[j].type == 'link')
                vcard.websites.push(friend.fields[j].value);
        }
        vcards.push(vcard);
    }
    if (vcards.length) {
        debugLog('yahoo_get_friends_callback adding '+vcards.length+' vcards');
        var socnet = addr_book.socnet('yahoo');
        socnet.add_vcards(vcards);
     /* socnet.add_me(data.feed.author[0].name.$t); */
     /* if (data.done) // use opensearch instead */ 
        socnet.set_state(state.loaded);
    } else {
        debugLog('NO Yahoo contacts found!'+'\n');
        // XXX should we go to loaded state here?
    }
}

function checkYahooCookie() {
  var knx_yahoo_oauth_token = readCookie('knx_yahoo_oauth_token');
  if (knx_yahoo_oauth_token) {
    clearInterval(window.yahooCheckr);
    window.yahooCheckr = null;
    attemptFetchFromYahoo();
  }
}

function resetYahoo() {
  eraseCookie('knx_yahoo_oauth_token_s');
  eraseCookie('knx_yahoo_oauth_token');
  eraseCookie('knx_yahoo_oauth_expires');
  eraseCookie('knx_yahoo_oauth_session');
  eraseCookie('knx_yahoo_guid');
  addr_book.socnet('yahoo').set_state(state.unknown);
}

function attemptFetchFromYahoo() {
  var knx_yahoo_oauth_token = readCookie('knx_yahoo_oauth_token');
  if (knx_yahoo_oauth_token) {
    var socnet = addr_book.socnet('yahoo');
    if (socnet.state() === state.unknown) {
      socnet.set_state(state.loading);
      get_yahoo_loop();
    }
  }
}

function fetchFromYahooNeedsAuth() {
  var knx_yahoo_oauth_token = readCookie('knx_yahoo_oauth_token');
  if (!knx_yahoo_oauth_token) {
    eraseCookie('knx_yahoo_oauth_token_s');
    eraseCookie('knx_yahoo');
    var d = new Date();
    createCookie('knx_windowid', d.getTime());
    window.yahooCheckr = setInterval(checkYahooCookie, 100);
    return true;
  } else {
    attemptFetchFromYahoo();
  }
  return false;
}

function fetchFromYahoo() {
  if (fetchFromYahooNeedsAuth()) {
    yahoo_login = "yahooOAuthCallback.php?"+Math.round(Math.random()*100000);
    window.open(yahoo_login, "yahooAuth", "height=420,width=600,toolbar=0,location=1,directory=0,resizable=1");
  }
}

knx.register_plugin({initialize: attemptFetchFromYahoo, reset: resetYahoo});
