function sprintf( ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Ash Searle (http://hexmen.com/blog/)
    // + namespaced by: Michael White (http://getsprink.com)
    // +    tweaked by: Jack
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: Paulo Ricardo F. Santos
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: sprintf("%01.2f", 123.1);
    // *     returns 1: 123.10
    // *     example 2: sprintf("[%10s]", 'monkey');
    // *     returns 2: '[    monkey]'
    // *     example 3: sprintf("[%'#10s]", 'monkey');
    // *     returns 3: '[####monkey]'

    var regex = /%%|%(\d+\$)?([-+\'#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;
    var a = arguments, i = 0, format = a[i++];

    // pad()
    var pad = function(str, len, chr, leftJustify) {
        if (!chr) chr = ' ';
        var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
        return leftJustify ? str + padding : padding + str;
    };

    // justify()
    var justify = function(value, prefix, leftJustify, minWidth, zeroPad, customPadChar) {
        var diff = minWidth - value.length;
        if (diff > 0) {
            if (leftJustify || !zeroPad) {
                value = pad(value, minWidth, customPadChar, leftJustify);
            } else {
                value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
            }
        }
        return value;
    };

    // formatBaseX()
    var formatBaseX = function(value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
        // Note: casts negative numbers to positive ones
        var number = value >>> 0;
        prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';
        value = prefix + pad(number.toString(base), precision || 0, '0', false);
        return justify(value, prefix, leftJustify, minWidth, zeroPad);
    };

    // formatString()
    var formatString = function(value, leftJustify, minWidth, precision, zeroPad, customPadChar) {
        if (precision != null) {
            value = value.slice(0, precision);
        }
        return justify(value, '', leftJustify, minWidth, zeroPad, customPadChar);
    };

    // finalFormat()
    var doFormat = function(substring, valueIndex, flags, minWidth, _, precision, type) {
        if (substring == '%%') return '%';

        // parse flags
        var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false, customPadChar = ' ';
        var flagsl = flags.length;
        for (var j = 0; flags && j < flagsl; j++) switch (flags.charAt(j)) {
            case ' ':positivePrefix = ' ';break;
            case '+':positivePrefix = '+';break;
            case '-':leftJustify = true;break;
            case "'":customPadChar = flags.charAt(j+1);break;
            case '0':zeroPad = true;break;
            case '#':prefixBaseX = true;break;
        }

        // parameters may be null, undefined, empty-string or real valued
        // we want to ignore null, undefined and empty-string values
        if (!minWidth) {
            minWidth = 0;
        } else if (minWidth == '*') {
            minWidth = +a[i++];
        } else if (minWidth.charAt(0) == '*') {
            minWidth = +a[minWidth.slice(1, -1)];
        } else {
            minWidth = +minWidth;
        }

        // Note: undocumented perl feature:
        if (minWidth < 0) {
            minWidth = -minWidth;
            leftJustify = true;
        }

        if (!isFinite(minWidth)) {
            throw new Error('sprintf: (minimum-)width must be finite');
        }

        if (!precision) {
            precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0);
        } else if (precision == '*') {
            precision = +a[i++];
        } else if (precision.charAt(0) == '*') {
            precision = +a[precision.slice(1, -1)];
        } else {
            precision = +precision;
        }

        // grab value using valueIndex if required?
        var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];

        switch (type) {
            case 's':return formatString(String(value), leftJustify, minWidth, precision, zeroPad, customPadChar);
            case 'c':return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad);
            case 'b':return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'o':return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'x':return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'X':return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase();
            case 'u':return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'i':
            case 'd': {
                var number = parseInt(+value);
                var prefix = number < 0 ? '-' : positivePrefix;
                value = prefix + pad(String(Math.abs(number)), precision, '0', false);
                return justify(value, prefix, leftJustify, minWidth, zeroPad);
            }
            case 'e':
            case 'E':
            case 'f':
            case 'F':
            case 'g':
            case 'G': {
                var number = +value;
                var prefix = number < 0 ? '-' : positivePrefix;
                var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
                var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
                value = prefix + Math.abs(number)[method](precision);
                return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]();
            }
            default:return substring;
        }
    };

    return format.replace(regex, doFormat);
}

function setCookie(CookieName, CookieVal, CookieExp, CookiePath, CookieDomain, CookieSecure) {
    var CookieText = escape(CookieName) + '=' + escape(CookieVal); 
    CookieText += (CookieExp ? '; EXPIRES=' + CookieExp.toGMTString() : '');
    CookieText += (CookiePath ? '; PATH=' + CookiePath : '');
    CookieText += (CookieDomain ? '; DOMAIN=' + CookieDomain : '');
    CookieText += (CookieSecure ? '; SECURE' : '');
    document.cookie = CookieText;
}
    
function getCookie(CookieName) {
    var CookieVal = null;
    if(document.cookie) {
        var arr = document.cookie.split((escape(CookieName) + '='));
        if(arr.length >= 2)
        {
            var arr2 = arr[1].split(';');
            CookieVal  = unescape(arr2[0]); 
        }
    }
    return CookieVal;
}

