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

/**
 * @singleton
 * @class EditUsccPvaContact
 *
 * @extends newbay.widget.Dialog
 * @depends newbay.widget.Dialog, newbay.util.JQYHtmlContainer
 * @events onContactEdited.AddPvaContactDialog
 *
 */

uscc.pva.dialog.EditUsccPvaContact = (function(nabApi, options){

    var _options = options,
        _constants = {
            CONTAINER_ID: "EditPvaContactDialog"
        },
        _buttons = {},
        _htmlContainer = new newbay.util.JQYHtmlContainer ("#" + _constants.CONTAINER_ID, {}),
        _nabApi = nabApi,
        _contactId = null,
        _contactPreEdit = null,
        l = newbay.pva.locale;

    _buttons["Edit"] = function() {
        _editContact();
    };

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

    // init parent dialog instance
    var _super = new newbay.widget.Dialog (_constants.CONTAINER_ID, _htmlContainer, {
    		buttons: _buttons,
    		title: "Edit Contact",
    		width:450,
            height: 380,
            hide: null,
            position: "center"
        }
    );

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

    var _editContact = function(data){
        if (_validateForm() === false) return false;
        var $containerSelector = $("#" + _constants.CONTAINER_ID),params = _getFormInfo();
        $containerSelector.addClass("htmlContainerOverlay");
        _nabApi.editContact(params, { "contact.id" : _contactId }, {
            onSuccess : function(xhr){
                _self.close();
                $(_options.formId)[0].reset();
                if (_options.responseFilter) {
                    _options.responseFilter(xhr.responseObject);
                }
                _self.trigger("onContactEdited.EditPvaContactDialog", params.contact.givenName);
                $containerSelector.removeClass("htmlContainerOverlay");
            },
            onFailure : function(xhr){
                var ro = xhr.responseObject,
                    msg = "Unknown Error Editing Contact";  //TODO: convert to l10n string and below
                if ($.isArray(ro.errors) && ro.errors.length > 0 && l.hasOwnProperty(ro.errors[0].message)) {
                    msg = l[ro.errors[0].message];
                }
                newbay.pva.widget.OKDialog.setText(msg)
                          .open()
                          .setDialogOption("title", "Error");  //TODO: convert to l10n string
                $containerSelector.removeClass("htmlContainerOverlay");
            }
        })
    };

    _self.showEditContact = function(data){
        _contactPreEdit = data;
        _contactId = data.id;
        $(_options.formId)[0].reset()
        var $editForm = $(_options.formId);

        $editForm.find("#givenName").val(data.givenName);
        $editForm.find("#familyName").val(data.familyName);

        if(!$.isEmptyObject(data.email)){
            $editForm.find("#email_personal").val(data.email.personal && data.email.personal.$ || "");
            $editForm.find("#email_work").val(data.email.work && data.email.work.$ || "");
        }

        if(!$.isEmptyObject(data.phone)){
            $editForm.find("#phone_cell").val(data.phone.cell && data.phone.cell.$);
            $editForm.find("#phone_work").val(data.phone.work && data.phone.work.$);
            $editForm.find("#phone_home").val(data.phone.home && data.phone.home.$);
        }
    };

    var _validateForm = function() {
        //check if all phones, emails are empty
        var countFields = 0, emptyFields = 0,$containerSelector = $("#" + _constants.CONTAINER_ID), valCheck = true;
        $containerSelector.find('input.email').each(function() {
            if ($.trim($(this).val()) == "") return true;
            return (valCheck = addbook.validateEmailAddress($(this).val()));
        });
        if (valCheck === false) {
            _showAlert("Invalid E-mail Address", "Invalid e-mail address entered.");
            return false;
        }
        $containerSelector.find('input.phone').each(function() {
            if ($.trim($(this).val()) == "") return true;
            return (valCheck = addbook.validatePhoneNumber($(this).val()));
        });
        if (valCheck === false) {
            _showAlert("Invalid Phone Number", "Invalid Phone Number entered. Please enter valid 10 digit numbers.");
            return false;
        }
        $containerSelector.find('input.email, input.phone').each(function() {
            countFields++;
            if ($.trim($(this).val()) === "") emptyFields++;
        });
        if (countFields === emptyFields) {
            newbay.pva.widget.OKDialog.setText("Please enter at least one email contact or phone number.")
                          .open()
                          .setDialogOption("title", "Missing Information");  //TODO: convert to l10n string
            return false;
        }
    };


    var _getFormInfo = function() {

        var $containerSelector = $("#" + _constants.CONTAINER_ID),
            newContact = { contact : {} },
            _emails = [],
            _phones = [];

            //both these guys are mandatory TODO: add validation for this
            newContact.contact.givenName = $containerSelector.find("#givenName").val();
            newContact.contact.familyName = $containerSelector.find("#familyName").val();

          //check for at least one email address
            $containerSelector.find('input.email').each(function(key, element){
                var type = element.id.split("_")[1];
                if (element.value !== "" || (_contactPreEdit.email[type] && typeof _contactPreEdit.email[type].$ !== "undefined" && element.value === "")) {
                    _emails.push({ type : type, "value" : element.value });
                }
            });

            $containerSelector.find('input.phone').each(function(key, element){
                var type = element.id.split("_")[1];
                if(element.value !== "" || (_contactPreEdit.phone[type] && typeof _contactPreEdit.phone[type].$ !== "undefined" && element.value === "")) {
                    _phones.push({ type : type, "value" : element.value });
                }
            });

            if(_emails.length > 0){
                newContact.contact.email = _emails;
            }
            if(_phones.length > 0){
                // leaving identifier 'newContact.contact.tel' alone for now
                // TODO: update backend to reflect identifier name change
                newContact.contact.tel = _phones;
            }

        return newContact;
    };

    var _showAlert = function(hdr, msg) {
        newbay.pva.widget.OKDialog.setText(msg)
                          .open()
                          .setDialogOption("title", hdr);  //TODO: convert to l10n string
    };


    //laod the template and render
    var _init = function () {

         _self.addSupportedEvents (["onContactEdited.EditPvaContactDialog"]);

        _htmlContainer.setRenderOptions ({
            renderFromTemplate: {templateId : "tmpl_EditPvaContactDialog"},
            renderOnce: true
        });
    };

    _init ();

    return _self;

});

