﻿/// <reference path="jquery.intellisense.js"/>
/// <reference path="Depend.Core.js"/>
/// <reference path="Depend.Services.MailService.js"/>

Depend.OptIn = function(clientId) {
    this.ClientID = clientId;
    this.Selector = "#" + clientId;
    this.Initialize();
};

Depend.OptIn.prototype =
{
    Name: 'Depend.OptIn',
    __typeName: 'Depend.OptIn',
    __class: true,
    Display: function() {
    },
    AttachEvents: function() {
        var __app = this;

        var context = $(this.Selector);
        var generalTimeout = 5000;
        var message = {
            Confirmation: $('.Messages span.Confirmation', context).text(),
            InvalidEmail: $('.Messages span.InvalidEmail', context).text(),
            ServiceError: $('.Messages span.ServiceError', context).text(),
            Processing: $('.Messages span.Processing', context).text()
        };
        var messageTimeout;
        var messageQueue = [];

        var clearInputForm = function() {
            $('input.Email', context).val('');
            $('input.Email', context).blur();
        };

        var returnToEntryForm = function() {
            $('.Message', context).fadeOut(250, function() {
                $('.EntryForm', context).fadeIn(250);
            });                        
        };

        var showLastMessage = function() {
            if (messageQueue.length === 0) {
                return;
            }

            $('.Content:visible', context).fadeOut(250, function() {
                
                var message;
                while (messageQueue.length > 0) {
                    message = messageQueue.shift();
                }
                $('.Message > span', context).text(message.Text);
                
                $('.Message', context).fadeIn(250, function() {
                    if (message.Callback) {
                        setTimeout(function() {
                            message.Callback.apply(__app, [], []);
                        }, message.Timeout);
                    }
                });
            });
        };

        var showMessage = function(text, timeout, callback) {
            messageQueue[messageQueue.length] = {
                Text: text,
                Timeout: timeout,
                Callback: callback
            };
            setTimeout(showLastMessage, 100);
        };

        var validateEmailAddress = function(emailAddress) {
            var AtPos = emailAddress.indexOf('@');
            var StopPos = emailAddress.lastIndexOf('.');

            if (emailAddress === '') {
                return false;
            }
            if (AtPos == -1 || StopPos == -1) {
                return false;
            }
            if (StopPos < AtPos) {
                return false;
            }
            if (StopPos - AtPos == 1) {
                return false;
            }
            return true;
        };

        var onSuccess = function(result) {
            if (result) {
                showMessage(message.Confirmation, generalTimeout, function() {
                    clearInputForm();
                    returnToEntryForm();
                });
            }
            else {
                showMessage(message.ServiceError, generalTimeout, returnToEntryForm);
            }
        };

        var onFailure = function() {
            showMessage(message.ServiceError, generalTimeout, returnToEntryForm);
        };

        var subscribe = function() {
            var email = $('input.Email', context).val();

            if (validateEmailAddress(email)) {
                showMessage(message.Processing, 250);
                __app.MailService.SubscribeToNewsletter(email, onSuccess, onFailure);
            }
            else {
                showMessage(message.InvalidEmail, generalTimeout, returnToEntryForm);
            }

        };

        $('.EntryForm > a', context).click(function() {
            subscribe();
            $(this).blur();
            return false;
        });

        $('input[type="text"].Email', context).keydown(function(ev) {
            if (ev.keyCode === 13) {
                subscribe();
                return false;
            }
            else if (ev.keyCode === 27) {
                setTimeout(clearInputForm, 20);
                $(this).blur();
                return false;
            }
        });

        $('input.Watermark', context).titleWatermark();
    }
};

Depend.Extend(Depend.OptIn, Depend.UserControl);