﻿/// <reference name="MicrosoftAjax.js"/>



Type.registerNamespace("TUI.Web.UI.WebControls");



TUI.Web.UI.WebControls.ShareLink = function(element)
{
    TUI.Web.UI.WebControls.ShareLink.initializeBase(this, [element]);
    this._popupLayer = null;
}
TUI.Web.UI.WebControls.ShareLink.prototype =
{
    initialize: function() {
        TUI.Web.UI.WebControls.ShareLink.callBaseMethod(this, 'initialize');

        var 
            $targetElement = $(this.get_element()),
            $popupLayer = $(this.get_popupLayer());

        Sys.UI.DomElement.setVisibilityMode(this.get_popupLayer(), Sys.UI.VisibilityMode.collapse);
        this.positionPopupLayer();

        // Bind to events
        $targetElement.click
        (
            Function.createDelegate(this,
            function(e) {
                Sys.UI.DomElement.setVisible(this.get_popupLayer(), !Sys.UI.DomElement.getVisible(this.get_popupLayer()));
                this.changeView('normal');
            })
        );
        $popupLayer.find('div.share-link-email-view').find(':text').keydown
        (
            Function.createDelegate(this,
            function(e) {
                if (e.keyCode == Sys.UI.Key.enter) {
                    this.submitEmail(e);
                }
            })
        );
        $popupLayer.find('div.share-link-normal-view ul a').click
        (
            function(e) {
                e.preventDefault();

                // Google Analytics
                _gaq.push(['_trackPageview', String.format("/social-media-sharing/{0}/{1}", $(this).find('span').text(), $('title').text())]);

                window.open(this.rel, 'sharer', this.windowFeatures);
            }
        );
        $popupLayer.find('img.close, a.close-button').click(Function.createDelegate(this, function() { Sys.UI.DomElement.setVisible(this.get_popupLayer(), false); }));
        $popupLayer.find('a.send-by-email').bind('click', { action: 'email' }, Function.createDelegate(this, this.changeViewHandler));
        $popupLayer.find('a.help-text').bind('click', { action: 'help' }, Function.createDelegate(this, this.changeViewHandler));
        $popupLayer.find('a.cancel-button, a.share-with-more').bind('click', { action: 'normal' }, Function.createDelegate(this, this.changeViewHandler));
        $popupLayer.find('a.submit-email').click(Function.createDelegate(this, this.submitEmail));
    },
    changeViewHandler: function(e) {
        this.changeView(e.data.action);
    },
    changeView: function(action) {
        var $popupLayer = $(this.get_popupLayer());

        $popupLayer.find('div.share-link-center > div').hide();

        switch (action) {
            case 'email-confirm':
                $popupLayer.find('div.share-link-email-confirm-view p.messages-area').html(this.get_translations().messageEmail).css('color', '#000');
                $popupLayer.find('div.share-link-email-confirm-view p.navigation').hide();
                $popupLayer.find('div.share-link-email-confirm-view p.ajax-loader').show();
                $popupLayer.find('div.share-link-email-confirm-view').show();
                break;
            case 'email':
                $popupLayer.find('div.share-link-email-view input.recipient-name, div.share-link-email-view input.recipient-email').val('');
                $popupLayer.find('div.share-link-email-view p.validation-summary').empty();
                $popupLayer.find('div.share-link-top h3').text(this.get_translations().headingShareByEmail);
                $popupLayer.addClass('share-link-large').find('div.share-link-email-view').show();
                $popupLayer.find('div.share-link-email-view input.recipient-name').get(0).focus();
                break;
            case 'help':
                $popupLayer.find('div.share-link-top h3').text(this.get_translations().headingHelpText);
                $popupLayer.addClass('share-link-large').find('div.share-link-help-view').show();
                break;
            case 'normal':
                $popupLayer.find('div.share-link-top h3').text(this.get_translations().headingShare);
                $popupLayer.removeClass('share-link-large').find('div.share-link-normal-view').show();
                break;
        }

        this.positionPopupLayer();
    },
    submitEmail: function(e) {
        var 
            $popupLayer = $(this.get_popupLayer()),
            $emailContainer = $popupLayer.find('div.share-link-email-view'),
            $emailConfirm = $popupLayer.find('div.share-link-email-confirm-view'),
            validationErrorMessage = "",
            validateRequiredFieldFunction,
            validateEmailFormatFunction,
            callbackArgument,
            callbackExpression;

        e.stopPropagation();
        e.preventDefault();

        callbackArgument =
        {
            shareUrl: this.get_shareUrl(),
            recipientName: $emailContainer.find('input.recipient-name').val(),
            recipientEmail: $emailContainer.find('input.recipient-email').val(),
            senderName: $emailContainer.find('input.sender-name').val(),
            senderEmail: $emailContainer.find('input.sender-email').val(),
            senderMessage: $emailContainer.find('textarea.sender-message').val()
        };

        // Validate the input
        // This JavaScript code should mirror the corresponding C# validation code (ShareLink.cs) directly
        validateRequiredFieldFunction = function(subject) {
            return subject != null && subject != "" && typeof subject != "undefined";
        }
        validateEmailFormatFunction = function(subject) {
            return subject.match(/\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b/i);
        }
        if (!validateRequiredFieldFunction(callbackArgument.recipientName)) {
            validationErrorMessage += this.get_translations().errorRecipientName + "<br />";
        }
        if (!validateRequiredFieldFunction(callbackArgument.recipientEmail)) {
            validationErrorMessage += this.get_translations().errorRecipientEmail + "<br />";
        }
        else if (!validateEmailFormatFunction(callbackArgument.recipientEmail)) {
            validationErrorMessage += this.get_translations().errorRecipientEmailFormat + "<br />";
        }
        if (!validateRequiredFieldFunction(callbackArgument.senderName)) {
            validationErrorMessage += this.get_translations().errorSenderName + "<br />";
        }
        if (validateRequiredFieldFunction(callbackArgument.senderEmail) && !validateEmailFormatFunction(callbackArgument.senderEmail)) {
            validationErrorMessage += this.get_translations().errorSenderEmail + "<br />";
        }
        if (validationErrorMessage != "") {
            $emailContainer.find('p.validation-summary').html(validationErrorMessage).css('color', 'red');
            return;
        }
        else {
            $emailContainer.find('p.validation-summary').empty();
        }

        this.changeView('email-confirm');

        // Google Analytics
        _gaq.push(['_trackPageview', "/social-media-sharing/send-by-email/" + $('title').text()]);

        // Url encode all arguments for JSON safety
        for (key in callbackArgument) {
            callbackArgument[key] = encodeURIComponent(callbackArgument[key]);
        }

        callbackArgument = "'" + Sys.Serialization.JavaScriptSerializer.serialize(callbackArgument) + "'";
        callbackExpression = this.get_callbackReference().replace("%replaceableArgument%", callbackArgument);
        eval(callbackExpression);
    },
    positionPopupLayer: function() {
        // Positions the popuplayer according to target element
        var 
            $targetElement = $(this.get_element()),
            $popupLayer = $(this.get_popupLayer()),
            left = $targetElement.position().left + $targetElement.width() / 2 - $popupLayer.width() / 2,
            top = $targetElement.position().top + $targetElement.height();

        $popupLayer.css('left', left);
        $popupLayer.css('top', top);
        $popupLayer.css('z-index', '11');
    },
    get_popupLayer: function() { return this._popupLayer; },
    set_popupLayer: function(value) { this._popupLayer = value; },
    get_callbackReference: function() { return this._callbackReference; },
    set_callbackReference: function(value) { this._callbackReference = value; },
    get_shareUrl: function() { return this._shareUrl; },
    set_shareUrl: function(value) { this._shareUrl = value; },
    get_translations: function() { return this._translations; },
    set_translations: function(value) { this._translations = value; }
}
TUI.Web.UI.WebControls.ShareLink.globalCallbackResultHandler = function (result)
{
    var 
        matches = result.match(/\{[^}]*\}/i),
        resultDeserialized = Sys.Serialization.JavaScriptSerializer.deserialize(matches.length ? matches[0] : matches),
        thisRef = $get(resultDeserialized.targetControlID).ShareLink,
        $popupLayer = $(thisRef.get_popupLayer());
        
    $popupLayer.find('div.share-link-email-confirm-view p.messages-area').html(decodeURIComponent(resultDeserialized.message)).css('color', resultDeserialized.success ? 'green' : 'red');
    $popupLayer.find('div.share-link-email-confirm-view p.navigation').show();
    $popupLayer.find('div.share-link-email-confirm-view p.ajax-loader').hide();
}
TUI.Web.UI.WebControls.ShareLink.registerClass('TUI.Web.UI.WebControls.ShareLink', Sys.UI.Behavior);
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();