/**************************
* 
* Andchir - http://wdevblog.net.ru
* Shopkeeper 0.8.6 - shopping cart (MODx snippet)
* 
**************************/

var debug = false;

(function($) {

var helper = '<div id="stuffHelper"><center><div id="stuffHelperName"><b></b></div>'
  +"\n"+'<div class="shs-count">'+langTxt['count']+' <input type="text" size="2" id="stuffCount" name="count" value="1" maxlength="3" />'
  +"\n"+'<img class="field-arr-up" src="assets/snippets/shopkeeper/img/arr_up.gif" width="17" height="9" alt="" />'
  +'<img class="field-arr-down" src="assets/snippets/shopkeeper/img/arr_down.gif" width="17" height="9" alt="" />'
  +"\n"+'</div><div><button class="shs-but" id="confirmButton">'+langTxt['continue']+'</button> '
  +"\n"+'<button class="shs-but">'+langTxt['cancel']+'</button></div></center></div>'
  +"\n";


$.fn.shopkeeper = function(options){

  settings = $.extend({
    clTitle: 'shs-title',
    clPrice: 'shs-price',
    clLink: 'shs-link',
    clButton: 'shs-but',
    nameHidden: 'shs-id'
  }, options);

  return this.each(function(i){
    var parent = this;
    var sId = $("input[name='"+settings.nameHidden+"']:eq(0)",this).val();
    var sTitle = $("."+settings.clTitle+":eq(0)",this).text();
    var sPrice = $("."+settings.clPrice+":eq(0)",this).text();
    if($("a."+settings.clLink+":eq(0)",this).size() > 0 || $("input[name='"+settings.clLink+"']").size()>0){
      var sLink = $("a."+settings.clLink+":eq(0)",this).size() > 0
        ? $("a."+settings.clLink+":eq(0)",this).attr('href')
        : $("input[name='"+settings.clLink+"']:eq(0)",this).val();
    }else{
      var sLink = null;
    }
    $('button.'+settings.clButton+':eq(0)',this).click(function(){
      if(debug)
        alert(sId+' '+sTitle+' '+sPrice+' '+sLink);
      $('select.addparam,input.addparam:checked',parent).each(function(){
        jQuery.additOpt(this);
      });
      toCart(sId,sTitle,sPrice,sLink,this);
      return false;
    });
  });
  
}



if (navigator.cookieEnabled==false){
  alert(langTxt['cookieError']);
}

function checkKey(e){
  var key_code = e.which ? e.which : e.keyCode;
  if((key_code>47&&key_code<58)||key_code==8){
    return true;
  }else{
    return false;
  }
}

function getPosition(el){
	var p = { x: el.offsetLeft, y: el.offsetTop };
	while (el.offsetParent){
		el = el.offsetParent;
		p.x += el.offsetLeft;
		p.y += el.offsetTop;
		if (el != document.body && el != document.documentElement){
			p.x -= el.scrollLeft;
			p.y -= el.scrollTop;
		}
	}
	return p;
}

function getCenterPos(elA,elB){
  posB = new Object();
  cntPos = new Object();
  posB = getPosition(elB);
  var correct;
  
  cntPos.y = Math.round(($(elB).outerHeight()-$(elA).outerHeight())/2)+posB.y;
  cntPos.x = Math.round(($(elB).outerWidth()-$(elA).outerWidth())/2)+posB.x;
  
  if(cntPos.x+$(elA).outerWidth()>$(window).width()){
    cntPos.x = Math.round($(window).width()-$(elA).outerWidth())-2;
  }
  if(cntPos.x<0){
    cntPos.x = 2;
  }
    
  return cntPos;
}


function stringToArray(str){
  curArray = new Array();
  if (str!=null){
    dataArray = str.split(';');
  
    $.each(dataArray,function(i,n){
      curArray[i] = n.split(',');
    });
  }
  return curArray;
}


function changeCount(fieldid,action){
  if(action==1){
    var num = parseInt($('#'+fieldid).attr('value'))+1;
  }else{
    var num = parseInt($('#'+fieldid).attr('value'))-1;
  }
  if(num>=1){
    $('#'+fieldid).val(num);
  }
}


function deleteItem(num,el){
  $('#stuffHelper').remove();
  $('body').append(helper);

  elHelper = document.getElementById('stuffHelper');
  boxPos = getCenterPos(elHelper,el);
  
  $('b','#stuffHelperName').text(langTxt['confirm']);
  $('div:eq(1)','#stuffHelper').remove();
  $('button:eq(1)','#stuffHelper').click(function(){
    $('#stuffHelper').fadeOut(300,function(){$(this).remove()});
    return false;
  });
  $('#confirmButton').text(langTxt['yes']).click(function(){
  
    if(num!='all'){
    stuffArray = new Array();
    stuffArray = stringToArray($.cookie('stuffAll'));
    var stuffString = '';
    var price;
    var link;
    if(stuffArray.length==1){
      emptyCart();
    }else{
    $.each(stuffArray,function(i,n){
      price = n.length>5 ? n[3]+','+n[4] : n[3];
      link = n.length>5 ? n[5] : n[4];
      if(i!=num){
        if(stuffString==''){
          stuffString = n[0]+','+n[1]+','+n[2]+','+price+','+link;
        }else{
          stuffString = stuffString.concat(';'+n[0]+','+n[1]+','+n[2]+','+price+','+link);
        }
      }
    });
    /////////////////////
    if($.cookie('additParam')){
      var additP = $.cookie('additParam').indexOf(';') ? $.cookie('additParam').split(';') : new Array($.cookie('additParam'));
      var reg=/(\d+)==(.*)/;
      var additClean = '';
      $.each(additP,function(i,a){
        var n = a.split('==');
        if(parseInt(n[0])!=(num+1)){
          var minus = parseInt(n[0])>(num+1) ? 1 : 0;
          var arr=reg.exec(a);
          additClean += additClean=='' ? (parseInt(arr[1])-minus)+'=='+arr[2] : ';'+(parseInt(arr[1])-minus)+'=='+arr[2];
        }
      });
      $.cookie('additParam',additClean, {expires: 1, path: '/'});
    }
    /////////////////////
    
    $.cookie('stuffAll', stuffString, {expires: 1, path: '/'});
    fillCart($.cookie('stuffAll'));
    }
  }else{
    emptyCart();
  }
  $('#stuffHelper').fadeOut(500).remove();
  
  });
  $('#stuffHelper').css({'top':boxPos.y+'px','left':boxPos.x+'px'}).fadeIn(500);
}


function recountItem(id,el){
  $('#stuffHelper').remove();
  $('body').append(helper);
  
  $('img.field-arr-up:eq(0)','#stuffHelper').click(function(){
    changeCount('stuffCount',1);
  });
  $('img.field-arr-down:eq(0)','#stuffHelper').click(function(){
    changeCount('stuffCount',2);
  });
  $('#stuffCount').keypress(function(e){
    return checkKey(e);
  });
  $('button:eq(1)','#stuffHelper').click(function(){
    $('#stuffHelper').fadeOut(300,function(){$(this).remove()});
    return false;
  });

  elHelper = document.getElementById('stuffHelper');
  boxPos = getCenterPos(elHelper,el);
  
  $('#stuffHelperName').remove();
  $('#stuffCount').val($(el).text());
  $('#stuffHelper').css({'top':boxPos.y+'px','left':boxPos.x-40+'px'}).fadeIn(500);
  
  $('#confirmButton').click(function(){
    var count = $('#stuffCount').val();
    var newcount;
    
    stuffArray = new Array();
    stuffArray = stringToArray($.cookie('stuffAll'));
    var stuffString = '';
    var price;
    var link;
    
    $.each(stuffArray,function(i,n){
      price = n.length>5 ? n[3]+','+n[4] : n[3];
      newcount = i==id ? count : n[2];
      link = n.length>5 ? n[5] : n[4];
    
      if(stuffString==''){
        stuffString = n[0]+','+n[1]+','+newcount+','+price+','+link;
      }else{
        stuffString = stuffString.concat(';'+n[0]+','+n[1]+','+newcount+','+price+','+link);
      }
    });
    $.cookie('stuffAll', stuffString, {expires: 1, path: '/'});
    $('#stuffHelper').fadeOut(500);
    fillCart($.cookie('stuffAll'));
  });
}



function fillCart(string){
  if(delItemBut=='img'){
    var delItemButton = '<img src="assets/snippets/shopkeeper/img/delete.gif" border="0" width="17" height="17" alt="'+langTxt['delete']+'" />';
  }else{
    var delItemButton = langTxt['delete'];
  }
  
  stuffArray = new Array();
  stuffArray = stringToArray(string);
  
  if(stuffArray.length>0&&string!=''){
    $('div:gt(0)','#shopCart').remove();
    $('table','#shopCart').remove();
    $('#shopCart').append('<div id="toolsCart" align="right"><a href="#">'+langTxt['delAll']+'</a></div>');
    $('a','#toolsCart').click(function(){
      deleteItem('all',this);
      return false;
    });
    
    var price;
    var totalPrice = 0;
    var totalItems = 0;
    
    $('#shopCart').append('<table width="100%"></table>');
    $.each(stuffArray,function(i,n){
      price = n.length>5 ? parseFloat(n[3])+parseFloat(n[4]) : parseFloat(n[3]);
      link = n.length>5 ? n[5] : n[4];
      price = price==Math.round(price) ? Math.round(price) : price.toFixed(2);
      var additList = '<br /><small>'+additString(i+1)+'</small>';
      if(cartType=='full'){
        var changeCount = noCounter ? '' : '<nobr> x <a href="#" title="'+langTxt['changeCount']+'">'+n[2]+'</a></nobr>';
        var name = link!='null' ? '<a href="'+link+'">'+n[1]+'</a>' : n[1];
        $('table','#shopCart').prepend('<tr class="cart-order"><td width="50%"><b>'+name+'</b>'+additList+'</td><td width="30%"><nobr>'+price+' '+currency+'</nobr></td><td width="10%">'+changeCount+'</td><td width="10%"><a href="#" title="'+langTxt['delGoods']+'">'+delItemButton+'</a></td></tr>');
      }
      totalItems += parseInt(n[2]);
      totalPrice += parseInt(n[2])*price;
    });
    var wordEnd = '';
    if(lang=='ru')wordEnd = wordEndFunc(totalItems);
    
    var tr = $('tr','#shopCart table').each(function(i,n){
      var c = $('tr','#shopCart table').length-1;
      var linkIndex = link!='null' ? 1 : 0;
      if(noCounter){
        $('a:eq('+linkIndex+')',this).click(function(){
          deleteItem(c-i,this);
          return false;
        });
      }else{
        $('a:eq('+linkIndex+')',this).click(function(){
          recountItem(c-i,this);
          return false;
        });
        $('a:eq('+(linkIndex+1)+')',this).click(function(){
            deleteItem(c-i,this);
            return false;
        });
      }
    });

    totalPrice = totalPrice==Math.round(totalPrice) ? Math.round(totalPrice) : totalPrice.toFixed(2);
    if(cartType=='small'){
      $('table','#shopCart').prepend('<tr class="cart-order"><td width="50%">'+langTxt['select']+'</td><td width="50%"><b>'+totalItems+'</b> '+langTxt['goods']+wordEnd+'</td></tr>');
    }
    
    $('#shopCart').append('<div id="totalCart" align="right">'+langTxt['sumTotal']+' <strong>'+totalPrice+'</strong> '+currency+'</div>');
    if(window.location.href.indexOf(orderFormPage)==-1){
      $('#shopCart').append('<div align="center"><a href="'+orderFormPage+'">'+langTxt['executeOrder']+'</a></div>');
    }
  }
}



function toCart(id,title,price,link,el){
  var name = title;

  $('#stuffHelper').remove();
  
  $('body').append(helper);
  $('img.field-arr-up:eq(0)','#stuffHelper').click(function(){
    changeCount('stuffCount',1);
  });
  $('img.field-arr-down:eq(0)','#stuffHelper').click(function(){
    changeCount('stuffCount',2);
  });
  $('#stuffCount').keypress(function(e){
    return checkKey(e);
  });
  $('button:eq(1)','#stuffHelper').click(function(){
    $('#stuffHelper').fadeOut(300,function(){$(this).remove()});
    return false;
  });
  if(noCounter){
    $('div.shs-count:eq(0)','#stuffHelper').hide();
  }
  
  
  elHelper = document.getElementById('stuffHelper');
  btPos = getCenterPos(elHelper,el);
  
  $('b','#stuffHelperName').text(name);
  $('#stuffHelper').css({'top':btPos.y+'px','left':btPos.x+'px'}).fadeIn(500);
    
  $('#confirmButton').click(function(){
  
    var priceAddit = $.cookie('tempParam') ? ','+additFilter(id,'price') : '';
    
    var count = parseInt($('#stuffCount').val());
    var stuffString = id+','+name+','+count+','+price+priceAddit+','+link;
    
    if($.cookie('stuffAll')==null||$.cookie('stuffAll')==''){
      $.cookie('stuffAll', stuffString, {expires: 1, path: '/'});
      $.cookie('additParam', additFilter(id,'all'), {expires: 1, path: '/'});
    }else{
      if(goodsGroup && ($.cookie('stuffAll').indexOf(';'+id)>-1 || $.cookie('stuffAll').indexOf(id)==0)){
        if(checkAddit(id)){
          groupingGoods(checkAddit(id),id,count);
        }else{
          $.cookie('stuffAll', $.cookie('stuffAll')+';'+stuffString, {expires: 1, path: '/'});
          $.cookie('additParam',additFilter(id,'all'), {expires: 1, path: '/'});
        }
      }else{
        $.cookie('stuffAll', $.cookie('stuffAll')+';'+stuffString, {expires: 1, path: '/'});
        $.cookie('additParam', additFilter(id,'all'), {expires: 1, path: '/'});
      }
    }
  
    var cart = document.getElementById('shopCart');
    
    cartPos = getCenterPos(elHelper,cart);
    
    $('#stuffHelper').animate({
        top: cartPos.y+'px',
        left: cartPos.x+'px'
      }).fadeOut(500,function(){
      
      fillCart($.cookie('stuffAll'));
    });
  });
}

additFilter = function(id,type){
  if(type!='all'){
    if(!$.cookie('tempParam'))return '';
  }
  
  if($.cookie('stuffAll')){
    var stuffArray = $.cookie('stuffAll').split(';');
    var stuffCount = stuffArray.length;
  }else{
    var stuffCount=1;
  }
  var tempParam = $.cookie('tempParam') ? $.cookie('tempParam').split(';') : new Array();
  var param;
  var output = type!=null ? stuffCount+'==' : '';
  $.each(tempParam,function(i,n){
    if(n.indexOf(','+id+',')>-1){
      output += output==stuffCount+'=='||output=='' ? n : '||'+n;
    }
  });
  if(type=='all'){
    output = output.length>3 ? output : '';
    if(output!=''){
      output = ($.cookie('additParam')) ? ($.cookie('additParam'))+';'+output : output;
    }else{
      output = ($.cookie('additParam')) ? $.cookie('additParam') : output;
    }
  }else if(type=='price'){
    if(output.length<4) return 0;
    var additPriceArray = output.indexOf('||')>-1 ? output.split('||') : new Array(output);
    var additPriceSum = 0;
    $.each(additPriceArray,function(i,n){
      additPrice = n.split(',');
      additPriceSum += parseFloat(additPrice[3]);
    });
    output = additPriceSum;
  }
  if(debug)alert('additFilter(): type='+type+', output='+output);
  return output;
}


function additString(num){
  if(!$.cookie('additParam')) return '';
  var additParam = $.cookie('additParam');
  if(additParam!='' && additParam.indexOf((num)+'==')>-1){
    eval('reg=/'+num+'==(.[^;]*)/g');
    var additParamStr = new String(additParam.match(reg));
    var output = '';
    additParamArray = additParamStr.indexOf('||') ? additParamStr.split('||') : new Array(additParamStr);
    $.each(additParamArray,function(i,n){
      var tempArr = n.split(',');
      var tempPrice = parseInt(tempArr[3])!=0 ? ' ('+tempArr[3]+')' : '';
      output += output=='' ? tempArr[2]+tempPrice : ', '+tempArr[2]+tempPrice;
    });
    return output;
  }else{
    return '';
  }
}


function checkAddit(id){
  var additParam = $.cookie('additParam');
  var additF = additFilter(id,null);
  if(debug)alert('checkAddit() -> additFilter(): '+additFilter(id,null));

  if(!additParam && additF=='') return true;
  if(!additParam && additF!='') return false;
  
  if(additParam && additF!=''){
    var curP = additParam.split(';');
    var curParam;
    for(var i=0;i<curP.length;i++){
      curParam = curP[i].split('==');
      if(!curParam[1])return true;
      if((curParam[1].indexOf(','+id+',')==additF.indexOf(','+id+','))&&(curParam[1].length == additF.length)&&(strToSum(curParam[1]) == strToSum(additF))){
        if(debug) alert('checkAddit(): '+curParam[1]+' = '+additFilter(id,null)+' -> '+curParam[0]);
        return curParam[0];
        break;
      }
    }
    return false;
  }else if(additParam && additF==''){
      var stuffArray = $.cookie('stuffAll').split(';');
      var stuffP;
      for(var i=0;i<stuffArray.length;i++){
        stuffP = stuffArray[i].split(',');
        if(stuffP[0]==id && additParam.indexOf((i+1)+'==')==-1){
          return i+1;
          break;
        }
      }
  }
  return false;
}


jQuery.additOpt = function(elem){
  var tag_name = elem.tagName;
  var value = tag_name=='SELECT'||(tag_name=='INPUT'&&elem.checked) ? elem.value : '';
  var name = elem.name;
  
  var valArr = value.split('_');
  var nameArr = name.split('_');
  var dataString;
  var cutData = '';
  var currentData = $.cookie('tempParam') ? $.cookie('tempParam').split(';') : '';
  var cut = nameArr[0]+','+nameArr[1];
  if(currentData!=''){
    $.each(currentData,function(i,n){
      if(n.indexOf(cut)==-1&&n!=''){
        cutData += cutData=='' ? n : ';'+n;
      }
    });
  }
  if(value!=''){
    dataString = valArr[1]!='' ? nameArr[0]+','+nameArr[1]+','+valArr[0].replace(',','.')+','+valArr[1].replace(',','.') : '';
  }else{
    dataString = '';
  }
  if(dataString!=''){
    dataString = cutData=='' ? dataString : ';'+dataString;
  }
  $.cookie('tempParam', cutData.concat(dataString), {expires: 1, path: '/'});
  $('#add_'+nameArr[1]).remove();
  var additPriceSum = additFilter(nameArr[1],'price');
  if(additPriceSum!=''&&!isNaN(additPriceSum)){
      $('#stuff_'+nameArr[1]+'_price').after('<sup id="add_'+nameArr[1]+'" class="price-add">+'+additPriceSum+'</sup>');
  }
  if(debug)alert('additOpt(): '+$.cookie('tempParam'));
}


function groupingGoods(num,id,count){
    var newcount;
    if(debug)alert('groupingGoods(): num = '+num);
    
    stuffArray = new Array();
    stuffArray = stringToArray($.cookie('stuffAll'));
    var stuffString = '';
    var additParam = $.cookie('additParam') ? $.cookie('additParam') : '';
    
    $.each(stuffArray,function(i,n){
      price = n.length>5 ? n[3]+','+n[4] : n[3];
      link = n.length>5 ? n[5] : n[4];
      if(!isNaN(parseInt(num))){
        newcount = n[0]==id && num==i+1 ? count+parseInt(n[2]) : n[2];
      }else{
        newcount = n[0]==id && additParam.indexOf((i+1)+'==')==-1 ? count+parseInt(n[2]) : n[2];
      }
      
      if(stuffString==''){
        stuffString = n[0]+','+n[1]+','+newcount+','+price+','+link;
      }else{
        stuffString = stuffString.concat(';'+n[0]+','+n[1]+','+newcount+','+price+','+link);
      }
    });
    $.cookie('stuffAll', stuffString, {expires: 1, path: '/'});
}

function emptyCart(){
  $.cookie('stuffAll', '', {expires: 1, path: '/'});
  $.cookie('stuffAll', null);
  if($.cookie('additParam')){
    $.cookie('additParam', '', {expires: 1, path: '/'});
    $.cookie('additParam', null);
  }
  $('div:gt(0)','#shopCart').remove();
  $('table','#shopCart').remove();
  $('#shopCart').append('<div id="cartEmpty" align="center">'+langTxt['empty']+'</div>');
}

function strToSum(str){
  var reg = /\D*/gi;
  var numStr = str.replace(reg,'');
  var numArr = numStr.split('');
  var output = 0;
  $.each(numArr,function(i,n){
    output = output+parseInt(n);
  });
  return output;
}


$(document).ready(function(){
  if(window.location.href.indexOf('/'+gotoid)>-1){
    $.cookie('stuffAll', '', {expires: 1, path: '/'});
    $.cookie('stuffAll', null);
  }else{
    if($.cookie('stuffAll')!=null){
      fillCart($.cookie('stuffAll'));
    }
  }
  if($.cookie('tempParam')){
    $.cookie('tempParam', '', {expires: 1, path: '/'});
    $.cookie('tempParam', null);
  }
  if(debug){
    var  degugString = $.cookie('tempParam') ? "1. "+$.cookie('tempParam') : '';
    degugString += $.cookie('stuffAll') ? "\n\n2. "+$.cookie('stuffAll') : '';
    degugString += $.cookie('additParam') ? "\n\n3. "+$.cookie('additParam') : '';
    if(degugString!='') alert(degugString);
  }
});

})(jQuery);

