
var W3CDOM = (document.getElementsByTagName && document.createElement);

if (W3CDOM)
{
    var errorNode;
    errorNode = document.createElement('div');
    errorNode.className = "errormsg";
}

function verifySimpleSearch(form) {
    if (Trim(form.elements['search'].value).length < 3) {
        alert("Podaj przynajmniej 3 znaki, aby zacząć wyszukiwanie...");
        return false;
    }
    return true;
}

function verifyAddToCart(form) {
    var wynik=true;
    clearErrors(form);
    form.elements['amount'].value = parseInt(form.elements['amount'].value, 10);
    if (isNaN(form.elements['amount'].value)) {
        form.elements['amount'].value = "0";
    }
    if (parseInt(form.elements['amount'].value, 10) <= 0) {
        wynik = addError(form, "Zamówiona ilość musi być większa od zera.");
    }
    for (var i = 0 ; i < form.elements.length; i++) {
        if (form.elements[i].name.match(/oc_\d+/)) { // this is an option field
            if (form.elements[i].name.match(/^oc_\d+$/)) { // options for base product
                if (getSingleInputValue(form.elements[i]) == -1) {
                    wynik = addError(form, "Nie wybrałeś wszystkich opcji tego towaru.");
                }
            } else { // options for additional product
                var match = form.elements[i].name.match(/^additional_options\[(\d+)\]\[oc_\d+\]$/);
                if (match && form.elements['additional[' + match[1] + ']'].checked &&
                    getSingleInputValue(form.elements[i]) == -1)
                        wynik = addError(form, "Nie wybrałeś wszystkich opcji tego towaru.");
            }

        }
    }

    if (!wynik)
        alert("Nie dodano towaru - wystąpiły błędy.");
    return wynik;
}

function verifyQuestion(form) {
    var wynik = true;
    clearErrors(form, 'email_errors');
    if (!isEmail(form.elements['email'].value))
        wynik = addError(form, 'Niepoprawny adres e-mail.', 'email', 'email_errors');
    if (Trim(form.elements['question'].value).length < 15)
        wynik = addError(form, "'Pytanie' musi mieć 15-200 znaków.", 'question', 'email_errors');
    if (!wynik)
        alert("W formularzu są błędy, proszę, popraw je.");
    return wynik;
}

function verifyContactForm(form) {
    var wynik=true;
    clearErrors(form);
    if (!isEmail(form.elements['email'].value))
        wynik = addError(form, 'Niepoprawny adres e-mail.', 'email');
    if (Trim(form.elements['message'].value).length < 15 || Trim(form.elements['message'].value).length > 1500)
        wynik = addError(form, "'Twoja wiadomość' musi mieć 15-1500 znaków.", 'message');

    if (!wynik)
        alert("W formularzu są błędy, proszę, popraw je.");
    return wynik;
}

function verifyEmailToFriend(form) {
    var wynik=true;
    clearErrors(form, 'email_errors');
    if (!isEmail(form.elements['email'].value))
        wynik = addError(form, 'Niepoprawny adres e-mail.', 'email', 'email_errors');

    if (!isEmail(form.elements['email_friend'].value))
        wynik = addError(form, 'Niepoprawny adres e-mail.', 'email_friend', 'email_errors');

    if (Trim(form.elements['message'].value).length < 15)
        wynik = addError(form, "'Twój komentarz' musi mieć 15-200 znaków.", 'message','email_errors');

    if (!wynik)
        alert("W formularzu są błędy, proszę, popraw je.");
    return wynik;
}

