var Globals = {};
Globals.Mins = {};
Globals.Maxs = {};
Globals.Values = {};
Globals.selectedTab = "103"; // цена към дилър във валута по подразбиране
Globals.valuta = 1;
Globals.backgrounds = {};
Globals.backgrounds.combo = null;
Globals.backgrounds.slider = null;

function Backgrounder( initialFunc ) {
	this.timeout = null;

	this.schedule = function( func ) {
		var self = this;
		this.timeout = setTimeout( function() { self.execute( func ); }, 0 );
	}

	this.execute = function( func ) {
		this.timeout = null;
		func();
	}

	this.interrupt = function() {
		clearTimeout( this.timeout );
		this.timeout = null;
	}

	this.finished = function() {
		this.interrupt();
	}

	if( initialFunc != undefined ) {
		initialFunc( this );
	}
}

function MultiplicationValues(arr, min)
{
    return arr;
    
    if (arr.length >= min)   return arr;
    // при една стойност.. няма какво да размножавам
    if (arr.length <=1)   return arr;


    var data = [];
    var first =  0;

    arr[0] = parseFloat(arr[0]);

    // na kolko trqbwa da se razdeli wseki podinterwal
    var ccount = min/(arr.length -1);
    if (ccount <=0 )  return arr;
    var dataCount = 0;

    for (var l = arr.length, i=1; i<l;i++)
    {
        // преобразувам масива в числа
       arr[i] = parseFloat(arr[i]);

       var step = (arr[i] - arr[first])/ccount;
        if ( (Math. ceil(arr[i]) == arr[i]) && (Math.ceil(arr[first]) == arr[first]))
        {
            step = Math.round(step);
        }
        // ako stypkat e нула, то означава че в интервала няма 10 стъпки. 
        if (step == 0) step = 1;
        

           if ($.inArray(arr[first], data)<0)
           {
                data[dataCount++] =arr[first];
           }
        if (Math.abs(step) > 0)
        {

           for (var j = arr[first]+step; j<arr[i]; j = Math.ceil((j+step)*100.0)/100.0)
           {
              if  ($.inArray(j, data)<0)
              {
                 data[dataCount++] = j;
              }
           }
         }
         if ($.inArray(arr[i], data)<0)
         {
            data[dataCount++] =arr[i];
         }

       first = i;
    }
    return data;
}


