(function($) {

var defaults = {
    ajaxLoad: {
		type: "POST",
        url: null,
        data: null,
        extraParams: {},
        successFn: function(){
            return "successFn not implemented"
        },
        errorFn: function(e1, e2, e3) {
            alert("Ajax request exception, " + e1 + ", " + e2 + ", " + e3);
        }
    },       
    ajaxSubmit: {
        submitBtn: "input[type=submit], .submitRequest",
        cancelBtn: null,
        type: "POST",
        url: null,
        extraParams: {},
        dataSource: null,
        successFn: function(){
            return "Submit SuccessFn not implemented"
        },
        errorFn: function(e1, e2, e3) {
            alert("Ajax request exception, " + e1 + ", " + e2 + ", " + e3);
        }
    },
    processing: ".processing",
	width: null,
    zIndex: null,
    oneInstance: true,
    addClass: false,
    fixed: true,
    top: "center",
    left: "center",
    close: '.closePopUp',
    noCache: false,
    load: true,
    target: null
};

$.fn.popUp = function(options) {

	var settings = $.extend(true, {}, defaults, options),
		self = $(this);

    var popUp = (settings.target) ? $(settings.target) : self;

    // if self is just a trigger, then initialization only
    if (settings.target)
    settings.load = false;

    var processing = popUp.find(settings.processing);

    self.overlay({
        onBeforeLoad: function(){

            var popUpApi = this;
            var popUp = popUpApi.getOverlay();
			var ajaxLoadUrl = settings.ajaxLoad.url;

            // Set popUp properties
            if (settings.width) {
				popUp.width(settings.width);
			}
            if (settings.zIndex) {
				popUp.css("z-index", settings.zIndex);
			}
            if (settings.addClass) {
				popUp.addClass(settings.addClass);
			}
				
			if ( typeof ajaxLoadUrl == 'function' ) {
				ajaxLoadUrl = settings.ajaxLoad.url();
			}

            // Get popUp via Ajax
            if(ajaxLoadUrl && popUp.find("div[id$=Inner]").children().size() == 0) {
                processing.show();

                // Collect Extra Params from trigger-button (or popUp itself) attributes
                var extraParams = "";
                $.each(settings.ajaxLoad.extraParams, function(k,v){
                    extraParams += "&" + k + "=" + self.attr(v)
                });

                $.ajax({
                    url: ajaxLoadUrl + extraParams,
                    type: settings.ajaxLoad.type,
                    //data: settings.ajaxLoad.data,
					data: (typeof settings.ajaxLoad.data == "function") ? settings.ajaxLoad.data() : settings.ajaxLoad.data,
                    success: function(result){
                        processing.hide();
                        popUp.find("div[id$=Inner]").html(result);
                        settings.ajaxLoad.successFn(result);
                        handleButtons();
                        popUpApi.load();
                    },
                    error: settings.ajaxLoad.errorFn
                });
            } else {
                processing.hide();
            }
			
			function checkCatalogRequestForm( form ) {
				var els = form && form.elements;
				var required = [ 'CatalogRequestForm_FirstName', 'CatalogRequestForm_LastName', 
					'CatalogRequestForm_Street', 'CatalogRequestForm_City', 'CatalogRequestForm_State',
					'CatalogRequestForm_ZipCode', 'CatalogRequestForm_Phone', 'CatalogRequestForm_Email' ];
				
				if ( els.length ) {
					var country = $(els[ 'CatalogRequestForm_Country' ]).val();
					
					for ( var i in required ) {
						var fieldName = required[ i ];
						var fieldValue = $.trim( $(els[ fieldName ]).val() );
						
						if ( fieldName === 'CatalogRequestForm_State' ) {
							if ( country === 'United States' && ( ! fieldValue || fieldValue === 'select one' ) ) {
								return false;
							}
						}
						else if ( ! fieldValue ) {
							return false;
						}
					}
					
					return true;
				}
				
				return false;
			}

            function handleButtons() {
                // Handle Cancel Button
                popUp.find(settings.ajaxSubmit.cancelBtn).click(function(e){
                    popUpApi.close(e)
                });

                if(!settings.ajaxSubmit.url) return;
                
                // Handle Submit Button
                popUp.find(settings.ajaxSubmit.submitBtn).click(function(e){
			
                    var button = $(this);
                    e.preventDefault();
                    processing.show();

                    var extraParams = "";
                    var ajaxData = settings.ajaxSubmit.dataSource;
						
                    // Collect Extra Params from trigger-button attributes
                    $.each(settings.ajaxSubmit.extraParams, function(k,v){
                        extraParams += "&" + k + "=" + button.attr(v)
                    });
					
					var url = settings.ajaxSubmit.url + extraParams;
					var $dataForm = $(settings.ajaxSubmit.dataSource);
					
					// Collect data
					if ( $dataForm.is("form") ) {
						ajaxData = $dataForm.serialize();
						var sitebranding = $dataForm.find('input[name=CatalogRequestForm_Catalog]:checked').val();
						
						if ( checkCatalogRequestForm($dataForm[0]) && ! sitebranding ) {
							processing.hide();
							return false;
						}
						
						if ( ! /[?&]sitebranding=/.test( url ) ) {
							url += url.lastIndexOf('?') > -1 ? '&' : '?';
							url += 'sitebranding=' + sitebranding;
						}
					}

                    $.ajax({
                        url: url,
                        type: settings.ajaxSubmit.type,
                        data: ajaxData,
                        success: function(result){
							var brand = $(settings.ajaxSubmit.brandSelector).val();
							processing.hide();
                            popUp.find("div[id$=Inner]").html(result);
                            handleButtons();
                            settings.ajaxSubmit.successFn(result, brand);
                        },
                        error: settings.ajaxSubmit.errorFn
                    });
                });
            }

            /*
            // Get popUp via Ajax
            if(settings.ajaxLoad.url && popUp.find("div[id$=Inner]").children().size() == 0) {
                processing.show();

                // Collect Extra Params from trigger-button (or popUp itself) attributes
                var extraParams = "";
                $.each(settings.ajaxLoad.extraParams, function(k,v){
                    extraParams += "&" + k + "=" + self.attr(v)
                });

                $.ajax({
                    url: settings.ajaxLoad.url + extraParams,
                    type: settings.ajaxLoad.type,
                    data: settings.ajaxLoad.data,
                    success: function(result){
                        processing.hide();
                        popUp.find("div[id$=Inner]").html(result);
                        settings.ajaxLoad.successFn(result);
                        handleButtons();
                    },
                    error: settings.ajaxLoad.errorFn
                });
            } else {
                processing.hide();
            }
            */
        },
        onClose: function(){
            // clear popUp if noCache in settings is true
            if (settings.noCache) {
                var popUp = this.getOverlay();
                popUp.find("div[id$=Inner]").empty();
                popUp.data("overlay", false);
            }
        },
        closeOnClick: settings.closeOnClick,
        fixed: settings.fixed,
        top: settings.top,
        left: settings.left,
        oneInstance: settings.oneInstance,
        close: settings.close,
        target: settings.target,
        load: settings.load
    });

}

})(jQuery);