function verifySearch(form) {
    var wynik=true;
    clearErrors(form);
    var option_chosen=false;

    for (var i = 0 ; i < form.elements.length; i++) {
        if (form.elements[i].name.match(/^oc\[\d+\]$/)
            && form.elements[i].value != -1)
            option_chosen = true;
    }

    var price_chosen = false;

    if (!isBlank(form.elements['price_from'].value) || !isBlank(form.elements['price_to'].value))
        price_chosen = true;

    if (option_chosen || price_chosen) {
        if (!isBlank(form.elements['name'].value) && Trim(form.elements['name'].value).length < 3)
            wynik = addError(form, "'Nazwa towaru' musi mieć co najmniej 3 znaki(-ów).", 'name');
        if (!isBlank(form.elements['category'].value) && Trim(form.elements['category'].value).length < 3)
            wynik = addError(form, "'Nazwa kategorii' musi mieć co najmniej 3 znaki(-ów).", 'category');
    } else {
        if (isBlank(form.elements['name'].value) && isBlank(form.elements['category'].value))
            wynik = addError(form, "Podaj nazwę towaru lub kategorii, lub wybierz odpowiednie opcje towaru.", "name");
        if (!isBlank(form.elements['name'].value) && Trim(form.elements['name'].value).length < 3)
            wynik = addError(form, "'Nazwa towaru' musi mieć co najmniej 3 znaki(-ów).", 'name');
        if (!isBlank(form.elements['category'].value) && Trim(form.elements['category'].value).length < 3)
            wynik = addError(form, "'Nazwa kategorii' musi mieć co najmniej 3 znaki(-ów).", "category");
    }
    if (!wynik)
        alert("W formularzu są błędy, proszę, popraw je.");
    return wynik;
}

function updateAddressRadios(form, radio_group_name) {
    if (form.elements[radio_group_name] && form.elements[radio_group_name].length) {// sa opcje do wyboru, czyli jest opcja dodania pola
        form.elements[radio_group_name][form.elements[radio_group_name].length-1].checked = true; //select last radio (i.e., add new)
    }
}

function verifyAddresses(form, array_name, radio_group_name) {
    var wynik=true;
    clearErrors(form);
    if (typeof radio_group_name != "undefined") {

        if (form.elements[radio_group_name+'[address_id]'] && form.elements[radio_group_name+'[address_id]'].length) {// sa opcje do wyboru, czyli jest opcja dodania pola
            // ale wybrano inna
            if (getRadioValue(form.elements[radio_group_name+'[address_id]']) != "-1")
                return true;
        }
    }

    if (Trim(form.elements[array_name+'[address_title]'].value).length < 6)
        wynik = addError(form, "'Imię i nazwisko / Nazwa firmy' musi mieć co najmniej 6 znaki(-ów).", array_name+'[address_title]');

    if (Trim(form.elements[array_name+'[address_line1]'].value).length < 5)
        wynik = addError(form, "'Adres' musi mieć co najmniej 5 znaki(-ów).", array_name+'[address_line1]');

    form.elements[array_name+'[address_line2]'].value = Trim(form.elements[array_name+'[address_line2]'].value);

    if (Trim(form.elements[array_name+'[address_city]'].value).length == 0)
        wynik = addError(form, "Nie wypełniłeś wymaganego pola 'Miasto'.", array_name+'[address_city]');

    if (Trim(form.elements[array_name+'[address_zipcode]'].value).length == 0)
        wynik = addError(form, "Nie wypełniłeś wymaganego pola 'Kod pocztowy'.", array_name+'[address_zipcode]');

   if (array_name == 'billing_form') {// additional test for billing address
        if (!isBlank(form.elements[array_name+'[address_phone]'].value) && !isPhone(form.elements[array_name+'[address_phone]'].value))
            wynik = addError(form, "Numer telefonu musi się składać z 6-20 znaków, może zawierać tylko znaki: 0-9,-,+,().", array_name+'[address_phone]');

        if ("" ==  "1") {
            if (form.elements['customer_email']
                && !isEmail(form.elements['customer_email'].value))
                wynik = addError(form, "Niepoprawny adres e-mail.", 'customer_email');

        } else { // default - require phone OR email
            if (form.elements['customer_email'] && !isBlank(form.elements['customer_email'].value)
                && !isEmail(form.elements['customer_email'].value))
                wynik = addError(form, "Niepoprawny adres e-mail.", 'customer_email');

            if (form.elements['customer_email'] && isBlank(form.elements['customer_email'].value)
                && isBlank(form.elements[array_name+'[address_phone]'].value))
                wynik = addError(form, "Podaj numer telefonu lub adres e-mail, by złożyć zamówienie.",array_name+'[address_phone]');
        }
    }

    if (!wynik)
        alert("W formularzu są błędy, proszę, popraw je.");
    return wynik;
}

