var Widgets = Widgets ? Widgets : function() {

    var p = {

        // load widget into 'container' from 'host'
        SubscriberContactService: function(container, host, useName, useEmail, labelName, labelPhoneNumber, labelEmail, textSave, confirmationMessage) {

            var w = new MyWidget();

            w.host = host;
            w.useName = useName;
            w.useEmail = useEmail;

            //            this.labelPhoneNumber = "Phone #:&nbsp;";
            //            this.labelName = "Name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
            //            this.labelEmail = "Email:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";

            w.labelPhoneNumber = labelPhoneNumber;
            w.labelName = labelName;
            w.labelEmail = labelEmail;
            w.labelSave = textSave;

            w.container = container;

            if (confirmationMessage != null) {
                w.confirmationMessage = confirmationMessage;
            }

            w.loadhtml(container, 'https://mobileMarketingApp.com/memberPortal/subscriberWidget/SubscriberWidget.aspx',
                w.SubscriberContactService_Init , w);
        }
    }

    return p;
} ();



function MyWidget() {

    this.host = null;
    this.container = null;
    this.callback = null;
    this.usePhone = true;
    this.useName = false;
    this.useEmail = false;
    this.labelPhoneNumber = "Phone #:&nbsp;";
    this.labelEmail = "Email:&nbsp;";
    this.labelName = "Name:&nbsp;";
    this.labelSave = "Save Contact";
    this.confirmationMessage = "text sent";

    this.jsonpcall = function(fn, paramArray, callbackFn) {
        // Create list of parameters in the form (http get format):
        // paramName1 = paramValue1 & paramName2 = paramValue2 &
        var paramList = '';
        if (paramArray.length > 0) {
            for (var i = 0; i < paramArray.length; i += 2) {
                paramList += paramArray[i] + '=' + paramArray[i + 1] + '&';
            }
        }

        var s = 'https://mobileMarketingApp.com/memberPortal/subscriberWidget/' + fn + '?' + paramList + 'method=?';

        jQuery.getJSON(s, callbackFn);
    };

    // get the html
    this.loadhtml = function(container, urlraw, callback, currentInstance) {
        var urlselector = (urlraw).split(" ", 1);
        var url = urlselector[0];
        var selector = urlraw.substring(urlraw.indexOf(' ') + 1, urlraw.length);

        var s = container.selector;
        var param = s.substring("div#subscriberContainer_".length, s.length);

        url = url + "?p=" + param;


        this.container = container;
        this.callback = callback;
        this.jsonpcall('SubscriberServiceLoader.ashx', ['downloadurl', escape(url)],
                function(msg) {
                    // gets the contents of the Html in the 'msg'
                    // todo: apply selector
                    container.html(msg);

                    if (jQuery.isFunction(callback)) {
                        callback(container, currentInstance);
                    }
                });
    };

    // wire widget after it's loaded
    this.SubscriberContactService_Init = function(theContainer, currentInstance) {
        // **************************************************************
        // Toggle the email and name fields

        var s = theContainer.selector;
        var masterParam = "_" + s.substring("div#subscriberContainer_".length, s.length);

        var param = "_" + s.substring("div#subscriberContainer_".length, s.length);


        var widget = jQuery('div#whamxSubscriberWidget' + param);


        param = "";

        var nameSection = widget.find('div#name' + param)
        var emailSection = widget.find('div#email' + param)

        nameSection[0].style.visibility = currentInstance.useName ? "" : "hidden";
        nameSection[0].style.display = currentInstance.useName ? "block" : "none";

        emailSection[0].style.visibility = currentInstance.useEmail ? "" : "hidden";
        emailSection[0].style.display = currentInstance.useEmail ? "block" : "none";

        // **************************************************************

        // **************************************************************
        // Setup the labels

        ///jQuery("style#whamxStyleOverride").length > 0
        //            var lblPhoneNumber = widget.find('span#lblPhoneNumber').html(this.labelPhoneNumber);
        //            var lblEmail = widget.find('span#lblEmail').html(this.labelEmail);
        //            var lblName = widget.find('span#lblName').html(this.labelName);
        //            widget.find('a#lbResult').html("Save Contact");


        if (currentInstance.labelSave == '###DEFAULT_IMAGE_BUTTON###') {
            widget.find('a#lbResult' + param).css("background-image", "url(http://www.mobilemarketingapp.com/images/submit.gif)");
            widget.find('a#lbResult' + param).attr("title", currentInstance.labelSave);
        }

        var backgroundPhoneNumber = widget.find('span#lblPhoneNumber' + param).css("background-image");
        var backgroundEmail = widget.find('span#lblEmail' + param).css("background-image");
        var backgroundName = widget.find('span#lblName' + param).css("background-image");
        var backgroundSave = widget.find('a#lbResult' + param).css("background-image");

        if (backgroundPhoneNumber == "none") {
            widget.find('span#lblPhoneNumber' + param).html(currentInstance.labelPhoneNumber);
        }
        else {
            widget.find('span#lblPhoneNumber' + param).html("&nbsp;");
            widget.find('span#lblPhoneNumber' + param).attr("title", currentInstance.labelPhoneNumber);
        }

        if (backgroundEmail == "none") {
            widget.find('span#lblEmail' + param).html(currentInstance.labelEmail);
        }
        else {
            widget.find('span#lblEmail' + param).html("&nbsp;");
            widget.find('span#lblEmail' + param).attr("title", currentInstance.labelEmail);
        }

        if (backgroundName == "none") {
            widget.find('span#lblName' + param).html(currentInstance.labelName);
        } else {
            widget.find('span#lblName' + param).html("&nbsp;");
            widget.find('span#lblName' + param).attr("title", currentInstance.labelName);
        }

        if (backgroundSave == "none") {
            widget.find('a#lbResult' + param).html(currentInstance.labelSave);
        }
        else {


            backgroundSave = backgroundSave.replace("url(\"", "");
            backgroundSave = backgroundSave.replace("\")", "");

            var s = widget.find('a#lbResult' + param).css("background-image");
            s = s.substring(4, s.length - 1);

            if (s.charAt(0) == "\"") {
                s = s.slice(1, s.length - 1);
            }

            //widget.find('a#lbResult').css("background-image", "none");
            //widget.find('a#lbResult').append("<img src='" + s + "' border='0'>");

            //widget.find('a#lbResult').html("&nbsp;");

            //widget.find('a#lbResult').append("<img src='" + s +"' style='width:100%;height:100%' border='0'>");

            widget.find('a#lbResult' + param).css("background-image", "none");
            widget.find('a#lbResult' + param).append("<img src='" + s + "'  border='0'>");

            widget.find('a#lbResult' + param).attr("title", currentInstance.labelSave);
        }




        // **************************************************************

        // this function is OnClick event for the link
        jQuery('div#whamxSubscriberWidget' + masterParam).find('a#lbResult' + param).click(function() {

            var btn = jQuery(this);

            var s = theContainer.selector;
            var param = "_" + s.substring("div#subscriberContainer_".length, s.length);

            var widget = jQuery('div#whamxSubscriberWidget' + param);

            param = "";

            widget.find('*').addClass("processing");
            widget.find("span#error" + param).html("");

            var arg1 = widget.find('input#txtPhoneArg1' + param)[0].value;
            var arg2 = widget.find('input#txtPhoneArg2' + param)[0].value;
            var arg3 = widget.find('input#txtPhoneArg3' + param)[0].value;

            var phoneNumber = arg1 + "-" + arg2 + "-" + arg3;
            var rePhone = /\d{3}\-\d{3}\-\d{4}/;

            var email = widget.find('input#txtEmail' + param)[0].value;
            var reEmail = /^(?:\w+\.?)*\w+@(?:\w+\.)+\w+$/;

            var name = widget.find('input#txtName' + param)[0].value;

            if (rePhone.test(phoneNumber)) {

                if (this.useEmail && email.length > 0 && !reEmail.test(email)) {
                    widget.find("span#errorEmail" + param).html("*");
                }
                else {

                    // this.host has the parameter passed from the containing page

                    currentInstance.jsonpcall("Service.svc/SendPromo",
                                ["promoId", currentInstance.host, "phoneNumber", phoneNumber, "name", name, "email", email, "network", ""],
                                function(result) {

                                    if (result.Error == null) {

                                        //widget.find("span#result").html(result.Value);
                                        widget.find("span#result" + param).html(currentInstance.confirmationMessage);
                                        widget.find("span#result" + param).fadeOut(4000);

                                        // clear the form
                                        widget.find('input#txtPhoneArg1' + param)[0].value = "";
                                        widget.find('input#txtPhoneArg2' + param)[0].value = "";
                                        widget.find('input#txtPhoneArg3' + param)[0].value = "";
                                        widget.find('input#txtEmail' + param)[0].value = "";
                                        widget.find('input#txtName' + param)[0].value = "";

                                        widget.find("span#error" + param).html("");
                                        widget.find("span#errorPhoneNumber" + param).html("");
                                        widget.find("span#errorEmail" + param).html("");
                                    }
                                    else {
                                        widget.find("span#result" + param).html("Error");
                                        widget.find("span#error" + param).html(result.Error);
                                    }

                                    widget.find('*').removeClass("processing");

                                });

                    return false;

                }

            }
            else {

                // not a valid phone number
                widget.find("span#errorPhoneNumber" + param).html("*");
            }
        });

        // initializing the widget.
        // nothing for now.
    }
}


        
