﻿/// <reference path="jQuery/jquery-1.3.2.min-vsdoc.js" />

//
// Helper object for external portal security mechanism.
//
var SecurityHelper = function() {

    var that = {};

    //
    // Private fields:
    //

    var params = { // Defaults:
        SessionId: null,
        SessionIdKey: null,
        RssHandlerName: null
    };

    //
    // Private methods:
    //

    var isPostbackLink = function(linkUrl) {

        var firstMatchObj = linkUrl.match('^' + 'javascript');
        var firstMatch = firstMatchObj !== null && firstMatchObj[0] === 'javascript';

        var secondMatchObj = linkUrl.match('\/' + '$');
        var secondMatch = secondMatchObj !== null && secondMatchObj[0] === '\/';

        return firstMatch || secondMatch;
    }

    var isExternalLink = function(linkUrl) {
        var host = window.location.hostname.toLowerCase();
        return linkUrl.indexOf(host) === -1;
    }

    var linkOpensInSameTab = function(linkElement) {
        var target = linkElement.attr('target');
        return target === null || target === '';
    }

    var isRssLink = function(linkUrl) {
        var rssHandlerName = params.RssHandlerName.toLowerCase();
        return linkUrl.indexOf(rssHandlerName) !== -1
    }

    var userLoggedIn = function() {
        return params.SessionId && params.SessionId !== '';
    }

    var sessionIdAlreadyAttached = function(linkUrl) {
        var fragment = params.SessionIdKey + '=' + params.SessionId;
        return linkUrl.indexOf(fragment.toLowerCase()) !== -1;
    }

    var attachSessionId = function(linkUrl, linkElement) {
        var separator = linkUrl.indexOf('?') === -1 ? '?' : '&';
        var sessionIdSuffix = separator + params.SessionIdKey + '=' + params.SessionId;
        linkElement.attr('href', linkElement.attr('href') + sessionIdSuffix);
    }

    var changeToOpenInNewTab = function(linkElement) {
        linkElement.attr('target', '_blank');
    }

    var checkLink = function() {

        var linkElement = $(this);
        var linkUrl = this.href.toLowerCase();

        if (!isPostbackLink(linkUrl)) {

            if (isExternalLink(linkUrl)) {

                var inFrame = top !== self;

                if (linkOpensInSameTab(linkElement) && inFrame) {
                    changeToOpenInNewTab(linkElement);
                }
            }
            else {
                if (userLoggedIn() && !isRssLink(linkUrl) && !sessionIdAlreadyAttached(linkUrl)) {
                    attachSessionId(linkUrl, linkElement);
                }
            }

        }
    };

    // Checks all links in html, if they need to be changed to support security mechanism
    var checkAllLinks = function() {
        $("a[href]").each(checkLink);
    };

    var attachHandlers = function() {

        // All links need to be checked on jQuery ready...
        $(function() {
            checkAllLinks();
        });

        // ... and on asp.net ajax postback end request:

        if (Sys.WebForms) {
            var prm = Sys.WebForms.PageRequestManager.getInstance();

            prm.add_endRequest(function() {
                checkAllLinks();
            });
        }
    };

    //
    // Public methods:
    //

    // Initializes helper object with parameters:
    that.Init = function(parameters) {
        params = parameters;

        $(function() {
            attachHandlers();
        });
    };

    return that;

} ();