function setAction(button, field, value) {
    if (typeof field != 'undefined')
        button.form.elements[field].value = value;
    button.form.elements['actn'].value = button.name;
    button.form.submit();
    return false;
}

function setFormAction(form_name, button, field, value) {
    var form = document.forms[form_name];
    if (typeof field != 'undefined')
        form.elements[field].value = value;
    form.elements['actn'].value = button.name;
    form.submit();
    return false;
}

function clearErrors(forma, id)
{
    if (!W3CDOM) return;
    var i;
    if (!id)
       id = 'form_errors' + (window.currentTab ? window.currentTab.toString() : "");
    // czyszczenie bledow poszczegolnych pol
    var pola = forma.getElementsByTagName("input");
    for (i = 0; i< pola.length; i++) {
        if (blad_pola = document.getElementById(pola[i].name.replace(/[\[\]]/g,'\.')+"_error"))
            blad_pola.innerHTML = '';
        if (hasClassName(pola[i], 'inline_error'))
            removeClassName(pola[i], 'inline_error');

    }
    pola = forma.getElementsByTagName("select");
    for (i = 0; i< pola.length; i++) {
        if (blad_pola = document.getElementById(pola[i].name.replace(/[\[\]]/g,'\.')+"_error"))
            blad_pola.innerHTML = '';
        if (hasClassName(pola[i], 'inline_error'))
            removeClassName(pola[i], 'inline_error');
    }
    pola = forma.getElementsByTagName("textarea");
    for (i = 0; i< pola.length; i++) {
        if (blad_pola = document.getElementById(pola[i].name.replace(/[\[\]]/g,'\.')+"_error"))
            blad_pola.innerHTML = '';
        if (hasClassName(pola[i], 'inline_error'))
            removeClassName(pola[i], 'inline_error');
    }

    pola = forma.getElementsByTagName("label");
    for (i = 0; i< pola.length; i++) {
        if (hasClassName(pola[i], 'inline_error'))
            removeClassName(pola[i], 'inline_error');
    }

    // i kontenera
        document.getElementById(id).innerHTML='';
}

function addError(form, title, field, id)
{
    if (!W3CDOM)
        return false;

    if (!id)
       id = 'form_errors' + (window.currentTab ? window.currentTab.toString() : "");

    var errorBlock = document.getElementById(id);

    if (!title) title = "UNNAMED ERROR!";

    if (typeof errorBlock != 'undefined') {
       var newError = errorNode.cloneNode(true); // dodawanie komunikatu o bledzie
       newError.appendChild(document.createTextNode("Błąd: "+title));
       errorBlock.appendChild(newError);
    }

    if (field) { // zawiadomienie o bledzie przy polu formularza
        if (form.elements[field]) {
           addClassName(form.elements[field], 'inline_error'); // pole dostaje inna klase
           var label = form.elements[field].parentNode;
           if (label) { // label dostaje inna klase i title
               addClassName(label, 'inline_error');
               label.title = title;
           }
        }
        field = field.replace(/[\[\]]/g,'\.');   //zamiana [ i ] na kropki
        field_error = document.getElementById(field+"_error");
        if (typeof field_error != 'undefined') // span o id=nazwa_pola_error dostaje zawartosc
            field_error.innerHTML='(!)&nbsp;';
    }

    return false;
}
function getRadioValue (radioButtonOrGroup) {
  var value = null;
  if (radioButtonOrGroup.length) { // group
    for (var b = 0; b < radioButtonOrGroup.length; b++)
      if (radioButtonOrGroup[b].checked)
        value = radioButtonOrGroup[b].value;
  }
  else if (radioButtonOrGroup.checked)
    value = radioButtonOrGroup.value;
  return value;
}

