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

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

uscc.pva.dialog.AddUsccPvaContact = (function(nabApi, options){
    
    var _options = options,
        _constants = {
            CONTAINER_ID: "AddPvaContactDialog"
        },
        _buttons = {},
        _htmlContainer = new newbay.util.JQYHtmlContainer ("#" + _constants.CONTAINER_ID, {}),
        _nabApi = nabApi,
        //_msgDialog = newbay.widget.OKDialog(),
        l = newbay.pva.locale;

    _buttons["Add"] = function() {
        _addNewContact();
    };

    _buttons["Cancel"] = function() {
        $(_options.formId)[0].reset();
        _self.close ();
    };

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

    // extend dialog instance
    var _self = $.extend({}, _super, {});
    
    var _addNewContact = function(){
        if (_validateForm() === false) return false;
        
        var $containerSelector = $("#" + _constants.CONTAINER_ID), params = _getFormInfo();
        $containerSelector.addClass("htmlContainerOverlay");
        _nabApi.addNewContact(params, {}, {
            onSuccess: function(xhr){
                _self.close();
                $(_options.formId)[0].reset();
                if (_options.responseFilter) {
                    _options.responseFilter(xhr.responseObject);
                }
                _self.trigger("onContactAdded.AddPvaContactDialog", params.contact.givenName);
                $containerSelector.removeClass("htmlContainerOverlay");
            },
            onFailure: function(xhr){
                var ro = xhr.responseObject,
                    msg = "Unknown Error Adding 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");
            }
        });
    };

    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) {
            _showAlert("Missing Information", "Please enter at least one email contact or phone number.");
            return false;
        }
    };

    var _getFormInfo = function(){

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

            //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){
                if(element.value !== ""){
                    email.push({ type : element.id.split("_")[1], "value" : element.value });
                }
            });

            $containerSelector.find('input.phone').each(function(key, element){
                if(element.value !== ""){
                    tel.push({ type : element.id.split("_")[1], "value" : element.value });
                }
            });

            if(email.length > 0){
                newContact.contact.email = email;
            }
            if(tel.length > 0){
                newContact.contact.tel = tel;
            }

        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 (["onContactAdded.AddPvaContactDialog"]);

        _htmlContainer.setRenderOptions ({
            renderFromTemplate: {templateId : "tmpl_" + _constants.CONTAINER_ID},
            renderOnce: true
        });
    };

    _init ();
    
    return _self;

});
