﻿function onAuthStatusChange(sessionInfo) {
    if (sessionInfo.session) {
        jQuery(".fbAuthenticated").css("display", "inline");
        jQuery(".fbUnauthenticated").css("display", "none");

        if (typeof AfterFacebookInit == 'function')
            AfterFacebookInit(sessionInfo.session.access_token);
    }
    else {
        jQuery(".fbAuthenticated").css("display", "none");
        jQuery(".fbUnauthenticated").css("display", "inline");
    }
}

function repositionFooter() {
    var documentHeight = jQuery(document).height();
    var windowHeight = jQuery(window).height();

    if (documentHeight > (windowHeight + 5)) {
        jQuery(".footer_links").css("bottom", "");
        jQuery(".footer_links").css("top", (documentHeight + "px"));
    }
    else {
        jQuery(".footer_links").css("top", "");
        jQuery(".footer_links").css("bottom", "3px");
    }
}

function VerifyPerms(permsArray, callback) {
    if (jQuery.browser.webkit) {
        PromptForPerms(permsArray, function (granted) {
            if (callback) { callback(granted); }
            else if (granted) { window.location.reload(); }
        });

        return;
    }
    
    var prompted = false;
    var numLeftToVerify = permsArray.length;
    for (var p = 0; p < permsArray.length; p++) {
        FB.api({ method: "users.hasAppPermission", ext_perm: permsArray[p]}, function (hasPermission) {
            if (!prompted && hasPermission == 0) {
                prompted = true;
                PromptForPerms(permsArray, function (granted) {
                    if (callback) { callback(granted); }
                    else if (granted) { window.location.reload(); }
                });
            }
            if (hasPermission == 1) {
                --numLeftToVerify;

                if (numLeftToVerify == 0 && callback)
                    callback(true);
            }
        });
    }
}

function CheckPerms(permsArray, callback) {
    var numLeftToVerify = permsArray.length;
    for (var p = 0; p < permsArray.length; p++) {
        FB.api({ method: "users.hasAppPermission", ext_perm: permsArray[p] }, function (hasPermission) {
            if (hasPermission == 0) {
                callback(false);
            }
            if (hasPermission == 1) {
                --numLeftToVerify;

                if (numLeftToVerify == 0 && callback)
                    callback(true);
            }
        });
    }
}

function BuildPermList(permsArray) {
    var permsList = "";
    for (var i = 0; i < permsArray.length; i++) {
        if (i > 0)
            permsList += ",";

        permsList += permsArray[i];
    }

    return permsList;
}

function PromptForPerms(permsArray, callback) {
    FB.login(function (state) {

        var connected = (state &&
                        state.status == "connected");

        var granted = connected && state.perms;

        if (granted) {
            for (var i = 0; i < permsArray.length; i++) {
                if (state.perms.indexOf(permsArray[i]) < 0)
                    granted = false;
            }
        }

        callback(granted);
    },
        { perms: BuildPermList(permsArray) }
    );
}

function EnsureSessionAndExecute(action) {
    FB.getLoginStatus(function (status) {
        if (status && status.session) {
            action();
            return;
        }
        FB.login(function (state) {
            var connected = (state && state.status == "connected");

            if (!connected) {
                alert("Sorry, you need to sign in to Facebook in order to do that.");
                return;
            }

            action();
        });
    });
}

function EnsureSessionWithPermsAndExecute(action, requiredPermsArray) {
    FB.getLoginStatus(function (status) {
        if (status && status.session) {
            VerifyPerms(requiredPermsArray, action);
            return;
        }
        FB.login(function (state) {
            var connected = (state && state.status == "connected");

            if (!connected) {
                alert("Sorry, you need to sign in to Facebook in order to do that.");
                return;
            }

            action();
        },
        { perms: BuildPermList(requiredPermsArray) }
        );
    });
}

function GetAccessToken(callback) {
    FB.getLoginStatus(function (status) {
        var token = null;
        if (status.session)
            token = status.session.access_token;

        callback(token);
    });
}