function isEmail(str) {
// przepuszcza adres mailowy
        if(!str.match(/^[\w]{1}[\w\.\-_]*@[\w]{1}[\w\-_\.]*\.[\w]{2,6}$/i)) {  //sam adres
        if (str.match(/<[\w]{1}[\w\.\-_]*@[\w]{1}[\w\-_\.]*\.[\w]{2,6}>$/i))  //nazwa i adres
            return true;
        else
             return false;
        } else {
            return true;
        }
}

function isPhone(s)
{

     // Check for correct phone number
     rePhoneNumber = new RegExp(/^\+?[0-9()\- ]{6,}$/);

     return rePhoneNumber.test(s);
}

function fillAddressTitle(obj) {
if (obj.form.address_title && obj.form.address_title.value == '')
    obj.form.address_title.value =
      obj.form.customer_salutation.options[obj.form.customer_salutation.selectedIndex].value
      + ' ' + obj.value;
}

function getElementsByClass(className) {

  var all = document.all ? document.all :
    document.getElementsByTagName('*');
  var elements = new Array();

  for (var e = 0; e < all.length; e++) {
    classes = all[e].className.split(" ");
    for (i = 0; i < classes.length; i++)
        if (classes[i] == className)
            elements[elements.length] = all[e];
  }

  return elements;
}

function _rollon() {
    this.src = this.src.replace(/(_f2)?\.(.{3,4})$/,'_f2.$2');
}

function _rolloff() {
    this.src = this.src.replace(/_f2\.(.{3,4})$/,'.$1');
}

function _rollonanchor() {
    if (this.getElementsByTagName) {
        var a = this.getElementsByTagName('img');
        a[0].onmouseover();

    }
}

function _rolloffanchor() {
    if (this.getElementsByTagName) {
        var a = this.getElementsByTagName('img');
        a[0].onmouseout();

    }
}



function attachRollovers() {
    var el = getElementsByClass('rollover');
    var loaded = [];
    var new_name;
    for (var i = 0; i < el.length; i++) {
        new_name = el[i].src.replace(/\.(.{3,4})$/,'_f2.$1');
        if (document.images && jQuery.inArray(new_name, loaded) == -1) {
            image = new Image();
            image.src = new_name;
            loaded[loaded.length] = new_name;
        }
        el[i].onmouseover = _rollon;
        el[i].onmouseout = _rolloff;
    }
    var el = getElementsByClass('rollover_anchor');
    for (i = 0; i < el.length; i++) {
        el[i].onmouseover = _rollonanchor;
        el[i].onmouseout = _rolloffanchor;
    }
}

window.onload = function() {attachRollovers(); if (document.getElementById("livesearch")) liveSearchInit()};

function removeClassName(el, name)
{

  var i, curList, newList;

  if (el.className == null)
    return;

  // Remove the given class name from the element's className property.

  newList = new Array();
  curList = el.className.split(" ");
  for (i = 0; i < curList.length; i++)
    if (curList[i] != name)
      newList.push(curList[i]);
  el.className = newList.join(" ");
}

function addClassName(el, name)
{

    if (el.className == null)
        el.className = name;
    else
        el.className += " "+name;
}

function hasClassName(el, name) {
    var classes = el.className.split(" ");
    for (var i = 0; i < classes.length; i++)
        if (classes[i] == name)
            return true;
    return false;
}

function switchModule(obj, block) {
    var type = obj.value;
    var blocks = getElementsByClass(block + '_form');
    for (var i=0; i < blocks.length; i++)
        addClassName(blocks[i], "hidden"); // hide all
    if (document.getElementById(block + 'm_' + type))
        removeClassName(document.getElementById(block + 'm_' + type), 'hidden');

    updateActiveBlocks(obj.form);
    return true;
}

function updateActiveBlocks(form) {
    var radios = form.elements['sm'];
    for(var i = 0; i < radios.length; i++)
        if (radios[i].checked) {
            addClassName(radios[i].parentNode.parentNode, 'active');
        } else {
            removeClassName(radios[i].parentNode.parentNode, 'active');
        }
    radios = form.elements['pm'];
    for(i = 0; i < radios.length; i++)
        if (radios[i].checked) {
            addClassName(radios[i].parentNode.parentNode, 'active');
        } else {
            removeClassName(radios[i].parentNode.parentNode, 'active');
        }
}