function deleteCookie(CookieName) {
    var tmp = getCookie(CookieName);
    if(tmp) {
        setCookie(CookieName,tmp,(new Date(1)));
    }
}

function szuk_pole(pole,domyslny,czysc){

	wartosc=document.getElementById(pole);

	if(czysc){
		if(wartosc.value==domyslny){
			wartosc.value='';
		}		
	} else {
		if(wartosc.value==''){
			wartosc.value=domyslny;
		}				
	}
}

function do_search(pole,domyslny,f) {
	wartosc=document.getElementById(pole);
    if (wartosc.value != '' && wartosc.value != domyslny) {
        f.form.submit(); 
    }
}


// switching between product details cards
function productDetailsCard_ShowHide(c) {

	if (c<10) {var c_num="0"+c;} else {var c_num=c;}

	$(".card-desc").each(function(i){
		if (i+1<10) {var i_num="0"+(i+1);} else {var i_num=(i+1);}

		if (i+1==c) {
			$("#card-"+c_num+"-hd").removeClass("card-off");
			$("#card-"+c_num+"-hd").addClass("card-on");
			$("#card-"+c_num+"-desc").removeClass("hidden");
		} else {
			$("#card-"+i_num+"-hd").removeClass("card-on");
			$("#card-"+i_num+"-hd").addClass("card-off");
			$("#card-"+i_num+"-desc").addClass("hidden");
		}

	});

}

function showOrHideAllDropDowns(newState) {
        
        var elements = document.documentElement.getElementsByTagName('select');
     
        for (var i=0; i<elements.length; i++) {
            elements[i].style.visibility = newState;
        }
    } 

var clickX = 0;
var clickY = 0;

function makeSuffixPl(amount,basetext) {
    var a = amount+'';
    var text = basetext;
    var jednosci = a.substr(a.length-1);
    if (amount >=10 && amount <=21) {
        text = text + 'ów';
    } else if (jednosci > 1 && jednosci < 5) {
        text = text + 'y';
    } else if (jednosci >= 5) {
        text = text + 'ów';
    }
    return text;
}

function makeSuffixCs(amount,basetext) {
    var a = amount+'';
    var text = basetext;
    if (amount == 1) {
        text = text + 'ek';
    } else if (amount > 1 && amount < 5) {
        text = text + 'ky';
    } else if (amount >= 5) {
        text = text + 'ků';
    }
    return text;
}

function updateCartText(locale,amount,totalvalue,item_name,item_quantity,gift_amount,cross_selling)  {
	if (amount > 0) {
	$('.minishopper').css("background-position","0px -110px");
        var cart_text;
        switch (locale) {
            case 'cs':
                cart_text = amount+makeSuffixCs(amount,' výrob')+' ('+totalvalue+' Kč)';
                if (gift_amount > 0)
                    cart_text += ' <b>+ '+gift_amount+makeSuffixCs(gift_amount,' dár')+'</b>'
                break;
            default:
            case 'pl':
                cart_text = amount+makeSuffixPl(amount,' produkt')+' ('+totalvalue+' zł)';
                if (gift_amount > 0)
                    cart_text += ' <b>+ '+gift_amount+makeSuffixPl(gift_amount,' prezent')+'</b>'
                break;
        }
		$('#cart_amount').html(cart_text);
	}else{
	$('.minishopper').css("background-position","0px 0px");
	}
	if (item_name!=undefined && item_quantity!=undefined) {
        $('#opensettext').hide();
        $('#opensetcomplete').hide();
        $('#cartconfirm').show();
//		$('#detail_popin').css({left: clickX, top: clickY}).show();
        openAddToCartPopin(item_name, item_quantity, cross_selling);
	}
}

function openAddToCartPopin(item_name, item_quantity, cross_selling) {
    closeAddToCartPopin();
    var cs = cross_selling || '';
    var w = 628; 
    var h = 490;
    if (cs=='') {
        h = 194;
    } 
	YRoverlay(true);
	$("#yr-overlay-cnt").append('<div id="topplayer" class="topplayer" style="width:'+w+'px;height:'+h+'px;"><div id="addCart">'+$('#addCartTemplate').html()+'</div></div>');
	var wide = ($(window).width() / 2) - ($("#topplayer").width() / 2);
	var high = ($(window).height() / 2) - ($("#topplayer").height() / 2);
	var scrollTop = $(window).scrollTop();
    $('#addCart #added_cart_item_name').text(item_name);
    $('#addCart #added_cart_item_quantity').text('Sztuk: '+item_quantity);
    if (cs=='') {
        $('#addCart h3').hide();
        $('#addCart div.crossSellZone').hide();
        $('#addCart').css({height: '175px'});
    } 
    $("#topplayer").css({
        'top': high + scrollTop + 'px',
        'left': wide + 'px',
        'display': 'none',
        'visibility': 'visible',
        'position': 'absolute',
        'z-index': 7000
    }).fadeIn(function(){
        if (cs!='') $('#addCart div.crossSellZone').load('/product/getcrosses', {cs: cross_selling});
    });
}

