BSD.namespace('fbconnect');
if(!console || !console.log){
    console = {};
    console.log = function(str){};
}
if(typeof _gel == 'undefined'){
    function _gel(e){
        return document.getElementById(e);
    }
}
if(typeof _cel == 'undefined'){
    function _cel(e){
        return document.createElement(e);
    }
}

BSD.fbconnect.user = null;

BSD.fbconnect.update_profile_pic = function(){
    var fbdiv = _gel('facebook_profile');

    if(!fbdiv){
        return;
    }
    var btn = _gel('facebook_login_button');
    if(btn){
        btn.style.display = 'none';
    }
    var name = _gel('facebook_name');
    var ppic = _gel('facebook_profile_pic');

    FB.Facebook.apiClient.fql_query('select pic_with_logo, name FROM user WHERE uid IN (' + BSD.fbconnect.user + ')', function(result){
        if(result && result[0]){
            if(!result[0].pic_with_logo){
                result[0].pic_with_logo = 'http://static.ak.fbcdn.net/pics/q_silhouette.gif';
            }
            ppic.innerHTML = '<img src="' + result[0].pic_with_logo + '" />';
            name.innerHTML = result[0].name;
            fbdiv.style.display = 'block';
        }
    });
}
BSD.fbconnect.handle_auth_failed = function(response){
    switch(response.status){
        case 401:
            BSD.fbconnect.remove_profile_pic();
            break;
    }
}
BSD.fbconnect.remove_profile_pic = function(){
    invite= _gel('fb_invite');
    if(invite){
        invite.style.display = 'none';
    }
    var fbdiv = _gel('facebook_profile');
    if(!fbdiv){
        return;
    }
    fbdiv.style.display = 'none';
    var btn = _gel('facebook_login_button');
    if(btn){
        btn.style.display = '';
    }
}
BSD.fbconnect.auth_success = function(response){
    //check for fbconnect button
    var btn = _gel('facebook_login_button');
    if(btn){
        btn.style.display = 'none';
    }
    //now start polling for actions
    BSD.fbconnect.update_profile_pic();
    BSD.fbconnect.set_polling_timeout();
    BSD.fbconnect.show_connected_friends();
}
BSD.fbconnect.logout = function(href){
   if(BSD.fbconnect.user != null){
       var w=FB.Connect.get_status();
       w.waitUntilReady(function(){
         if(w.result == 1){
           FB.Connect.logoutAndRedirect(href);
         } else {
            location.href = href;
         }
       });
       return false;
   }
   return true;
}
BSD.fbconnect.set_polling_timeout = function(){
    if(this.poll_timeout){
        try {
            window.clearTimeout(this.poll_timeout);
        } catch(e){
            if(console && console.error){
                console.error(e);
            }
        }
        this.poll_timeout = null;
    }
    this.poll_timeout = window.setTimeout('BSD.fbconnect.poll_for_actions()', BSD.fbconnect.constants.poll_interval);
}
BSD.fbconnect.auth = function(force_register, callback){
    url = force_register ? 'register' : 'login_status';
    if(force_register){
        FB.Facebook.get_sessionState().resetChange();
    }
    FB.Facebook.get_sessionState().waitUntilReady(function(session) {
        BSD.fbconnect.user = session.uid;

        var is_logged_in = BSD.fbconnect.user ? true : false;
        if(is_logged_in){
            ajax_callback = {
                success:function(response){
                    BSD.fbconnect.auth_success(response);
                    if(typeof callback == 'function'){
                        callback(response);
                    }
                },
                failure: BSD.fbconnect.handle_auth_failed
            };
            YAHOO.util.Connect.asyncRequest('POST', '/page/fbconnect/' + url, ajax_callback);
        }
    });
}
BSD.fbconnect.onload = function(){
    if(!BSD.fbconnect.constants.api_key){
        window.alert("api_key is not set");
        return;
    }
    //we need to make sure that the fbjs is loaded
    try {
        FB_RequireFeatures(["XFBML", "Api"], function() {
/*             FB.XFBML.Host.autoParseDomTree = ; */
            FB.Facebook.init(BSD.fbconnect.constants.api_key, "/modules/fbconnect/xd_receiver.htm");
            login_btn=_gel("fb_login_button");
            if(login_btn){
                FB.XFBML.Host.addElement(new FB.XFBML.LoginButton(login_btn));
            }
            if(location.href.match(/\/dashboard\/view\/private/) && location.href.match(/fb_invitor=/)){
                FB.Connect.requireSession(false);
            }
            BSD.fbconnect.auth(true);
        });
    } catch(err){
        if(console && console.error){
            console.error(err);
        }
    }
}
BSD.fbconnect.add_facebook_friend = function(friend, parent_el){
    var tpl=_gel('friend_box_template');
    var box=tpl.cloneNode(true);
    box.id = 'friend_box_' + friend.uid;

    links=box.getElementsByTagName('a');
    for(var j=0;j<links.length;j++){
        links[j].href = friend.dashboard; //('href', friend.dashboard);
    }

    img=box.getElementsByTagName('img')[0];
    img.src=friend.profile_pic;

    span=box.getElementsByTagName('span')[0];
    span.innerHTML=friend.name;
    /* the classname attribute must trigger hasLayout or something
     * because without it, IE won't display anything inside this span */
    span.className = 'pdn';
    parent_el.appendChild(box);
    box.style.display='';
}
BSD.fbconnect.connected_friends = [];
BSD.fbconnect.render_fb_friends = function(response){
    try {
        var friends = eval('(' + response.responseText + ")");
        fcnt=friends.length;
        var friend_list=_gel('fb_friends');
        for(var i=0;i<fcnt;i++){
            if(i %2==0){
                var row = _cel('div');
                row.className='row';
                friend_list.appendChild(row);
            }
            BSD.fbconnect.add_facebook_friend(friends[i], row);
            BSD.fbconnect.connected_friends[BSD.fbconnect.connected_friends.length]=friends[i].uid;
        }
        var i=_gel('fb_invite');
        if(i){
            i.style.display='';
        }
        var link=_gel('fb_invite_link');
        var fcount=_gel('fb_friend_count');
        fcount.innerHTML = fcnt+ ' of your Facebook friends have connected their accounts with ' + BSD.fbconnect.constants.app_name + '!';
        if(fcnt > 0){
            link.innerText = 'Invite more friends';
            friend_list.style.display='';
        } else {
            link.innerText ='Invite some friends';
            friend_list.style.display='none';
        }
    } catch(err){
        if(console && console.error){
            console.error(err);
        }
    }
}
BSD.fbconnect.get_invited_friends = function(callback){
    YAHOO.util.Connect.asyncRequest('POST', '/page/fbconnect/invited_friends', {
        success:function(o){
            var friends = BSD.JSON.decode(o.responseText);
            callback(friends);
        },
        failure:function(o){
            callback([]);
        }
    });

}
BSD.fbconnect.show_connected_friends = function(){
    if(this._shown_connected_friends){
        return;
    }
    if(!_gel('fb_friends')){
        return;
    }
    YAHOO.util.Connect.asyncRequest('POST', '/page/fbconnect/get_friends', {success:BSD.fbconnect.render_fb_friends, failure:BSD.fbconnect.handle_auth_failed});
}
BSD.fbconnect.polling_callback = {
    success: function poll_success(response){
         switch(response.status){
             case 200:
                 try{
                     action = eval("(" + response.responseText + ")");
                     BSD.fbconnect.publishUserAction(action);
                 } catch(e){
                    if(console && console.error){
                        console.error(e);
                    }
                 }
                 break;
         }
    },
    failure: function(response){
         switch(response.status){
             case 401:
                 BSD.fbconnect.remove_profile_pic();
                 return;
             default:
                 /* overwrite the polling function on error to prevent any more requests */
                 BSD.fbconnect.poll_for_actions = function(){};
         }
   }
};

