var PremiumContentPrototype = new Object();

PremiumContentPrototype.PremiumContent = function(jsonSettings, jsonSubscriptionDefs, articleId) {
    this.settings = JSON.parse(jsonSettings);
    this.subscriptionDefs = JSON.parse(jsonSubscriptionDefs);
    this.articleId = articleId;
    this.waiting = false;
    this.buttonsEnabled = true;
    this.userInfo = null;
    this.time = null;
    this.mode = "articlepage";
}

PremiumContentPrototype.PremiumContent.prototype = {
    showBox: function(mode) {
        this.mode = mode;
        this.updateUserInfo();

        $("#cp-box").append('<div id="cp-box-content"></div>');
        this.updateBox();
    },
    updateBox: function() {
        $("#cp-box-content").empty();

        $("#cp-box-content").append('<div id="cp-message-box"></div>');

        var messageInfo = $.cookies.get(this.settings.messageCookieName);
        var username = "";
        var disableBuyButtons = false;

        if (messageInfo != null) {

            if (messageInfo.username != undefined) {
                username = messageInfo.username;
                disableBuyButtons = true;
            }

            if (messageInfo.message != undefined) {
                this.setMessage(messageInfo.title, messageInfo.message);
            }

            var cookieOptions = {
                domain: this.settings.cookieDomain,
                path: "/"
            };
            $.cookies.del(this.settings.messageCookieName, cookieOptions);
        }

        if (this.isLoggedIn()) {

            var bundleSubscriptions = this.getValidBundleBasedSubscriptions();
            var timeBasedSubscriptions = this.getValidTimeBasedSubscriptions();

            if (this.mode == 'articlepage') {
                if (bundleSubscriptions.length > 0) {
                    $("#cp-box-content").append('<h3>Read This Article</h3>');

                    this.renderAccessOptions("Use your article bundle subscription:", bundleSubscriptions);
                }
            } else {

                var validSubscriptions = this.getValidSubscriptions();

                if (validSubscriptions.length > 0) {
                    $("#cp-box-content").append('<h3>Your Subscriptions</h3>');

                    this.renderCurrentOptions("Your current subscriptions:", validSubscriptions);
                }
            }

            var expiredSubscriptions = this.getExpiredSubscriptions();
            if (expiredSubscriptions.length > 0) {
                this.renderRenewOptions("Renew your subscription:", expiredSubscriptions);
            }

            var remainingSubscriptionDefs = new Array();

            for (var i = 0; i < this.subscriptionDefs.length; i++) {
                var found = false;

                for (var j = 0; j < bundleSubscriptions.length; j++) {
                    if (bundleSubscriptions[j].code == this.subscriptionDefs[i].code) found = true;
                }

                for (var j = 0; j < timeBasedSubscriptions.length; j++) {
                    if (timeBasedSubscriptions[j].code == this.subscriptionDefs[i].code) found = true;
                }

                for (var j = 0; j < expiredSubscriptions.length; j++) {
                    if (expiredSubscriptions[j].code == this.subscriptionDefs[i].code) found = true;
                }

                if (!found) {
                    remainingSubscriptionDefs.push(this.subscriptionDefs[i]);
                }
            }

            if (remainingSubscriptionDefs.length > 0) {
                $("#cp-box-content").append('<h3>Purchase</h3>');

                this.renderBuyNowOptions("Articles:", remainingSubscriptionDefs, 100, 199);
                this.renderBuyNowOptions("Subscriptions:", remainingSubscriptionDefs, 200, 299);
                this.renderBuyNowOptions("All:", remainingSubscriptionDefs, 300, 399);
            }

        } else {
            $("#cp-box-content").append('<h3>Login</h3>');
            $("#cp-box-content").append('<p>Login to use your current subscription</p>' +
                                           '<form class="sep" method="post" action="./">' +
                                           '<p><label id="cp-l-email" for="cp-f-email">E-mail address</label><input type="text" id="cp-f-email" value="' + username + '"/></p>' +
                                           '<p><label id="cp-l-password" for="cp-f-password">Password</label><input type="password" id="cp-f-password"/></p>' +
                                           '<p class="submit"><button id="cp-b-login" type="button">Login</button> <a href="http://' + this.settings.registrationHost+ '/forgottenpassword">Forgot Password</a></p>' +
                                           '</form>');
            $("#cp-b-login").bind("click", {sourceObject: this}, function(eventObject) {
                eventObject.data.sourceObject.login();
            });

            $("#cp-box-content").append('<h3>Purchase</h3>');

            this.renderBuyNowOptions("Articles:", this.subscriptionDefs, 100, 199);
            this.renderBuyNowOptions("Subscriptions:", this.subscriptionDefs, 200, 299);
            this.renderBuyNowOptions("All:", this.subscriptionDefs, 300, 399);

            if (this.mode == "articlepage") {
                if (username != "") {
                    $("#cp-f-password").focus();
                } else {
                    $("#cp-f-email").focus();
                }
            }
        }

        if (this.mode == "articlepage") {
            var more = '<p class="more">';
            if (this.settings.linkCustomerService != null) more += '<a href="' + this.settings.linkCustomerService + '" rel="fancyframe" class="w-700 h-500">Customer Service</a>';
            if (this.settings.linkFaq != null) {
                if (this.settings.linkCustomerService != null) more += ' | ';
                more += '<a href="' + this.settings.linkFaq + '">Frequently Asked Questions</a>';
            }
            more += "</p>";
            $("#cp-box-content").append(more);
        }

        if (this.settings.linkAllRegionals != null) {
            $(".cp-allregionals").wrapInner('<a class="regular w-700 h-500" href="' + this.settings.linkAllRegionals + '" rel="fancyframe"></a>');
        }
        
        if (disableBuyButtons) {
            this.disableButtons();
        }

    },
    initOverlay: function() {
        this.mode = "overlay";
        this.updateUserInfo();

        var context = this;

        if ($.getUrlVar("login") != null) {
            $("#cp-box").append('<div id="cp-box-content"></div>');
            this.updateOverlay();
            $("#paywallLink").fancybox({
                type: "inline",
                showCloseButton: true,
                margin: 0,
                padding: 0,
                overlayColor: "#000000",
                overlayOpacity: 0.75,
                hideOnOverlayClick: false,
                onClosed: function() {
                    context.onOverlayClosed();
                }
            });

            $(document).ready(function () {
                $('a[rel=paywallframe]').each(function(){
                    var width 	= 430;
                    var height 	= 400;
                    var classes = $(this).attr('class');

                    var widths = classes.match(/w\-(\d+)/);
                    var heights = classes.match(/h\-(\d+)/);

                    if(widths[1] != null) width = parseInt(widths[1]);
                    if(heights[1] != null) height = parseInt(heights[1]);

                    var deferClose = true;

                    $(this).fancybox({
                        type: "iframe",
                        showNavArrows: false,
                        width: width,
                        height: height,
                        showCloseButton: true,
                        margin: 0,
                        padding: 0,
                        overlayColor: "#000000",
                        overlayOpacity: 0.75,
                        hideOnOverlayClick: false,
                        onCleanup: function() {
                            if (deferClose) {
                                deferClose = false;
                                setTimeout(function() {
                                    $("#paywallLink").trigger("click");
                                }, 100);
                                return false;
                            }
                        },
                        onComplete: function() {
                            deferClose = true;
                        }
                    });

                    $("#paywallLink").trigger("click");
                });
            });
        }
    },
    updateOverlay: function() {
        $("#cp-box-content").empty();

        var loginStr = "Login or purchase";
        if (this.isLoggedIn()) loginStr = "Purchase";

        $("#cp-box-content").append('<div class="cp-header-a sep">' +
                '<div class="cp-header-logo-' + this.settings.publicationCode + '"></div>' +
                '<h3>Welcome to ' + this.settings.publicationName + ' website.</h3>' +
                '<h4>Available exclusively by subscription</h4>' +
                '<p>' + loginStr + ' access to our exclusive content below</p>' +
                '</div>');

        $("#cp-box-content").append('<div id="cp-message-box"></div>');

        var messageInfo = $.cookies.get(this.settings.messageCookieName);
        var username = "";
        var disableBuyButtons = false;

        if (messageInfo != null) {

            if (messageInfo.username != undefined) {
                username = messageInfo.username;
                disableBuyButtons = true;
            }

            if (messageInfo.message != undefined) {
                this.setMessage(messageInfo.title, messageInfo.message);
            }

            var cookieOptions = {
                domain: this.settings.cookieDomain,
                path: "/"
            };
            $.cookies.del(this.settings.messageCookieName, cookieOptions);
        }

        if (this.isLoggedIn()) {

            var expiredSubscriptions = this.getExpiredSubscriptions();
            if (expiredSubscriptions.length > 0) {
                this.renderRenewOptions("Renew your subscription:", expiredSubscriptions);
            }

            var remainingSubscriptionDefs = new Array();

            for (var i = 0; i < this.subscriptionDefs.length; i++) {
                var found = false;

                for (var j = 0; j < expiredSubscriptions.length; j++) {
                    if (expiredSubscriptions[j].code == this.subscriptionDefs[i].code) found = true;
                }

                if (!found) {
                    remainingSubscriptionDefs.push(this.subscriptionDefs[i]);
                }
            }

            if (remainingSubscriptionDefs.length > 0) {
                $("#cp-box-content").append('<h3>Purchase</h3>');

                this.renderBuyNowOptions("Subscriptions:", remainingSubscriptionDefs, 200, 299);
                this.renderBuyNowOptions("All:", remainingSubscriptionDefs, 300, 399);
            }

        } else {
            $("#cp-box-content").append('<h3>Login</h3>');
            $("#cp-box-content").append('<p>Login to use your current subscription</p>' +
                                           '<form class="sep" method="post" action="./">' +
                                           '<p><label id="cp-l-email" for="cp-f-email">E-mail address</label><input type="text" id="cp-f-email" value="' + username + '"/></p>' +
                                           '<p><label id="cp-l-password" for="cp-f-password">Password</label><input type="password" id="cp-f-password"/></p>' +
                                           '<p class="submit"><button id="cp-b-login" type="button">Login</button> <a href="http://' + this.settings.registrationHost+ '/forgottenpassword">Forgot Password</a></p>' +
                                           '</form>');
            $("#cp-b-login").bind("click", {sourceObject: this}, function(eventObject) {
                eventObject.data.sourceObject.login();
            });

            $("#cp-box-content").append('<h3>Purchase</h3>');

            this.renderBuyNowOptions("Subscriptions:", this.subscriptionDefs, 200, 299);
            this.renderBuyNowOptions("All:", this.subscriptionDefs, 300, 399);

            if (this.mode == "articlepage") {
                if (username != "") {
                    $("#cp-f-password").focus();
                } else {
                    $("#cp-f-email").focus();
                }
            }
        }

        var more = '<p class="more">';
        if (this.settings.linkCustomerService != null) more += '<a href="' + this.settings.linkCustomerService + '" rel="paywallframe" class="w-700 h-500">Customer Service</a>';
        if (this.settings.linkFaq != null) {
            if (this.settings.linkCustomerService != null) more += ' | ';
            more += '<a href="' + this.settings.linkFaq + '">Frequently Asked Questions</a>';
        }
        more += "</p>";
        $("#cp-box-content").append(more);

        if (this.settings.linkAllRegionals != null) {
            $(".cp-allregionals").wrapInner('<a class="regular w-700 h-500" href="' + this.settings.linkAllRegionals + '" rel="paywallframe"></a>');
        }

        if (disableBuyButtons) {
            this.disableButtons();
        }

    },
    onOverlayClosed: function() {
        location.replace(this.getBaseLocation() + "?otoa");
    },
    renderAccessOptions: function(caption, bundleSubscriptions) {
        if (bundleSubscriptions.length > 0) {
            $("#cp-box-content").append("<p>" + caption + "</p>");

            var optionsList = '<ul class="options sep">';

            for (var i = 0; i < bundleSubscriptions.length; i++) {
                var subscription = bundleSubscriptions[i];
                var subscriptionNumber = subscription.id;
                var subscriptionName = subscription.name;
                var remainingArticles = subscription.remainingArticles;

                optionsList += '<li><strong>' + subscriptionName + '</strong><span>=</span><em class="xl">' + remainingArticles + ' remaining</em>';
                if (this.mode == 'articlepage') {
                    optionsList += '<a href="" id="cp-b-use-' + i + '">Access</a>';
                }
                optionsList += '</li>';
            }

            optionsList += "</ul>";

            $("#cp-box-content").append(optionsList);

            if (this.mode == 'articlepage') {
                for (var i = 0; i < bundleSubscriptions.length; i++) {
                    var subscription = bundleSubscriptions[i];

                    $("#cp-b-use-" + i).bind("click", {sourceObject: this, subscriptionNumber: subscription.id}, function(eventObject) {
                        eventObject.data.sourceObject.readnow(eventObject.data.subscriptionNumber);
                        return false;
                    });
                }
            }
        }
    },
    renderCurrentOptions: function(caption, currentSubscriptions) {
        if (currentSubscriptions.length > 0) {
            $("#cp-box-content").append("<p>" + caption + "</p>");

            var optionsList = '<ul class="options sep">';

            for (var i = 0; i < currentSubscriptions.length; i++) {
                var subscription = currentSubscriptions[i];
                var subscriptionName = subscription.name;
                var remainingArticles = subscription.remainingArticles;
                var validUntil = subscription.validUntil;

                optionsList += '<li><strong>' + subscriptionName + '</strong><span>=</span>';
                if (remainingArticles != null) {
                    optionsList += '<em class="xl">' + remainingArticles + ' remaining</em>';
                } else {
                    optionsList += '<em class="xl">' + this.formatDate(validUntil) + '</em>';
                }
                optionsList += '</li>';
            }

            optionsList += "</ul>";

            $("#cp-box-content").append(optionsList);
        }
    },
    renderRenewOptions: function(caption, expiredSubscriptions) {
        if (expiredSubscriptions.length > 0) {

            var optionsList = '<ul class="options sep">';

            var expiredSubscriptionDefs = new Array();
            for (var i = 0; i < expiredSubscriptions.length; i++) {
                var subscription = expiredSubscriptions[i];
                var subscriptionName = subscription.name;
                var subscriptionPrice = "";

                var expireSubscriptionDefFound = false;

                for (var j = 0; j < expiredSubscriptionDefs.length; j++) {
                    var expiredSubscriptionDef = expiredSubscriptionDefs[j];
                    if (subscription.code == expiredSubscriptionDef.code) {
                        expireSubscriptionDefFound = true;
                    }
                }

                if (!expireSubscriptionDefFound) {
                    for (var j = 0; j < this.subscriptionDefs.length; j++) {
                        var subscriptionDef = this.subscriptionDefs[j];
                        if (subscription.code == subscriptionDef.code) {
                            subscriptionName = subscriptionDef.name;
                            subscriptionPrice = subscriptionDef.price;
                            expiredSubscriptionDefs.push(subscriptionDef);
                            expireSubscriptionDefFound = true;
                        }
                    }

                    if (expireSubscriptionDefFound) {
                        optionsList += '<li><strong>' + subscriptionName + '</strong><span>=</span><em>' + subscriptionPrice + '</em><a href="" id="cp-b-renew-' + i + '">Renew</a></li>';
                    }
                }
            }

            optionsList += "</ul>";

            if (expiredSubscriptionDefs.length > 0) {
                if (this.mode == 'articlepage') {
                    $("#cp-box-content").append('<h3>' + caption + '</h3>');
                }

                $("#cp-box-content").append("<p>" + caption + "</p>");
                $("#cp-box-content").append(optionsList);

                for (var i = 0; i < expiredSubscriptions.length; i++) {
                    var subscription = expiredSubscriptions[i];

                    $("#cp-b-renew-" + i).bind("click", {sourceObject: this, subscriptionCode: subscription.code}, function(eventObject) {
                        eventObject.data.sourceObject.buynow(eventObject.data.subscriptionCode);
                        return false;
                    });
                }
            }

        }
    },
    renderBuyNowOptions: function(caption, subscriptionDefs, minSortOrder, maxSortOrder) {
        var subscriptionDefsFound = false;

        var optionsList = '<ul class="options">';
        for (var i = 0; i < subscriptionDefs.length; i++) {
            var subscriptionDef = subscriptionDefs[i];
            if ((subscriptionDef.sortOrder >= minSortOrder) && (subscriptionDef.sortOrder <= maxSortOrder)) {
                if ((this.mode == "articlepage") || (subscriptionDef.articleBundle == null) || (subscriptionDef.articleBundle > 1)) {
                    optionsList += '<li><strong>' + subscriptionDef.name + '</strong><span>=</span><em>' + subscriptionDef.price + '</em>';
                    optionsList += '<a href="" id="cp-b-buynow-' + i + '" class="cp-b-buynow">Buy Now</a>';
                    optionsList += '</li>';
                    subscriptionDefsFound = true;
                }
            }
        }
        optionsList += '</ul>';

        if (subscriptionDefsFound) {
            $("#cp-box-content").append("<p>" + caption + "</p>");
            $("#cp-box-content").append(optionsList);

            for (var i = 0; i < subscriptionDefs.length; i++) {
                var subscriptionDef = subscriptionDefs[i];
                if ((subscriptionDef.sortOrder >= minSortOrder) && (subscriptionDef.sortOrder <= maxSortOrder)) {
                    if ((this.mode == "articlepage") || (subscriptionDef.articleBundle == null) || (subscriptionDef.articleBundle > 1)) {
                        $("#cp-b-buynow-" + i).bind("click", {sourceObject: this, subscriptionCode: subscriptionDef.code}, function(eventObject) {
                            eventObject.data.sourceObject.buynow(eventObject.data.subscriptionCode);
                            return false;
                        });
                    }
                }
            }
        }
    },
    login: function() {
        if (!this.waiting) {

            $("#cp-l-email").css("color", null);
            $("#cp-l-password").css("color", null);

            var username = $("#cp-f-email").val();
            var password = $("#cp-f-password").val();
            var valid = true;

            if (username == "") {
                $("#cp-l-email").css("color", "#bb2222");
                valid = false;
            }

            if (password == "") {
                $("#cp-l-password").css("color", "#bb2222");
                valid = false;
            }

            if (!valid) {
                this.clearMessage();
                this.setMessage("E-mail or Password Missing", "Your e-mail address or password is missing. Check your e-mail address and password are correct.");
                return;
            }

            this.startWait();
            
            var hashedPassword = $.md5(password);

            $.ajax({url: this.settings.publicationUrl + this.settings.prefix + "/api/login",
                    context: this,
                    dataType: "json",
                    success: function(data, status) {
                        if (data.loggedIn) {

                            this.context.updateUserInfo();
                            if (this.context.userInfo == null) {
                                location.replace(this.context.getCurrentLocation());

                            } else {
                                if (this.context.hasValidTimeBasedSubscriptions()) {
                                    var redirectUrl = this.context.getCurrentLocation();

                                    if (this.context.mode == "overlay") {
                                        var url = $.getUrlVar("url");

                                        if (url != null) {
                                            redirectUrl = url;
                                        }
                                    }
                                    location.replace(redirectUrl);

                                } else if (data.currentArticleAccess) {
                                    var redirectUrl = this.context.getCurrentLocation();

                                    if (this.context.mode == "overlay") {
                                        var url = $.getUrlVar("url");

                                        if (url != null) {
                                            redirectUrl = url;
                                        }
                                    }
                                    location.replace(redirectUrl);

                                } else {

                                    if (this.context.mode == "overlay") {
                                        this.context.updateOverlay();
                                    } else {
                                        this.context.updateBox();
                                    }

                                    if (!this.context.hasValidBundleBasedSubscriptions()) {
                                        if (this.context.hasExpiredSubscriptions()) {
                                            this.context.setMessage("Subscription Expired", "Your subscription has expired. Please renew or buy an alternative subscription below.");
                                        } else {
                                            this.context.setMessage("No Subscription", "You do not have a subscription. Please buy a subscription below.");
                                        }
                                    }

                                    this.context.endWait();
                                    this.context.enableButtons();
                                    this.context.updateMemberLogin();
                                }
                            }

                        } else {
                            $("#cp-f-password").val("");
                            this.context.clearMessage();
                            this.context.setMessage("Login Error", data.message);
                            this.context.endWait();
                        }
                    },
                    error: function(xhr, status, exception) {
                        $("#cp-f-password").val("");
                        this.context.clearMessage();
                        this.context.setMessage("Login Error", "Cannot check login credentials. Please try again later.");
                        this.context.endWait();
                    },
                    data: {username: username,
                           hashedPassword: hashedPassword,
                           articleId: this.articleId
                    }
            });
        }
    },
    buynow: function(subscriptionCode) {
        if (!this.waiting && this.buttonsEnabled) {
            this.startWait();

            var redirectUrl = this.settings.publicationUrl + this.settings.prefix + "/api/buynow" +
                              "?subscriptionCode=" + encodeURI(subscriptionCode);

            if (this.mode == "overlay") {
                var url = $.getUrlVar("url");
                if (url != null) url = url;
                else url = this.getCurrentLocation();
                redirectUrl += "&contentUrl=" + encodeURI(url);
            } else {
                redirectUrl += "&contentUrl=" + encodeURI(this.getCurrentLocation());
            }

            if (this.articleId != null) {
                redirectUrl += "&articleId=" + this.articleId;
            }

            location.href = redirectUrl;
        }
    },
    readnow: function(subscriptionNumber) {
        if (!this.waiting && this.buttonsEnabled) {
            this.startWait();

            var redirectUrl = this.settings.publicationUrl + this.settings.prefix + "/api/readnow" +
                              "?subscriptionNumber=" + encodeURI(subscriptionNumber) +
                              "&contentUrl=" + encodeURI(this.getCurrentLocation()) +
                              "&articleId=" + this.articleId;
            location.href = redirectUrl;
        }
    },
    setMessage: function(title, message) {
        this.clearMessage();

        if ((title != undefined) || (message != undefined)) {
            if (title == undefined) title = "";
            if (message == undefined) message = "";
            $("#cp-message-box").append('<div id="#cp-message"><h3>' + title + '</h3><p>' + message + '</p></div>');
        }
    },
    clearMessage: function() {
        $("#cp-message-box").empty();
    },
    startWait: function() {
        this.waiting = true;
        $("#cp-box-content").fadeTo(200, 0.33);
    },
    endWait: function() {
        this.waiting = false;
        $("#cp-box-content").fadeTo(200, 1);
    },
    disableButtons: function() {
        this.buttonsEnabled = false;
        $(".cp-b-buynow").fadeTo(200, 0.33);
    },
    enableButtons: function() {
        this.buttonsEnabled = true;
        $(".cp-b-buynow").fadeTo(200, 1);
    },
    updateUserInfo: function() {
        this.userInfo = null;

        var userInfoContainer = $.cookies.get(this.settings.cookieName);
        if (userInfoContainer != undefined) {
            this.userInfo = userInfoContainer.userInfo;
        }

        this.time = null;

        var timeCookie = $.cookies.get(this.settings.timeCookieName);
        if (timeCookie != undefined) {
            this.time = timeCookie.time;
        }

        if (this.time == null) {
            var now = new Date();
            this.time = now.getUTCFullYear();
            this.time += (now.getUTCMonth() + 1).toString().padLeft(2, "0");
            this.time += now.getUTCDay().toString().padLeft(2, "0");
            this.time += now.getUTCHours().toString().padLeft(2, "0");
            this.time += now.getUTCMinutes().toString().padLeft(2, "0");
            this.time += now.getUTCSeconds().toString().padLeft(2, "0");
        }
    },
    getTimeBasedSubscriptions: function() {
        var timeBasedSubscriptions = new Array();

        var subscriptions = this.userInfo.subscriptions;
        if (subscriptions != null) {
            for (var i = 0; i < subscriptions.length; i++) {
                var subscription = subscriptions[i];
                var totalArticles = subscription.totalArticles;

                if (totalArticles == null) timeBasedSubscriptions.push(subscription);
            }
        }

        return timeBasedSubscriptions;
    },
    getValidTimeBasedSubscriptions: function() {
        var validTimeBasedSubscriptions = new Array();

        var timeBasedSubscriptions = this.getTimeBasedSubscriptions();
        for (var i = 0; i < timeBasedSubscriptions.length; i++) {
            var subscription = timeBasedSubscriptions[i];
            if ((subscription.validFrom == null) || (subscription.validFrom < this.time)) {
                if ((subscription.validUntil == null) || (subscription.validUntil > this.time)) {
                    validTimeBasedSubscriptions.push(subscription);
                }
            }
        }

        return validTimeBasedSubscriptions;

    },
    getBundleBasedSubscriptions: function() {
        var bundleBasedSubscriptions = new Array();

        var subscriptions = this.userInfo.subscriptions;
        if (subscriptions != null) {
            for (var i = 0; i < subscriptions.length; i++) {
                var subscription = subscriptions[i];
                var totalArticles = subscription.totalArticles;

                if (totalArticles != null) bundleBasedSubscriptions.push(subscription);
            }
        }

        return bundleBasedSubscriptions;
    },
    getValidBundleBasedSubscriptions: function() {
        var validBundleBasedSubscriptions = new Array();

        var bundleBasedSubscriptions = this.getBundleBasedSubscriptions();
        for (var i = 0; i < bundleBasedSubscriptions.length; i++) {
            var subscription = bundleBasedSubscriptions[i];
            if ((subscription.validFrom == null) || (subscription.validFrom < this.time)) {
                if ((subscription.validUntil == null) || (subscription.validUntil > this.time)) {
                    if (subscription.remainingArticles > 0) {
                        validBundleBasedSubscriptions.push(subscription);
                    }
                }
            }
        }

        return validBundleBasedSubscriptions;
    },
    getValidSubscriptions: function() {
        var validBundleBasedSubscriptions = this.getValidBundleBasedSubscriptions();
        var validTimeBasedSubscriptions = this.getValidTimeBasedSubscriptions();

        var validSubscriptions = new Array();
        for (var i = 0; i < validBundleBasedSubscriptions.length; i++) {
            validSubscriptions.push(validBundleBasedSubscriptions[i]);
        }
        for (var i = 0; i < validTimeBasedSubscriptions.length; i++) {
            validSubscriptions.push(validTimeBasedSubscriptions[i]);
        }

        return validSubscriptions;
    },
    getExpiredSubscriptions: function() {
        var expiredSubscriptions = new Array();

        var subscriptions = this.userInfo.subscriptions;
        if (subscriptions != null) {
            for (var i = 0; i < subscriptions.length; i++) {
                var subscription = subscriptions[i];
                if ((subscription.validUntil != null) && (subscription.validUntil < this.time)) {
                    expiredSubscriptions.push(subscription);
                }
            }
        }

        return expiredSubscriptions;
    },
    hasValidTimeBasedSubscriptions: function() {
        return (this.getValidTimeBasedSubscriptions().length > 0);
    },
    hasValidBundleBasedSubscriptions: function() {
        return (this.getValidBundleBasedSubscriptions().length > 0);
    },
    hasExpiredSubscriptions: function() {
        return (this.getExpiredSubscriptions().length > 0);
    },
    isLoggedIn: function() {
        return (this.userInfo != null);
    },
    formatDate: function(date) {
        var monthNum = date.substr(4, 2);
        var month = "";

        if (monthNum == "01") month = "Jan";
        else if (monthNum == "02") month = "Feb";
        else if (monthNum == "03") month = "Mar";
        else if (monthNum == "04") month = "Apr";
        else if (monthNum == "05") month = "May";
        else if (monthNum == "06") month = "Jun";
        else if (monthNum == "07") month = "Jul";
        else if (monthNum == "08") month = "Aug";
        else if (monthNum == "09") month = "Sep";
        else if (monthNum == "10") month = "Oct";
        else if (monthNum == "11") month = "Nov";
        else if (monthNum == "12") month = "Dec";
        
        var formattedDate = date.substr(6, 2) + " " + month + " " + date.substr(0, 4) + " " + date.substr(8, 2) + ":" + date.substr(10, 2);

        return formattedDate;
    },
    getCurrentLocation: function() {
        var currentLocation = location.href;
        var pos = currentLocation.indexOf("?");
        if (pos > 0) currentLocation = currentLocation.substr(0, pos);
        return currentLocation;
    },
    getBaseLocation: function() {
        var baseLocation = location.href;
        var pos = baseLocation.indexOf("://");
        if (pos > 0) pos = pos + 3;
        pos = baseLocation.indexOf("/", pos);
        if (pos > 0) baseLocation = baseLocation.substr(0, pos + 1);
        return baseLocation;
    },
    logout: function() {
        var cookieOptions = {
            domain: this.settings.cookieDomain,
            path: "/"
        };
        $.cookies.del(this.settings.cookieName, cookieOptions);
        location.reload();
    },
    updateMemberLogin: function() {
        $("#memberStatus").empty();
        
        if (this.isLoggedIn) {
            $("#memberStatus").append('<div><strong>' + this.userInfo.firstname + '</strong> | <a href="http://' + this.settings.registrationHost + '/">Member Centre</a> | <a id="memberLogout" href="">Logout</a></div>');
        } else {
            $("#memberStatus").append('<div><a href="http://' + this.settings.registrationHost + '/login/return">Login</a> | <a href="http://' + this.settings.registrationHost + '/register">Register</a> | <a href="http://' + this.settings.registrationHost + '/forgottenpassword">Forgot Password?</a></div>');
        }

        $("#memberLogout").bind("click", {context: this}, function(eventObject) {
            eventObject.data.context.logout();
        });
    }
}

