/**
 * @author pborissov
 */
function BasketItemSet ( discontTab ) {
    this.jq       = $('div.basket:first');
    this.items    = new Array();
    this.cost     = 0;
    this.discont  = 0;
    this.totalSum = 0;

    this.general = new BasketItemSetGeneral( discontTab );
    this.jq.append( this.general.jqClear );
    this.jq.append( this.general.jq );

    this.add = function ( mode, data ) {
        var item = new BasketItem( this, mode, data );
        this.items.push( item );
        //item.jq.appendTo( 'div.basket:first' );
        this.general.jqClear.before( item.jq );
        this.refresh();
    };

    this.remove = function ( id ) {
        var tmp = new Array();
        for ( var i=0; i<this.items.length; i++ )
            if ( this.items[ i ].id != id )
                tmp.push( this.items[ i ] );
            else
                this.items[ i ].jq.remove();
        this.items = tmp;
        this.refresh();
    }

    this.getOrderData = function(){
		var data = new Array();
		for ( var i=0; i<this.items.length; i++ )
            data.push( this.items[ i ].getOrderData() );
		return data;
	};

    this.serializeOrderData = function () {
		var data  = this.getOrderData();
		var adata = new Array();
		for (var i = 0; i < data.length; i++)
			for (var j = 0; j < data[i].length; j++) {
				var arow = new Array();
				for (var k in data[i][j])
					arow.push( '"'+k+'"' + ':' + data[i][j][k] );
				adata.push( '{'+arow.join( ',' )+'}' );
			}
		return '['+adata.join( ',' )+']';
	};

    this.refresh = function () {
        var totalSum = 0;
        for ( var i=0; i<this.items.length; i++ ) {
            totalSum += this.items[ i ].order.getTotalSum();
        }
        this.general.setSum( totalSum );
    };

    var self = this;
    this.general.jq
        .find( 'tr.generalTotalSumTR td.basketButtonTD div.basketButton a:first' )
            .click( function () {
				//var data = self.serializeOrderData();
				//$('#basket_data').val( data );
				$('#basket_form').submit();
				return false;
			} );
}

function BasketItemSetGeneral ( discontTab ) {
	this.discontTab = discontTab;
    this.html1 = new Array(
          '<div class="clearBasketBox">'
        , '    <a href="/basket/clear/" class="clearBasketLink">Очистить корзину</a>'
        , '</div>'
    ).join( "\n" );
    this.html2 = new Array(
          '<table class="basketTable">'

        , '    <tr class="generalSumTR">'
        , '        <td class="border"><span class="text">Выбрано товара на сумму</span></td>'
        , '        <td class="priceTD">'
        , '            <span class="text price"> </span>'
        , '        </td>'
        , '        <td></td>'
        , '        <td></td>'
        , '    </tr>'

        , '    <tr class="generalDiscontTR">'
        , '        <td class="border"><span class="text">Скидка</span></td>'
        , '        <td class="priceTD">'
        , '            <span class="text price"></span>'
        , '        </td>'
        , '        <td></td>'
        , '        <td></td>'
        , '    </tr>'

        , '    <tr class="generalTotalSumTR">'
        , '        <td class="border textTDtotal bottom">'
        , '            <span class="text">Сумма заказа</span>'
        , '        </td>'
        , '        <td class="priceTDtotal bottom">'
        , '            <span class="text totalPrice"></span>&nbsp;<span class="rubPink pink">Р</span>'
        , '        </td>'
        , '        <td></td>'
        , '        <td rowspan="4" class="basketButtonTD bottom">'
        , '            <div class="basketButton">'
        , '                <a href="#" class="button">'
        , '                    <span><b>Оформить заказ</b></span>'
        , '                </a>'
        , '                <div class="clear"/>'
        , '            </div>'
        , '        </td>'
        , '    </tr>'

        , '</table>'
    ).join( "\n" );
    this.jqClear = jQuery( this.html1, document );
    this.jq      = jQuery( this.html2, document );

    this.setSum = function ( sum ) {
        this.jq.find( 'tr.generalSumTR span.text.price' ).html(
            sum + ' ' + '<span class="rubSmall">Р</span>'
        );
        this.setDiscont( sum );
    };

    this.setDiscont = function ( sum ) {
        var discont = 0;
		for ( var i=0; i<this.discontTab.length; i++ ) {
            var from    = this.discontTab[ i ].from;
            var to      = this.discontTab[ i ].to;
			if ( ( sum >= from ) && ( sum <= to ) )
                discont = this.discontTab[ i ].discont;
		}
        this.jq.find( 'tr.generalDiscontTR span.text.price' ).text( discont + '%' );
        this.setTotalSum( sum, discont );
    };

    this.setTotalSum = function ( sum, discont ) {
        var value = Math.round(sum - ( sum / 100 * discont ));
        this.jq.find( 'tr.generalTotalSumTR span.text.totalPrice' ).text( value );
    };
}