function handleBuyXGetY(input, src_amount, dest_amount, dest_product_id) {
    var amount_fld = $('form[name=addToCart] :input[name=amount]');
    var div = $('#options' + dest_product_id).get(0);

    switch (input.checked) {
        case true: // enable promotion
            // disable all other promotions
            for (var i = 0 ; i < input.form.elements.length; i++) {
                if (input.form.elements[i].name.match(/^additional\[\d+\]/)
                    && input.form.elements[i].type == 'checkbox' && input.form.elements[i] != input) {
                    input.form.elements[i].checked = false;

                    input.form.elements[i].onclick();
                }
            }
            // correct the amount of source product
            if (parseInt(amount_fld.val(), 10) < src_amount) {
                amount_fld.val(src_amount);

                var text = "Zwiększono zamówioną ilość do " + src_amount + ", aby uwzględnić warunki promocji.";
                text += "\nJeśli chcesz dodać towary ręcznie (np. by uwzględnić różne ich opcje), skoryguj ilość towarów i dodaj towary ręcznie, promocja zostanie uznana."
                alert(text);
            }

            // add calculated amount of destination product
            var howMany = Math.floor(amount_fld.val() / src_amount);
            input.form.elements['additional[' + dest_product_id + ']'].value = dest_amount * howMany;
            if (div)
                div.style.display = 'block';
        break;
        case false: // disable promotion
            input.form.elements['additional[' + dest_product_id + ']'].value = "";
            if (div)
                div.style.display = 'none';
        break;
    }

    copyFields(input.form, amount_fld.get(0).form);
}

function copyFields(source, target) {
	if (source === target) // same forms
		return;
	var input;
	$(':input', source).each(function() {
		$(':input[name="' + this.name + '"]', target).remove();
		input = $('<input type=hidden>').attr('name', this.name).val($(this).val()).appendTo(target);
		$(this).unbind('change.duplicate').bind('change.duplicate', function() {
			$(':input[name="' + this.name + '"]', target).remove();
			$('<input type=hidden>').attr('name', this.name).val($(this).val()).appendTo(target);
		});
	});
}

function checkout_editAddress(obj, address_id, link) {
    obj.form.action = link;
    return setAction(obj,'address_id',address_id);
}

// the functions in this file require the supplementary library lib.js

// These defaults should be changed the way it best fits your site
var _POPUP_FEATURES = '';

function raw_popup(url, target, features) {
    // pops up a window containing url optionally named target, optionally having features
    if (isUndefined(features)) features = _POPUP_FEATURES;
    if (isUndefined(target  )) target   = '_blank';
    var theWindow = window.open(url, target, features);
    theWindow.focus();
    return theWindow;
}

function link_popup(src, features) {
    // to be used in an html event handler as in: <a href="..." onclick="link_popup(this,...)" ...
    // pops up a window grabbing the url from the event source's href
    return raw_popup(src.getAttribute('href'), src.getAttribute('target') || '_blank', features);
}

function event_popup(e) {
    // to be passed as an event listener
    // pops up a window grabbing the url from the event source's href
    link_popup(e.currentTarget);
    e.preventDefault();
}

function event_popup_features(features) {
    // generates an event listener similar to event_popup, but allowing window features
    return function(e) { link_popup(e.currentTarget, features); e.preventDefault() }
}

function isUndefined(v) {
    var undef;
    return v===undef;
}

function validateSP(form) {
    var wynik = true;
    clearErrors(form, 'sp_errors');

    var checked = false;

    if (form.elements['sm'].type == 'hidden')
        checked = true;

    for (var i = 0; i < form.elements['sm'].length; i++)
        if (form.elements['sm'][i].checked) {
            checked = true;
            break;
        }

    if (!checked) {
        wynik = addError(form, "Wybierz sposób dostawy.", null, 'sp_errors');
    }

    if (form.elements['pm'].type == 'hidden')
        checked = true;

    for (i = 0; i < form.elements['pm'].length; i++)
        if (form.elements['pm'][i].checked) {
            checked = true;
            break;
        }

    if (!checked) {
        wynik = addError(form, "Wybierz formę płatności.", null, 'sp_errors');
    }

    return wynik;
}

