function number_format( number, decimals, dec_point, thousands_sep ) {

	var i, j, kw, kd, km;

	// input sanitation & defaults
	if( isNaN(decimals = Math.abs(decimals)) ){
		decimals = 2;
	}
	if( dec_point == undefined ){
		dec_point = ",";
	}
	if( thousands_sep == undefined ){
		thousands_sep = ".";
	}

	i = parseInt(number = (+number || 0).toFixed(decimals)) + "";

	if( (j = i.length) > 3 ){
		j = j % 3;
	} else{
		j = 0;
	}

	km = (j ? i.substr(0, j) + thousands_sep : "");
	kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep);
	//kd = (decimals ? dec_point + Math.abs(number - i).toFixed(decimals).slice(2) : "");
	kd = (decimals ? dec_point + Math.abs(number - i).toFixed(decimals).replace(/-/, 0).slice(2) : "");


	return km + kw + kd;
}

function appendOrderSumm( amount )
{
	var formatted = number_format( amount, 0, '', ' ' ) + ' руб.';
	var $html = $( '<span class="itog-link"></span>' +
	'<div class="b-itog" id="floatItog">' +
	'<i>Итоговая стоимость заказа:</i>' +
	'<b>'+ formatted +'</b>' +
	'<em><a href="#" class="itog-close">Свернуть окно<img src="images/str.png" alt="" /></a></em>' +
	'</div>');

	if( !$( '.itog-link' ).size() ) {
		$( '.l-container' ).parent().append( $html );
	}
	else {
		$( '.b-itog' ).find('b').text( formatted );
	}

}

var calc = function( Input )
{

	this.$container = $( '#basketContainer' );
	this.input = $.parseJSON( Input );
	this.$tables = $([]);
	this.price = 0;
	var me = this;
	
	this.init = function()
	{
		var $tables = $( '.right table.details' );
		$( '.right .add-remove .add' ).click( function(){ me.addRow( $(this).parent() ) } );
		$( '.right' ).delegate( '.del', 'click', me.removeRow );
		$tables.delegate( 'select', 'change', me.selectHandle );
		$tables.each( function( i, el ){ me.checkTable( $(el) ) } );
		$tables.delegate( 'input', 'blur keyup', me.calc );
		this.$tables = $tables;
		this.calc();
	};

	this.reInitTables = function() {
		this.$tables = $( '.right table.details' );
	};

	this.selectHandle = function()
	{
		var $this = $( this );
		var $row = $this.parents( '.basketRow' );
		var $inputs = $row.find( 'input' );
		var valid = true;
		$row.find( 'select' ).each( function( i, el ){ if( !parseInt( $(el).val() ) ){ valid = false; }  } )

		$inputs.attr( 'disabled', (valid ? false : 'disabled') );

		if( valid ) {
			var select = $this.parents( 'tr' ).find( 'select.select-offer' )[0];
			var price = $( select.options[select.selectedIndex] ).attr( 'price' );
			$row.find( '.product-price' ).html( number_format( price, 0, '', ' ' ) + ' руб.' )
		}
		
		me.calc();
	};

	this.checkTable = function( $Table )
	{
		var $rows = $Table.find( 'tr.basketRow' );
		if( $rows.length == 1 ) {
			$rows.addClass( 'unable' );
		}
		$Table.find( 'select' ).trigger( 'change' );
	};
	
	this.addRow = function( $El )
	{
		var $tbl = $El.prev();
		var $row = $tbl.find( 'tr' ).eq( 1 );
		var $newRow = $row.clone();
		$tbl.append( $newRow );
		$newRow.find( 'select' ).each( function( i, el ){ el.selectedIndex = 0; } );
		$newRow.find( 'input' ).each( function( i, el ){ el.value = ''; } );
		me.reindexRows( $tbl );
		me.calc();
		$newRow.find( '.product-price, td:last' ).html( '' );
	};

	this.reindexRows = function( $Tbl ) {

		var $rows = $Tbl.find( 'tr.basketRow' );
		var lastOne = false;
		
		if( $rows.length == 1 ) {
			lastOne = true;
		}
		
		$rows.each( function( i, el ){
			$('td.num i', el).html( (i+1) );
			if( lastOne ) {
				$(el).addClass( 'unable' );
			}
			else {
				$(el).removeClass( 'unable' );
			}

			$(el).find( 'select.select-offer' ).trigger( 'change' );
		});
	};

	this.removeRow = function()
	{
		var $tbl = $(this).parents( 'table' );
		
		$(this).parents( 'tr.basketRow' ).remove();
		me.reindexRows( $tbl );
		me.calc();
	};

	this.calcTable = function( i, el )
	{
		var $table = $( el );
		var tablePrice = 0;
		$table.find( 'tr.basketRow' ).each( function( j, row ){

			var $el = $(row);
			var $select = $el.find( '.select-offer' );
			//ничего не выбрано
			if( !parseInt( $select.val() ) ) {
				return;
			}
			var domEl = $select[0];
			var $option = $( domEl.options[domEl.selectedIndex] );
			var price = parseFloat( $option.attr( 'price' ) );
			var priceRow = 0;

			$el.find( 'input' ).each( function( i, el ){
				var add = parseFloat( price * parseInt( $(el).val() ) );
				if( add && !isNaN( add ) ) {
					me.price += add;
					priceRow += add;
					tablePrice += add;
				}
			});

			$el.find( 'td:last' ).html( number_format( priceRow, 0, '', ' ' ) + ' руб.' );
		} );
		$table.data( 'price', tablePrice );
	};
	
	this.calc = function() {
		me.price = 0;
		me.$tables.each( me.calcTable );

		me.$container.find( 'ul.shopping-list > li' ).each( function( i, el){
			var $this = $( el );
			var price = 0;
			$this.find( 'table.details' ).each( function( j, t ){ price += parseFloat( $(t).data( 'price' ) ) } );
			$this.find( '.itog i' ).html( number_format( price, 0, '', ' ' ) );
		} );

		me.$container.find( '.total-value b.full-price' ).html( number_format( me.price, 0, '', ' ' ) );
		appendOrderSumm( me.price );
	};

	//инициализация себя
	this.init();
};