BSD.fbconnect.publishUserAction = function(action, callback){

    if(action.story){

        var actionLink = (action.action_link) ? [action.action_link] : null;

        FB.Connect.streamPublish(action.story, null, actionLink, null, null, function(){
            YAHOO.util.Connect.asyncRequest('POST', '/page/fbconnect/get_next_activity', BSD.fbconnect.polling_callback, 'completed='+action.action_id);
        }, true);


    }
}

BSD.fbconnect.poll_for_actions = function(){
    YAHOO.util.Connect.asyncRequest('POST', '/page/fbconnect/get_next_activity', BSD.fbconnect.polling_callback);
}
BSD.fbconnect.invite_friends = function(){
    //FB.Connect.inviteConnectUsers();
    var show_invited=_gel('show_invited');
    if(show_invited && show_invited.checked){
        BSD.fbconnect.render_invite_form([]);
    } else {
        BSD.fbconnect.get_invited_friends( BSD.fbconnect.render_invite_form );
    }
}
BSD.fbconnect.facebook_button_onclick = function() {
    BSD.fbconnect.auth(true, BSD.fbconnect.update_profile_pic);
}
BSD.fbconnect.render_invite_form = function(invited_already){
    FB.IFrameUtil.CanvasUtilServer.run(true);
    var div=_cel("div");
    div.id='fb_invite_friends';
    width= BSD.fbconnect.constants.invite_width;
    div.setAttribute("iframeWidth",width+"px");
    var dlg=new FB.UI.PopupDialog("Invite Your Friends to Join "+BSD.fbconnect.constants.app_name,div,false,false);
    dlg.setContentWidth(width);
    dlg.set_placement(FB.UI.PopupPlacement.center);
    exclude_list = invited_already.concat(BSD.fbconnect.connected_friends);
    var url =  location.href.match(/http:\/\/[^\/]*/)[0] + '/page/fbconnect/invite';
    var tmpl = ['<fb:fbml><fb:request-form action="', url, '" method="POST" invite="true" type="', BSD.fbconnect.constants.app_name, '" content="', BSD.fbconnect.constants.invite_text,
         ' <fb:req-choice url=\'', location.href.match(/(http:\/\/[^\/]*)/)[0], '/page/dashboard/view/private?fb_invitor=' , BSD.fbconnect.user,
         '\' label=\'Join ',BSD.fbconnect.constants.app_name,'\' />"><fb:multi-friend-selector cols="4" showborder="false" bypass="cancel" actiontext="Invite your friends to join ',
         BSD.fbconnect.constants.app_name,'." exclude_ids="', exclude_list.join(','),
         '" max="20" /></fb:request-form></fb:fbml>'];

    div.setAttribute('fbml', tmpl.join(''));
    dlg.show();
    FB.XFBML.Host.addElement(new FB.XFBML.ServerFbml(div));
}
YAHOO.util.CustomEvent.silent = true;
YAHOO.util.Event.on(window, 'load', BSD.fbconnect.onload, BSD.fbconnect);