var PremiumContent = PremiumContentPrototype.PremiumContent;


function memberLogin(cookieName, cookieDomain, registrationHost) {
    var userInfoContainer = $.cookies.get(cookieName);

    var userInfo = null;
    if (userInfoContainer != null) userInfo = userInfoContainer.userInfo;
    var isLoggedIn = (userInfo != null);

    if (isLoggedIn) {
        $("#memberStatus").append('<div><strong>' + userInfo.firstname + '</strong> | <a href="http://' + registrationHost + '/">Member Centre</a> | <a id="memberLogout" href="">Logout</a></div>');
    }
    else {
        $("#memberStatus").append('<div><a href="http://' + registrationHost + '/login/return">Login</a> | <a href="http://' + registrationHost + '/register">Register</a> | <a href="http://' + registrationHost + '/forgottenpassword">Forgot Password?</a></div>');
    }

    $("#memberLogout").bind("click", {cookieName: cookieName, cookieDomain: cookieDomain}, function(eventObject) {
        var cookieOptions = {
            domain: eventObject.data.cookieDomain,
            path: "/"
        };
        $.cookies.del(eventObject.data.cookieName, cookieOptions);
        location.reload();
    });
}

String.prototype.repeat = function(character, count) {
    var str = "";

    for (var i = 0; i < count; i++) {
        str += character;
    }

    return str;
}

String.prototype.padLeft = function(width, padCharacter) {
    if ((width == null) || (width < 1)) return this;
    if (padCharacter == null) padCharacter = " ";

    var length = width - this.length;
    if (length < 1) return this.substr(0, width);

    return (this.repeat(padCharacter, length) + this).substr(0, width);
}

$.extend({
    getUrlVars: function(){
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for(var i = 0; i < hashes.length; i++) {
            hash = hashes[i].split('=');
            vars.push(hash[0]);
            vars[hash[0]] = hash[1];
        }
        return vars;
    },
    getUrlVar: function(name){
        return $.getUrlVars()[name];
    }
});
