var newbay = newbay || {};
newbay.pva = newbay.pva || {};
newbay.pva.widget = newbay.pva.widget || {};

var uscc = uscc || {};
uscc.pva = uscc.pva || {};
uscc.pva.widget = uscc.pva.widget || {};

/**
 * @class MMSDialog
 *
 * pva.messenger.sendMessage
 *
 * @extends newbay.widget.Dialog
 * @depends newbay.widget.Dialog, newbay.util.JQYHtmlContainer, newbay.widget.AddressBook, jQuery.fn.contactsInput, newbay.widget.AddNabContactsDialog
 * @events onMessageSent.MMSDialog
 *
 */

uscc.pva.widget.MMSDialog = (function(){

        var _const = {  template: "/albums/js_templates/mmsDialog",
                    dialogWidth: 485,
                    DEFAULT_MSG : "I thought you would like this photo!",
                    DEFAULT_SUB : "A picture for you!"
                    },

        _buttons = {},
        _addressBook = null,
        _$contactsInput = null,
        _contactsOpened = false,
        _htmlContainer = new newbay.util.JQYHtmlContainer ("#MmsDialog", {}),
        _dialog = newbay.widget.OKDialog();
        _options = null;

    _buttons["Send"] = function(e) {
        _sendMMS ();
    };

    _buttons["Cancel"] = function() {
        _self.close ();
    };

    // init parent dialog instance
    var _super = new newbay.widget.Dialog ("MmsDialog", _htmlContainer, {
    		buttons: _buttons,
    		title: "Send Photo",
    		width: _const.dialogWidth,
            height: 520,
            noanim: true,
            position: "center"
        }
    );

    // extend dialog instance
    var _self = $.extend({}, _super, {


    openMMSDialog : function (options) {

            _options = options;

            _self.open();
            _htmlContainer.setLoading (false); // ensure previous 'still loading' is removed

            // initialize these widgets AFTER dialog content rendered so can attach events through delegation
            if (_addressBook == null) {

                _addressBook = newbay.pva.widget.PVAInviteAddressBook (),
                _$contactsInput = $("#MmsDialog .contacts-input").contactsInput ();

                _super.subscribe ("close", function () {
                    _$contactsInput.contactsInput ("clear");
                    toggleContacts (true);
                });

                _addressBook.subscribe ("contactAdded.AddressBook", function (event) {
                    _$contactsInput.contactsInput ("add", event.contact);
                });
            }

            _setupForm ();
        }
    });

    var _setupForm = function () {

        var $mmsDialog = $("#MmsDialog .dialog-form").find("input").val ("").end();

        if (typeof(_options.type) !== "undefined") {
            if (_options.type == "compose") {

                _super.setDialogOption ("title", "Send Photo");
                $mmsDialog.find ("#contacts-btn").show();
                $mmsDialog.find ("#mmsDialog-thumbnail").html('<div class="mediathumb" style="background-image:url(' + _options.thumbnailUrl + ')"/>');
                $mmsDialog.find ("#mmsDialog-message").val (_const.DEFAULT_MSG);
                $mmsDialog.find ("#mmsDialog-subject").val (_const.DEFAULT_SUB);
                $mmsDialog.find("input, textarea").removeAttr("readonly");

               // _$contactsInput.contactsInput ("setOptions", {allowContactDelete: true});
            }
            else if (_options.type == "resend") {
                _showResendInfo ($mmsDialog);
            }
        }
    };

    var _showResendInfo = function ($mmsDialog) {

        _super.setDialogOption ("title", "Re-Send Invite");

        $mmsDialog.find ("#contacts-btn").hide();

        $mmsDialog.find ("#mmsDialog-message")
                .val (_options.invitation.body)
                .attr("readonly", "readonly");

        $mmsDialog.find ("#mmsDialog-subject")
                .val (_options.invitation.subject)
                .attr("readonly", "readonly");

        _$contactsInput
                .find("input")
                    .attr("readonly", "readonly")
                .end()
                .contactsInput ("setOptions", {allowContactDelete: false});

        var recipients = _options.invitation.recipient;
        for (var inx in recipients) {
            var address = recipients[inx].transportAddress;
            _$contactsInput.contactsInput ("add", {address: (address.email?address.email:address.msisdn)});
        }
    };

    var _init = function () {

        _self.addSupportedEvents (["onMessageSent.MMSDialog"]);
        newbay.widget.AddNabContactsDialog.setOptions ({nabAPI : newbay.api.PvaABApi});

        if ("systemSettings" in newbay.pva) {
            _htmlContainer.setRenderOptions ({
                renderFromTemplate: {
                    url : newbay.pva.systemSettings.contextWebApp+_const.template
                },
                renderOnce: true
            });
        }

        $("#MmsDialog #contacts-btn").live ("click", function () {
            toggleContacts ();
        });
    };

    var toggleContacts = function (forceClose) {

        if (forceClose === true) {
            $("#contacts-container").css ({display: "none"});
            _super.setDialogOption ("width", _const.dialogWidth);
            _contactsOpened = false;
            _super.setDialogOption ("position", "center");
            return;
        }

        if (!_contactsOpened) {

            $("#MmsDialog-parent").css({left:$("#page-logo").position().left+40}); // hack to position dialog left

            _super.animate ({width: 940}, 200, function () {
                $("#contacts-container").show();
                _addressBook.show ();
            });

            _contactsOpened = true;
        }
        else {
            $("#contacts-container").hide ();
            _super.animate ({width: _const.dialogWidth}, 200);
            _contactsOpened = false;
            _super.setDialogOption ("position", "center");
        }
    };

    var _validate = function (contacts) {

        var validPhoneRegex = /^[2-9]\d{9}$/,
            validEmailRegex = /^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/i,
            entriesValid = true;

        for (var i=0, len=contacts.emails.length; i < len; i++) {
            if (!validEmailRegex.test(contacts.emails[i])) {
                entriesValid = false;
                break;
            }
        }

        for (i=0,len=contacts.msisdns.length; i< len && entriesValid; i++) {
            if (!validPhoneRegex.test(contacts.msisdns[i])) {
                entriesValid = false;
                break;
            }
        }

        var pulseErrorContacts = function() {
            $("#MmsDialog .contacts-input")
                .find ("input").focus ().end()
                .css("background-color", "red")
                .animate({ backgroundColor: "#FFFFFF"}, 500);
        }

        if (!entriesValid) {
            pulseErrorContacts();
            _dialog.setText("Some of the contact details entered are invalid. Please correct these problems and try again.")
                    .open()
                    .setDialogOption("title", "An Error Occurred");
        }


        if (!entriesValid || (contacts.emails.length == 0 && contacts.msisdns.length == 0)) {
            pulseErrorContacts();
            return false;
        }

        return true;
    };

    var _getFormData = function () {

        var contacts = _$contactsInput.contactsInput ("getContacts"),
            contactsString = "",
            recipients = [];

        if (_validate (contacts)) {

            if (contacts.emails.length > 0) {
                for(var emailsTo in contacts.emails){
                    recipients.push(contacts.emails[emailsTo]);
                }
            }

            if(contacts.msisdns.length > 0){
                for(var msisdnTos in contacts.msisdns){
                    recipients.push(contacts.msisdns[msisdnTos]);
                }
            }

            var $dialogForm = $("#MmsDialog .dialog-form"),

                message = {
                        "to":           recipients,
                        "subject"       : $dialogForm.find("#mmsDialog-subject").val(),
                        "msg"           : $dialogForm.find("#mmsDialog-message").val(),
                        "entry"     : _options.entryId //one image only but to multiple cotacts {max: 5}
                    }



            return message;
        };

        return null;
    };

    var _sendMMS = function () {

        if (!_htmlContainer.isBusy()) {

            if (_options.type == "compose") {

                var mms = null;
                if (mms = _getFormData ()) {

                    _htmlContainer.setLoading (true);

                    PvaAPI.sendMessage(mms, {}, {

                        onSuccess: function(response) {
                            _htmlContainer.setLoading (false);
                            _self.trigger ("onMessageSent.MMSDialog", {});
                            _self.close ();
                        },
                        onFailure: function(response) {
                            _dialog.setText("MMS Could not be sent. Please check that your contacts are in the correct format.");
                            _dialog.open();
                            _dialog.setDialogOption("title", "An Error Occurred");
                            _htmlContainer.setLoading(false);
                        },
                        mms: mms
                    });
                }
            }
            else { // resend

                var messageId = _options.message.id;
                var end = (messageId.lastIndexOf("?") != -1) ? messageId.lastIndexOf("?") : messageId.length;

                PvaAPI.resendMessage({}, {"message.address":messageId.substring (messageId.lastIndexOf("/")+1, end)}, {

                    onSuccess: function() {
                        _htmlContainer.setLoading (false);
                        _self.close ();
                    },
                    onFailure: function() {
                        _htmlContainer.setLoading (false);
                    },
                    mms: mms
                });
            }
        }
    };


    $(document).ready(function () {
        _init ();
    });

    return _self;
})();

newbay.pva.widget.PVAInviteAddressBook = (function () {

    return new newbay.widget.AddressBook ({
        // direct references to required elements
        outerContainer: "#contacts-container", // root element of widget
        listContainer: "#contacts-list",

        // selectors should all be defined without ref to outerContainer above (this is assumed by widget)
        innerContainerSelector: ".contacts-widget",
        contactSelector: "#contacts-list .content-entry",
        searchInputSelector: ".contacts-search-input input",
        searchButtonSelector: ".contacts-search-input span",
        alphaMenuSelector: ".alphamenu",

        listTemplateURL: ("systemSettings" in newbay.pva)?newbay.pva.systemSettings.contextWebApp+"/albums/js_templates/addressbook": "",
        showDetailsOnSelection: true,

        nabAPI : newbay.api.PvaABApi
    });
});
