/*
Copyright 2012 Red Edge LLC. All Rights Reserved. Neither this software nor any part of it may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, electronic, mechanical, photocopying, recording or otherwise, without the prior written permission of Red Edge LLC. By using this product, user agrees not to hold Red Edge LLC liable for any problems, errors, or malfunctions directly involving or associated with the software.
 */

var FacebookWrapper = (function() {
    function FacebookWrapper(options) {
        this.init(options);
    }
    FacebookWrapper.prototype = {
        init: function(options) {
            var facebookWrapper = this;
            this.parent = options.parent;
            this.curUrl = options.curUrl;
            this.fbObject = options.fbObject;
            this.namespace = options.namespace;
            this.pluginPath = options.pluginPath;
            delete options.parent;
            delete options.curUrl;
            delete options.fbObject;
            delete options.namespace;
            delete options.pluginPath;
            this.connected = false;
            this.cookie = readCookie('socialReader');
            this.autoShareLabel = {
                'true': 'Share on read <strong>ON</strong>',
                'false': 'Share on read <strong>OFF</strong>'
            };
            this.autoShare = this.cookie ? parseBoolean(this.cookie) : true;
            this.myActivityOpen = false;
            this.activityOpen = false;
            window.fbAsyncInit = function() {
                FB.Flash.hasMinVersion = function () { return false; }; // Fixes misc. compatibility problems w/ auth popup appearing blank
                FB.init(options);
				// console.log(FB);
				setTimeout(function () { if(!facebookWrapper.connected) { showColorbox(); } },1500);
                FB.Event.subscribe('auth.statusChange', function(data) {
					// console.log(data);
                    facebookWrapper.isConnected(data);
                });
				FB.Event.subscribe('auth.authResponseChange ', function(data) {
					// console.log(data);
				});
				/*
                FB.getLoginStatus(function(data) {
					if(data.status !== 'connected') {
						showColorbox();
					}
                    // facebookWrapper.isConnected(data);
                });
                */
            };
            (function(d){
                var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
                js = d.createElement('script'); js.id = id; js.async = true;
                js.src = "//connect.beta.facebook.net/en_US/all.js";
                d.getElementsByTagName('head')[0].appendChild(js);
            }(document));
        },
        // This function is kind of a mess, I'll clean it up and break it into a number of smaller functions asap
        login: function(data) {
            var facebookWrapper = this;
			this.loggedIn = true;
            FB.api('/me', function(user) {
				var activityFeed = jQuery(".fb_iframe_widget iframe");
				// console.log(activityFeed.attr('src'));
				activityFeed.attr('src', activityFeed.attr('src'));
				jQuery.colorbox.close();
				jQuery("#interstitial").hide(0);
                if (user) {
                    facebookWrapper.me = user;
                    facebookWrapper.friends = {};
                    facebookWrapper.actions = {};
                    facebookWrapper.connected = true;
                    if (facebookWrapper.parent.widgets.login[0]) {
                        facebookWrapper.initLoginWidget(user);
                    }
                    if (facebookWrapper.parent.widgets.friendActivity[0]) {
                        facebookWrapper.initFriendActivityWidget(user);
                    }
                    if (facebookWrapper.parent.widgets.aggregateActivity[0]) {
                        facebookWrapper.initAggregateActivityWidget(user);
                    }
                    if (facebookWrapper.parent.widgets.allInOne[0]) {
                        if (IEgetElementsByClassName('sr-widget-login', 'div', IEgetElementsByClassName('sr-fb-allInOne')[0])[0])
                            facebookWrapper.initLoginWidget(user);
                        if (IEgetElementsByClassName('sr-widget-friendActivity', 'div', IEgetElementsByClassName('sr-fb-allInOne')[0])[0])
                            facebookWrapper.initFriendActivityWidget(user);
                        if (IEgetElementsByClassName('sr-widget-aggregateActivity', 'div', IEgetElementsByClassName('sr-fb-allInOne')[0])[0])
                            facebookWrapper.initAggregateActivityWidget(user);
                    }
                    addEvent(document.body, 'click', function() {
                        var activities, myActivities;
                        if (facebookWrapper.parent.widgets.login[0] && facebookWrapper.myActivityOpen) {
                            myActivities = IEgetElementsByClassName('sr-fbLogin-activityList');
                            for (var i in myActivities)
                                myActivities[i].style.display = 'none';
                            facebookWrapper.myActivityOpen = false;
                        }
                        if (facebookWrapper.parent.widgets.friendActivity[0] && facebookWrapper.activityOpen) {
                            activities = IEgetElementsByClassName('sr-fbFriendActivity-activityList');
                            for (var i in activities)
                                activities[i].style.display = 'none';
                            facebookWrapper.activityOpen = false;
                        }
                    });
                }
            });
        },
        initLoginWidget: function(user) {
            var facebookWrapper = this,
                loginWidgets = IEgetElementsByClassName('sr-widget-fbLogin'),
                myLogin, myAvatar, myUsername, myOption, myActivity, myAutoshareButton, myActivityButton, myInviteButton;
            for (var i in loginWidgets) {
                myLogin = IEgetElementsByClassName('sr-fbLogin-loginButton', null, loginWidgets[i])[0];
                myAvatar = IEgetElementsByClassName('sr-fbLogin-avatar', null, loginWidgets[i])[0];
                myOption = IEgetElementsByClassName('sr-fbLogin-options', null, loginWidgets[i])[0];
                myActivity = IEgetElementsByClassName('sr-fbLogin-activityList', null, loginWidgets[i])[0];
                myAutoshareButton = IEgetElementsByClassName('sr-fbLogin-autoshareButton', null, loginWidgets[i])[0];
                myActivityButton = IEgetElementsByClassName('sr-fbLogin-activityButton', null, loginWidgets[i])[0];
                myInviteButton = IEgetElementsByClassName('sr-fbLogin-inviteButton', null, loginWidgets[i])[0];
                myLogin.style.display = 'none';
                myAvatar.src = 'https://graph.facebook.com/'+user.id+'/picture';
                myOption.style.display = 'block';
                myAutoshareButton.innerHTML = facebookWrapper.autoShareLabel[facebookWrapper.autoShare];
                addEvent(myActivityButton, 'click', function(e) {
                    e = window.event || e;
                    if (facebookWrapper.myActivityOpen)
                        return false;
                    var myActivity = IEgetElementsByClassName('sr-fbLogin-activityList', 'div', (e.target || e.srcElement).parentNode.parentNode)[0];
                    facebookWrapper.listActivities(myActivity);
                });
                addEvent(myAutoshareButton, 'click', function() {
                    facebookWrapper.autoShare = !facebookWrapper.autoShare;
                    document.getElementById('SR_FacebookAutoShare_Button').innerHTML = facebookWrapper.autoShareLabel[facebookWrapper.autoShare];
                    createCookie('socialReader', facebookWrapper.autoShare);
                });
                addEvent(myInviteButton, 'click', function() {
                    //document.getElementById('SR_FacebookInviteFriends').style.display = 'block';
                    FB.ui({
                            method: 'apprequests',
                            message: 'Invite your friends to share what they read on '+facebookWrapper.curUrl+'.',
                            data: 127076597408738,
                            title:'Share this page with your friends.'},
                        function(response) {  // This is just a temporary placeholder callback
                            if (response)
                                return;
                        }
                    );
                });
                addEvent(myActivity, 'click', stopPropogation);
            }
            myUsername = IEgetElementsByClassName('sr-fbLogin-myUsername');
            for (var i in myUsername)
                myUsername[i].innerHTML = user.name;
            facebookWrapper.action('read', facebookWrapper.fbObject, facebookWrapper.curUrl);
        },
        initFriendActivityWidget: function(user) {
            var facebookWrapper = this,
                friendActivityWidgets = IEgetElementsByClassName('sr-widget-fbFriendActivity'),
                friendLists = IEgetElementsByClassName('sr-fbFriendActivity-friendList'),
                activityLists = IEgetElementsByClassName('sr-fbFriendActivity-activityList'),
                maxl = parseInt(friendLists[0].className.split(' ')[1].split(':')[1]);
            for (var i in friendActivityWidgets)
                friendActivityWidgets[i].style.display = 'block';
            FB.api('/me/friends?fields=installed,name&limit=5000', function(friends) {
                if (friends) {
                    var l = friends.data.length,
                        img;
                    while (l--) {
                        if (friends.data[l].installed) {
                            facebookWrapper.friends[friends.data[l].name] = friends.data[l];
                            img = document.createElement('img');
                            img.src = 'https://graph.facebook.com/'+friends.data[l].id+'/picture';
                            img.className = friends.data[l].id;
                            img.setAttribute('alt', friends.data[l].name);
                            addEvent(img, 'mouseover', function(e) {
                                e = window.event || e;
                                if (IEgetElementsByClassName('sr-fb-friendActivity')[0] && IEgetElementsByClassName('sr-fb-friendActivity')[0].getElementsByTagName('h3')) {
                                    facebookWrapper.activityTitle = IEgetElementsByClassName('sr-fb-friendActivity')[0].getElementsByTagName('h3')[0].innerHTML;
                                    IEgetElementsByClassName('sr-fb-friendActivity')[0].getElementsByTagName('h3')[0].innerHTML = (e.target || e.srcElement).getAttribute('alt');
                                }
                            });
                            addEvent(img, 'mouseout', function(e) {
                                if (facebookWrapper.activityTitle)
                                    IEgetElementsByClassName('sr-fb-friendActivity')[0].getElementsByTagName('h3')[0].innerHTML = facebookWrapper.activityTitle;
                            });
                            addEvent(img, 'click', function(e) {
                                e = window.event || e;
                                if (facebookWrapper.activityOpen)
                                    return false;
                                var activityList = IEgetElementsByClassName('sr-fbFriendActivity-activityList', 'div', (e.target || e.srcElement).parentNode.parentNode)[0],
                                    maxi = parseInt(activityList.className.split(' ')[1].split(':')[1]),
                                    newImg = (e.target || e.srcElement).src,
                                    ajaxLoader = document.createElement('img');
                                ajaxLoader.className = 'sr-ajax-loader';
                                ajaxLoader.src = facebookWrapper.pluginPath+'img/ajax-loader.gif';
                                if (facebookWrapper.activityTitle)
                                    IEgetElementsByClassName('sr-fb-friendActivity')[0].getElementsByTagName('h3')[0].innerHTML = facebookWrapper.activityTitle;
                                activityList.innerHTML = '<img src="'+newImg+'" /><p>'+(e.target || e.srcElement).getAttribute('alt')+'</p>';
                                activityList.appendChild(ajaxLoader);
                                activityList.style.display = 'block';
                                facebookWrapper.fetchActivity((e.target || e.srcElement).className, function(actions) {
                                    var p = 0,
                                        i = actions.data.length,
                                        action,
                                        object,
                                        date,
                                        friendActions = {};
                                    facebookWrapper.activityOpen = true;
                                    activityList.removeChild(ajaxLoader);
                                    if (actions.data == '') {
                                        action = document.createElement('div');
                                        action.innerHTML = '<span class="sr-no-activity">No activity logged.</span>';
                                        activityList.appendChild(action);
                                    }
                                    while (p < i) {
                                        if (actions.data[p].data.website)
                                            object = actions.data[p].data.website;
                                        else
                                            object = actions.data[p].data.article;
                                        if (!friendActions[object.type])
                                            friendActions[object.type] = {};
                                        if (!friendActions[object.type][object.url]) {
                                            friendActions[object.type][object.url] = object.title;
                                            date = actions.data[p].start_time.split('T')[0].split('-');
                                            date = new Date(date[0], date[1]-1, date[2]);
                                            action = document.createElement('div');
                                            action.innerHTML = '<a href="'+object.url+'">'+object.title+'</a> <span class="action-date">'+date.toDateString()+'</span>';
                                            activityList.appendChild(action);
                                            if (!--maxi)
                                                return;
                                        }
                                        p++;
                                    }
                                });
                            });
                            for (var i in friendLists)
                                friendLists[i].appendChild(img);
                            if (!--maxl)
                                return;
                        }
                    }
                }
            });
            for (var i in activityLists)
                addEvent(activityLists[i], 'click', stopPropogation);
        },
        initAggregateActivityWidget: function(user) {
            var facebookWrapper = this,
                aggregateActivityWidgets = IEgetElementsByClassName('sr-widget-fbAggregateActivity');
            for (var i in aggregateActivityWidgets)
                aggregateActivityWidgets[i].style.display = 'block';
        },
        logout: function(data) {
            var facebookWrapper = this,
                loginWidgets = IEgetElementsByClassName('sr-widget-fbLogin'),
                myLogin, myAvatar, myUsername, myOption, myActivity, myAutoshareButton, myActivityButton, myInviteButton;
            for (var i in loginWidgets) {
                myLogin = IEgetElementsByClassName('sr-fbLogin-loginButton', null, loginWidgets[i])[0];
                myAvatar = IEgetElementsByClassName('sr-fbLogin-avatar', null, loginWidgets[i])[0];
                myUsername = IEgetElementsByClassName('sr-fbLogin-myUsername', null, loginWidgets[i])[0];
                myOption = IEgetElementsByClassName('sr-fbLogin-options', null, loginWidgets[i])[0];
                myActivity = IEgetElementsByClassName('sr-fbLogin-activityList', null, loginWidgets[i])[0];
                myAutoshareButton = IEgetElementsByClassName('sr-fbLogin-autoshareButton', null, loginWidgets[i])[0];
                myActivityButton = IEgetElementsByClassName('sr-fbLogin-activityButton', null, loginWidgets[i])[0];
                myInviteButton = IEgetElementsByClassName('sr-fbLogin-inviteButton', null, loginWidgets[i])[0];
                //document.getElementById('SR_FacebookMyFriends').style.display = 'none';
                //document.getElementById('SR_FacebookLogin').style.display = 'block';
                //document.getElementById('SR_FacebookAvatar').src = this.pluginPath+'/img/fbAvatar.png';
                //document.getElementById('SR_FacebookMyUsername').innerHTML = 'Share the conversation!';
                //document.getElementById('SR_FacebookMyOptions').style.display = 'none';
            }
            facebookWrapper.connected = false;
            facebookWrapper.me = {};
        },
        isConnected: function(data) {

            if (data.status === 'connected') {
				this.login(data);
			} else {
				this.logout(data);
				// console.log('Not logged in?');
			}

        },
        action: function(action, object, url) {
            if (this.autoShare)
                FB.api('/me/'+this.namespace+':'+action+'?'+object+'='+url, 'post', function(response) {
                    if (!response || response.error)
                        alert(response.error.message);
                });
        },
        listActivities: function(myActivity) {
            var facebookWrapper = this,
                args = myActivity.className.split(' ')[1].split(':'),
                maxl = parseInt(args[1]),
                allowDelete = args[2] == 'on' ? true : false,
                ajaxLoader = document.createElement('img'),
                deleteLinks = IEgetElementsByClassName('sr-delete-activity', 'a', myActivity),
                dl = deleteLinks.length,
                deleteTarget = false,
                deleteCallback = function(response) {
                    if (response)
                        facebookWrapper.listActivities(myActivity);
                    deleteTarget = false;
                },
                deleteFn = function(e) {
                    e = window.event || e;
                    if (allowDelete && !deleteTarget) {
                        deleteTarget = (e.target || e.srcElement).className.split(' ')[1];
                        facebookWrapper.deleteAction(deleteTarget, deleteCallback);
                    }
                },
                activityCallback = function(actions) {
                    var p = 0,
                        l = actions.data.length,
                        action,
                        date,
                        deleteLink,
                        object;
                    facebookWrapper.myActivityOpen = true;
                    myActivity.removeChild(ajaxLoader);
                    if (actions.data == '') {
                        action = document.createElement('div');
                        action.innerHTML = '<span class="sr-no-activity">No activity logged.</span>';
                        myActivity.appendChild(action);
                    }
                    while (p < l) {
                        this.myActivityOpen = true;
                        if (actions.data[p].data.website)
                            object = actions.data[p].data.website;
                        else
                            object = actions.data[p].data.article;
                        if (!facebookWrapper.actions[object.type])
                            facebookWrapper.actions[object.type] = {};
                        if (!facebookWrapper.actions[object.type][object.url]) {
                            facebookWrapper.actions[object.type][object.url] = object.title;
                            date = actions.data[p].start_time.split('T')[0].split('-');
                            date = new Date(date[0], date[1]-1, date[2]);
                            deleteLink = (allowDelete) ? '<a class="sr-delete-activity '+actions.data[p].id+'" href="javascript:;">x</a>' : '';
                            action = document.createElement('div');
                            action.id = 'div'+actions.data[p].id;
                            action.innerHTML = '<a href="'+object.url+'">'+object.title+'</a>'+deleteLink+'<span class="action-date">'+date.toDateString()+'</span>';
                            myActivity.appendChild(action);
                            if (allowDelete)
                                addEvent(IEgetElementsByClassName(actions.data[p].id, 'a', myActivity)[0], 'click', deleteFn);
                            if (!--maxl)
                                return;
                        }
                        p++;
                    }
                };
            ajaxLoader.className = 'sr-ajax-loader';
            ajaxLoader.src = facebookWrapper.pluginPath+'img/ajax-loader.gif';
            while (--dl > 0)
                removeEvent(deleteLinks[dl], 'click', deleteFn);
            myActivity.style.display = 'block';
            myActivity.innerHTML = '<img src="https://graph.facebook.com/'+facebookWrapper.me.id+'/picture" /><p>Your activity</p>';
            myActivity.appendChild(ajaxLoader);
            facebookWrapper.actions = {};
            facebookWrapper.fetchActivity('me', activityCallback);
        },
        fetchActivity: function(user, callback) {
            var facebookWrapper = this;
            user = user || 'me';
            //limit = (limit) ? '?limit='+limit : '';
            limit = '?limit='+1000;  // THIS IS A TEMPORARY RESOLUTION TO THE PROBLEM OF DEALING WITH DUPLICATE ACTION ENTRIES
            /* The problem is that facebook will return duplicates of the same article, which means we cant just limit this to the number
            that we want to search for and return.  We have to return enough that we can discard duplicates and then return the top X
            unique actions.  I temporarily hardcoded this limit at 100 but this is obviously not robust.  We need a real workaround for
            this issue.  My proposed solution would be to fetch an arbitrary number, eliminate duplicates, and then if the total entries
            remaining is STILL too few, pull the next 100, repeat, append to list, ad infinitum until the list is at least the length of
            the desired number of articles to be returned.
             */
            setTimeout(function() {
                FB.api('/'+user+'/'+facebookWrapper.namespace+':read'+limit, function(actions) {
                    if (actions) {
                        if (typeof callback == 'function')
                            callback(actions);
                    }
                });
            }, 0);
        },
        deleteAction: function(id, callback) {
            setTimeout(function() {
                FB.api('/'+id+'?method=delete', function(response) {
                    if (response && !response.error)
                        if (typeof callback == 'function')
                            callback(response);
                });
            }, 0);
        }
    }
    return FacebookWrapper;
})();
