
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={
                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(){
                    $(document).trigger('hookAjaxAddToCartSubmit',[form,obj]);
                    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'));
    }   // esc
}

function GetCurrencyStandardDefs() {
  
  var defsMatch = "1 000 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;
}