function BasketItem ( set, mode, data ) {
    this.set  = set;
    this.mode = mode;
    this.data = data;
	this.id   = data.r_id;
    this.html = new Array(
         '<div class="item">'
       , '    <div class="RCwhite1Basket">'
       , '        <div class="RCwhite2">'
       , '            <div class="RCwhiteHeader"></div>'
       , '        </div>'
       , '    </div>'
       , '    <div class="RCwhiteCenterBasket">'
       , '    </div>'
       , '    <div class="RCwhite3">'
       , '        <div class="RCwhite4">'
       , '            <div class="RCwhiteFooter"></div>'
       , '        </div>'
       , '    </div>'
       , '</div>'
    ).join( "\n" );
    this.jq      = jQuery( this.html, document );

    this.del = function () {
        this.set.remove( this.id );
    };

    this.refresh = function () {
        this.set.refresh();
    };

    this.getOrderData = function () {
		var order = this.order.getOrderData();
		for (var i = 0; i < order.length; i++) {
            order[i].i_id = this.data.i_id;
            order[i].r_id = this.data.r_id;
            order[i].type = this.data.type;
		}
		return order;
	};

    this.general = new BasketItemGeneral( this );
    this.order   = new BasketItemOrder( this );

    this.jq.find( 'div.RCwhiteCenterBasket' ).append( this.order.jq );
    this.jq.find( 'div.RCwhiteCenterBasket' ).append( this.general.jq );
}

function BasketItemGeneral ( item ) {
    this.item = item;
    this.html = new Array(
          '<div class="item2">'
        , '    <div class="image">'
        , '        <a href="/3/'+this.item.data.node_id+'/'+this.item.data.i_id+'/" title="">'
        , '            <img src="" class="img" alt=""/>'
        , '        </a>'
        , '    </div>'
        , '    <div class="desc">'
        , '        <div class="title"><a href="/3/'+this.item.data.node_id+'/'+this.item.data.i_id+'/" title=""></a></div>'
        , '        <div class="text"></div>'
        , '        <div class="maker"></div>'
        , '    </div>'
        , '    <div class="clear"></div>'
        , '</div>'
    ).join( "\n" );
    this.jq = jQuery( this.html, document );

    var data = {
        'imgsrc': '/f'+this.item.data.matrix[0]
    };
    this.jq.find( 'div.image a img.img' ).attr( 'src', '/f'+this.item.data.matrix[0]+'?w=100' );
    this.jq.find( 'div.desc div.title a:first' ).html(
        this.item.data.title + '<br/>' + this.item.data.articul
    );
    //this.jq.find( 'div.desc div.text' ).text( this.item.data.categories );
    this.jq.find( 'div.desc div.maker' ).text( this.item.data.prod_title );
}

function BasketItemOrder ( item ) {
    this.item = item;
    this.html = new Array(
          '<table class="item2Table">'
        , '    <tr class="summTR">'
        , '        <td class="summTD">Сумма:</td>'
        , '        <td class="priceTD"></td>'
        , '        <td class="numberTD"/>'
        , '        <td class="colorTD"/>'
        , '        <td class="delTD"/>'
        , '    </tr>'
        , '</table>'
    ).join( "\n" );
    this.items = new Array();
    this.jq = jQuery( this.html, document );

    this.getOrderData = function () {
		var data = new Array();
		for (var i = 0; i < this.items.length; i++) {
			var row = this.items[i].getOrderData();
			data.push( row );
		}
		return data;
	};

    this.add = function ( data ) {
        var item = new BasketItemOrderItem( this, data );
        this.items.push( item );
        //this.jq.append( item.jq );
        this.jq.find( 'tr.summTR:first' ).before( item.jq );
    };

    this.remove = function ( id ) {
        var tmp = new Array();
        for ( var i=0; i<this.items.length; i++ )
            if ( this.items[ i ].id != id )
                tmp.push( this.items[ i ] );
            else
                this.items[ i ].jq.remove();
        this.items = tmp;
        if ( this.items.length > 0 )
            this.items[0].setPrice( this.item.data.price );
        this.refresh();
    };

    this.del = function () {
        this.items = null;
        var item   = this.item;
        this.item  = null;
        item.del();
    };

    this.setTotalSum = function () {
        this.jq.find( 'tr.summTR td.priceTD:first' ).html(
            '<span class="totalSumm">'+this.getTotalSum()+'</span>'
        );
    };

    this.getTotalSum = function () {
        var totalSum = 0;
		if (this.items != null)
        {
			for ( var i=0; i<this.items.length; i++ )
				totalSum += this.items[ i ].quantity.value();
			totalSum *= this.item.data.price;
		}
        return totalSum;
    };

    this.refresh = function () {
        if ( this.items.length == 0 )
            this.del();
        this.setTotalSum();
        if  (this.item!= null) this.item.refresh();
    };

    for ( var i=0; i<this.item.data.rest.length; i++ )
        this.add( this.item.data.rest[ i ] );
    if ( this.items.length > 0 ) {
        this.items[0].setPrice( this.item.data.price );
        this.items[ this.items.length-1 ].setBorder();
        this.setTotalSum();
    }
}

