
function GeneralFormPopUp(params){
    var buttons ={};
    var form;

    var destroy=function(dlg){
        dlg.dialog('destroy').remove();
        $('body').find('.wrapper').removeClass('wrapper-blur');
        $('body').find('.wrapper-footer').removeClass('wrapper-blur');
    };

    if(params =='' || params === undefined){
        params={};
    }

    if(params['query_params'] =='' || params['query_params'] === undefined){
        params['query_params']={};
    }

    /*check input parameters*/
    if(params['action'] =='' || params['action'] === undefined){
        params['action']='/';
    }

    params['reload_url']=params['reload_url']||'';

    if(parseInt(params['width']) < 1){
        params['width']=500;
    }

    $('body').append('<div class="GeneralFormPopUp"></div>');

    params['REQUEST_FROM_FACEBOX']=1;
    $('.GeneralFormPopUp').load(params['action'],params['query_params'],function(){

        var dlg=$(this);

        form=dlg.find('form');

        var showResponse = function(responseText, statusText, xhr)  {
            var result;
            var errorfound=0;

            /*try to find the input fields that have errors and mark them in the dialog*/
            $(responseText).find('.errfield').each(function(){
                $(this).find('input').each(function(){
                    var input=form.find("[name='"+$(this).attr('name')+"']");
                    var div_container=input.closest('div');
                    div_container.addClass('errfield');
                    div_container.append('<span class="text-error">Fältet måste fyllas i</span>');
                });
            });

            /*try to find an error message on the result page and print it in the dialog*/
            $(responseText).find('.msg-error').each(function(){
                form.append('<div class="msg-error">'+$(this).html()+'</div>');
                errorfound=1;
            });

            if(errorfound == 0){
                /*close dialog and load the page that is in the forms action*/
                destroy(dlg);

                if(params['formCallback']){
                    params['formCallback'](form);
                }

                if(params['callback']){
                    params['callback'](responseText);
                }

                if(params['reload_url']){
                    location.href=params['reload_url'];
                }
            }
        }

        /*add ajax function to the form*/
        var options = {
            success: showResponse
        }

        form.submit(function(e){
            if(e.target.onsubmit){
                if(e.target.onsubmit()){
                    $(this).ajaxSubmit(options);
                }
                return false;
            }
            $(this).ajaxSubmit(options);
            return false;
        });

        /*find all buttons in the form and add them as buttons in the dialog*/
        $($(this).find('.button').get().reverse()).each(function(){

            var action=$(this).attr('name');
            $(this).hide();

            if(action !='CANCEL'){
                buttons[$(this).val()]=function() {
                    form.append('<input type="hidden" name="'+action+'" value="1"/>');
                    form.submit();
                };
            }
        });

        /*add a default cancel button*/
        buttons['Avbryt']=function() {
            destroy($(this));
        };

        var dialog_params={
            resizable: false,
            modal: true,
            width: parseInt(params['width']),
            buttons: buttons,
            close: function(){
                destroy($(this));
            },
            open:function () {
                var dlg=$(this);
                var uiDialog=$(this).closest(".ui-dialog");
                var button=uiDialog
                    .find("[type=button]");
                button.addClass("button");
                button.unbind('mouseenter mouseleave');
                button.unbind('focus');
                button.removeClass('ui-state-default');
                $('body').find('.wrapper').addClass('wrapper-blur');
                $('body').find('.wrapper-footer').addClass('wrapper-blur');
                $('.ui-widget-overlay').bind('click',function(){
                    destroy(dlg);
                })
            }
        };

        if(params.dialogClass){
            dialog_params.dialogClass=params.dialogClass;
        }

        $('.GeneralFormPopUp').dialog(dialog_params);
    });
}

function form_validate_general(obj,callback,params){
    var result=true;

    if(params===undefined){
        params={};
    }

    var form;
    if(obj.is( "form" )){
        form = obj;
    }else{
        form = obj.closest('form');
    }

    form.find('input').each(function(){

        if($(this).attr('data-required')){

            $(this).click();
            if($(this).val() == $(this).attr('data-default') || $(this).val()==''){
                $(this).closest('div').addClass('errfield');
                $(this).val($(this).attr('data-default'));
                result=false;
            }else{
                $(this).closest('div').removeClass('errfield');
            }
        }
    });

    form.find('textarea').each(function(){

        if($(this).attr('data-required')){

            $(this).click();

            if($(this).val() == $(this).attr('data-default') || $(this).val()==''){
                $(this).closest('div').addClass('errfield');
                $(this).val($(this).attr('data-default'));
                result=false;
            }else{
                $(this).closest('div').removeClass('errfield');
            }
        }
    });

    if(result){
        if(callback!==undefined){
            callback(params['image'],params['form']);
        }

        var error=form.find('.msg-error');
        if(error.length>0){
            error.remove();
        }

    }else{

        var error=form.find('.error');
        if(error.length<1){
            form.append('<div class="msg-error"></div>');
            error=form.find('.msg-error');
        }

        error.html('Obligatoriskt fält saknar värde');
        $("html, body").scrollTop(form.offset().top-50);

        if(params['image']!==undefined){
            $('#'+params['image']).hide();
        }
    }

    return result;
}