$(function(){

    var $catalog_list = $(".catalog-list");
    $(".item:even", $catalog_list).addClass("even");

    if ( $.browser.msie ) { $("body").addClass("ie") }

    if ($.browser.msie && $.browser.version.substr(0,1)<7) {
        $(".left-menu > li").addClass("first-level-ie6");
    }

	$q = $( '.total-value[data-total]' );
	if( $q.size() ) {
		appendOrderSumm( $q.data( 'total' ) );
	}

    var itog = function() {
      var $itog_link = $(".itog-link"),
          $b_itog = $(".b-itog"),
          $itog_close = $(".itog-close");

      $itog_link.click(function(){
        $(this).fadeOut();
        $b_itog.animate({height: 'show'}, 300);
      });

      $itog_close.click(function(){
        $itog_link.fadeIn();
        $b_itog.animate({height: 'hide'}, 300);
        return false;
      });
    };

    itog();
	
    var $subscribe_toggle = $(".subscribe-toggle"),
        $subscribe_form = $(".subscribe .form");

    $subscribe_toggle.click(function(){
      if ( $(this).hasClass("active") ) {
        $(this).removeClass("active");
        $subscribe_form.hide();
      }
      else {
        $(this).addClass("active");
        $subscribe_form.show();
      }
      return false;
    });

	function updateAfterBasket( response )
	{
		if( response.status )
		{
			if( response.basket ) {
				$( '.b-login' ).replaceWith( response.basket );
			}

			if( response.output && response.id ) {
				var $cont = $( '#add-remove-'+response.id );
				$cont.fadeOut( 'fast', function(){ $(this).html( response.output ); $(this).fadeIn() } );
			}
		}
	}

	function basketRequest()
	{
		var $href = $(this);
		var $basketPos = $(this).parents( '.basket-position' );
		var href = $(this).attr( 'href' );
		if( href ) {
			$( this ).parents( '.add-remove' ).html( '<div class="spinner"></div>' );
			$.getJSON( href, function( response ){
				if( $basketPos.length ) {
					$basketPos.remove();
					redrawBasket();
				}
				updateAfterBasket( response );
			} );
		}
		return false;
	}

	function redrawBasket()
	{
		var $basket = $( '#basketContainer ul.shopping-list' );
		$basket.children().each( function( i, el ){

			if( i%2 == 0 ) {
				$(el).addClass( 'even' );
			}
			else {
				$(el).removeClass( 'even' );
			}
		} );
		
		if( !$basket.children().length ) {
			$basket.replaceWith( '<p>Ваш список пуст</p>' );
		}
		else {
			window.calculator.reInitTables();
			window.calculator.calc();
		}
	}

	$( '.add-remove' ).delegate( 'a', 'click', basketRequest );
});