function BasketItemOrderItem ( order, data ) {
    this.order = order;
    this.data  = data;
    this.id    = data.size + ( data.color_id || 0 )
    this.html  = new Array(
          '<tr>'
        , '    <td class="summTD"></td>'
        , '    <td class="priceTD"></td>'
        , '    <td class="numberTD border"></td>'
        , '    <td class="colorTD border">'
        , (
            ( this.data.color_id != undefined )
                ? '        <div class="color" style="background:'+this.data.color_title+';"></div>'
                : ''
        )
        , '        <div class="size">'
        , (
            this.data.size || ''
        )
        , '        </div>'
        , '    </td>'
        , '    <td class="delTD border">'
        , '        <a href="#" title="">'
        , '            <img src="/a0/ru/images/quickRunCloseButton.gif" alt="Удалить"/>'
        , '        </a>'
        , '    </td>'
        , '</tr>'
    ).join( "\n" );
    this.jq = jQuery( this.html, document );

    this.setPrice = function ( price ) {
        this.jq.find( 'td.priceTD:first' ).html( '<span>'+price+'</span>' );
    };

    this.setBorder = function () {
        this.jq.find( 'td.summTD:first' ).addClass( 'border' );
        this.jq.find( 'td.priceTD:first' ).addClass( 'border' );
    };

    this.del = function () {
        this.quantity = null;
        var order     = this.order;
        this.order    = null;
        order.remove( this.id );
    }

    this.refresh = function () {
        this.order.refresh();
    };

    this.getOrderData = function () {
		return {
              'r_id'    : this.data.r_id
            , 'i_id'    : this.data.i_id
            , 'size'    : this.data.size
            , 'color_id': this.data.color_id
            , 'quantity': this.quantity.value()
		};
	};

    this.quantity = new BasketItemOrderItemQuantity ( this, data.quantity, order );
    this.jq.find( 'td.numberTD' ).append( this.quantity.jq );

    var self = this;
    this.jq.find( 'td.delTD a:first' ).click( function ()
		{
			/* Удаление */
			var i = order.item.data.i_id;

			var basketID = $.cookie( 'basket_id' );
			$.ajax( {
				async: false,
				type: "POST",
				url: "/basket/do/0/",
				data: 'basket_id='+( ( basketID == null ) ? 0 : basketID )
					+'&count='+self.data.quantity+'&i='+i+'&size='+self.data.size+'&color='+self.data.color_id,
				success: function( str ) {
						/*self.del();
						var fdata = new Function( 'return '+str);
						var data  = fdata();
						$("#headerBasketQuantityInfo").text(data.quantity);
						$("#headerBasketCostInfo").text(data.cost);*/
						document.location="/basket/";
				},
				error: function(xhr, textStatus, errorThrown){
					alert( 'Произошла ошибка: '+xhr.statusText + "\n" + textStatus );
				}
			} );

			return false;
		}
	);
}

function BasketItemOrderItemQuantity ( orderItem, value, order ) {
    this.orderItem = orderItem;
    this.html      = new Array(
          '<div class="numberChange">'
        , '    <a href="#" class="left" title=""></a>'
        , '    <input type="text" value="" readonly="readonly"/>'
        , '    <a href="#" class="right" title=""></a>'
        , '</div>'
    ).join( "\n" );
    this.jq = jQuery( this.html, document );

    this.value = function () {
        return parseFloat( this.jq.find( 'input:first' ).val() );
    };

    this.set = function ( value ) {
        this.jq.find( 'input:first' ).val( value );
    };

    this.set( value );
    var self = this;

    this.jq.find( 'a.left:first' ).click( function () {
        var number = self.value();
        if( number > 1 )
			{
				self.set( number-1 );
				BasketItemRewrite(orderItem,self.value(), order);
			}
        self.orderItem.refresh();
        return false;
    } );

    this.jq.find( 'a.right:first' ).click( function () {
        self.set( self.value()+1 );
		BasketItemRewrite(orderItem,self.value(), order);
        self.orderItem.refresh();
        return false;
    } );
}



function BasketItemRewrite ( orderItem, value, order ) {
//	var table = prettyPrint( order, { /*optional options object */ } );
//	document.body.appendChild(table);

	orderItem.data.quantity = value;
	var i = order.item.data.i_id;

	var basketID = $.cookie( 'basket_id' );
	$.ajax( {
		async: false,
		type: "POST",
		url: "/basket/do/1/",
		data: 'basket_id='+( ( basketID == null ) ? 0 : basketID )
			+'&count='+orderItem.data.quantity+'&i='+i+'&size='+orderItem.data.size+'&color='+orderItem.data.color_id,
		success: function( str ) {
                var fdata = new Function( 'return '+str);
                var data  = fdata();
				$("#headerBasketQuantityInfo").text(data.quantity);
				$("#headerBasketCostInfo").text(data.cost);
		},
		error: function(xhr, textStatus, errorThrown){
			alert( 'Произошла ошибка: '+xhr.statusText + "\n" + textStatus );
		}
	} );
};