function ajaxAddToCart(opt){
    opt=opt||{};

    if(opt.defaultOpen==undefined){
        if(''=='1'){
            opt.defaultOpen=1;
        }else{
            opt.defaultOpen=0;
        }
    }

    var updateForm = function(obj,callback){
        var form=obj.closest('form');
        var buttoncontainer=obj;

        form.find('[type="submit"]').each(function(){
            var submitbutton=$(this);
            if(form.find('[name="'+submitbutton.attr('name')+'"][type="hidden"]').length<1){
                submitbutton.bind('click',function(){
                    form.append('<input type="hidden" name="'+submitbutton.attr('name')+'" value="1"/>');
                });
            }
        });

        var submitFunction=function(){
            var tmpValue;
            var options={
                beforeSerialize: function(jqForm, options) {
                  var beforeserialize = jqForm.attr("data-beforeserialize");
                  if(beforeserialize && beforeserialize.length) {
                    if(typeof(beforeserialize) == "string") {
                      return eval(beforeserialize+"(jqForm)");
                    }
                    if(typeof(beforeserialize) == "function") {
                      return beforeserialize(jqForm);
                    }
                  }
                },
                beforeSubmit:  function(formData, jqForm, options){

                    if(form.attr('onsubmit')){
                        if(!validateForm(form)){
                            return false;
                        }
                    }

                    if(buttoncontainer.find('.iconset-spinner').length<1){
                        if(opt.replaceButtonText){
                            tmpValue=obj.html()
                            obj.html('<i class="iconset iconset-spinner iconset-spin" style="margin-left: 4px;"></i>');
                        }else{
                            obj.append('<i class="iconset iconset-spinner iconset-spin" style="margin-left: 4px;"></i>');
                        }

                    }
                },
                success: function(){
                    var what2add = {};
                    var names = ["id", "qty", "qualifier", "qualifier2", "product_id"];
                    var regex_names = ["input_[0-9]+"];
                    for(var i = 0; i < form.length; i++) {
                      var field = form[i];
                      for(var j = 0; j < field.length; j++) {
                        var item = field[j];
                        if(item["name"]) {
                          var lcName = item["name"].toLowerCase();
                          if(names.indexOf(lcName) < 0) {
                            for(var r in regex_names) {
                              var regex = regex_names[r];
                              regex = regex.replace(/\*/, '.*');
                              if(lcName.match(regex)) {
                                names.push(lcName);
                              }
                            }
                          }
                          if(names.indexOf(lcName) >= 0) {
                            if(what2add[lcName]) {
                              what2add[lcName].push(item["value"]);
                            } else {
                              what2add[lcName] = [item["value"]];
                            }
                          }
                        }
                      }
                    }
                    if(what2add["id"]) {
                      what2add["_pairs"] = [];
                      for(var i in what2add["id"]) {
                        var item = {};
                        for(var j in names) {
                          var name = names[j];
                          if(what2add[name]) {
                            item[name] = what2add[name][i];
                          }
                        }
                        what2add["_pairs"].push(item);
                      }
                    }

                    $(document).trigger('hookAjaxAddToCartSubmit',[form,obj,what2add]);
                    reloadCartContainers('UPDATE_CART',opt);
                    if(opt.replaceButtonText){
                        obj.html(tmpValue);
                    }else{
                        buttoncontainer.find('.iconset-spinner').remove();
                    }
                    if(callback) callback();
                }

            };

            form.ajaxSubmit(options);
            return false;
        };

        form.unbind('submit',submitFunction);


        form.submit(submitFunction);


    };

    $('body').find('[name="ADD_TO_CART"][type="submit"]').each(function(){updateForm($(this))});
    $('body').find('[name="ADD_GIFTCERT_TO_CART"][type="submit"]').each(function(){updateForm($(this))});
}

function cartESCTrigger(e){
    if (e.keyCode == 27) {
        MiniCartClose($('.ml-cart-top-dropdown-container'));
    }   // esc
}