function FinishEditing(actionUrl) {
    var postData = {
        __RequestVerificationToken: jQuery('input[name=__RequestVerificationToken]').val()
    };
    
    jQuery.ajax({
        url: actionUrl,
        data: postData,
        type: "POST",
        dataType: "json",
        async: !jQuery.browser.webkit, // webkit doesn't allow async req in unload event handler
        success: function (json) {
            if (json.errorMsg) {
                alert(json.errorMsg);
            }
        },
        error: function (request, textStatus, errorThrown) {
            alert(textStatus);
        }
    });
}

function VerifyPermissionsAndSubmit(form, errorMessage, requiredPerms) {
    var requirePostToProfile = RequiresStreamPermissions(form);

    if (requirePostToProfile) {
        requiredPerms[requiredPerms.length++] = "read_stream";
        requiredPerms[requiredPerms.length++] = "publish_stream";
    }

    VerifyPerms(requiredPerms,
            function (granted) {
                if (!granted) {
                    alert(errorMessage);
                    return;
                }
                form.submit();
            });

    return false;
}

function ResizeWacIframe() {
    var maxDocHeight;
    var docWidth = jQuery(".wac_iframe").width();


    if (docType == "Word" || docType == "OldWord")
        maxDocHeight = 1100;
    else if (docType == "Excel")
        maxDocHeight = 10000;
    else if (docType == "PowerPoint" || docType == "OldPowerPoint")
        maxDocHeight = docWidth;
    else
        maxDocHeight = 1100;

    var offset = jQuery(".wac_iframe").offset();
    var docHeight = jQuery(document).height();
    var windowHeight = jQuery(window).height();
    var verticalPadding = 75;
    var maxAvailableHeight = windowHeight - offset.top - verticalPadding;
    var newHeight = Math.min(maxAvailableHeight, maxDocHeight);

    jQuery(".wac_iframe")[0].style.height = newHeight + "px";
    jQuery(".right_column")[0].style.height = newHeight + "px";
    repositionFooter();
}

function DisableAllElements() {
    jQuery('input[type=submit]').attr('disabled', 'disabled');
    jQuery('input[type=image]').attr('disabled', 'disabled');
    jQuery('input[type=text]').attr('readonly', 'readonly');
    jQuery('textarea').attr('readonly', 'readonly');
    jQuery('a').unbind('click');
    jQuery('a').bind('click', ClickDisabled);
}

function EnableAllElements() {
    jQuery('input[type=submit]').removeAttr('disabled', null);
    jQuery('input[type=image]').removeAttr('disabled', null);
    jQuery('select').removeAttr('disabled', null);
    jQuery('input[type=text]').removeAttr('readonly', null);
    jQuery('textarea').removeAttr('readonly', null);
    jQuery('a').unbind('click', ClickDisabled);
}

function ClickDisabled() {
    return false;
}

function delayLoadPlugin(scriptUrl, pluginName, callback) {
    jQuery.getScript(scriptUrl, function () {
        if (jQuery.fn[pluginName]) {
            callback();
            return;
        }

        var toId = setInterval(function () {
            if (jQuery.fn[pluginName]) {
                clearTimeout(toId);
                callback();
            }
        }, 100);
    });
}

