/**************************
* 
* Andchir - http://wdevblog.net.ru
* Shopkeeper 0.9 - shopping cart (MODx snippet)
* 
**************************/

var shkHelper;

(function($) {

shkHelper = '<div id="stuffHelper"><div><b id="stuffHelperName"></b></div>'
  +"\n"+'<div class="shs-count">'+langTxt['count']+' <input type="text" size="2" id="stuffCount" name="count" value="1" maxlength="3" />'
  +'</div><div><button class="shk-but" id="confirmButton">'+langTxt['continue']+'</button> '
  +"\n"+'<button class="shk-but" id="cancelButton">'+langTxt['cancel']+'</button></div></div>'
  +"\n";

$.fn.setCounterToField = function(opt){
  st = $.extend({imgpath:'assets/snippets/shopkeeper/img/',wrapdiv:false}, opt);
  function checkKey(e){
    var key_code = e.which ? e.which : e.keyCode;
    return (key_code>47&&key_code<58)||key_code==8 ? true : false;
  };
  function changeCount(field,action){
    var count = parseInt($(field).attr('value'));
    var num = action==1 ? count+1 : count-1;
    if(num>=1)
      $(field).val(num);
  };
  var countButs = '<img class="field-arr-up" src="'+st.imgpath+'arr_up.gif" width="17" height="9" alt="" />'
                + '<img class="field-arr-down" src="'+st.imgpath+'arr_down.gif" width="17" height="9" alt="" />'+"\n";
  var field = $(this);
  if(st.wrapdiv)
    $(this).wrap('<div></div>');
  $(this)
  .css({'height':'16px','border':'1px solid #888','vertical-align':'bottom','text-align':'center','padding':'1px 2px','font-size':'13px'})
  .after(countButs)
  .keypress(function(e){return checkKey(e);});
  $(this).next('img').click(function(){
    changeCount(field,1);
  })
  .css({'cursor':'pointer','margin':'0 0 11px 1px','vertical-align':'bottom'})
  .next('img').click(function(){
    changeCount(field,2);
  })
  .css({'cursor':'pointer','margin':'0 0 1px -17px','vertical-align':'bottom'});
};


$.fn.shopkeeper = function(options){

  settings = $.extend({
    counterField: false
  }, options);
  $(this).each(function(i){
    var parent = this;
    var thisForm = $('form',this);
    if(settings.counterField){
      if($("input[name='shk-count']",this).is(':hidden')==false){
        $("input[name='shk-count']",this).setCounterToField();
      }
    }
    $(thisForm).submit(function(){
      if(debug) log.info('id:'+sId+'; name:'+sTitle+'; price:'+sPrice+'; link:'+sLink);
        $('select.addparam,input.addparam:checked',parent).each(function(){
          jQuery.additOpt(this);
        });
      toCart(thisForm);
      return false;
    });
    return this;
  });
  
};



if (navigator.cookieEnabled==false){
  alert(langTxt['cookieError']);
}

function showHelper(elem,name,noCounter,func){
  $('body').append(shkHelper);
  $('#cancelButton').click(function(){
    $('#stuffHelper').fadeOut(300,function(){$(this).remove()});
    return false;
  });
  $('#confirmButton').click(function(){
    func();
    return false;
  });
  if(noCounter){
    $('div.shs-count:eq(0)','#stuffHelper').hide();
  }else{
    $('#stuffCount').setCounterToField();
  }
  var elHelper = $('#stuffHelper');
  var btPos = getCenterPos(elHelper,elem);
  if(name){
    $('#stuffHelperName').text(name);
  }else{
    $('#stuffHelperName').remove();
  }
  $('#stuffHelper').css({'top':btPos.y+'px','left':btPos.x+'px'}).fadeIn(500);
};


function getPosition(elem){
  var el = $(elem).get(0);
	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 deleteItem(num,el){
  
  thisAction = 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();
      }
    }else{
      emptyCart();
    }
    $('#stuffHelper').fadeOut(500).remove();
  };
  
  showHelper(el,langTxt['confirm'],true,thisAction);
  
  $('#confirmButton').text(langTxt['yes']);
};