function GetCurrencyStandardDefs() {
  
  var defsMatch = "1000 Kr".match(/^(.*)1([^0]*)000(([^0])(0+))?([^0].*)?/);
  var defs;
  if(defsMatch) {
    defs = {};
    defs.prefix = defsMatch[1]?defsMatch[1]:"";
    defs.thousand_sep = defsMatch[2]?defsMatch[2]:"";
    defs.decimal_sep = defsMatch[4]?defsMatch[4]:"";
    defs.decimals = defsMatch[5]?defsMatch[5].length:0;
    defs.suffix = defsMatch[6]?defsMatch[6]:"";
  }
  return defs;
}

function FormatPriceString(value, defs) {
  if(!defs) {
    defs = GetCurrencyStandardDefs();
  }
  var isNegative = false;
  var s = "";
  var intValue = Math.abs(parseInt(value));
  if(value < 0) {
    isNegative = true;
  }
  while(intValue > 0) {
    var temp = "" + (intValue % 1000);
    while(temp.length < 3) {
      temp = "0" + temp;
    }
    if(defs.thousand_sep && s.length) {
      s = defs.thousand_sep + s;
    }
    s = temp + s;
    intValue = parseInt(intValue / 1000);
  }
  s = s.replace(/^[\s0]+/g, '');
  if(isNegative) {
    s = "-" + s;
  }
  if(defs.prefix) {
    s = defs.prefix + s;
  }
  if(defs.decimals) {
    s += defs.decimal_sep;
    var decimals = "" + Math.round((Math.abs(value) - Math.abs(parseInt(value))) * Math.pow(10,defs.decimals), 0);
    while(decimals.length < defs.decimals) {
      decimals = "0" + decimals;
    }
    s += decimals;
  }
  if(defs.suffix) {
    s += defs.suffix;
  }
  return s;
}
function captcha_reload_wrap(form) {
    form.find('.captcha-wrap').load('/', {'RUN_INCLUDE': 'rs/rs-captcha-load.htm'}, function() {
        $(this).children(':first').unwrap();
    });
}
function recaptcha_reset(form) {
    let key = '';
    if (form.prop('nodeName').toUpperCase() != 'FORM') {
        form = form.closest('form');
    }
    let element = form.find('.captcha-wrap');
    let id = element.attr('id');
//    grecaptcha.reset(id, {
//        'sitekey': key
//      });
}

window.recaptchaObjectsShadow = window.recaptchaObjects || [];
window.recaptchaLoaded = false;
window.recaptchaObjects = new Proxy(window.recaptchaObjectsShadow, {
    set(target, property, value) {
        target[property] = value;

        // Check if the property is a number
        let propertyAsNumber = parseInt(property);
        if (property.toString() === propertyAsNumber.toString()) {
            if (window.recaptchaLoaded) {
                // Call your function to handle the change
                recaptchaOnload();
            }
        }

        return true;
    }
});

function recaptchaOnload() {
    if (window.recaptchaObjects && window.recaptchaObjects.length > 0) {
        for (let i = 0; i < window.recaptchaObjects.length; i++) {
            let obj = window.recaptchaObjects[i];
            if (obj.id && !obj.recaptchaId && obj.recaptchaId !== 0) {
                obj.recaptchaId = grecaptcha.render(obj.id, {
                    'sitekey': obj.sitekey,
                    'size': obj.size,
                    'callback': function(token) {
                        const recaptchaObject = $("#" + obj.id);
                        recaptcha_append_token(recaptchaObject.closest('form'), token);
                    }
                });
            }
        }
    }
    window.recaptchaLoaded = true;
}

function recaptchav3_onload() {
    
}

