﻿/// <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 
                if (pageTracker && pageTracker._trackPageview) 
                { 
                    pageTracker._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
        if (pageTracker && pageTracker._trackPageview)
        {
            pageTracker._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();