(function( $ ){
    var createEle, createEleStr, previewEle, previewEleStr, successEle, successEleStr;
    var shareContentTitle, shareContentType, shareContentUrl, shareUserContent;
    var shareContentPhotoSrc, shareContentName, shareContentCaption, shareContentDesc;
    var shareModalType;
    var serviceFacebook, serviceTwitter;
    var facebookUserInfo, twitterUserInfo;

    var methods = {
        init : function( options ) {
            return this.each(function(){
                serviceTwitter = false;
                serviceFacebook = false;
                facebookUserInfo = null;
                twitterUserInfo = null;
                createEle = $('#shareModalCreatePanel');
                createEleStr = '#shareModalCreatePanel';
                if(options.length == 7) {
                    shareContentTitle = options[0];
                    shareContentType = options[1];
                    shareContentUrl = options[2];
                    shareContentPhotoSrc = options[3];
                    shareContentName = options[4];
                    shareContentCaption = options[5];
                    shareContentDesc = options[6];
                    shareModalType = "share";
                    if(shareContentPhotoSrc.indexOf("http:") == -1) {
                        shareContentPhotoSrc = 'http:'+shareContentPhotoSrc;
                    }

                    $(createEleStr+' div.share-btn-area button.previewBtn').show();
                }
                else {
                    shareModalType = "status-update";
                    $(createEleStr+' div.share-btn-area button.previewBtn').hide();
                }

                var avatarGetUrl = $('input#getUserAvatarUrl').val();
                $.ajax({
                    url: avatarGetUrl,
                    success: function(data) {
                        $(createEleStr+' div.modal-body img.avatar').attr('src', data);
                        methods["checkConnectedServices"].apply(this, []);
                    }
                });
            });
        },
        destroy : function( ) {
            return this.each(function(){

            });
        },
        checkConnectedServices : function() {
            var url =  $('input#getConnectedServicesUrl').val();
            $.ajax({
                url: url,
                //data: ({name: name, label: label, visibility: visibility, sortOrder: sortOrder}),
                success: function(data) {
                    serviceTwitter = false;
                    serviceFacebook = false;
                    var services = $.parseJSON(data);
                    for(var foo=0; foo < services.response.payload.length; foo++) {
                        if(services.response.payload[foo].userService.service.name == "Twitter")
                            serviceTwitter = true;
                        if(services.response.payload[foo].userService.service.name == "FacebookFeed")
                            serviceFacebook = true;
                    }

                    if(!serviceFacebook)
                        $('input#shareServiceFacebookChk').attr('checked', '');

                    if(!serviceTwitter)
                        $('input#shareServiceTwitterChk').attr('checked', '');

                    if(serviceFacebook && serviceTwitter) {
                        if(facebookUserInfo == null) {
                            var facebookInfoUrl = $('input#getFacebookUserInfoUrl').val();
                            $.ajax({
                                url: facebookInfoUrl,
                                success: function(data) {
                                    facebookUserInfo = $.parseJSON(data);
                                    if(twitterUserInfo == null) {
                                        var twitterInfoUrl = $('input#getTwitterUserInfoUrl').val();
                                        $.ajax({
                                            url: twitterInfoUrl,
                                            success: function(data) {
                                                twitterUserInfo = $.parseJSON(data);
                                                methods["showCreateForm"].apply( this, [true]);
                                            }
                                        });
                                    }
                                    else
                                        methods["showCreateForm"].apply( this, [true]);
                                }
                            });
                        }
                        else if(twitterUserInfo == null) {
                            var twitterInfoUrl = $('input#getTwitterUserInfoUrl').val();
                            $.ajax({
                                url: twitterInfoUrl,
                                success: function(data) {
                                    twitterUserInfo = $.parseJSON(data);
                                    if(facebookUserInfo == null) {
                                        var facebookInfoUrl = $('input#getFacebookUserInfoUrl').val();
                                        $.ajax({
                                            url: facebookInfoUrl,
                                            success: function(data) {
                                                facebookUserInfo = $.parseJSON(data);
                                                methods["showCreateForm"].apply( this, [true]);
                                            }
                                        });
                                    }
                                    else
                                        methods["showCreateForm"].apply( this, [true]);
                                }
                            });
                        }
                    }
                    else if(serviceFacebook) {
                        if(facebookUserInfo == null) {

                            var facebookInfoUrl = $('input#getFacebookUserInfoUrl').val();
                            $.ajax({
                                url: facebookInfoUrl,
                                success: function(data) {

                                    facebookUserInfo = $.parseJSON(data);

                                    methods["showCreateForm"].apply( this, [true]);
                                }
                            });
                        }
                    }

                    else if(serviceTwitter) {
                        if(twitterUserInfo == null) {
                            var twitterInfoUrl = $('input#getTwitterUserInfoUrl').val();
                            $.ajax({
                                url: twitterInfoUrl,
                                success: function(data) {
                                    twitterUserInfo = $.parseJSON(data);
                                    methods["showCreateForm"].apply( this, [true]);
                                }
                            });
                        }
                    }
                    else
                        methods["showCreateForm"].apply( this, [true]);
                }
            });
        },
        connectUserServiceLinkClick : function(serviceType) {
            //var connectServiceUrl = $('input#genericConnectServiceUrl').val();
            //connectServiceUrl = connectServiceUrl.replace('replacethistext', serviceType);
            var connectUrl = "";
            if(serviceType == "twitter") {
                connectUrl = $('input#twitterConnectUrl').val();
            }
            else if(serviceType == "facebook") {
                connectUrl = $('input#facebookConnectUrl').val();
            }
            window.open(connectUrl, "ConnectPopup", "menubar=yes,width=800,height=600,toolbar=yes");
            methods["checkRingCookieSet"].apply(this, [2000]);
            //time out logic to check for cookie
        },
        checkRingCookieSet : function(interval) {
            if(methods["getCookie"].apply(this, ["RingCallBack"]) == "1") {
                methods["createCookie"].apply(this, ["RingCallBack", "0", 0]);
                methods["checkConnectedServices"].apply(this, []);
            }
            else
                setTimeout(function() { methods["checkRingCookieSet"].apply(this, [interval]); });
        },
        getCookie : function(c_name) {
            if (document.cookie.length > 0) {
                c_start = document.cookie.indexOf(c_name + "=");
                if (c_start != -1) {
                    c_start = c_start + c_name.length + 1;
                    c_end = document.cookie.indexOf(";", c_start);
                    if (c_end == -1) c_end = document.cookie.length;
                    return unescape(document.cookie.substring(c_start, c_end));
                }
            }
            return "";
        },
        createCookie: function(name,value,days) {
        	var expires = "";
            if (days) {
                var date = new Date();
                date.setTime(date.getTime()+(days*24*60*60*1000));
                expires = "; expires="+date.toGMTString();
            }
            document.cookie = name+"="+value+expires+"; path=/";
        },
        showCreateForm : function(first) {
            createEle = $('#shareModalCreatePanel');
            createEleStr = '#shareModalCreatePanel';
            previewEle = $('#shareModalPreviewPanel');
            previewEleStr = '#shareModalPreviewPanel';
            successEle = $('#shareModalSuccessPanel');
            successEleStr = '#shareModalSuccessPanel';

            $('#shareModalPanelContainer a.closeHandle').unbind('.share');
            $('#shareModalPanelContainer a.closeHandle').bind('click.share', methods.cancelCreateForm);

            $(createEleStr+' h4.sharePanelTitleContent strong.shareContentTitle').html(shareContentTitle);
            $(createEleStr+' h4.sharePanelTitleContent span.shareContentType').html(shareContentType);

            if(shareModalType == "status-update") {
                $(createEleStr+' h4.sharePanelTitleContent').hide();
                $(createEleStr+' h4.sharePanelTitleStatus').show();
                $(createEleStr+' div.modal-btn-holder input.previewBtn').hide();
            }
            else {
                $(createEleStr+' h4.sharePanelTitleContent').show();
                $(createEleStr+' h4.sharePanelTitleStatus').hide();
                $(createEleStr+' div.modal-btn-holder input.previewBtn').show();
            }

            if(serviceTwitter) {
                $('input#shareServiceTwitterChk').attr("checked", "checked");
                createEle.children('div.share-social').children('div.twitterCharCounter').toggle();
                createEle.children('div.share-social').children('div.twitter-share').children('div.shareServiceTwitterDisconnected').hide();
                createEle.children('div.share-social').children('div.twitter-share').children('div.shareServiceTwitterConnected').show();
            }
            else {
                $('input#shareServiceTwitterChk').attr("checked", "");
                $('input#shareServiceTwitterChk').bind('click', function() {
                    methods["connectUserServiceLinkClick"].apply(this, ["twitter"]);
                    $(this).unbind('click');
                });
            }

            if(serviceFacebook) {
                $('input#shareServiceFacebookChk').attr("checked", "checked");
                createEle.children('div.share-social').children('div.facebook-share').children('div.shareServiceFacebookDisconnected').hide();
                createEle.children('div.share-social').children('div.facebook-share').children('div.shareServiceFacebookConnected').show();
            }
            else {
                $('input#shareServiceFacebookChk').attr("checked", "");
                $('input#shareServiceFacebookChk').bind('click', function() {
                    methods["connectUserServiceLinkClick"].apply(this, ["facebook"]);
                    $(this).unbind('click');
                });
            }

            //event handler for twitter box check/uncheck
            $('input#shareServiceTwitterChk').unbind('change');
            $('input#shareServiceTwitterChk').bind('change', function() {
                if($(this).attr('checked')) {
                    serviceTwitter = true;
                    $('div#twitterCharCounter').show();
                }
                else {
                    serviceTwitter = false;
                    $('div#twitterCharCounter').hide();
                }
            });

            $('input#shareServiceFacebookChk').unbind('change');
            $('input#shareServiceFacebookChk').bind('change', function() {
                if($(this).attr('checked')) {
                    serviceFacebook = true;
                }
                else {
                    serviceFacebook = false;
                }
            });

            $('textarea#shareComment').unbind('keydown');
            $('textarea#shareComment').unbind('keyup');
            $('textarea#shareComment').bind('keydown, keyup', methods.updateMessageCharCounter);

            //add handlers for buttons   shareBtn
            $(createEleStr+' div.modal-btn-holder input.cancelBtn').unbind('click');
            $(createEleStr+' div.modal-btn-holder input.cancelBtn').bind('click', methods.cancelCreateForm);
            $(createEleStr+' div.modal-btn-holder input.previewBtn').unbind('click');
            $(createEleStr+' div.modal-btn-holder input.previewBtn').bind('click', methods.showPreviewForm);
            $(createEleStr+' div.modal-btn-holder input.nextBtn').unbind('click');
            $(createEleStr+' div.modal-btn-holder input.nextBtn').bind('click', methods.doShareAction);

            $('div.infield-holder label').inFieldLabels();
            previewEle.hide();
            successEle.hide();
            createEle.show();
            if(first)
                $.blockUI({ message: $('#shareModalPanelContainer')});

        },
        updateMessageCharCounter : function() {
            var charCount = $('textarea#shareComment').val().length;
            var totalChars = 130-21; //number of chars remaining with blank text area, acounting for bit.ly url length

            //TODO: if twitter char count shown, enable/disable share and preview buttons off count

            $('div#twitterCharCounter').html(totalChars-charCount);
            if(totalChars-charCount < 0) {
                if(!$('div#twitterCharCounter').hasClass('twitter-count-negative'))
                    $('div#twitterCharCounter').addClass('twitter-count-negative');
            }
            else {
                if($('div#twitterCharCounter').hasClass('twitter-count-negative'))
                    $('div#twitterCharCounter').removeClass('twitter-count-negative');
            }

            shareUserContent = $('textarea#shareComment').val();
        },
        showPreviewForm : function() {
            shareUserContent = $('textarea#shareComment').val();
            $(previewEleStr+' h4.sharePanelTitleContent strong.shareContentTitle').html(shareContentTitle);
            $(previewEleStr+' h4.sharePanelTitleContent span.shareContentType').html(shareContentType);

            if(shareModalType == "status-update") {
                previewEle.children('h2.sharePanelTitleContent').hide();
                previewEle.children('h2.sharePanelTitleStatus').show();
            }
            else {
                previewEle.children('h2.sharePanelTitleContent').show();
                previewEle.children('h2.sharePanelTitleStatus').hide();
            }

            // hide preview sections
            $(previewEleStr+' div.twitter-section').parent().hide();
            $(previewEleStr+' div.facebook-section').parent().hide();
            
            if(serviceTwitter) {
                $(previewEleStr+' div.twitter-section img.avatar').attr('src', twitterUserInfo.pic);
                $(previewEleStr+' div.twitter-section div.preview-text a').attr('href', 'http://www.twitter.com/'+twitterUserInfo.username);
                $(previewEleStr+' div.twitter-section div.preview-text a').html('@'+twitterUserInfo.username);
                $(previewEleStr+' div.twitter-section div.preview-text span.twitter-name').html(twitterUserInfo.name);
                $(previewEleStr+' div.twitter-text p').html(shareUserContent);
                $(previewEleStr+' div.twitter-section').parent().show();
            }
            if(serviceFacebook) {
                $(previewEleStr+' div.facebook-section img.avatar').attr('src', facebookUserInfo.pic_square);
                $(previewEleStr+' div.facebook-section div.preview-text a.share-links').attr('href', facebookUserInfo.url);
                $(previewEleStr+' div.facebook-section div.preview-text a.share-links').html(facebookUserInfo.name);
                $(previewEleStr+' div.facebook-section div.preview-text p').html(shareUserContent);

                $(previewEleStr+' div.facebook-section div.preview-text div.shared-content img.shared-image').attr('src', shareContentPhotoSrc);
                $(previewEleStr+' div.facebook-section div.preview-text div.shared-content div.shared-text a').attr('href', shareContentUrl);
                $(previewEleStr+' div.facebook-section div.preview-text div.shared-content div.shared-text a').html(shareContentName);
                $(previewEleStr+' div.facebook-section div.preview-text div.shared-content div.shared-text span').html(shareContentCaption);
                $(previewEleStr+' div.facebook-section div.preview-text div.shared-content div.shared-text p').html(shareContentDesc);
                $(previewEleStr+' div.facebook-section').parent().show();
            }

            //button handlers <button class="cancelBtn">Cancel</button> <button class="editBtn">Edit</button> <button class="shareBtn">Share</button>
            $(previewEleStr+' div.modal-btn-holder input.cancelBtn').unbind('click');
            $(previewEleStr+' div.modal-btn-holder input.cancelBtn').bind('click', methods.cancelCreateForm);
            $(previewEleStr+' div.modal-btn-holder input.editBtn').unbind('click');
            $(previewEleStr+' div.modal-btn-holder input.editBtn').bind('click', function() { methods["showCreateForm"].apply( this, [false]); });
            $(previewEleStr+' div.modal-btn-holder input.nextBtn').unbind('click');
            $(previewEleStr+' div.modal-btn-holder input.nextBtn').bind('click', methods.doShareAction);

            createEle.hide();
            successEle.hide();
            previewEle.show();
        },
        doShareAction : function() {
            if(shareModalType == "share") {
                var url =  $('input#ShareUserContentUrl').val();

                var shareContentId = null;
                if(shareContentType == 'Walk') {
                    shareContentId = $('input#walkId').val();
                }
                else if(shareContentType == 'Recipe') {
                    shareContentId = $('input#recipeId').val();
                }
                else if(shareContentType == 'Note') {
                    shareContentId = $('input#noteId').val();
                }
                else if(shareContentType == 'Photo') {
                    shareContentId = $('input#umbrellaPhotoId').val();
                }

                var isPrivateContent = true;
                if($('div.profile-content div.profile-left div.privacy-status').hasClass('public')) {
                    var isPrivateContent = false;
                }
                if($('div.profile-content div.profile-left div.privacy-status').hasClass('private')) {
                    var isPrivateContent = true;
                }

                if(shareContentPhotoSrc.length > 0) {
                    var data = ({facebook: serviceFacebook, twitter: serviceTwitter, message: shareUserContent, contentTitle: shareContentTitle, pictureSrc: shareContentPhotoSrc, name: shareContentName, caption: shareContentCaption, description: shareContentDesc, shareType: shareContentType, userContentId: shareContentId, link: encodeURI(shareContentUrl)});
                    if(isPrivateContent)
                        data = ({facebook: serviceFacebook, twitter: serviceTwitter, message: shareUserContent, contentTitle: shareContentTitle, pictureSrc: shareContentPhotoSrc, name: shareContentName, caption: shareContentCaption, description: shareContentDesc, shareType: shareContentType, userContentId: shareContentId, link: encodeURI(shareContentUrl), updatePrivacy: true});
                }
                else {
                    var data = ({facebook: serviceFacebook, twitter: serviceTwitter, message: shareUserContent, contentTitle: shareContentTitle, name: shareContentName, caption: shareContentCaption, description: shareContentDesc, shareType: shareContentType, userContentId: shareContentId, link: encodeURI(shareContentUrl)});
                    if(isPrivateContent)
                        data = ({facebook: serviceFacebook, twitter: serviceTwitter, message: shareUserContent, contentTitle: shareContentTitle, name: shareContentName, caption: shareContentCaption, description: shareContentDesc, shareType: shareContentType, userContentId: shareContentId, link: encodeURI(shareContentUrl), updatePrivacy: true});
                }

                $.ajax({
                    url: url,
                    data: data,
                    success: function() {
                        methods["showSuccessForm"].apply( this, []);
                    }
                });
            }
            else if(shareModalType == "status-update") {
                var url =  $('input#UpdateUserStatusUrl').val();
                $.ajax({
                    url: url,
                    data: ({facebook: serviceFacebook, twitter: serviceTwitter, message: shareUserContent}),
                    success: function(data) {
                        methods["showSuccessForm"].apply( this, []);
                    }
                });
            }
        },
        showSuccessForm : function() {
            $(successEleStr+' h4.sharePanelTitleContent strong.shareContentTitle').html(shareContentTitle);
            $(successEleStr+' h4.sharePanelTitleContent span.shareContentType').html(shareContentType);

            if(shareModalType == "status-update") {
                $(successEleStr+' h4.sharePanelTitleContent').hide();
                $(successEleStr+' h4.sharePanelTitleStatus').show();
            }
            else {
                $(successEleStr+' h4.sharePanelTitleContent').show();
                $(successEleStr+' h4.sharePanelTitleStatus').hide();
            }

            if(serviceFacebook || serviceTwitter) {
                $(successEleStr+' div.modal-body div.success-message p').show();
            }
            else {
            	$(successEleStr+' div.modal-body div.success-message p').hide();
            }

            if(serviceFacebook) {
                $(successEleStr+' div.modal-body div.success-message p a.facebookProfileLink').attr('href', facebookUserInfo.url);
                $(successEleStr+' div.modal-body div.success-message p a.facebookProfileLink').show();
            }
            if(serviceTwitter) {
                $(successEleStr+' div.modal-body div.success-message p a.twitterProfileLink').attr('href', 'http://www.twitter.com/'+twitterUserInfo.username);
                $(successEleStr+' div.modal-body div.success-message p a.twitterProfileLink').show();
            }

            if(serviceTwitter && serviceFacebook) {
                $(successEleStr+' div.modal-body div.success-message p span.facebookLinkSpacer').show();
            }

            $(successEleStr+' div.modal-btn-holder input.doneBtn').unbind('click');
            $(successEleStr+' div.modal-btn-holder input.doneBtn').bind('click', methods.hideCreateForm);

            createEle.hide();
            previewEle.hide();
            successEle.show();
        },
        hideCreateForm : function () {
            if(!isDebugModeOn)
                window.location.reload();

            createEle.hide();
            previewEle.hide();
            successEle.hide();
            $.unblockUI();
        },
        cancelCreateForm : function () {
            createEle.hide();
            previewEle.hide();
            successEle.hide();
            $.unblockUI();
        }
    };

    $.fn.share = function( method ) {
        if ( methods[method] ) {
            return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        } else {
            $.error( 'Method ' +  method + ' does not exist on jQuery.share' );
        }
    };

})( jQuery );
