var uscc = uscc || {};
uscc.pva = uscc.pva || {};
uscc.pva.addbook = uscc.pva.addbook || {};
/**
 * @class PVAAddressBook
 *
 * PVAAddressBook : Allows a user to Autenticate/Send Media to different social networks
 *
 *
 *
 * @class uscc.pva.addbook.PVAAddressBook
 * @extends newbay.widget.AddressBook
 * @depends newbay.api.PvaABApi
 * 
 * @events   onContactAdded.AddPvaContactDialog, onContactEdited.AddPvaContactDialog
*/
uscc.pva.addbook.PVAAddressBook = (function(){

    var _nabAPI = newbay.api.PvaABApi,

        _addContactDialog = null,
        _delContactDialog = null,
        _editContactDialog = null,
        _phoneNumRegex = null,
        _emailAddrRegex = null,


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

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

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

            nabAPI : newbay.api.PvaABApi
       }),

        _self = $.extend({}, _super, {
            validateEmailAddress:function(email) {
                if (!newbay.pva.systemSettings.emailRegex) {
                    return true;    //if no regex specified everythig is valid.
                } else {
                    if (_emailAddrRegex === null) {
                        _emailAddrRegex = new RegExp(newbay.pva.systemSettings.emailRegex, "i");
                    }
                    return _emailAddrRegex.test(email);
                }
            },
            validatePhoneNumber:function(tel) {
                if (!newbay.pva.systemSettings.phoneRegex) {
                    return true;    //if no regex specified everythig is valid.
                } else {
                    if (_phoneNumRegex === null) {
                        _phoneNumRegex = new RegExp(newbay.pva.systemSettings.phoneRegex);
                    }
                    return _phoneNumRegex.test(tel);
                }
            }
        });



    var _loadAddressBook =  function(){
        _self.show();
    };

    var _isContactChecked = function(){
        return $("input:checked").length == 0 ? false : true;
    };

    var _checkForErrors = function(resObj) {
        try {
            var impStatus = resObj.feed.importStatus[0];
            if (parseInt(impStatus.ignored, 10) > 0) {
                newbay.pva.widget.OKDialog.setText("This contact already exists and has not been updated.").open().setDialogOption("title", "Contact not saved");
            }
        } catch(e) {
            //error parsing JSON response.
        }
    };

    var _init = function(){

         _loadAddressBook();

        $("#uscc-contacts-container")
                .delegate("#uscc-add-contact", "click", function(){
                    // open add contact dialog

                    if (_addContactDialog === null) {
                        _addContactDialog = new uscc.pva.dialog.AddUsccPvaContact(_nabAPI, {formId : "#uscc-addpva-form", responseFilter: _checkForErrors});
                        _addContactDialog.bind("onContactAdded.AddPvaContactDialog", function(contact){
                            _self.renderSearch(contact);
                        });
                    }

                    _addContactDialog.open();
                    //listen for the event

                })

                .delegate("#uscc-del-contact", "click", function(){
                    if(_isContactChecked()){
                        var contactIds = $("input:checked");

                        if(_delContactDialog === null){
                            _delContactDialog = newbay.widget.ConfirmDialog("usccDelContactDialog", {
                                title               : "Delete Contact",
                                text                : "Are you sure you want to delete?",
                                confirmButtonText   : "Delete",
                                width               : "300px"
                            });


                            _delContactDialog.subscribe("okclick", function(){
                                var contactIds = $("input:checked");
                                _nabAPI.deleteContact(contactIds, {
                                    onSuccess: function(){
                                        _self.refresh ();
                                    },
                                    onFailure: function(){

                                    }
                                });
                            });
                        }
                        _delContactDialog.open();
                    }else{
                        newbay.pva.widget.OKDialog.setText("Please select at least one contact to delete.").open().setDialogOption("title", "No Contacts Selected");
                    }

                });

                $("#uscc-contacts-list").delegate(".uscc-edit-btn", "click", function(event){
                    event.preventDefault();
                    var contact = $(this).parent().parent().prev(),
                        editContact = null;

                   _nabAPI.getSelectedContact(function(index, obj){
                        if(obj.id === contact[0].id){
                            editContact = this;
                        }
                    });

                    _editContactDialog = (_editContactDialog?_editContactDialog: (new uscc.pva.dialog.EditUsccPvaContact(_nabAPI, {formId : "#uscc-editpva-form", responseFilter: _checkForErrors})));
                    _editContactDialog.open();
                    _editContactDialog.showEditContact(editContact);

                    _editContactDialog.bind("onContactEdited.EditPvaContactDialog", function(contact){
                        _self.renderSearch(contact);
                    });
                                     
                });
    };

    _init();

    return _self;

});

