/**************************
* 
* Andchir - http://wdevblog.net.ru
* Shopkeeper 0.8.8beta3 - shopping cart (MODx snippet)
* 
**************************/

(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){
      if(!ajaxLoad){
        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 = 0;
      }
    }else{
      var sLink = null;
    }
    $('button.'+settings.clButton+':eq(0)',this).click(function(){
      if(debug)
        log.info(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(num,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);
  
  if(debug)
    log.info('recountItem()');
  
  $('#confirmButton').click(function(){
    var count = $('#stuffCount').val();
    
    groupingGoods(num+1,0,count);
    
    $('#stuffHelper').fadeOut(500);
    fillCart($.cookie('stuffAll'));
    if(debug)
      log.info('recountItem(): index='+num+', newcount='+count);
  });
}

function groupingGoods(num,count,newcount){
    var thiscount;
    if(debug) log.info('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(newcount){
        if(!isNaN(parseInt(num))){
          thiscount = num==i+1 ? newcount : n[2];
        }else{
          thiscount = additParam.indexOf((i+1)+'==')==-1 ? newcount : n[2];
        }
      }else{
        if(!isNaN(parseInt(num))){
          thiscount = num==i+1 ? count+parseInt(n[2]) : n[2];
        }else{
          thiscount = additParam.indexOf((i+1)+'==')==-1 ? count+parseInt(n[2]) : n[2];
        }
      }
      
      if(stuffString==''){
        stuffString = n[0]+'//'+n[1]+'//'+thiscount+'//'+price+'//'+link;
      }else{
        stuffString = stuffString.concat('__'+n[0]+'//'+n[1]+'//'+thiscount+'//'+price+'//'+link);
      }
    });
    $.cookie('stuffAll', stuffString, {expires: 1, path: '/'});
}

function fillCart(string){
  var shopCart = $('#shopCart');
  shopCart.css({'height':shopCart.height()+'px','overflow':'hidden','background-image':'url(assets/snippets/shopkeeper/img/ajax-loader.gif)','background-position':'center center','background-repeat':'no-repeat'});
  
  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'];
  
  shopCart.empty();
  
  shopCart.append('<div id="cartInner"></div>');
  var cartInner = $('#cartInner');
  
  stuffArray = new Array();
  stuffArray = stringToArray(string);
  
  if(stuffArray.length>0&&string!=''){
    var price;
    var totalPrice = 0;
    var totalItems = 0;
    
    if(cartType=='full' && !ajaxLoad || cartType=='small')
      cartInner.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' && !ajaxLoad){
        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',cartInner).prepend('<tr class="cart-order"><td width="50%" align="left"><b>'+name+'</b>'+additList+'</td><td width="30%"><nobr>'+price+' '+currency+'</nobr></td><td width="10%">'+changeCount+'</td><td width="10%" align="right"><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);
    
    function addCartNav(){
      if(cartType=='full'){
        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);
      
      cartInner.prepend('<div id="toolsCart"><a href="#">'+langTxt['delAll']+'</a></div>');
      $('a','#toolsCart').click(function(){
        deleteItem('all',this);
        return false;
      });
      
      cartInner.append('<div id="totalCart" align="right">'+langTxt['sumTotal']+' <strong>'+totalPrice+'</strong> '+currency+'</div>');
      if(window.location.href.indexOf(orderFormPage)==-1){
        cartInner.append('<div class="cart-order"><a href="'+orderFormPage+'">'+langTxt['executeOrder']+'</a></div>');
      }
      
      shopCart.css({'overflow':'visible','height':'auto','background-image':'none'});
    }
    
    if(cartType=='small'){
      $('table',cartInner).prepend('<tr class="cart-order"><td width="50%">'+langTxt['select']+'</td><td width="50%"><b>'+totalItems+'</b> '+langTxt['goods']+wordEnd+'</td></tr>');
    }
    
    if(cartType=='full' && ajaxLoad){
      //$(cartInner).load('assets/snippets/shopkeeper/ajax-action.php?stuff_all=1&link_allow=1&currency='+currency,addCartNav);
      $.ajax({
      type: "GET",
      cache: false,
      contentType: 'text/html',
      dataType: 'html',
      url: 'assets/snippets/shopkeeper/ajax-action.php',
      data: 'stuff_all=1&link_allow=1',
      success: function(data){
        $(cartInner).append(data);
        addCartNav();
      }
     });
    }else{
      addCartNav();
    }
    
    shopCart.removeClass('empty');
    shopCart.addClass('full');
  }
}



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);
  
  if(ajaxLoad)name = 0;
  
  $('#confirmButton').click(function(){
  
    var priceAddit = $.cookie('tempParam') ? '//'+additFilter(id,'price') : '';
    
    var count = parseInt($('#stuffCount').val());
    price = price.replace(/\D*/,'');
    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),count,0);
        }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)log.info('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)log.info('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) log.info('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) log.info('additOpt(): '+$.cookie('tempParam'));
}


function emptyCart(){
  $.cookie('stuffAll', '', {expires: 1, path: '/'});
  $.cookie('stuffAll', null);
  if($.cookie('additParam')){
    $.cookie('additParam', '', {expires: 1, path: '/'});
    $.cookie('additParam', null);
  }
  if($('div:eq(0)','#shopCart').is('#toolsCart')){
    $('div','#shopCart').remove();
  }else{
    $('div:gt(0)','#shopCart').remove();
  }
  $('#shopCart').removeClass('full');
  $('#shopCart').addClass('empty');
  $('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 && $.cookie('stuffAll')!=''){
      fillCart($.cookie('stuffAll'));
    }
  }
  if($.cookie('tempParam')){
    $.cookie('tempParam', '', {expires: 1, path: '/'});
    $.cookie('tempParam', null);
  }
  if(debug){
    $('body').append('<button style="position:fixed;left:0;bottom:0;" id="logShowButton" onclick="appender.show();return false"> ^ </button>');
    var  degugString = $.cookie('tempParam') ? "1. cookie[\'tempParam\']: "+$.cookie('tempParam') : '';
    degugString += $.cookie('stuffAll') ? "\n\n2. cookie[\'stuffAll\']: "+$.cookie('stuffAll') : '';
    degugString += $.cookie('additParam') ? "\n\n3. cookie[\'additParam\']: "+$.cookie('additParam') : '';
    if(degugString.length>0)
      log.debug(degugString);
    if($.cookie('stuffAll')){
      log.info('cookie length: '+document.cookie.length);
      log.info('cookie[\'stuffAll\'] length: '+$.cookie('stuffAll').length);
    }
  }
});

})(jQuery);

