
var Common = {
  addAnotherProduct: function(source, triggerID, handlowiec, closePoss, limit, trigger) {
  	if (typeof source == 'string') var li = document.getElementById(source);
	else if (source.tagName == 'LI') var li = source;
	else return alert('Child has to be a list element (id or element handler) and as a parent a list holder.');

  	var trigger = document.getElementById(triggerID);
	var handler = handler || '0';

	var ul, appendLi, close;
    var limit = limit || 0;
    var closePoss = (closePoss == undefined) ? true : false;

    ul = li.parentNode;
    if (ul.tagName != 'UL' && ul.tagName != 'OL')
      return alert('Child has to be a list element and as a parent a list holder.');

    while (ul.lastChild.tagName != 'LI') // make sure that last child is a list element child (and not text node)
      ul.removeChild(ul.lastChild);

	var produktID = document.createElement('input');
	produktID.type = 'hidden';
	produktID.name = 'produkt[]';
	produktID.value = 0;

	var produktName = document.createElement('span');
	/*
	produktName.readOnly = true;
	produktName.type = 'text';
	produktName.style.width = '50%';
	produktName.style.border = '0';
	produktName.style.background = 'none';
    produktName.value = '__nieprawidłowa_nazwa_produktu__';
	*/
	produktName.className = 'prodNameItem';
	produktName.innerHTML = '__nieprawidłowa_nazwa_produktu__';

    if (closePoss) {
      var close = document.createElement('span');
	  close.className = 'removeItem';

	  var sqBracket1 = document.createTextNode('[ ');
	  var sqBracket2 = document.createTextNode(' usuń ]');
	  var minusImg = document.createElement('img');
	  minusImg.src = '/var/image/layout/px/minus.png';
	  minusImg.style.height = '9px'; minusImg.style.width = '9px';
	  minusImg.style.border = '0px'; minusImg.alt = '-';

	  close.appendChild(sqBracket1);
	  close.appendChild(minusImg);
	  close.appendChild(sqBracket2);
    }

    appendLi = li.cloneNode(false);
	appendLi.style.clear = 'both';
	for (var i = 0; i < li.childNodes.length; ++i)
	  if (li.childNodes[i].tagName != 'SELECT') {
	  	var cloneElem = li.childNodes[i].cloneNode(true);
		if (is_opera8)
		  this.synchronize(li.childNodes[i], cloneElem);
	    appendLi.appendChild(cloneElem);
      } else {
	  	var sel = li.childNodes[i];
		var found = false;
	  	for (var j = 0; j < sel.options.length; ++j) {
		  if (true == sel.options[j].selected && sel.options[j].value > 0) {
			appendLi.id = 'product_' + sel.options[j].value;
		  	for (var k = 1, max = ul.childNodes.length; k < max; ++k) {
			  if (appendLi.id == ul.childNodes[k].id) {
			  	alert('Produkt już występuje w li¶cie dodanych.');
			    return;
			  }
			}

		  	found = true;
		  	produktID.value = sel.options[j].value;
			produktName.innerHTML = sel.options[j].innerHTML;
			break;
		  }
		}
        if (!found) return; // no product choosen - no need to add another field
		appendLi.appendChild(produktID);
		appendLi.appendChild(produktName);
		if (closePoss) appendLi.appendChild(close);
	  }
    //appendLi.id = ul.lastChild.id + '_';

    this.resetValue(li);

    for (var i = 0, max = appendLi.childNodes.length; i < max; i++) {
      var cld = appendLi.childNodes[i];
      if (cld.id && cld.id != '' && ul.lastChild.childNodes[i])
        cld.id = ul.lastChild.childNodes[i].id + '_';
    }

    ul.appendChild(appendLi);

    if (closePoss) {
      Events.add(close, 'click', function(event) { Common.removeNode(appendLi); Common.updatePrice(trigger, handlowiec); });
    }

    // trigger is checked to hide it when element count limit is exceeded
    // check is made at the end of method so there will not be any blank clicks
    if (limit > 0) {
      if (li.counter) {
        if (li.counter > limit) {
          if (!closePoss && trigger)
            trigger.style.display = 'none';
          return;
        } else {
          li.counter++;
        }
      } else {
        li.counter = 1;
      }
    }
  },

  addAdditional: function(trg,li){
  	if (typeof li == 'string') var li = document.getElementById(li);
	else if (li.tagName == 'LI') var li = li;
	else return alert('Drugim elementem metody Common.addAdditional musi byc ciag znakow lub element list.');

    trg.style.visibility='hidden';
	li.style.display='list-item';
  },

  synchronize: function(src, dest){
  	var eC=src.childNodes.length;
	if (eC!=dest.childNodes.length)return;
  	for(var i=0;i<eC;++i){
	  if(src.childNodes[i].nodeType!=dest.childNodes[i].nodeType)
	    return;
	  if (src.childNodes[i].nodeType == 1 && src.childNodes[i].value!=undefined && dest.childNodes[i].value!=undefined)
	    dest.childNodes[i].value=src.childNodes[i].value;
	  if (src.childNodes[i].childNodes.length)
	    this.synchronize(src.childNodes[i], dest.childNodes[i]);
    }
  },

  removeNode: function(node){
  	for (var i = node.childNodes.length; i > 0; --i)
	  this.removeNode(node.childNodes[i-1]);
	node.parentNode.removeChild(node);
  },

  updateQuantity: function(trigger, handlowiec){
    var handlowiec = handlowiec || '0';
    var ilePol = (handlowiec == '1') ? 4 : 3;
    var formObj = document.forms['produkty'];

	var index = this.findIndex(trigger);
	if (-1 == index) return;

    var co = formObj.elements[index*ilePol];
    var ile = formObj.elements[index*ilePol+1];
    if(co.value == 0){
      ile.value = 0;
    } else if (ile.value == 0) {
      ile.value = 1;
    }
  },

  updatePrice: function(trigger, handlowiec)
  {
    var handlowiec = handlowiec || '0';
    var ilePol = (handlowiec == '1') ? 4 : 3;
    var cena_suma = suma = cena_upust = ile_upust = upust = 0;
    var formObj = document.forms['produkty'];

    var index = (1 == trigger) ? 1 : this.findIndex(trigger);
	if (-1 == index) return;

    var liczbaPol = formObj.length - 1;
    var co = formObj.elements[index*ilePol];
    var ile = formObj.elements[index*ilePol+1];
    var cena = formObj.elements[index*ilePol+2];
	if (cena.readOnly)
      cena.value = (cena_produktu[co.value]) ? cena_produktu[co.value]*ile.value : 0;

    for(var ii = 0; ii < liczbaPol/ilePol; ii++){
      var co = formObj.elements[ii*ilePol];
      var ile = formObj.elements[ii*ilePol+1];
      var cena = formObj.elements[ii*ilePol+2];
      if(formObj.elements[ii*ilePol+2].name != 'cena[]'){
        var liczbaPol = ii*ilePol;
        break;
      }
	  if (cena.readOnly)
        cena_suma = parseInt(cena.value);
	  else
	    cena_suma = parseInt(cena.value*ile.value)
      suma += cena_suma;
      if(ilePol > 3){
        cena_upust = parseInt(formObj.elements[ii*ilePol+3].value);
        ile_upust = parseInt(formObj.elements[ii*ilePol+1].value);
        upust += cena_upust*ile_upust;
      }
    }
    formObj.elements[liczbaPol].value = suma;
    if(ilePol > 3){
      formObj.elements[liczbaPol+1].value = upust;
      okres = parseInt(formObj.elements[liczbaPol+2].value);
	  wklad = parseInt(formObj.elements[liczbaPol+4].value);
      formObj.elements[liczbaPol+3].value = policzRaty(suma, okres, wklad);
    }else{
      okres = parseInt(formObj.elements[liczbaPol+1].value);
	  wklad = parseInt(formObj.elements[liczbaPol+3].value);
      formObj.elements[liczbaPol+2].value = policzRaty(suma, okres, wklad);
    }
  },

  findIndex: function(trigger) {
    var prodList = document.getElementsByName('produkt[]');
    var priceList = document.getElementsByName('cena[]');
    var quantList = document.getElementsByName('ilosc[]');
    var bonusList = document.getElementsByName('cenaUpust[]');

		var searchList;
		var basketItemsNb = prodList.length - priceList.length; // z racji interferencji niepustego koszyka

    if ('produkt[]' == trigger.name){
      searchList = prodList;
    }else if ('ilosc[]' == trigger.name){
      searchList = quantList;
    }else if ('cenaUpust[]' == trigger.name){
      searchList = bonusList;
    }else
      return -1;

	for (var i = 0, max = searchList.length; i < max; ++i)
	  if (searchList[i] == trigger)
	  	return i - basketItemsNb;

    return -1;
  },

  resetValue: function (root) {
  	for (var i = 0, max = root.childNodes.length; i < max; ++i)
	  if (root.childNodes[i].nodeType == 1 && root.childNodes[i].value != undefined)
	    if (root.childNodes[i].value.match(/^\d+$/))
		  root.childNodes[i].value = 0;
		else
	      root.childNodes[i].value = '';
      else if (root.childNodes[i].childNodes.length)
	    this.resetValue(root.childNodes[i]);
  }
}

var Events = {
  clickEvent: function(event) {
    e = event || window.event;
    charCode = e ? (e.charCode ? e.charCode : e.keyCode) : 0;
    if (charCode != 13 && charCode != 32 &&
        charCode != undefined && charCode != 0)
      return false;
    return true;
  },

  add: function (element, event, callback, capture) {
  	if (element) { }
  	else if (!element && typeof element == 'string') element = document.getElementById(element);
	else return alert('Bad element format in Events.add() method.');

    capture = capture || false;
    if (element.addEventListener) {
      element.addEventListener(event, callback, capture);
      return true;
    } else if (element.attachEvent) {
      return element.attachEvent('on' + event, callback);
    } else {
      Events.customAttach(element, event, callback);
      element['on' + event] = function() { callCustom(element, event) }
    }
  },

  customAttach: function(element, event, callback) {
    if (!element.customEvents)
      element.customEvents = [];
    if (!element.customEvents[event])
      element.customEvents[event] = [];
    element.customEvents[event].push(callback);
  },

  callCustom: function(element, event) {
    if (element && element.customEvents && element.customEvents[event]) {
      var eventContainer = element.customEvents[event];
      for (var i = 0, max = eventContainer.length; i < max; i++)
        eventContainer[i]();
    }
  }
}