function validateAddComment(form) {
    if (isBlank(form.elements['order_comment_text'].value)) {
        alert("Nie można wysłać komentarza - wpisz odpowiedni tekst w polu komentarza!");
        return false;
    }
    return true;
}

function fetchOptionImage(input) {
    var value = input.options ? input.options[input.selectedIndex].value : input.value;

	while (document.getElementById(input.name + "_image")) // bug - sometimes multiple images with the same ID get created, jQuery always return first
    	$(document.getElementById(input.name + "_image")).remove();

    if (value && value > 0) {

        $.getJSON("api/option_image", {option_id: value}, function(data) {

			while (document.getElementById(input.name + "_image")) // bug - sometimes multiple images with the same ID get created, jQuery always return first
		    	$(document.getElementById(input.name + "_image")).remove();

            if (data.url)
                $("<a>zobacz...</a>").attr({'id': input.name + "_image", 'href': data.url}).insertAfter(input).lightbox();
        });
    }
}

function getModifiedPrices() {
	var base_gross = parseFloat($(".product_price[rel]").attr("rel"),10),
	    base_net = parseFloat($(".product_price_net[rel]").attr("rel"),10),
	    options = $(".product_options").data("modifiers"),
	    incr_gross = 0, incr_net = 0;

	if (!options)
		return [base_net, base_gross];

	// add price modifiers for chosen options
	$(".product_options input[type=hidden],.product_options select,.product_options :radio:checked").each(function() {
		var modifier;
		if (modifier = options[$(this).val()]) {
			if (modifier[0] == "+") {
				incr_net += modifier[1];
				incr_gross += modifier[2];
			}
			else if (modifier[0] == "%") {
				incr_gross += (base_gross + incr_gross) * modifier[1] / 100;
				incr_net += (base_net + incr_net) * modifier[1] / 100;
			} else if (modifier[0] == "=") {
				base_net = modifier[1];
				base_gross = modifier[2];
				incr_net = incr_gross = 0;
			}
		}
	});

	return [base_net+incr_net, base_gross+incr_gross];
}

function updateProductPrices() {
	// get current text
	var old_price = $(".product_price[rel]"),
	    old_price_net = $(".product_price_net[rel]"),
		new_prices = getModifiedPrices(),
		decimals = 10;

	if (!old_price.size() || !old_price_net.size()) // could not fetch old product prices
		return;

    if (old_price.html().match(/,/)) { // use comma
        decimals = old_price.html().match(/\d\,(\d+)/) ? old_price.html().match(/\d\,(\d+)/)[1].length : 0;
        new_prices = $.map(new_prices, function(v) {return v.toFixed(decimals).replace(".",",");});
    } else {
        decimals = old_price.html().match(/\d\.(\d+)/) ? old_price.html().match(/\d\.(\d+)/)[1].length : 0;
    	new_prices = $.map(new_prices, function(v) { return v.toFixed(decimals);});
    }

	old_price.html(old_price.html().replace(/\d[\d,. ]*/, new_prices[1]));
	old_price_net.html(old_price.html().replace(/\d[\d,. ]*/, new_prices[0]));
}

if (typeof(Number)!='undefined'&&typeof(Number.prototype)!='undefined'){
  if (typeof(Number.prototype.toFixed)=='undefined'){

    function Number_toFixed(d) {
      var n = this;
      d = d || 2;
      var f = Math.pow(10, d);
      n = Math.round(n * f) / f;
      n += Math.pow(10, - (d + 1));
      n += '';
      return d == 0 ? n.substring(0, n.indexOf('.')) :
        n.substring(0, n.indexOf('.') + d + 1);
    }

    Number.prototype.toFixed = Number_toFixed;
  }
}