function recountItem(num,el){
  thisAction = function(){
    var count = $('#stuffCount').val();
    groupingGoods(num+1,0,count);
    $('#stuffHelper').fadeOut(500,function(){
      $('#stuffHelper').remove();
    });
    fillCart();
    if(debug)
      log.info('recountItem(): index='+num+', newcount='+count);
  };
  showHelper(el,false,false,thisAction);
  $('#stuffCount').val(parseInt($(el).text().replace(/\D* /,'')));
  if(debug)
    log.info('recountItem()');
};


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 setCartActions(){
  var c = $('tr','#shopCart table').length-1;
  $('tr','#shopCart table').each(function(i,n){
    $('a.shk-count',this).click(function(){
      recountItem(c-i,this);
      return false;
    });
    $('a.shk-del',this).click(function(){
        deleteItem(c-i,this);
        return false;
    });
  });
  $('#butEmptyCart').click(function(){
    deleteItem('all',this);
    return false;
  });
  if(window.location.href.indexOf('/'+orderFormPage)>-1){
    $('#butOrder').hide();
  }
};


function fillCart(){
  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'});
  var getParams = '&stuff_all=1&cart_type='+cartType+'&cart_tpl='+cartTpl[0]+'&cart_row_tpl='+cartTpl[1]+'&link_allow=1&nocounter='+noCounter+'&change_price='+changePrice+'&order_page='+orderFormPage;
  $.ajax({
  type: "GET",
  cache: false,
  url: 'assets/snippets/shopkeeper/ajax-action.php',
  data: getParams,
  success: function(data){
    $('#shopCart').replaceWith(data);
    setCartActions();
  }
 });
};



function toCart(thisForm){
  var el = $("input[name='shk-submit'],button[name='shk-submit']",thisForm).eq(0);
  var name = $("input[name='shk-name']",thisForm).val();
  
  thisAction = function(){
    var id = $("input[name='shk-id']",thisForm).val();
    var price = $("input[name='shk-price']",thisForm).val();
    var link = $("input[name='shk-link']",thisForm).is('*') ? $("input[name='shk-link']",thisForm).val() : 0;
    var count = flyToCart!='helper' ? parseInt($("input[name='shk-count']",thisForm).val()) : parseInt($('#stuffCount').val());
    
    var priceAddit = $.cookie('tempParam') ? '//'+additFilter(id,'price') : '';
    
    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: '/'});
      }
    }
    
    if(flyToCart=='helper'){
      var elHelper = $('#stuffHelper');
      var cart = $('#shopCart');
      var cartPos = getCenterPos(elHelper,cart);
      $('#stuffHelper').animate({
          top: cartPos.y+'px',
          left: cartPos.x+'px'
        }).fadeOut(500,function(){
          $('#stuffHelper').remove();
          fillCart();
        });
    }else{
      fillCart();
      showHelper(el,langTxt['addedToCart'],true,thisAction);
      $('#confirmButton,#cancelButton').hide();
      setTimeout(function(){
        $('#stuffHelper').fadeOut(500,function(){
          $('#stuffHelper').remove();
        });
      },2000);
    }
  };
  
  switch(flyToCart){
    case 'image':
      //soon
    break;
    case 'nofly':
      thisAction();
      fillCart();
    break;
    default:
      showHelper(el,name,noCounter,thisAction);
  }
  
};


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 && !changePrice ? ' ('+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 value = $(elem).is('select,input:checked') ? $(elem).val() : '';
  var name = $(elem).attr('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]+'//'+valArr[1] : '';
  }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)&&!changePrice){
    $('#stuff_'+nameArr[1]+'_price').after('<sup id="add_'+nameArr[1]+'" class="price-add">+'+additPriceSum+'</sup>');
  }
  if(!isNaN(additPriceSum)&&changePrice){
    var priceTxt = $('#stuff_'+nameArr[1]+'_price');
    var curPrice = $(priceTxt).is(":has('span')") ? $('span',priceTxt).text().replace(/\D* /,'') : $(priceTxt).text().replace(/\D* /,'');
    $(priceTxt).empty().append('<span style="display:none;">'+curPrice+'</span>'+(parseFloat(curPrice)+additPriceSum));
  }
  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);
    fillCart();
  }else{
    if($.cookie('stuffAll')!=null && $.cookie('stuffAll')!=''){
      setCartActions();
    }
  }
  if(window.location.href.indexOf('/'+orderFormPage)>-1){
    $('#butOrder').hide();
  }
  if($.cookie('tempParam')){
    $.cookie('tempParam', '', {expires: 1, path: '/'});
    $.cookie('tempParam', null);
  }
  if(1==1){
    $('select.addparam,input.addparam:checked').each(function(){
      jQuery.additOpt(this);
    });
  }
  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);


if($.browser.msie && $.browser.version=='6.0'){
  document.execCommand("BackgroundImageCache",false,true);
}
