var Sociable = {
    loadFb: 1,
    HOST: "sociable.livenation.com",
    BASE_URL: document.location.protocol + '//sociable.livenation.com',
    channel: null,
    channelReady: false,
    
    parent_div: 'sociable_container',
    content_div: 'sociable_1',
    story_id: '',
    story_preview: '',
    story_prompt_source: '',
    
    session_state_map: {1:'connected',2:'userNotLoggedIn',3:'appNotAuthorized',0:'unknown'},
    
    
    bootstrap: function() {
        // load style sheet with correct protocol
        Sociable.loadStyleSheet(Sociable.BASE_URL+'/media/styles/sociable.css');
        
        // initialize subdomain channel
        var url = Sociable.BASE_URL + '/connect/bridge.html';
        Sociable.channel = Sociable.createSubdomainChannel(url);
        if (Sociable.loadFb) {
            Sociable.initFacebook();
            FB.ensureInit(Sociable.loadModule);
        } else {
            Sociable.loadModule();
        }
    },

    initFacebook: function() {
        var xdrurl = Sociable.BASE_URL + '/connect/xd_receiver.html';
        if (!FB.Connect) {
            FB.init('952a7349ada7e3aa6c9f8120b949c978',
                xdrurl, {doNotUseCachedConnectState:1});
        }
    },
    
    createSubdomainChannel: function (uri) {
        var iframe = document.createElement('iframe');
        iframe.style.width = '0px';
        iframe.style.height = '0px';
        iframe.style.border = '0px';
        iframe.src = uri;
        document.body.appendChild(iframe);
        return iframe.contentWindow;
    },
    
    loadStyleSheet: function(href) {
        for (var i=0; i < document.styleSheets.length; i++) {
            if (document.styleSheets[i].href == href) {
                return;     // stylesheet already referenced
            }
        }
        // add stylesheet to document as new link element
        var ss = document.createElement('link');
        ss.rel = 'stylesheet';
        ss.type = 'text/css';
        ss.href = href;
        // head element will be in DOM even if not in document source
        document.getElementsByTagName('head')[0].appendChild(ss);
    },

    ajaxRequest: function (url, options, events) {
        if (Sociable.channelReady) {
            if (url.substring(0,1) == "/") {
                url = Sociable.BASE_URL + url;
            }
            var req =  new Sociable.channel.Request({url: url});
            for (var e in events) {
                req.addEvent(e, events[e]);
            }
            req.send(options);
        } else {
            // wait for mootools to initialize
            setTimeout(function() { Sociable.ajaxRequest(url,options,events); }, 50);
        }
    },
    
    ajaxUpdate: function (url, options, events, element) {
        var update = function(responseText, responseXML) {
            $(element).set('html',responseText);
            FB.XFBML.Host.parseDomTree();
        };
        events.success = update;
        Sociable.ajaxRequest(url, options, events);
    },
    
    loadModule: function() {
        var loader = Sociable.edpLoadModule;
        if (sociable_event_data.module_type == 4) {
            loader = Sociable.hpLoadModule;
        }
        if (Sociable.loadFb) {
            var status = FB.Connect.get_status();
            status.waitUntilReady(loader);
        } else {
            loader(0);
        }
    },
    
    edpLoadModule: function(session_state) {
        data = new Hash(sociable_event_data);
        data['loadFb'] = Sociable.loadFb;
        data['session_state'] = Sociable.session_state_map[session_state];
        data['url_params'] = window.location.search;
        Sociable.ajaxUpdate('/edp/ajax/auth_prompt/',
            {method: 'post', evalScripts: true, data: data}, {}, Sociable.parent_div);
    },
    
    reload: function() {
        Sociable.ajaxUpdate('/edp/ajax/reload_module/',
            {method: 'post', evalScripts: true, data: sociable_event_data}, {}, Sociable.parent_div);
    },
    
    closeModal: function() {
        $('sociable_modal').hide();
        var cel = $('email_comment');
        if (cel) {
            cel.hide();
        }
        var el = $('sociable_comment_prompt_modal');
        if (el) {
            el.hide();
        }
    },

    startPermissionsB: function(source) {
        // Sociable.story_prompt_source = source;
        // var complete = function(responseText, responseXML) {
        //     var permissions = JSON.decode(responseText);
        //     if (permissions.perm_read_stream) {
        //          Sociable.startEventPromptB();
        //      } else {
        //          FB.Connect.showPermissionDialog("read_stream", Sociable.permissionsUpdateCallback);  
        //      }
        // };
        // var events = { complete: complete };
        // Sociable.ajaxRequest('/edp/ajax/check_permissions/', {}, events);
        Sociable.startEventPromptB(source);
    },

    permissionsUpdateCallback: function(perms) {
        if (perms) {
            var events = { success: function() { Sociable.startEventPromptB(); } };
            Sociable.ajaxRequest("/edp/ajax/process_permissions/", 
                { method: "post", data: "permissions="+perms },
            	events);
        } else {
            Sociable.startEventPromptB();
        }
    },

    startEventPromptB: function(source) {
        Sociable.story_prompt_source = source;
        var update = function(responseText, responseXML) {
            jsonObj = JSON.decode(responseText);
            Sociable.story_id = jsonObj.story_id;
		    Sociable.story_preview = jsonObj.story_preview;
		    uid = jsonObj.user;
		    if (source == 'inline' || source == 'modal') {
                Sociable.promptFeedStoryB(source);
		    } else {
		        Sociable.promptFeedStoryA();
		    }
        };
        var events = { success: update };
        data = new Hash(sociable_event_data);
        data['prompt'] = Sociable.story_prompt_source;
        data['modal_params'] = window.location.search;
        Sociable.ajaxRequest("/edp/ajax/save_feed_story/",
            { method: "post", data:data },
            events);
    },

    promptFeedStoryA: function() {
        var attachment = { 
            name: Sociable.story_preview.name,
            href: Sociable.story_preview.href,
            caption: Sociable.story_preview.caption,
            description: Sociable.story_preview.description,
            properties: Sociable.story_preview.properties
        };

        if (Sociable.story_preview.event_pic_url) {
            attachment.media = [{ 'type': 'image', 
                src: Sociable.story_preview.event_pic_url,
                href: Sociable.story_preview.href}];
        }

        var user_message = Sociable.story_preview.user_message;
        var action_links = Sociable.story_preview.action_links;

        FB.Connect.streamPublish(
            // user_message, attachment
            user_message, attachment,
            // action_links, target_id
            action_links, null,
            // user_message_prompt, callback
            null, Sociable.feedDialogCallbackA,
            // auto_publish
            false
        );
    },

    promptFeedStoryB: function(source) {
        var post = false;
        var auto_publish = false;
        if (source == 'inline') {
            Sociable.story_preview.user_message = $('soc_comment_inline').value;
            post = $('post_to_fb_inline').checked;
            auto_publish = true;
        } else if (source == 'modal'){
            Sociable.story_preview.user_message = $('soc_comment_modal').value;
            post = true;
        } else {
            post = true;
        }
        var attachment = { 
            name: Sociable.story_preview.name,
            href: Sociable.story_preview.href,
            caption: Sociable.story_preview.caption,
            description: Sociable.story_preview.description,
            properties: Sociable.story_preview.properties
        };

        if (Sociable.story_preview.event_pic_url) {
            attachment.media = [{ 'type': 'image', 
                src: Sociable.story_preview.event_pic_url,
                href: Sociable.story_preview.href}];
        }

        var user_message = Sociable.story_preview.user_message;
        var action_links = Sociable.story_preview.action_links;

        if (post) {
            FB.Connect.streamPublish(
                // user_message, attachment
                user_message, attachment,
                // action_links, target_id
                action_links, null,
                // user_message_prompt, callback
                null, Sociable.feedDialogCallbackB,
                // auto_publish
                auto_publish
            );
        } else {
            Sociable.feedDialogCallbackB('null','');
        }
    },

    feedDialogCallbackA: function(post_id, exception, data) {
        if (data) {
            user_message = data.user_message;
        } else {
            user_message = '';
        }
        Sociable.ajaxUpdate('/edp/ajax/update_feed_story/',
            { method: "post", data: {story_id:Sociable.story_id, action_type:sociable_event_data.action_type, post_id:post_id, exception:exception, user_message:user_message} },
            {}, 
            Sociable.parent_div);
    },
    feedDialogCallbackB: function(post_id, exception, data) {
        Sociable.ajaxUpdate('/edp/ajax/update_feed_story/',
            { method: "post", data: {story_id:Sociable.story_id, 
                                     action_type:sociable_event_data.action_type, 
                                     prompt:Sociable.story_prompt_source,
                                     modal_params:window.location.search,
                                     post_id:post_id, 
                                     exception:exception,
                                     user_message:Sociable.story_preview.user_message} },
            {}, 
            Sociable.parent_div);
        Sociable.story_prompt_source = '';
    },

    changeRSVP: function() {
        Sociable.ajaxUpdate('/edp/ajax/change_rsvp/', 
            { method: 'post', data: sociable_event_data },
            {},
            Sociable.parent_div);
    },

    inviteFriends: function() {
        var callback = function(responseText, responseXML) {
            var dialog = new FB.UI.FBMLPopupDialog('Invite your friends', '');
            dialog.setFBMLContent(responseText);
            dialog.setContentWidth(755); 
            dialog.setContentHeight(540);
            dialog.show();
        };
        var events = { success: callback };
        Sociable.ajaxRequest('/edp/ajax/send_requests/',
            { method: "post", data: { event_id: sociable_event_data.event_id, at:sociable_event_data.action_type }},
            events);

    },

    switchTab: function(tab){
        var data = sociable_event_data;
        data.tab = tab;
        Sociable.ajaxUpdate('/edp/ajax/event_rsvps/',
            { method: "post", data: data }, 
            {},
            Sociable.parent_div);
    },
    
    seeAllRsvps: function() {
        var callback = function(responseText, responseXML) {
            var dialog = new FB.UI.FBMLPopupDialog("Who's Going", '');
            dialog.setFBMLContent(responseText);
            dialog.setContentWidth(420); 
            dialog.setContentHeight(360);
            dialog.show();
        };
        var events = { success: callback };
        Sociable.ajaxRequest('/edp/ajax/view_all_rsvps/',
            { method: "post", data: { event_id: sociable_event_data.event_id}},
            events);
    },
    
    registerClick: function(action) {
        url = '/edp/ajax/register_click/' + action + '/';
        Sociable.ajaxRequest(url,
            { method: "post", data: { event_id: sociable_event_data.event_id}}, {});
    },
    
    clearCommentDefault: function(source) {
        if ( source == 'inline') {
            var textel = $('soc_comment_inline');
        } else if (source == 'modal') {
            var textel = $('soc_comment_modal');
        } else {
            var textel = $('comment_input_'+source);
        }
        if ((textel.value == 'Write a comment...') || (textel.value == 'Write another comment...')) {
            textel.value = '';
        }
    },
    permsReload: function() {
        var update_publish_permissions = function(perms) {
            if (perms) {
                var up_events = { success: Sociable.reload };
                Sociable.ajaxRequest("/edp/ajax/process_permissions/", 
                    { method: "post", data: "permissions="+perms },
                	up_events);
            }
        };
        FB.Connect.showPermissionDialog("read_stream", update_publish_permissions);  
    },
    toggleLikes: function(post_id) {
        $('likes_detail_'+post_id).toggle();
    },
    showCommentPrompt: function(post_id) {
        $('comment_placeholder_'+post_id).addClass('sociable_hideme');
        $('comment_prompt_'+post_id).removeClass('sociable_hideme');
        $('comment_input_'+post_id).focus();
    },
    startPublish: function(post_id, action) {
        var call_next = function() {
            if (action == 'comment') {
                Sociable.submitComment(post_id);
            } else if (action == 'like') {
                Sociable.addLike(post_id);
            } else if (action == 'unlike') {
                Sociable.removeLike(post_id);
            }
        };
        var update_publish_permissions = function(perms) {
            if (perms) {
                var up_events = { success: call_next };
                Sociable.ajaxRequest("/edp/ajax/process_permissions/", 
                    { method: "post", data: "permissions="+perms },
                	up_events);
            } else {
                call_next();
            }
        };
        
        var perm_complete = function(responseText, responseXML) {
            var permissions = JSON.decode(responseText);
            if (permissions.perm_publish_stream) {
                call_next();
             } else {
                FB.Connect.showPermissionDialog("publish_stream", update_publish_permissions);  
             }
        };
        var perm_events = { complete: perm_complete };
        Sociable.ajaxRequest('/edp/ajax/check_permissions/', {}, perm_events);
    },
    submitComment: function(post_id) {
        var comment = $('comment_input_'+post_id).value;
        var com_success = function(responseText, responseXML) {
            if (responseText.indexOf('sociable_error') == -1) {
                var com_el = $('comments_'+post_id);
                com_el.set('html',com_el.get('html')+responseText);
                $('comment_input_'+post_id).value = 'Write another comment...';
                var comment_count = parseInt($('comment_count_'+post_id).get('text')) + 1;
                $('comment_count_'+post_id).set('text', comment_count);
                FB.XFBML.Host.parseDomTree();
            } else {
                var com_el = $('comments_'+post_id);
                com_el.set('html',com_el.get('html')+responseText);
            }
        };
        var com_events = { success: com_success };
        Sociable.ajaxRequest('/edp/ajax/post_comment/',
            { method: "post", 
              data: { event_id: sociable_event_data.event_id, 
                      post_id: post_id, 
                      comment: comment}}, 
              com_events);

    }, 
    showComments: function(post_id) {
        Sociable.ajaxUpdate('/edp/ajax/view_comments/',
            { method: "post", 
              data: { event_id: sociable_event_data.event_id, 
                      post_id: post_id}},
             {}, 
              'comments_'+post_id);
    },
    addLike: function(post_id) {
        var success = function(responseText, responseXML) {
            response = JSON.decode(responseText);
            if (response.success) {
                if ($('comment_prompt_'+post_id).hasClass('sociable_hideme')) {
                    $('comment_placeholder_'+post_id).removeClass('sociable_hideme');
                }
                var count = parseInt($('like_count_'+post_id).get('text')) + 1;
                $('like_count_'+post_id).set('text', count);
                $('like_summary_'+post_id).removeClass('sociable_hideme');
                if (count == 1) {
                    text = "1 person likes this.";
                } else {
                    text = count + " people like this.";
                }
                $('unlike_link_'+post_id).removeClass('sociable_hideme');
                $('like_link_'+post_id).addClass('sociable_hideme');
                $('likes_toggle_'+post_id).set('text', text);
                $('user_like_'+post_id).removeClass('sociable_hideme');
            } else {
                var er_el = "<div class='sociable_error";
                if (response.code == 200) {
                    er_el += " perm_publish_stream'>Your like cannot be posted without granting permission to publish to Facebook.";
                } else if (response.code == 210) {
                    er_el += "'>You don\'t have access to like this item.";
                } else {
                    er_el += "'>There was an error posting your like to Facebook.";
                }
                er_el += "</div>";
                var likes_cont = $('likes_'+post_id);
                likes_cont.set('html', er_el + likes_cont.get('html'));
            }
        };
        var events = {success: success};
        Sociable.ajaxRequest('/edp/ajax/like/',
        { method: "post", 
          data: { event_id: sociable_event_data.event_id, 
                  post_id: post_id}},
         events);
    },
    removeLike: function(post_id) {
        var success = function(responseText, responseXML) {
            response = JSON.decode(responseText);
            if (response.success) {
                var count = parseInt($('like_count_'+post_id).get('text')) - 1;
                $('like_count_'+post_id).set('text', count);
                if (count === 0) {
                    $('like_summary_'+post_id).addClass('sociable_hideme');
                    var comment_count = parseInt($('comment_count_'+post_id).get('text'));
                    if (comment_count === 0) {
                        $('comment_placeholder_'+post_id).addClass('sociable_hideme');
                        $('comment_prompt_'+post_id).addClass('sociable_hideme');
                    }
                }
                if (count == 1) {
                    text = "1 person likes this.";
                } else {
                    text = count + " people like this.";
                }
                $('unlike_link_'+post_id).addClass('sociable_hideme');
                $('like_link_'+post_id).removeClass('sociable_hideme');
                $('likes_toggle_'+post_id).set('text', text);
                $('user_like_'+post_id).addClass('sociable_hideme');
            } else {
                var er_el = "<div class='sociable_error";
                if (response.code == 200) {
                    er_el += " perm_publish_stream'>Your like cannot be removed without granting permission to publish to Facebook.";
                } else if (response.code == 210) {
                    er_el += "'>You don\'t have access to unlike this item.";
                } else {
                    er_el += "'>There was an error removing your like to Facebook.";
                }
                er_el += "</div>";
                var likes_cont = $('likes_'+post_id);
                likes_cont.set('html', er_el + likes_cont.get('html'));
            }
        };
        var events = {success: success};
        Sociable.ajaxRequest('/edp/ajax/unlike/',
        { method: "post", 
          data: { event_id: sociable_event_data.event_id, 
                  post_id: post_id}},
         events);
    },
    
    hpLoadModule: function(session_state) {
        data = new Hash(sociable_event_data);
        data['loadFb'] = Sociable.loadFb;
        data['session_state'] = Sociable.session_state_map[session_state];
        data['url_params'] = window.location.search;
        Sociable.ajaxUpdate('/hp/ajax/load_module/',
            {method: 'post', evalScripts: true, data: data}, {}, Sociable.parent_div);
    }, 
    
    hpSwitchTab: function(tab){
        var data = sociable_event_data;
        data.tab = tab;
        Sociable.ajaxUpdate('/hp/ajax/switch_tab/',
            { method: "post", data: data }, 
            {},
            Sociable.parent_div);
    },
    hpRegisterClick: function(action, el) {
        var complete = function() {
            if (el) {
                window.location = el.href;
            }
        };
        var url = '/hp/ajax/register_click/' + action + '/';
        Sociable.ajaxRequest(url,
            { method: "post", data: {}}, {complete:complete});
    },
    hpRegisterEventClick: function(event_id, tab, el) {
        var complete = function() {
            if (el) {
                window.location = el.href;
            }
        };
        var url = '/hp/ajax/register_click/view_event/';
        Sociable.ajaxRequest(url,
            { method: "post", data: {event_id:event_id, tab:tab}}, {complete:complete});
    }
    
 
};

Sociable.bootstrap(true);
