Umbraco.Sys.registerNamespace("Umbraco.Dialogs");

(function ($) {

    // register AssignDomain dialog
    Umbraco.Dialogs.AssignDomain2 = base2.Base.extend({
        
        _opts: null,
        
        _isRepeated: function (element) {
            var inputs = $('form input.domain');
            var elementName = element.attr('name');
            var repeated = false;
            inputs.each(function() {
                var input = $(this);
                if (input.attr('name') != elementName && input.val() == element.val())
                    repeated = true;
            });
            return repeated;
        },

        // constructor
        constructor: function (opts) {
            // merge options with default
            this._opts = $.extend({
                invalidDomain: 'Invalid domain.',
                duplicateDomain: 'Domain has already been assigned.'
            }, opts);
        },

        // public methods/variables

        languages: null,
        language: null,
        domains: null,

        addDomain: function () {
            this.domains.push({
                Name: "",
                Lang: ""
            });
        },
      
        init: function () {
            var self = this;
            
            self.domains = ko.observableArray(self._opts.domains);
            self.languages = self._opts.languages;
            self.language = self._opts.language;
            self.removeDomain = function() { self.domains.remove(this); };

            ko.applyBindings(self);

            $.validator.addMethod("domain", function (value, element, param) {
                // beware! encode('test') == 'test-'
                // read eg https://rt.cpan.org/Public/Bug/Display.html?id=94347
                value = punycode.encode(value);
                // that regex is best-effort and certainly not exact
                var re = /^(http[s]?:\/\/)?([-\w]+(\.[-\w]+)*)(:\d+)?(\/[-\w]*|-)?$/gi;
                var isopt = this.optional(element);
                var retest = re.test(value);
                var ret = isopt || retest;
                return ret;
            }, self._opts.invalidDomain);

            $.validator.addMethod("duplicate", function (value, element, param) {
                return $(element).nextAll('input').val() == 0 && !self._isRepeated($(element));
            }, self._opts.duplicateDomain);
            
            $.validator.addClassRules({
                domain: { domain: true },
                duplicate: { duplicate: true }
            });

            $('form').validate({
                debug: true,
                focusCleanup: true,
                onkeyup: false
            });

            $('form input.domain').live('focus', function(event) {
                if (event.type != 'focusin') return;
                $(this).nextAll('input').val(0);
            });
            
            // force validation *now*
            $('form').valid();

            $('#btnSave').click(function () {
                if (!$('form').valid())
                    return false;
                
                var mask = $('#komask');
                var masked = mask.parent();
                mask.height(masked.height());
                mask.width(masked.width());
                mask.show();
                
                var data = { nodeId: self._opts.nodeId, language: self.language ? self.language : 0, domains: self.domains };
                $.post(self._opts.restServiceLocation + 'SaveLanguageAndDomains', ko.toJSON(data), function (json) {
                    mask.hide();

                    if (json.Valid) {
                        UmbClientMgr.closeModalWindow();
                    }
                    else {
                        var inputs = $('form input.domain');
                        inputs.each(function() { $(this).nextAll('input').val(0); });
                        for (var i = 0; i < json.Domains.length; i++) {
                            var d = json.Domains[i];
                            if (d.Duplicate == 1)
                                inputs.each(function() {
                                    var input = $(this);
                                    if (input.val() == d.Name)
                                        input.nextAll('input').val(1);
                                });
                        }
                        $('form').valid();
                    }
                })
                .fail(function (xhr, textStatus, errorThrown) {
                    mask.css('opacity', 1).css('color', "#ff0000").html(xhr.responseText);
                });
                return false;
            });
        }

    });

    // set defaults for jQuery ajax calls
    $.ajaxSetup({
        dataType: 'json',
        cache: false,
        contentType: 'application/json; charset=utf-8'
    });
    
})(jQuery);
