function get_google_loop() {
  var url = 'googleOAuthCallback.php'+
            '?method=contacts'+
            '&max-results=' + 5000 +
            '&start-index=' + 1 +
            '&real_google_callback=google_get_friends_callback' +
            '&alt=json-in-script'+
            '&callback=?';
  $.getJSON(url,
            function(result) {
                if (result.error) {
                    debugLog('ERROR: ' + result.error);
                    resetGoogle();
                } else {
              inject_script_failsafe(result.Location,
                                     'google',
                                     function () {
google_get_friends_callback({'error': 'Google timed out, 401 Unauthorized, or returned unparseable Javascript'});
/* @@ call an eventLog() that warns us a failsafe was used */
                                     }
                  );
                }
            });
}

function google_get_friends_callback(data) {
    inject_script_ack('google');
    if (data.error) {
        debugLog('ERROR: ' + data.error);
        resetGoogle();
        return;
    }
    var google_friends = data.feed.entry;
    debugLog('google: ← '+google_friends.length+' gdata entries');
    var vcards = [];
    window.emails_seen = {};
    for (var ii = 0; ii < google_friends.length; ii++) {
        var friend = google_friends[ii];
        if (friend.gd$email == undefined) continue;
        var email = friend.gd$email[0].address;
        if (emails_seen[email] != undefined) {
            vcard = vcards[emails_seen[email]];
        } else {
            vcard = {};
        }
        var title = friend.title.$t;
        var screen_name = email.split('@')[0];
        var org = email.split('@')[1];
        var fn = title ? title : screen_name;
        var guessed_names = guess_names_from_string(fn);
        vcard['fn'] =         fn;
        vcard['given-name']=  guessed_names['given-name'];
        vcard['family-name']= guessed_names['family-name'];
      /*vcard['photo'] =      friend.profile_image_url;*/
        vcard['socnet'] =    'google';
        vcard['favicon'] =   'http://mail.google.com/favicon.ico';
        vcard['url'] =       'mailto:' + email;
        vcard['email'] =      email;
        vcard['account_id'] = friend.id.$t;
        vcard['nickname'] =   screen_name;
        vcard['org'] =        org;
        vcard['websites'] =   ['http://' + org + '/']
        if (friend.gd$phoneNumber != undefined) {
            /* should really loop over these, and use the schema to label which line it is */
            vcard['tel'] = friend.gd$phoneNumber[0].$t;
        }
        if (emails_seen[email] == undefined) {
            emails_seen[email] = vcards.length;
            vcards.push(vcard);
        }
    }
    if (vcards.length) {
        var socnet = addr_book.socnet('google');
        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 Google contacts found!'+'\n');
        // XXX should we go to loaded state here?
    }
}

function checkGoogleCookie() {
  var knx_google_oauth_token = readCookie('knx_google_oauth_token');
  if (knx_google_oauth_token) {
    clearInterval(window.googleCheckr);
    window.googleCheckr = null;
    attemptFetchFromGoogle();
  }
}

function resetGoogle() {
  eraseCookie('knx_google_oauth_token_s');
  eraseCookie('knx_google_oauth_token');
  addr_book.socnet('google').set_state(state.unknown);
}

function attemptFetchFromGoogle() {
  var knx_google_oauth_token = readCookie('knx_google_oauth_token');
  if (knx_google_oauth_token) {
    var socnet = addr_book.socnet('google');
    if (socnet.state() === state.unknown) {
      socnet.set_state(state.loading);
      get_google_loop();
    }
  }
}

function fetchFromGoogleNeedsAuth() {
  var knx_google_oauth_token = readCookie('knx_google_oauth_token');
  if (!knx_google_oauth_token) {
    eraseCookie('knx_google_oauth_token_s');
    var d = new Date();
    createCookie('knx_windowid', d.getTime());
    window.googleCheckr = setInterval(checkGoogleCookie, 100);
    return true;
  } else {
    attemptFetchFromGoogle();
  }
  return false;
}

function fetchFromGoogle() {
  if (fetchFromGoogleNeedsAuth()) {
    google_login = "googleOAuthCallback.php?"+Math.round(Math.random()*100000);
    window.open(google_login, "googleAuth", "height=400,width=800,toolbar=0,location=1,directory=0,resizable=1");
  }
}

knx.register_plugin({initialize: attemptFetchFromGoogle, reset: resetGoogle});