function updateLoginInfo(first_name,last_name) {
        if (first_name!='') {
                var newText = 'Witaj <b> <u>'+first_name+'</u> </b> :';
		$('#logged-login').html(newText);
		$('#me-menu0').hide();
		$('#me0').hide();
		$('#me-menu4').show();
	}
}

function focusPassword(){
    var password_on = document.getElementById('password_on');
    var password_off = document.getElementById('password');
    password_on.style.display='none';
    password_on.name="password_on";
    password_off.name="password";
    password_off.style.display='';
    password_off.focus();
}

function closeReminderPopup() {
	$('#login_popin').hide();
}

function submitSearchForm(form) {
    var v = $('#searchfield').val();
    if (v!='' && v!='Nazwa lub kod produktu') {
        form.submit();
        return true;
    } else return false;
}

if (min_char_autocomplete==undefined) var min_char_autocomplete = 3;

$(document).ready(function() {
    $("#searchfield").james("/hint", {
        minlength: min_char_autocomplete,
        method: "post",
        keydelay: 500,
        varname: 'q'
    });
    $("#searchfield").keyup(function(e) {
        if(e.keyCode == 13) {
            $('#keywordsearchform').submit();
        }
    });
    jQuery.validator.messages.required = "Pole jest wymagane";
    var validateLogin = $("#access").validate({
        submitHandler: function(form) {
            $(form).ajaxSubmit({
                url: '/auth/login',
                dataType: 'json',
                success: function(responseText){
                    if (responseText.success) {
                        window.location.href = '/customer';
                    } else {
                        window.location.href = '/auth/index/show/errors';
                    }
                }
            });
        }
    });
    var vp = $("#forgotpassword").validate({
        submitHandler: function(form) {
            $(form).ajaxSubmit({
                url: '/customer/passreminder',
                dataType: 'json',
                success: function(responseText){
                    if (responseText.success) {
                        window.location.href = '/auth/index/show/message';
                    } else {
                        window.location.href = '/auth/index/show/message';
                    }
                }
            });
        }
    });
});

function buildQuantitySelector(element, available) {
    if (available==0) {
        $('#'+element).hide();
        $('label[for='+element+']').hide();
    } else {
        var html = '';
        for (var i=1; i<=available; i++) {
            html += '<option value="'+i+'">0'+i+'</option>';
        }
        $('#'+element).html(html);
    }
}

function YRoverlay(overlay) {
    var overlay = overlay==undefined?true:overlay;

	var docHeight = $(document).height();

	if (overlay) $("body").append("<div id='yr-overlay'></div>");
	$("body").append("<div id='yr-overlay-cnt'></div>");
	
	if (overlay) $("#yr-overlay").height(docHeight).css({
		'opacity' : 0.4,
		'position': 'absolute',
		'top': 0,
		'left': 0,
		'background-color': 'black',
		'width': '100%',
		'z-index': 5000
	}).fadeIn();
}


function autoPopupOpen(x,y,w,h,overlay,timeout,content,cmsblock)  {
	YRoverlay(overlay);
    var openingBlock = '<div class="top-bar"> <a title="Zamknij" href="javascript:autoPopupClose();"> Zamknij <img src="/public/img/catalog/popin_button_close.gif" style="vertical-align:middle;" /> </a> </div><div class="cnt">';
    if (cmsblock!=undefined) {
        var toplayer = openingBlock+'</div>';
    } else {
        var toplayer = openingBlock+content+'</div>';
    }
	$("#yr-overlay-cnt").append('<div id="topplayer" class="topplayer" style="width:'+w+'px;height:'+h+'px;">'+toplayer+'</div>');
	var wide = (x!=null)?x:($(window).width() / 2) - ($("#topplayer").width() / 2);
	var high = (y!=null)?y:($(window).height() / 2) - ($("#topplayer").height() / 2);
	var scrollTop = $(window).scrollTop();
    if (cmsblock!=undefined) {
        var params = {id: null, title: cmsblock};
        $('#topplayer').load('/cmsblock/show/',params,function(){
            $("#topplayer").css({
                'top': high + scrollTop + 'px',
                'left': wide + 'px',
                'display': 'none',
                'visibility': 'visible',
                'position': 'absolute',
                'z-index': 7000
            }).fadeIn();
        });
    } else {
        $("#topplayer").css({
            'top': high + scrollTop + 'px',
            'left': wide + 'px',
            'display': 'none',
            'visibility': 'visible',
            'position': 'absolute',
            'z-index': 7000
        }).fadeIn();
    }
    
    if (timeout > 0) setTimeout('autoPopupClose()',timeout*1000);
	
}

function autoPopupClose() {
	$('#topplayer').fadeOut();	
	$('#yr-overlay').fadeOut();	
	
}

function closeAddToCartPopin() {
	$('#topplayer').fadeOut().remove();	
	$('#yr-overlay').fadeOut().remove();	
	
}