function recaptcha_append_token(form, token) {
    var token_input = "g-recaptcha-response";
    if( ! form.find('[name='+token_input+']').length ) {
        form.append('<input type="hidden" name="'+token_input+'" value="'+token+'"/>');
    } else {
        form.find('input[name='+token_input+']').val(token);
        form.find('textarea[name='+token_input+']').text(token);
    }
}
function recaptchav3_append_token(form, token) {
    var token_input = "token";
    if( ! form.find('[name='+token_input+']').length ) {
        form.append('<input type="hidden" name="'+token_input+'" value="'+token+'"/>');
    } else {
        form.find('[name='+token_input+']').val(token);
    }
}
function recaptcha_check_and_submit(eventObject) {
    // Get the form
    let form = $(eventObject.parentNode).closest('form');
    // Check if the form has a data-submit attribute
    let submit = $(eventObject).attr('data-submit');
    // If there is a data-click-selector attribute, use it to find the button to click
    let clickSelector = $(eventObject).attr('data-click-selector');
    if (clickSelector === undefined) {
        clickSelector = 'input[type="submit"]';
    }
    // Check if the form has a data-submit-feedback attribute
    let callback = $(eventObject).attr('data-submit-feedback');
    if (typeof callback === 'string') {
        if (callback === 'default') {
            callback = recaptchav3_default_feedback;
        } else {
            callback = window[callback];
        }
    }
    if (typeof callback !== 'function') {
        callback = () => {
            // No callback function defined
        };
    }
    // Check if the form has a data-success-msg attribute
    const msg = $(eventObject).attr('data-success-msg') || 'Din förfrågan har skickats!';
    form.attr('data-success-msg', msg);
    // Handle submit based on the data-submit attribute
    if (submit === 'ajax') {
        $(form).ajaxSubmit({
            success: function(data) {
                callback(data, form);
                const recaptchaId = $(eventObject).closest('form').find('.g-recaptcha').attr('id');
                window.recaptchaObjects.forEach(element => {
                    if (element.id == recaptchaId) {
                        grecaptcha.reset(element.recaptchaId);
                    }
                });
            }
        });
    } else if (submit === 'form') {
        form.submit();
    } else if (submit === 'click') {
        $(form).find(clickSelector).trigger('click');
    } else if (submit !== 'none') {
        console.log("No valid submit action defined", submit);
    }
}
function recaptchav3_get_and_set_token(eventObject, callback) {
    grecaptcha.ready(function() {
        // Check if the action attribute is set, otherwise default to 'submit'
        let action = $(eventObject).attr('data-action');
        if (action === undefined) {
            action = 'submit';
        }
        grecaptcha.execute('', {action: action}).then(function(token) {
            let appendSelector = $(eventObject).attr('data-append-selector') || 'form';
            // Append the token to the form
            let form = $(eventObject.parentNode).closest(appendSelector);
            recaptchav3_append_token(form, token);
            if (typeof callback === 'function') {
                callback(token);
            }
        });
    });
}
function recaptchav3_check_and_submit(eventObject) {
    grecaptcha.ready(function() {
        // Check if the action attribute is set, otherwise default to 'submit'
        let action = $(eventObject).attr('data-action');
        if (action === undefined) {
            action = 'submit';
        }
        grecaptcha.execute('', {action: action}).then(function(token) {
            let appendSelector = $(eventObject).attr('data-append-selector') || 'form';
            // Append the token to the form
            let form = $(eventObject.parentNode).closest(appendSelector);
            recaptchav3_append_token(form, token);
            // Check if the form has a data-submit attribute
            let submit = $(eventObject).attr('data-submit');
            // If there is a data-click-selector attribute, use it to find the button to click
            let clickSelector = $(eventObject).attr('data-click-selector');
            if (clickSelector === undefined) {
                clickSelector = 'input[type="submit"]';
            }
            // Check if the form has a data-submit-feedback attribute
            let callback = $(eventObject).attr('data-submit-feedback');
            if (typeof callback === 'string') {
                if (callback === 'default') {
                    callback = recaptchav3_default_feedback;
                } else {
                    callback = window[callback];
                }
            }
            if (typeof callback !== 'function') {
                callback = () => {
                    // No callback defined
                };
            }
            // Check if the form has a data-success-msg attribute
            const msg = $(eventObject).attr('data-success-msg') || 'Din förfrågan har skickats!';
            form.attr('data-success-msg', msg);
            // Handle submit based on the data-submit attribute
            if (submit === 'ajax') {
                $(form).ajaxSubmit({
                    success: function(data) {
                        callback(data, form);
                    }
                });
            } else if (submit === 'form') {
                form.submit();
            } else if (submit === 'click') {
                $(form).find(clickSelector).trigger('click');
            } else if (submit !== 'none') {
                console.log("No valid submit action defined", submit);
            }
        });
    });
}
function recaptchav3_default_feedback(data, form) {
    if (data == "OK") {
        $(form).find('[type="text"]').val("");
        form.append('<div class="msg-success">'+form.attr('data-success-msg')+'</div>');
        form.find($('.msg-error')).remove();
    } else {
        form.find($('.msg-error')).remove();
        if (data == "INVALID_DOMAIN") {
            form.append('<div class="msg-error">Ogiltig domän</div>');
        } else if (data == "INVALID_EMAIL") {
            form.append('<div class="msg-error">Ogiltig e-postadress</div>');
        } else if (data == "FAILED_RECAPTCHA_V3") {
            form.append('<div class="msg-error">Ogiltig enligt Captcha</div>');
        } else {
            form.append('<div class="msg-error">'+data+'</div>');
        }
        
        form.find($('.msg-success')).remove();
    }
    handleFeedbackMessage({'scroll':1});
}
function delete_wishlist_item_confirm() {
    return confirm('Är du säker på att du vill ta bort artikeln från önskelistan?');
}
function delete_wishlist_confirm(wishlist_id) {
    if (confirm('Är du säker på att du vill ta bort önskelistan?')) {
        delete_wishlist(wishlist_id);
    } else {
        return 0;
    }
}