// plugin za filtrite
(function($)
{

    $.filters = function(el, options)
    {
        var base = this;
        // Access to jQuery and DOM versions of element
        base.$el = $(el);
        base.el = el;
        base.options = $.extend($.filters.defaults, options);
        base.$wrapper =  base.$el.find('> div').css('overflow', 'hidden');
        base.$wrapper.html("");

        base._createComboFilter = function(filt, onchange)
        {
            var comboHtml;
            if (filt.ntype == 0)
            {
                 // създавам комбо
               
                comboHtml =    $("<div class='field'><label><span  class='select'><select id='cb_" + filt.id + "'" + " class='comboFilter' name='select'> <option value='all'>" + filt.name +' (всички)' + "</option></select></span></label></div>");
               // ako sa stringowe , sortirame лексикографски
                filt.values.sort();

                var comboLen = filt.values.length;
                var vals = filt.values;
                // зареждам комбото със стойности.
                var combo = comboHtml.find("#cb_" + filt.id);
                var oldFilter = base.options.oldFilters[filt.id];
                    for (var kk = 0; kk < comboLen; kk++)
                    {
                        var s = $("<option value='" + vals[kk] + "'>" + vals[kk] + "</option>");
                        if ((oldFilter != undefined) && (oldFilter.ntype == 0) && (oldFilter.value == vals[kk]))
                        {
                            $(s).attr("selected",'selected');
                        }
                        $(s).appendTo(combo);
                    }

//                }
            }
            combo.unbind('change').change(onchange);
            return comboHtml;
        }


        base._createCheckFilter = function(filt, onclick)
        {
            var checkHtml;
            if (filt.ntype == 1)
            {
                // добавям check

                var oldFilter = base.options.oldFilters[filt.id];
                var sch = "";
                if ((oldFilter != undefined) && (oldFilter.value) && (oldFilter.ntype == 1))
                {
                   sch="checked='checked'";
                }

                checkHtml = $("<label for='ib_" + filt.id + "'" + " class='checks'><input id='ib_" + filt.id + "'" + " class='checkFilter' name='check' type='checkbox' value='Y'  "+sch +" />" + filt.name + "</label>");
                checkHtml.find('#ib_' + filt.id).unbind('click').click(onclick);
            }
            return checkHtml;
        }

        base._createSliderFilter = function(filt, action)
        {
            var sliderHtml;
            if (filt.ntype == 2)
            {
                sliderHtml = $("<div class='scroll'><h2>" + filt.name + "</h2>" +                                                   

                               "<span class='float_left' id='minlbl_" + filt.id + "'" + ">0</span>" +
                               "<span class='float_right' id='maxlbl_" + filt.id + "'" + ">0</span>" +
                               "<div class='slider-range' id='sr_" + filt.id + "' lngt='0' allvalues='[]'>" +
                               "<input type='hidden' name='min_" + filt.id + "' id='min_" + filt.id + "' value='0'/>" +
                               "<input type='hidden' name='max_" + filt.id + "' id='max_" + filt.id + "' value='0'/>" +
                               "<input type='hidden' name='abs_min_" + filt.id + "' id='abs_min_" + filt.id + "' value='0'/>" +
                               "<input type='hidden' name='abs_max_" + filt.id + "' id='abs_max_" + filt.id + "' value='0'/>" +

                               "</div></div>");

                // dobawqme absolютните минимуми и максимуми за филтъра
                if ($.inArray(filt.abs_min,filt.values)<0)
                {
                    filt.values.push(filt.abs_min);
                }

                if ($.inArray(filt.abs_max,filt.values)<0)
                {
                    filt.values.push(filt.abs_max);
                }

                // да добавим старите стойности  в данните, ще се ипозлват после при въстановяване на стария филтър
                var oldFilter = base.options.oldFilters[filt.id];
                if ((oldFilter != undefined) && (oldFilter.ntype == 2))
                {
                    var minOld = parseFloat(oldFilter.min);
                    var maxOld = parseFloat(oldFilter.max);

                    var abs_minOld = parseFloat(oldFilter.abs_min);
                    var abs_maxOld = parseFloat(oldFilter.abs_max);


                    if ((!isNaN(minOld))&&($.inArray(minOld,filt.values)<0))
                    {
                        filt.values.push(minOld);
                    }
                    if ((!isNaN(maxOld))&& ($.inArray(maxOld,filt.values)<0))
                    {
                        filt.values.push(maxOld);
                    }

                    if ((!isNaN(abs_minOld)) && ($.inArray(abs_minOld,filt.values)<0))
                    {
                        filt.values.push(abs_minOld);
                    }

                    if ((!isNaN(abs_maxOld)) && ($.inArray(abs_maxOld,filt.values)<0))
                    {
                        filt.values.push(abs_maxOld);
                    }


                }

                
                filt.values.sort(function(a, b)
                {
                    var aa = parseFloat(a);
                    var bb = parseFloat(b);
                    if (isFinite(aa) && !isFinite(bb))
                    {
                        return aa;
                    }
                    else if (!isFinite(aa) && isFinite(bb))
                    {
                        return -bb;
                    }
                    else if (isFinite(aa) && isFinite(bb))
                    {
                        return aa - bb;
                    }
                    else return 0;

                });
                
                // експериментално!! Да размножим стойностите ако са < от зададеното
                filt.values = MultiplicationValues(filt.values, 10);

               // свършихме със сортирането, да установим графичните елементи

                var slider = sliderHtml.find("#sr_" + filt.id);
                var minlbl = sliderHtml.find("#minlbl_" + filt.id);
                var maxlbl = sliderHtml.find("#maxlbl_" + filt.id);
                var mininp = sliderHtml.find("#min_" + filt.id);
                var maxinp = sliderHtml.find("#max_" + filt.id);

                var abs_mininp = sliderHtml.find("#abs_min_" + filt.id);
                var abs_maxinp = sliderHtml.find("#abs_max_" + filt.id);
                

                abs_mininp.val(filt.abs_min);
                abs_maxinp.val(filt.abs_max);

                var vals = filt.values;
                var clen = vals.length;

                slider.attr("lngt", clen);
                // da си направим стринг от стойностите
                var s = "";
                for (var i = 0; i < clen; i++)
                {
                    s = s + vals[i] + ',';
                }

                // mahame poslednata zapetajka
                if (s.length > 0)
                {
                    s = s.substring(0, s.length - 1);
                }
                slider.attr("allvalues", "[" + s + "]");

                // установявам минимална и максимална стойност
                if (vals.length > 0)
                {
                    var bFormt = ((Math.ceil(vals[vals.length-1])*100.0)/100.0 != vals[vals.length-1]);
                    var first = (bFormt?formatNumber(vals[0]):vals[0]);
                    var second = (bFormt?formatNumber(vals[vals.length-1]):vals[vals.length-1]);
                    minlbl.text(first);
                    maxlbl.text(second);

                    mininp.val(vals[0]);
                    maxinp.val(vals[vals.length - 1]);
                }


                var absMinIdx = 0;
                var absMaxIdx = clen - 1;
                // ако ма стар филтър, да му възсатанови стойностите, тях преди това сме ги набутали в масива със стойности 
                if ((oldFilter != undefined) && (oldFilter.ntype == 2))
                {
                    var minOld = parseFloat(oldFilter.min);
                    var maxOld = parseFloat(oldFilter.max);
                    if ($.inArray(minOld,vals)>=0)
                    {
                        absMinIdx = $.inArray(minOld,vals);
                    }

                    if ($.inArray(maxOld,vals)>=0)
                    {
                        absMaxIdx = $.inArray(maxOld,vals);
                    }

                    var bFormt = ((Math.ceil(vals[absMinIdx])*100.0)/100.0 !=vals[absMinIdx]);
                    var first = (bFormt?formatNumber(vals[absMinIdx]):vals[absMinIdx]);
                        bFormt = ((Math.ceil(vals[absMaxIdx])*100.0)/100.0 !=vals[absMaxIdx]);
                    var second = (bFormt?formatNumber(vals[absMaxIdx]):vals[absMaxIdx]);
                    minlbl.text(first);
                    maxlbl.text(second);
                    mininp.val(vals[absMinIdx]);
                    maxinp.val(vals[absMaxIdx]);
                }
            }
            try
            {
             var sl = slider.slider(
                {
                    range: true,
                    // NB - first max, then min, else BUFF in IE!
                    max: clen - 1 ,
                    min: 0,
                    values: [absMinIdx, absMaxIdx],
                    slide: function(event, ui)
                    {
                        var r = eval(slider.attr('allvalues'));
                        var bFormt = ((Math.ceil(r[r.length-1])*100.0)/100.0 != r[r.length-1]);
                        var first = (bFormt?formatNumber(r[ui.values[0]]):r[ui.values[0]]);
                        var second = (bFormt?formatNumber(r[ui.values[1]]):r[ui.values[1]]);

                        minlbl.text(first);
                        maxlbl.text(second);

                        mininp.val(r[ui.values[0]]);
                        maxinp.val(r[ui.values[1]]);
                    },
                    stop: function(event, ui)
                    {
                        if (action)
                        {
                            action(event, ui);
                        }
                    }
                });


            } catch(err)
            {

            }

            return sliderHtml;
        }



        base.filtersCombo = {};
        base.idsCombo = [];
        base.filtersSlider = {};
        base.idsSlider = [];
        base.filtersCheck = {};
        base.idsCheck = [];
        base.Mins = {};
        base.Maxs = {};
        
        base.parse = function()
        {

          var data = base.options.data;
          var len = data.length;
          if ((data == undefined) || (data.length == 0))
          {
              return;
          }

            // обработваме продуктите
          for (var i = 0; i < len; i++)
          {
            var o = data[i];
            var chars = o.chars;
            var clen = chars.length;
            for (var j = 0; j < clen; j++)
            {
                var ch = chars[j];
                var filt;
                if (ch.ntype == 2)
                {
                    filt = base.filtersSlider[ch.id];
                } else if (ch.ntype == 0)
                {
                    filt = base.filtersCombo[ch.id];
                } else if (ch.ntype == 1)
                {
                    filt = base.filtersCheck[ch.id];
                }
                if (filt == undefined)
                {
                    filt = new Object();
                    filt.ntype = ch.ntype;
                    filt.name = ch.name;
                    filt.id = ch.id;
                    filt.values = [];
                    filt.count = 1; // филтъра отговаря на един продукт

                    if ((ch.ntype == 2) && (ch.value != ' ') && (ch.value != ''))
                    {
                        filt.abs_min = parseFloat(Globals.Mins[filt.id]);
                        if (isNaN(filt.abs_min))
                        {
                           filt.abs_min = 1000000;
                           Globals.Mins[filt.id] = 1000000;
                        }
                        filt.abs_max = parseFloat(Globals.Maxs[filt.id]);

                        if (isNaN(filt.abs_max))
                        {
                           filt.abs_max = 0;
                           Globals.Maxs[filt.id] = 0;
                        }
                        filt.values = Globals.Values[filt.id];
                        base.filtersSlider[filt.id] = filt;
                        base.idsSlider.push(ch.id);
                    } else if (ch.ntype == 0)
                    {
                        base.filtersCombo[filt.id] = filt;
                        base.idsCombo.push(ch.id);
                    } else if (ch.ntype == 1)
                    {
                        base.filtersCheck[filt.id] = filt;
                        base.idsCheck.push(ch.id);
                    }
                }  else
                {
                  filt.count = filt.count + 1; // увеличавам броя на отговарящи продукти за този филтър
                }

                // ако стойноста я няма я добавяме
                // var s = encodeURIComponent(ch.value);
                var s = '0';
                try {
                s = $("<div/>").text(ch.value).html();
                } catch (Exception)
                {
                    s = " ";
                }
            // махаме празни стойности от комбото, само в тях стойноста може да бъде ' '
                if ((filt.ntype != 2) && ($.inArray(s, filt.values) < 0) && (s!=" ") && (s.length>0))
                {
                        filt.values.push(s);
                } else
                {
                 /*   s = parseFloat(ch.value);
                    if ((filt.ntype == 2) && ($.inArray(s, filt.values) < 0))
                    {
                        filt.values.push(s);
                        if (s < filt.abs_min ) { filt.abs_min = s; Globals.Mins[filt.id] = s;}
                        if (s > filt.abs_max ) { filt.abs_max = s; Globals.Maxs[filt.id] = s;}
                    }
                */
                }

            } // end for j - обработл съм всички характеристики и вземаме следващия продукт
          } //  for var i.. край на обработката на продуктите

          // да изчистим филтрите, които не съответстват на всички продукти

      // създаваме графичните елементи.
            jQuery.each(base.idsCombo,
                    function(index, id)
                    {
                        var filt = base.filtersCombo[id];

                        if ((filt != undefined) && ((filt.values.length > 1) || ((filt.values.length == 1) && (filt.values[0] != "") && (filt.ntype != 2) )) && (filt.count == len))
                        {
                            var combo = base._createComboFilter(filt, base.options.changeCombo);
                            if (combo != undefined) combo.appendTo(base.$wrapper);
                        }
                        return true;
                    });
            var tabs = {};
            tabs['103'] = $("<div class='mytabs show' id='tab_103' rev='103'></div> ");
            tabs['102'] = $("<div class='mytabs hide' id='tab_102' rev='102'></div> ");
            tabs['101'] = $("<div class='mytabs hide' id='tab_101' rev='101'></div> ");
            tabs['100'] = $("<div class='mytabs hide' id='tab_100' rev='100'></div> ");



              if (base.options.user)
              {


                  var filtValComboHtml =    $("<div class='field'><label><span  class='select'><select id='filtValCombo' name='filtValCombo'>"+
                          "<option value='1' "+ (Globals.valuta == 1 ?"selected='selected' ":"")+ ">" +'Цени във валута' + "</option>"+
                          "<option value='2' "+ (Globals.valuta == 2 ?"selected='selected' ":"")+ ">" +'Цени в лева' + "</option>"+
                          "</select></span></label></div>");
                 filtValComboHtml.appendTo(base.$wrapper);

                  $('#filtValCombo').change(function(event,ui) {
                      var r = $(this).val();
                      Globals.valuta = r;
                      base.options.sliderAction(event, ui);
                  });



                   var filtComboHtml =    $("<div class='field'><label><span  class='select'><select id='filtCombo' name='filtCombo'>"+
                           "<option value='103' "+ (Globals.selectedTab == '103' ?"selected='selected' ":"")+ ">" +'Без ДДС към Дилър' + "</option>"+
                           "<option value='102' "+ (Globals.selectedTab == '102' ?"selected='selected' ":"")+ ">" +'С ДДС към Дилър' + "</option>"+
                           "<option value='101' "+ (Globals.selectedTab == '101' ?"selected='selected' ":"")+ ">" +'Без ДДС към Краен клиент' + "</option>"+
                           "<option value='100' "+ (Globals.selectedTab == '100' ?"selected='selected' ":"")+ ">" +'С ДДС към Краен клиент' + "</option>"+

                           "</select></span></label></div>");
                 // filtComboHtml.find("#filtCombo").val(Globals.selectedTab);                  
                  filtComboHtml.appendTo(base.$wrapper);

                  $("#filtCombo").change(function(event, ui)
                  {
                      var rev = $(this).val();
                      $.each(tabs, function (i, v)
                      {
                          if ($(v).attr('rev') == rev)
                          {
                              $(v).addClass('show');
                              $(v).removeClass('hide');
                              //base.options.selectedTab = rev;
                              Globals.selectedTab = rev;
                          }
                          else
                          {
                              $(v).addClass('hide');
                              $(v).removeClass('show');
                          }

                          var newRev = $(v).attr('rev');
                          var min = $("#abs_min_"+newRev).val();
                          $("#min_"+newRev).val(min);
                          $("#minlbl_"+newRev).val(min);
                          var max = $("#abs_max_"+newRev).val();
                          $("#max_"+newRev).val(max);
                          $("#maxlbl_"+newRev).val(max);
                          
                          var filt = base.filtersSlider[newRev];
                          if (filt != undefined)
                          {
                            filt.min = min;
                            filt.max = max;
                          }
                          if (base.options.oldFilters[newRev] != undefined)
                          {
                            base.options.oldFilters[newRev] = undefined;
                          }
                      });
                        base.options.sliderAction(event, ui);                      
                      return false;
                  });
              }

            jQuery.each(base.idsSlider,
                    function(index, id){
                        var filt = base.filtersSlider[id];
                        if ((filt != undefined) &&  ((filt.values.length > 1) || ((filt.values.length==1) && ((filt.values[0]!=filt.abs_min) || (filt.values[0]!=filt.abs_max)) )) && (filt.count == len))
                        {
                            var slider = base._createSliderFilter(filt, base.options.sliderAction);
                            if (slider != undefined)
                            {
                                var slides = [];
                                slider.find('.ui-slider-handle').each(function (i,v)
                                {
                                   slides.push($(v));
                                });
                                if (slides.length > 0)
                                {
                                    slides[0].addClass('left');
                                    slides[1].addClass('right');
                                }
                                // ТУК ще се добавят филтрите за цени в отделни табчета.
                                //
                                //

                                if (tabs[filt.id] != undefined)
                                {

                                      tabs[filt.id].appendTo(base.$wrapper);
                                    var b = tabs[filt.id];

                                    // да установим активния филтър
                                    $.each(tabs, function (i,v)
                                     {
                                         if ($(v).attr('rev') == Globals.selectedTab)
                                         {
                                            $(v).addClass('show');
                                            $(v).removeClass('hide');
                                         } else
                                         {
                                             $(v).addClass('hide');
                                             $(v).removeClass('show');
                                         }
                                     });
                                    slider.appendTo(b);
                                } else
                                {
                                    slider.appendTo(base.$wrapper);
                              }

                            }
                        }
                        return true;
                    });
            
            jQuery.each(base.idsCheck,
                    function(index, id){
                        var filt = base.filtersCheck[id];
                        if ((filt != undefined) && ((filt.values.length > 1) || ((filt.values.length==1) && (filt.values[0]!="")  && (filt.ntype != 2) ))&& (filt.count == len))
                        {
                            var check = base._createCheckFilter(filt, base.options.clickCheck);
                            if (check != undefined) check.appendTo(base.$wrapper);
                        }
                         return true;                        
                    });



        }


        // triger parsing
        base.parse();
    }


    $.filters.defaults = {
        data:{},
        changeCombo:function(){},
        clickCheck:function(){},
        sliderAction:function(){},
        oldFilters:{},
        user : false
    };

    $.fn.filters = function(options)
    {
        return this.each(function(i)
        {
            (new $.filters(this, options));
        });
    }

})(jQuery);



 ProductFilters = function ()
 {
     // parse url parameters
     this.getUrlVars = function()
     {
         if (window.location.href.indexOf('#') >= 0)
         {

             var vars = {}, hash;
             var hashes = window.location.href.slice(window.location.href.indexOf('#') + 1).split('&');
             for (var i = 0; i < hashes.length; i++)
             {
                 hash = hashes[i].split('=');

                 var cmd = hash[0];
                 if (cmd == 'id')
                 {
                     if (hash[1])
                     {
                         var val1 = hash[1].split(";");
                         var id = val1[0];
                         var ntype = val1[1];
                         var f = new Object();
                         f.id = $.URLDecode(id);
                         f.ntype = ntype;
                         if (ntype == 2)
                         {
                             f.min = $.URLDecode(val1[2]);
                             f.max = $.URLDecode(val1[3]);
                             f.abs_min = $.URLDecode(val1[4]);
                             f.abs_max = $.URLDecode(val1[5]);

                         }
                         else
                         {
                             f.value = $.URLDecode(val1[2]);
                         }

                         if (vars['filters'] == undefined)
                         {
                             vars['filters'] = {};
                         }
                         vars['filters'][f.id] = f;
                     }
                 } else if (cmd == 'page')
                 {
                     if (hash[1])
                     {
                         vars['page'] = hash[1];
                     }
                 } else if (cmd=='vc') // валута комбо
                 {
                     if (hash[1] in ({1:1,2:1}))
                     {
                       Globals.valuta = hash[1];
                     }
                 }
                  else if (cmd=='cb') // kombo ceni
                 {
                 //    console.log("HASH = "+hash[1]);
                     if (hash[1] in ({100:1,101:1,102:1, 103:1}))
                     {
                       Globals.selectedTab = hash[1];
                   //      console.log("HASH1 = "+hash[1]);
                     }
                 }
             }
             return vars;
         }
         else return {};
     }

    var pf = this;

    this.productComboData = [];
    this.productsData = [];
    this.productSliderData = [];

    this.oldCombos = [];
    this.oldSliders = [];
    this.oldPage = 1;
    this.productsPerPage = 24;

     this.actTimer = function(event, ui)
     {
         $('#waitFilters').show();
         var timer = setTimeout(
                 function()
                 {pf.actionCombo(event, ui);},
                 300);
         event.stopPropagation();
     }


     this.actTimerSlider = function(event, ui)
     {
         $('#waitFilters').show();
         var timer = setTimeout(
                 function()
                 //{pf.actionSlider(event, ui);},
                 {pf.actionCombo(event, ui);},
                 300);
         event.stopPropagation();
     }

     this.createParams = function()
     {
         var params = "#";
         $.each(pf.oldCombos, function(i, v)
         {
             if (v.ntype == 0)
             {
                 params = params + "&id=" + $.URLEncode(v.id) + ";0;" + $.URLEncode(v.value);
             } else if (v.ntype == 1)
             {
                 params = params + "&id=" + $.URLEncode(v.id) + ";1;" + $.URLEncode(v.value);
             }
             else if (v.ntype == 2)
             {
                 params = params + "&id=" + $.URLEncode(v.id) + ";2;" + $.URLEncode(v.min) + ";" + $.URLEncode(v.max)+ ';'+$.URLEncode(v.abs_min) + ";" + $.URLEncode(v.abs_max);
             }
         });
         if (pf.oldPage != 1)
         {
             params = params + "&page=" + pf.oldPage;
         }
         params = params + "&vc="+Globals.valuta+"&cb="+Globals.selectedTab;
         return params;
     }



     this.filterSlider = function(farr, orgData)
     {
         //за всеки създаден филтър данните се филтрират
         var len = orgData.length;
         var fData = [];

         var flen = 0; //farr.length
         jQuery.each(farr, function(i, v) {flen = flen + 1;});

         // с цикъл по продуктите, всеки артикул се проверява със всеки филтър дали отговаря на условията
         for (var i = 0; i < len; i++)
         {
             var article = orgData[i];
             var chars = article.chars;
             var clen = chars.length;
             var tadd = true;
             var nadd = 0;
             var tt = "";
             // всяка характеристика се проверява
             for (var j = 0; j < clen; j++)
             {

                 var ch = chars[j];
                 var f = farr[ch.id];
                 if (f != undefined)
                 {
                     if (f.ntype == 2) // ako e slider
                     {
                         var min = parseFloat(f.min);
                         var max = parseFloat(f.max);
                         var chVal  = parseFloat(ch.value);
                         if ((chVal >= min) && (chVal <= max))
                         {
                             nadd = nadd + 1;
                         }
                     }
                     else
                    { // Всички други характеристрики

                         nadd = nadd + 1;
                     }
                 }
             }
             if ((nadd == flen) && ((nadd > 0) || ((nadd == 0) && (flen == 0))))
             {
                 fData.push(article);
             }
         }
         return fData;
     }


     var procesOneProductCombo = function(retData,farr, flen, article){
              // с цикъл по продуктите, всеки артикул се проверява със всеки филтър дали отговаря на условията
         //for (var i=0; i<len; i++)
         //{
            //var article =  orgData[i];
            var chars = article.chars;
            var clen = chars.length;
            var tadd = true;
            var nadd = 0;
            var tt ="";
            // всяка характеристика се проверява
            for (var j=0; j<clen; j++)
            {

                var ch = chars[j];
                var f = farr[ch.id];

                // първия път създавам масивите със стойности за слайдерите, не е хубаво тука, но за да изпозлвам цикъла

                if (Globals.Values[ch.id] == undefined)
                {
                    Globals.Values[ch.id] = [];
                }

                if (Globals.Mins[ch.id] == undefined)
                {
                    Globals.Mins[ch.id] = 100000;
                }

                if (Globals.Maxs[ch.id] == undefined)
                {
                    Globals.Maxs[ch.id] = 0;
                }



                if (ch.ntype == 2)
                {
                    var v = parseFloat(ch.value);
                    if ((!isNaN(v)) && ($.inArray(v,Globals.Values[ch.id])<0))
                    {
                        Globals.Values[ch.id].push(v);
                        if (Globals.Mins[ch.id]> v) {Globals.Mins[ch.id] = v;}
                        if (Globals.Maxs[ch.id] < v) {Globals.Maxs[ch.id] = v;}
                    }
                }

                 if (f != undefined)
                 {
                    if (f.ntype == 0) // kombo
                    {
                       if (ch.value == f.value)
                       {
                          nadd = nadd + 1;
                        }
                     } else if ((f.ntype == 1) && (f.value)) // check
                     {
                          if (ch.value == 'Y')
                         {
                              nadd = nadd + 1;
                          }
                     } else {// Всички други характеристрики
                          nadd = nadd + 1;
                     }
                   }
            }
            if ((nadd == flen) && ((nadd>0) || ((nadd == 0) && (flen==0))))
            {
              retData.push(article);
            }
     };


     this.filterCombo = function(farr, orgData)
     {
         //за всеки създаден филтър данните се филтрират
         var len =  orgData.length;
         var fData = [];

         var flen = 0; //farr.length
         jQuery.each(farr, function(i,v){flen = flen + 1;});

         for (var i=0; i<len; i++)
         {
            var article =  orgData[i];
             procesOneProductCombo(fData,farr,flen,article);
         }

         return fData;

     }

     this.actionCombo = function(event, ui)
     {
         var farr = {};
         //TODO - da se dobawi i za komboto i 4ek4eto
         // създавам масив от филтрите
         // nulirame starite kombos
         pf.oldCombos = {};

         $(".comboFilter").each(function()
         {
             // da naprawim masiv ot stpjnosti na filtrite
             var id = this.id.substring(3);
             var val = $(this).val();
             var f = new Object();
             f.id = id;
             f.ntype = 0;
             f.value = val;
             // ako e na ВСИЧКО не се добавя като филтър - е различно от празната стойност
             if ((val != "all") && (val != ' ') && (val != ''))
             {
                 farr[id] = f;
                 pf.oldCombos[id] = f
             }
         });

         $(".checkFilter").each(function()
         {
             // da naprawim masiv ot stpjnosti na filtrite
             var id = this.id.substring(3);
             var val = $(this).is(":checked")
             var f = new Object();
             f.id = id;
             f.ntype = 1;
             f.value = val;
             farr[id] = f;
             if (val)
             {
                 pf.oldCombos[id] = f;
             }
         });


         // филтрирам данните
         var fData = pf.filterCombo(farr, pf.productComboData);
         farr = {};

         $(".slider-range").each(function()
         {
             // da naprawim masiv ot stpjnosti na filtrite
             var id = this.id.substring(3);
             var min = parseFloat($("#min_" + id).val());
             var max = parseFloat($("#max_" + id).val());
             var abs_min = parseFloat($("#abs_min_" + id).val());
             var abs_max = parseFloat($("#abs_max_" + id).val());
             var f = new Object();

             if (isNaN(min))
             {
                 min = 0;
             }
             if (isNaN(max))
             {
                 max = 100000000;
             }


             f.id = id;
             f.ntype = 2;
             f.min = min;
             f.max = max;
             f.abs_min = abs_min;
             f.abs_max = abs_max;
             farr[id] = f;
             // ako филтъра е променен - го добавяме
             if ((min != abs_min) || (max != abs_max))
             {
                pf.oldCombos[id] = f;
             } 
         });

         // след комбото, филтрирам и по слайдерите
         fData = pf.filterSlider(farr, fData);


         var oldFiltersLen = 0;
         var oData = fData;
         $.each(pf.oldCombos, function(i, v){/*if (v.ntype != 2)*/ {oldFiltersLen = oldFiltersLen + 1;} });
         // проверка дали сме нулирали комботата
         if ((oData.length == 0 ) || (oldFiltersLen == 0))
         {
             // ако сме нулирали комботата връщаме всички данни и филтри, но само ако има филтрирани данни
             // ако няма филтрирани данни, остаяме да покаже че няма намерени данни
             if (oData.length != 0)
             {
                 fData = pf.productsData;
             }
             oData = pf.productsData;
         }

         pf.productSliderData = fData;
         $("#haracteristics").filters({data:oData, changeCombo:pf.actTimer, clickCheck:pf.actTimer, sliderAction:pf.actTimerSlider, oldFilters:pf.oldCombos});

         pf.currentPage = 1;
         pf.createPageLinks(fData, pf.productsPerPage);
         pf.show_page(fData, 1, pf.productsPerPage);
         $('#waitFilters').hide();
     }


     this.show_page = function(data,page_id, productsPerPage)
     {
         var firsProduct = (page_id-1)*productsPerPage;
         var lastProduct = Math.min(firsProduct+productsPerPage,data.length);

         $("#prod_list").empty();  // clean #prod_list contents

         if (data.length<=0)
         {

             var noproductsDIV = $('#noproducts').parseTemplate({});
             $("#prod_list").append(noproductsDIV);
         } else
         {

             for (var i = firsProduct; i < lastProduct; i++)
             {
                 var item = data[i];
                 var productTumbHtml = $('#ProductTumbTemplate').parseTemplate(item);

                 $("#prod_list").append(productTumbHtml);
             }


             // zakacha tooltipite s harakteristikite
             initHaracteristic();

            if (pf.user)
            {
             // zakacha BG cenite
             initBGPrices();

             //linkovete za basketa
             initBasketLinks();
             initPreferedLinks();
            }
            initCompareLinks();
            pf.oldPage = page_id;
            window.location = pf.createParams();
         }
     }

     this.goPage = function (data,idx, productsPerPage)
     {
         $(".pageLink").each(function() { $(this).attr('style','color:#333333;'); });
         pf.show_page(data,idx,productsPerPage);
         $("#paget"+idx).attr('style','color:#f1383f;');
         $("#pageb"+idx).attr('style','color:#f1383f;');
     }


     this.createPageLinks = function(data, productsPerPage)
     {
         var pages = Math.ceil(data.length/productsPerPage);
         $(".paging").each(function()
         {

             $(this).html('');
             var position = $(this).attr("pos");

                var leftArrow = $("<a href='#' class='page_left' id='lp"+position+"0'></a>");
                leftArrow.click(function()
                {
                 if (pf.currentPage>1)
                 {
                    pf.currentPage = pf.currentPage - 1;
                    pf.goPage(data,pf.currentPage,productsPerPage);
                    $(".page_right").each(function() { $(this).show(); });
                 }
                 if (pf.currentPage <=1)
                 {
                    $(".page_left").each(function() { $(this).hide(); });
                 }
                 return false;
                });

               $(this).append(leftArrow);
               leftArrow.hide();

             for (var i=1; i<=pages; i++)
             {
                 //create paging divs... and bind clicks
                 var pageNumber = $("<a href='?page="+i+"'"+" class='pageLink' id='page"+position+i+"'>"+i+"</a>");
                 if (i==pf.currentPage)
                 {
                   pageNumber.attr('style','color:#f1383f;');
                 }
                 pageNumber.click(function()
                 {
                     var z = parseFloat(this.id.substring(5));
                     pf.goPage(data,z,productsPerPage);
                     pf.currentPage = z;
                     if (pf.currentPage >= pages)
                     {
                        $(".page_right").each(function() { $(this).hide(); });
                     } else
                     {
                        $(".page_right").each(function() { $(this).show(); });
                     }
                     if ((pf.currentPage > 1))
                     {
                         $(".page_left").each(function() { $(this).show(); });

                     } else
                     {
                         $(".page_left").each(function() { $(this).hide(); });
                     }
                     return false;
                 });

                 $(this).append(pageNumber);
             }

                 var rightArrow = $("<a href='#' class='page_right' id='lr"+position+"0'></a>");
                 rightArrow.click(function(){
                     if (pf.currentPage < pages)
                     {
                         pf.currentPage = pf.currentPage + 1;
                         pf.goPage(data,pf.currentPage,productsPerPage);
                         $(".page_left").each(function() { $(this).show(); });

                     }
                     if (pf.currentPage >= pages)
                     {
                         $(".page_right").each(function() { $(this).hide(); });
                     }
                     return false;
                 });
                 $(this).append(rightArrow);
         });
     }


     this.process = function(user, currentPage, articleList)
     {
         var fData = articleList;
         pf.user = user;
         pf.currentPage = currentPage;

         pf.productComboData = fData;
         pf.productSliderData = fData;
         pf.productsData = fData;

        $("#preload").hide();

        var fParams = pf.getUrlVars();
        var fOld = (fParams['filters'] == undefined?{}:fParams['filters']);


        if(articleList.length>0)
        {

            fData = pf.filterCombo(fOld, fData);
            fData = pf.filterSlider(fOld,fData);

            $("#haracteristics").filters({data:fData, changeCombo:pf.actTimer, clickCheck:pf.actTimer, sliderAction:pf.actTimerSlider, oldFilters:fOld, user:pf.user});
            $("#haracteristics").show();
        }
        else
        {
            $("#noparams").show();
            $("#noparams").text('все още няма въведени характеристики за тези продукти');
        }

        // след като сме заредили всички продукти, да подменим page links със по-бързите скрипт
        pf.createPageLinks(fData, pf.productsPerPage);
        var curPage = fParams['page'];
        if (curPage != undefined )
        {
            pf.goPage(fData, curPage,pf.productsPerPage);
        } else
        {
            pf.show_page(fData,1,pf.productsPerPage);
        }
     }
 };


ProductFilters.instance = new ProductFilters();


