(function($){
    
    $.extend($.fn.dfield.defaults, {
        stateTxt: "",
        stateCss: ""
    });
    
    // initialize the cache variables if not yet defined
    window.ws = window.ws || {};
    ws.cc = ws.cc ||{};
    ws.cc.info = ws.cc.info || {};
    ws.jr = ws.jr || {};
    ws.jr.info = ws.jr.info || {};
    ws.stateRequired = true;

    vmf.dfield.populateCountry = function(settings){
        var $this = $(this);
        var country = $this.val().toLowerCase().replace(/ /g, "_");
        var phoneCode = $this.attr("phone_code_id");
        var astersIds = $this.attr("asterisk_id");
        var asters = astersIds.split(",");
        var asterisk = asters[0];
        var zipAsterisk = asters[1];
        var state = $this.attr("state_id");
        var postalCode = $this.attr("postal_code_id");
        var isoCode = $this.attr("iso_code_id");
        var localNumber = $this.attr("local_number_id");
        var disableState = function(isDisabled){
            $("#" + state).html("<input type='text' id='state' name='state' value='" + settings.stateTxt + "' class='" + settings.stateCss + "'" + (isDisabled ? " disabled='disabled' " : "") + "/>");
            $("#" + asterisk).hide();
            $("#" + zipAsterisk).hide();
            if(isDisabled)
                $("#" + postalCode).attr("disabled", "disabled");
            else
                $("#" + postalCode).removeAttr("disabled");
            ws.stateRequired = false;
        };
        
        var loadStates = function(i){
            settings = settings || {};
            if (i && i.state && i.state.length > 0) {
                var html = [];
                html.push("<select id='state' name='state' class='" + settings.stateCss + "'>");
                for (var j = 0; j < i.state.length; j++) {
                    html.push("<option value='" + i.state[j] + "'" + (settings.value == i.state[j] ? " selected='selected' " : "") + ">" + i.stateName[j] + "</option>");
                }
                html.push("</select>");
                $("#" + state).html(html.join(""));
                $("#" + asterisk).show();
                $("#" + zipAsterisk).show();
                $("#" + postalCode).removeAttr("disabled");
                ws.stateRequired = true;
            }
            else {
                disableState(settings.disableFields);
            }
        };
        
        var loadLocalPhoneNumbers = function(i) {
            if (i === undefined || i === null) { i = ws.cc.info["global"]; }
            // a country has been chosen, so clear any error
            jQuery('#con_country').removeClass('box-selected').css({'marginTop':'1px'});
            jQuery('#error_country').hide();
            // check for DOM element with phone number to replace
            if ($('#'+localNumber).size() >= 1) {
                // grab and store the default english phone number
                var defaultNumber = $('#local-phone-default').text();
                if (defaultNumber) {
                    ws.cc.info["global"] = {
                        englishLanguageSupport: defaultNumber
                    };
                }
                // clear out any old numbers
                $('#'+localNumber+' ul li').remove();
                // check for local english data
                if (("englishLanguageSupport" in i) && i.englishLanguageSupport !== null) {
                    // add english support phone numbers
                    if ($.isArray(i.englishLanguageSupport)) {
                        $.each(i.englishLanguageSupport, function() {
                            // add each english phone number to the first ul tag
                            $('#'+localNumber+' ul:first').append("<li>"+this+"</li>");
                        });
                    } else {
                        // treat data as a string
                        $('#'+localNumber+' ul:first').append("<li>"+i.englishLanguageSupport+"</li>");
                    }
                } else {
                    // add default english number
                    $('#'+localNumber+' ul:first').append("<li>"+ws.cc.info.global.englishLanguageSupport+"</li>");
                }
                // check for local language data
                if (("localLanguageSupport" in i) && i.localLanguageSupport !== null) {
                    // add local language support phone numbers
                    // check if data is an array
                    if ($.isArray(i.localLanguageSupport)) {
                        $.each(i.localLanguageSupport, function() {
                            // add each local language phone number to the second ul tag
                            $('#'+localNumber+' ul:eq(1)').append("<li>"+this+"</li>");
                        });
                    } else {
                        // treat data as a string
                        $('#'+localNumber+' ul:eq(1)').append("<li>"+i.localLanguageSupport+"</li>");
                    }
                    // reveal the local lanuage phone numbers
                    $('#'+localNumber+' div:hidden').show();
                } else {
                    // hide the local lanuage phone numbers
                    $('#'+localNumber+' div:eq(3)').hide();
                }
                // reveal local phone numbers
                $('#'+localNumber).fadeIn('slow');
                // adjust the fields if an error message overlaps
                var marginTop = 1;
				if ($('#error_fname:visible').height() > 0) {
					var fnameOffset = $('#con_fname').offset().top;
					var fnameMarginTop = parseInt($('#con_fname').css('marginTop'), 10);
					var callusOffset = $('#form-reg-local-phone').offset().top;
					var callusHeight = $('#form-reg-local-phone').height();
					marginTop = callusOffset + callusHeight - fnameOffset + fnameMarginTop;
				}
				if (marginTop < 0) {
				    marginTop = 1;
				}
				$('#con_fname, #error_fname').animate({'marginTop':marginTop+'px'}, 'fast');
            }
        };
        
        var populate = function(scriptResponse){
            // evaluate script response if country not set
            if (!ws.cc.info[country] && typeof scriptResponse != 'undefined') { eval(scriptResponse); }
            var i = ws.cc.info[country];
            // $("#" + phoneCode).val(i.phoneCode).trigger("change");
            if (i && i.isoCode) {
                $("#" + isoCode).val(i.isoCode);
            }
            if (localNumber) {
                loadLocalPhoneNumbers(i);
            }
            settings.disableFields = (country == "select_one" || country == "") ? true : false;
            loadStates(i, settings);
        };
        
        // check if country is empty, aka the user re-selected 'select one'
        if ((country != "") && (country != "Select One") && (!ws.cc.info[country])) {
            $.ajax({
                cache: false,
                dataType: 'script',
                url: $.fn.dfield.defaults.url + country + ".js",
                success: populate
            });
        } else {
            populate();
        }
    };
    vmf.dfield.populateDepartment = function(settings){
        settings = settings || {};
        var $this = $(this);
        var $jobRole = $("#" + $this.attr("job_role_id"));
        var $focus = $("#" + $this.attr("focus_id"));
        var $posLevel = $("#" + $this.attr("position_level_id"));
        var dept = $this.val();
        $.ajax({
            cache: false,
            dataType: 'script',
            url: $.fn.dfield.defaults.url + "job_role.js",
            success: function(){
                var i = ws.jr.info[dept];
                if (i) {
                    var html = [];
                    var val = "";
                    for (var j = 0; j < i.length; j++) {
                        val = ('value' in i[j].role) ? i[j].role.value : i[j].role;
                        html.push("<option value='" + val + "'" + (settings.value == val ? " selected='selected' " : "") + ">" + (i[j].role.label || i[j].role) + "</option>");
                    }
                    var $role = $(html.join(""));
                    $jobRole.empty().append($role);
                    //$focus.val(i[0].jobFocus);
                    //$posLevel.val(i[0].posLevel);
                    // TW: Removed the focus and position level population   
                    $role.change(function(){
                        $focus.val(i[this.selectedIndex].jobFocus);
                        $posLevel.val(i[this.selectedIndex].posLevel);
                    });
                    
                }else{
                    $jobRole.empty().append($("<option>--</option>"));
                }
            }
        });
        
    };
    
    vmf.dfield.prefill = function(){
    };
    
    vmf.dfield.initShortForm = function(){
        vmf.dfield.build("Salutation", {
            value: ws.pf["Salutation"]
        });
        
        vmf.dfield.build("Country", {
            onChange: vmf.dfield.populateCountry,
            value: ws.pf["Country"]
        });
    };
    
    vmf.dfield.initLongForm = function(){
        
        vmf.dfield.build("salutation", {
            value: $("#pp_Salutation").val()
        });
        
        vmf.dfield.build("country", {
            onChange: vmf.dfield.populateCountry,
            value: $("#pp_Country").val(),
            success: function(){
                if($("#pp_Country").val() !== "")
                    vmf.dfield.populateCountry.call(document.getElementById("country"), {value: $("#pp_State").val()});
            }
        });
        
        if($("#pp_Country").val() === ""){
            $("#state").attr("disabled", "disabled");
            $("#zip").attr("disabled", "disabled");
        }

        vmf.dfield.build("department", {
            onChange: vmf.dfield.populateDepartment,
            value: $("#pp_role_type").val(),
            success: function(){
                if($("#pp_jobrole").val() !== "")
                    vmf.dfield.populateDepartment.call(document.getElementById("department"), {value:$("#pp_jobrole").val()});
            }
        });
        
        vmf.dfield.build("industry", {
            value: $("#pp_Industry").val()
        });
        
        vmf.dfield.build("numberEmployeesGlobal", {
            value: $("#pp_number_employees").val()
        });
        
        vmf.dfield.build("numberEmployeesCountry", {
            value: $("#pp_number_employees_in_country").val()
        });
        
        vmf.dfield.build("numberServers", {
            value: $("#pp_number_servers").val()
        });
        
        vmf.dfield.build("numberDesktops", {
            value: $("#pp_number_desktops").val()
        });
        
        vmf.dfield.build("virtualizationbudget", {
            value: $("#pp_defined_budget").val()
        });
        
        vmf.dfield.build("refreshservers", {
            value: $("#pp_server_refresh").val()
        });
        vmf.dfield.build("resfreshdesktops", {
            value: $("#pp_desktop_refresh").val()
        });
        vmf.dfield.build("relationshipVMware", {
            value: $("#pp_visitor_type").val()
        });
        
        vmf.dfield.build("language", {
            value: $("#pp_language").val()
        });
        
    };
        
    $(function(){
        var forms = $("form");
        var $form = null;
        for (var i = 0; i < forms.length; i++) {
            $form = $(forms[i]);
            switch ($form.attr("dfield")) {
                case "longForm":
                    vmf.dfield.initLongForm();
                    break;
                case "shortForm":
                    vmf.dfield.initShortForm();
                    break;
                default:
                break;
            }
        }
        var ppBusinessPhone = $("#pp_businessPhone").val();
        if( ppBusinessPhone !== ""){
            $("#businessPhoneSpan").html("<input type='text' name='contactBusinessPhone' size='30' value='" + ppBusinessPhone + "' />");
        }else{
            var $countryCode = $("#CountryCode");
            var $businessPhone = $("#BusinessPhone");
            var $contactPhone = $("#ContactBusinessPhone");
            var combinePhone = function(){
                $contactPhone.val($countryCode.val() + $businessPhone.val());
            };
            $businessPhone.change(combinePhone);
            $countryCode.change(combinePhone);
        } 
    });
    
    
})(jQuery);