jQuery(document).ready(function () {
    FB.XFBML.parse();
    FB.getLoginStatus(onAuthStatusChange);
    FB.Event.subscribe('auth.statusChange', onAuthStatusChange);

    jQuery("a.logout_link").click(function () {
        FB.logout(function () {
            window.location = "/Main/SignOut";
        });
        return false;
    });

    jQuery("a.facebookLogin").click(function () {
        FB.login();
        return false;
    });

    jQuery("input.button_commit_upload").click(function () {
        if ($('form#uploadDocForm').valid()) {
            jQuery("#uploadDocForm").loading();
            VerifyPermissionsAndSubmit(jQuery(this).parents('form'), "Sorry, you must grant access to the requested Facebook permissions in order to create this template.", ["publish_stream", "read_stream", "manage_pages"]);
        }
    });

    jQuery("a.reqSession").click(function () {
        var link = jQuery(this).attr("href");
        EnsureSessionAndExecute(function () {
            window.location = link;
        });

        return false;
    });

    if (jQuery.loading) {
        jQuery.loading.align = "center";
        jQuery.loading.mask = true;
        jQuery.loading.pulse = false
        jQuery.loading.img = "/Content/progress.gif";
    }

    jQuery('a.submitLink').click(function (e) {
        var form = jQuery(this).parents('form');

        EnsureSessionAndExecute(function (e) {
            form.submit();
            jQuery(".add_doc_menu_frame").loading();

            if (e)
                e.preventDefault();
        });

        return false;
    });

    jQuery('.createTemplate').click(function (e) {
        var requiredPerms;

        if (RequiredPermissions)
            requiredPerms = RequiredPermissions;
        else
            requiredPerms = new Array();

        jQuery("#createTemplateForm").loading();
        VerifyPermissionsAndSubmit(jQuery(this).parents('form'), "Sorry, you must grant access to the requested Facebook permissions in order to create this template.", requiredPerms);
        return false;
    });

    jQuery(window).resize(function () { repositionFooter(); });

    jQuery("#addDocLink").click(function (e) {
        if (jQuery(".add_doc_menu_frame").css("display") == "none")
            jQuery(".add_doc_menu_frame").css("display", "block");
        else
            jQuery(".add_doc_menu_frame").css("display", "none");

        if (jQuery(".add_doc_menu_frame_FB").css("display") == "none")
            jQuery(".add_doc_menu_frame_FB").css("display", "block");
        else
            jQuery(".add_doc_menu_frame_FB").css("display", "none");

        if (e) {
            e.preventDefault();
            e.stopPropagation();
        }
        return false;
    });

    jQuery("body").click(function () {
        jQuery(".add_doc_menu_frame").css("display", "none");
        jQuery(".add_doc_menu_frame_FB").css("display", "none");
    });

    delayLoadPlugin(prettyDateUrl, "prettyDate", function () {
        jQuery('.timestamp').prettyDate();
        jQuery('.localtimestamp').prettyDateLocal();
        setInterval(function () { jQuery('.timestamp').prettyDate(); }, 15000);
        setInterval(function () { jQuery('.localtimestamp').prettyDateLocal(); }, 15000);
    });

    jQuery('a#listViewLink').click(function () {
        jQuery('#ThumbsView').css("display", "none");
        jQuery('#ListView').css("display", "inline-block");
        jQuery('a.nextLink').attr("href", nextLinkListView);
        jQuery('a.prevLink').attr("href", prevLinkListView);
        jQuery('#thumbViewLink').attr("class", "");
        jQuery('#listViewLink').attr("class", "disabled");
        return false;
    });

    jQuery('a#thumbViewLink').click(function () {
        jQuery('#ListView').css("display", "none");
        jQuery('#ThumbsView').css("display", "inline-block");
        jQuery('a.nextLink').attr("href", nextLinkThumbView);
        jQuery('a.prevLink').attr("href", prevLinkThumbView);
        jQuery('#thumbViewLink').attr("class", "disabled");
        jQuery('#listViewLink').attr("class", "");
        return false;
    });

    // Prevent form double-submission
    jQuery('form').submit(function () {
        if (formSubmitted) {
            return false;
        }
        DisableAllElements();
        formSubmitted = true;
    });

    EnableAllElements();

    jQuery(".wac_iframe").each(function () { ResizeWacIframe(); });
    repositionFooter();
});

var formSubmitted = false;


jQuery(window).resize(function () {
    jQuery(".wac_iframe").each(function () { ResizeWacIframe(); });
});

jQuery.cookie = function (name, value, options) {
    if (typeof value != 'undefined') { 
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); 
        }

        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else {
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
               
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};

function UnbindImageOnError(className) {
    jQuery(className).error(function () {
        jQuery(this).attr('src', '/Content/fb_silhouette.png');
    });
}

function WordWrap(str, width) {
    var stringWords = str.split(' ');
    for (var i = 0; i < stringWords.length; i++) {
        if (stringWords[i].length > width) {
//            stringWords[i] = stringWords[i].split('').join('&#8203;');
            stringWords[i] = stringWords[i].substr(0, width) + "-<br />\n" + stringWords[i].substr(width, stringWords[i].length - 1);
        }
    }
    return stringWords.join(' ');
}
