/**********************************************************************************}
{                                                                                  }
{                   ПО КОРЗИНЫ НЕПОСРЕДСТВЕННО                                     }
{                                                                                  }
{**********************************************************************************/

/*-------------------------------------TODO:--------------------------------------*/
/*


*/

/*------------------------------ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ-----------------------------*/

  var c_pr = 0;               // текущий подарок
  var act_cnt = 0;            // количество акций
  var act_arr = new Array(3); // массив акций
  isCart = true;              // флаг корзины
  isFrmld = false;            // фрейм не загружен
  isFLoad = true;             // загрузка фрейма первая
  var st_num = 0;             // номер запуска процеду пересчета
  
  isCart = true;              // метим, что у нас корзина в работе
  
  // TEMPORARY!!!!!!!
  glob_user_disc = 0;


/*------------------------------------АКЦИИ---------------------------------------*/
  /*->конструктор объекта*/

  function Action(){
    /*====================================свойства===============================================*/
    this.cur_value = 0;              // стоимость товаров в корзине по данной акции в дефолтной валюте
    this.max_fc_value = 0;           // стоимость товаров по максимальному комплекту
    this.is_fc = false;              // полнота комплекта qo-товаров в акции
    this.all_prod = "P_ALL";         // константа, говорящая о том, что к серии относятся все продукты

    this.p = new Array();            // двумерный массив товаров p[i] = [id, kol-vo, kol-vo_max, and_condition]
                                     // если kol-vo = -1, то товар отностися к value_oriented наполнению
                                     // если kol-vo => 0, то к quont_oriented наполнению
                                     // and_condition - если продукт quont_oriented то считать его по условию И (default) или ИЛИ

    this.pt = new Array();           // двумерный массив подарков pt[i] = [id, value, value_max, is_combined]
                                     // если value = -1, то подарок отностися к quont_oriented наполнению
                                     // если value => 0, то к value_oriented наполнению

    this.d = new Array();            // двумерный массив скидок d[i] = [disc_%, value, value_max, is_combined]
                                     // если value = -1, то скидка отностися к quont_oriented наполнению
                                     // если value => 0, то к value_oriented наполнению
                                     //

    this.prod_cnt = 0;               // кол-во товаров в акции
    this.pres_cnt = 0;               // кол-во подарков в акции
    this.disc_cnt = 0;               // кол-во скидок в акции

    /*====================================методы===============================================*/
    this.is_in_action      = is_in_action;
    this.set_current_value = set_current_value;
    this.set_max_discount  = set_max_discount;
    this.is_full_complect  = is_full_complect;
    this.set_avalible_pr   = set_avalible_pr;
  }

  /*->проверка на принадлежность товара к акции */
  // a_type: 1 - в value_oriented
  //         2 - в quont_oriented
  //         3 - всё равно где
  function is_in_action(id_prod, a_type){
    var i = 0;
    for (i = 0; i < this.prod_cnt; i++){
      if(this.p[i][0] == this.all_prod || this.p[i][0] == id_prod){
        if( (this.p[i][1] == -1 && a_type == 1) ||
            (this.p[i][1] >= 0  && a_type == 2) ||
            (a_type == 3)
          ){
          return i;
        }
        else{
          return -1;
        }
      }
    }
    return -1;
  }

  /*-> подсчет суммы по акции (для vo товаров)*/
  function set_current_value(){
    var i;
    var b_tab = document.getElementById('b_tab');
    var verge = b_tab.rows.length - 2;
    this.cur_value = 0;
    for(i = 1; i < verge; i++){
      if(this.is_in_action(Math.floor(getNumber(b_tab.rows[i].id)), 1) > -1){
        this.cur_value += getNumber(b_tab.rows[i].childNodes[1].innerHTML)*(parseInt(b_tab.rows[i].childNodes[3].childNodes[0].value),10)*arrCurency[cCurrency][0]/arrCurency[relative_currency][0];
      }
    }
  }

  
  /*-> проверка полноты комплекта qo-товаров*/
	function is_full_complect(){
		var i = 0;
		
		this.max_fc_value = 0;
		
		is_has_or	= false;
		
		or_value 	= 0;
		and_value 	= 0;
		
		
		for (i = 0; i < this.prod_cnt; i++){

			if(this.p[i][3] == 'C_OR' && this.p[i][1] > 0){
				is_has_or = true;
			}

			// если продукт входит на условии И и его нет (либо мало, или больше чем надо)
			if(this.p[i][3] == 'C_AND' && this.p[i][1] > 0){
				// проверка наличия
				if(b_tab.rows["pr_row_"+this.p[i][0]]){
					// совпадает ли количество 
					if(parseInt(b_tab.rows["pr_row_"+this.p[i][0]].childNodes[3].childNodes[0].value) < this.p[i][1] || (parseInt(b_tab.rows["pr_row_"+this.p[i][0]].childNodes[3].childNodes[0].value) > this.p[i][2] && this.p[i][2] > 0)){
						this.max_fc_value = 0;
						return (this.is_fc = false);
					}
				}
				else{
					this.max_fc_value = 0;
					if(this.p[i][1] > 0) return (this.is_fc = false);
				}
			}
			
			// если продукт входит на условии И и он есть в нужном кол-ве (иначе бы вылетело 5 строками выше)
			if(this.p[i][3] == 'C_AND' && this.p[i][1] > 0){
				and_value += getNumber(b_tab.rows["pr_row_"+this.p[i][0]].childNodes[1].innerHTML)*(parseInt(b_tab.rows["pr_row_"+this.p[i][0]].childNodes[3].childNodes[0].value))*arrCurency[cCurrency][0]/arrCurency[relative_currency][0];
				continue;
			}
			
			// если продукт входит на условии ИЛИ и он есть в нужном количестве
			if(this.p[i][3] == 'C_OR' && this.p[i][1] > 0){
				// проверка наличия
				if(b_tab.rows["pr_row_"+this.p[i][0]]){
					// совпадает ли количество 
					if(parseInt(b_tab.rows["pr_row_"+this.p[i][0]].childNodes[3].childNodes[0].value) >= this.p[i][1] || (parseInt(b_tab.rows["pr_row_"+this.p[i][0]].childNodes[3].childNodes[0].value) <= this.p[i][2] || this.p[i][2] > 0)){
						tmp_or_value = getNumber(b_tab.rows["pr_row_"+this.p[i][0]].childNodes[1].innerHTML)*(parseInt(b_tab.rows["pr_row_"+this.p[i][0]].childNodes[3].childNodes[0].value))*arrCurency[cCurrency][0]/arrCurency[relative_currency][0];
						or_value = (tmp_or_value > or_value) ? tmp_or_value : or_value;
					}
				}
			}
		}
		
		// анализируем результат исходя из того, что если бы не было обязательной части комплекта 
		// - сюда бы мы никак не пришли )) т.е. либо обязательная часть вообще не задана, либо она укомплектована полностью
		// т.е. анализируем, есть ли остаток комплекта на условиях ИЛИ
		
		// если комплектные товары на условиях ИЛИ к акции приписаны
		if(is_has_or){
			if( or_value > 0){
				// часть комплекта на условиях ИЛИ есть - все ок
				this.max_fc_value = or_value + and_value;
				this.is_fc = true;
			}
			else{
				// недостача вышла...
				this.max_fc_value = 0;
				this.is_fc = false;
			}
		}
		// если комплектные товары на условиях ИЛИ к акции не приписаны
		else{
			// если вообще что-то от комплекта есть (а именно обязательная часть)
			if(and_value > 0){
				this.max_fc_value = and_value;
				this.is_fc = true;
			}
			// гы.. а что тогда воопще к акции приписано??!!!
			else{
				this.max_fc_value = 0;
				this.is_fc = false;
			}
		}
		return this.is_fc;
		
		
	}

  
  /*-> выбор оптимальной скидки для каждого товара*/
  /*глюк: комплектная скидка идет и на vo товары*/
  function set_max_discount(step){
    var max_d = 0;
    var i = 0;
    this.is_full_complect();
    this.set_current_value();
    
    // расчет максимальной скитки
	 for (i = 0; i < this.disc_cnt; i++){
	 	if(this.d[i][3] == 'NON_COMBINED'){
		 	if(((this.d[i][1] == -1 && this.is_fc) || (this.d[i][1] >= 0 && this.d[i][1] <= this.cur_value && ( this.d[i][2] >= this.cur_value || this.d[i][2] <= 0 ))) && (this.d[i][0] > max_d)){
		 		max_d = this.d[i][0];
		 	}
	 	}
	 	else if(this.d[i][3] == 'COMBINED'){
	 		if((this.is_fc && (this.d[i][1] >= 0 && this.d[i][1] <= this.max_fc_value && ( this.d[i][2] >= this.max_fc_value || this.d[i][2] <= 0 ))) && (this.d[i][0] > max_d)){
		 		max_d = this.d[i][0];
		 	}
	 	}
    }
    
    // установка расчетного значения
    for (i = 0; i < this.prod_cnt; i++){
      if(this.p[i][0] == this.all_prod){
        var verge = b_tab.rows.length - 2;
        var j;
        for(j = 1; j < verge; j++){
          if(parseInt(b_tab.rows[j].childNodes[2].innerHTML) < max_d || parseInt(b_tab.rows[j].childNodes[2].st_num) < step){
            b_tab.rows[j].childNodes[2].innerHTML = max_d + "%";
            b_tab.rows[j].childNodes[2].st_num = step;
          }
        }
        return;
      }
      if(b_tab.rows["pr_row_"+this.p[i][0]]){
        if(parseInt(b_tab.rows["pr_row_"+this.p[i][0]].childNodes[2].innerHTML) < max_d + glob_user_disc || parseInt(b_tab.rows["pr_row_"+this.p[i][0]].childNodes[2].st_num) < step){
          b_tab.rows["pr_row_"+this.p[i][0]].childNodes[2].innerHTML = max_d + glob_user_disc + "%";
          b_tab.rows["pr_row_"+this.p[i][0]].childNodes[2].st_num = step;
        }
      }
    }
  }

  /*-> показываем доступные подарки и убираем недоступные*/
  function set_avalible_pr(step){
	var i = 0;
	var op_count = 0;
	for (i = 0; i < this.pres_cnt; i++){
	// подарок на простом условии (NON_COMBINED) (ИЛИ)
		if(this.pt[i][3] == 'NON_COMBINED'){
		   if((this.pt[i][1] == -1 && this.is_fc) || (this.pt[i][1] >= 0 && this.pt[i][1] <= this.cur_value && (this.pt[i][2] >= this.cur_value || this.pt[i][2] <= 0))){
		   	p_tab.rows["pt"+this.pt[i][0]].style.display = "block";
		   	p_tab.rows["pt"+this.pt[i][0]].st_num = step;
		   	op_count++;
		   }
		   else if(parseInt(p_tab.rows["pt"+this.pt[i][0]].st_num) < step){
		   	p_tab.rows["pt"+this.pt[i][0]].style.display = "none";
		   	if(c_pr == this.pt[i][0]){
		   		del_present();
				}
			}
		}
	// подарок на комбинированном условии (COMBINED) (И)
		else if(this.pt[i][3] == 'COMBINED'){
			if(this.is_fc && (this.pt[i][1] >= 0 && this.pt[i][1] <= this.max_fc_value && (this.pt[i][2] >= this.max_fc_value || this.pt[i][2] <= 0))){
		   	p_tab.rows["pt"+this.pt[i][0]].style.display = "block";
		   	p_tab.rows["pt"+this.pt[i][0]].st_num = step;
		   	op_count++;
		   }
		   else if(parseInt(p_tab.rows["pt"+this.pt[i][0]].st_num) < step){
		   	p_tab.rows["pt"+this.pt[i][0]].style.display = "none";
		   	if(c_pr == this.pt[i][0]){
		   		del_present();
				}
			}
		}
	}
	return op_count;
  }

/*--------------------------------ПРЯМАЯ РАБОТА-----------------------------------*/

	/*выбирает из строки цену в формате *.* */
	function getNumber(str){
		var re = /\d+(\.\d+)?/;
		var tArr = re.exec(str);
		var num = parseFloat(tArr[0]);
		return num;
	}
	
	/*добавляет значок денег*/
	function setMoney(price){
		if(price == 0) return 0;
		if(arrCurency[cCurrency][2] == "before"){
			return arrCurency[cCurrency][1] + price;
		}
		else{
			return  price + arrCurency[cCurrency][1];
		}
	}
	
	/*Инициирует пересчет таблицы и суммарных цен на клиенте*/
	function cal(obj){
		
		var productAmount = jQuery(obj).val();
		st_num++; // увеличиваем номер запуска (для подарков наверно)
		
		//считаем скидки
		for (i = 0; i < act_cnt; i++)
		{
			act_arr[i].set_max_discount(st_num);
		}
		
		if( productAmount == 0 ) 
		{
			del_prod_from_cart(jQuery(obj).parent().parent().attr('id'));
		}
		
		recalculateCart(obj);// считаем сумму корзины
		
		reInitPT(st_num);// перерисовываем подарки
		recount(jQuery(obj).attr('id'), productAmount);// пересчет корзины на сервере
	}
	
	/*Инициирует пересчет на сервере*/
	function recount(id, count){
		var params = new Object();
		params.product_id = id;
		params.count = count;
		ajaxSend(AJAX.recount, params);
	}

	/*Добавляет товар в корзину*/
	function add_prod_to_cart( i_prod_id, credit_info )
	{
		createMessage("Минуточку...", "#4f4f4f");

		var params = new Object();
		params.product_id = i_prod_id;
		
		params.cos_id = 0;//Класс обслуживания
		var selectListAcc = document.getElementsByClassName('select-cos');
		params.cos_id = selectListAcc[0].options[selectListAcc[0].selectedIndex].value;
		
		if( credit_info )
		{
			params.credit_program_id = credit_info[0];
			params.first_payment = credit_info[1];
			params.credit_period = credit_info[2];
			if( credit_info == "del_cred" )
			{
				params.subaction = "del_cred";
			}
		}

		ajaxSend(AJAX.add_prod_to_cart, params);
		//updateCartPrices(params.cos_id);//Обновляем корзину в соотв. с новым выбранным классом обслуживания
	}
	
	/*Удаляет товар*/
	function del_prod_from_cart(id)
	{
		var params = new Object();
		params.product_id = Math.floor(getNumber(id));
		ajaxSend(AJAX.del_prod_from_cart, params);
		
		var delRow = jQuery('#'+id);
		delRow.remove();
		cal( jQuery('.product-amount input').get(0) ); 
		if( jQuery('#b_tab tr.product').length == 1 )
		{
			jQuery('#b_tab td.prod-del span').hide();
		}
	}
	  
	/*перерисовывает таблицу подарков*/
	function reInitPT(step){
		var table_is_empty = true;
		for (i = 0;i < act_cnt; i++){
			table_is_empty = (act_arr[i].set_avalible_pr(step) > 0) ? false : table_is_empty;
		}
		if(document.getElementById('present_box')){
			document.getElementById('present_box').style.display = (table_is_empty) ? 'none' : 'block';
		}
	}
	
	/*ставит подарок*/
	function add_present(el, param){
		var b_tab = document.getElementById('b_tab');
		if(param == 1){
			c_pr = parseInt(el.value);
			newNode = el.parentNode.nextSibling.firstChild.cloneNode(true);
			//newNode.insertAdjacentHTML("afterBegin", "<span style='color:red'>Подарок! </span>");
			b_tab.rows[b_tab.rows.length - 2].childNodes[0].replaceChild(newNode, b_tab.rows[b_tab.rows.length - 2].childNodes[0].firstChild);
			b_tab.rows[b_tab.rows.length - 2].style.display = "block";
		}
		else{
			c_pr = el;
		}
		var params = new Object();
		params.present_id = c_pr;
		ajaxSend(AJAX.add_present, params);
	}
	  
	  
	/*удаляет подарок из сессии*/
	function del_present(pres_id){
		var b_tab = document.getElementById('b_tab');
		var p_tab = document.getElementById('p_tab');
		if(!pres_id){
			b_tab.rows[b_tab.rows.length - 2].style.display = "none";
			p_tab.rows["pt"+c_pr].childNodes[0].childNodes[0].checked = false;
			pres_id = c_pr;
			c_pr = 0;
		}
		var params = new Object();
		params.present_id = pres_id;
		ajaxSend(AJAX.del_present, params);
	}

/*-----------------РАСШИРЕНИЕ ОБРАБОТКИ ОТВЕТА СЕРВЕРА----------------------------*/
	function cart_event_handler(result){
		createMessage(result.message, ((result.common_code == 1) ? "#4f4f4f" : "red"), 2000);

		// рисуем товар в корзине
		var d = document;
		var klvo = parseInt(result.cart_prod_count);

		if( klvo > 0 )
		{
			jQuery('#basket').html( klvo ).css( 'color', '#24a100' );
		}
		else 
			if( klvo == 0 )
			{
				if( d.all.sum_span && parseInt(d.all.sum_span.innerHTML) == 0 )
				{
					window.location.reload(true);
				}
				if( d.all.basket_cont )
				{
					d.all.basket_cont.style.color = '#4a4a4a';
				}
				jQuery('#basket').html( klvo ).css( 'color', '#707070' );
			}
	}
	
	handle_recount = cart_event_handler;
	handle_del_prod_from_cart = cart_event_handler;
	
// хэндлер обработки добавления товара в корзину
	function handle_add_prod_to_cart(result)
	{
		createMessage(result.message, ((result.common_code == 1) ? "#4f4f4f" : "red"), 1500);
		
		var d = document;
		var klvo = parseInt( result.cart_prod_count );
		
		// подновляем корзину
		if( klvo > 0 )
		{
			jQuery('#basket').html( klvo ).css( 'color', '#24a100' );
		}

		if ( result.common_code == 1 )
		{
			var lastProductRow = jQuery('table tr.product:last');
			var newProductRow = lastProductRow.clone();
			var productInfo = result.product_info;
			var cosInputs = jQuery('td.name div.cos-prices input', newProductRow);
			var amountInput = jQuery('td.product-amount input', newProductRow);
			var k=0;
			
			newProductRow.attr( 'id', 'pr_row_' + result.product_id );
			
			// картинка-ссылка
			jQuery('td.image a', newProductRow).attr( 'href', productInfo.link );
			jQuery('td.image img', newProductRow).attr({ 
		          src: productInfo.img_url,
		          title: productInfo.name,
		          alt: productInfo.name
		        });
			
			// название товара
			jQuery('td.name a', newProductRow).attr( 'href', productInfo.link ).text( productInfo.name );
			for( i in productInfo.prices )
			{
				cosInputs.eq(k).val( productInfo.prices[i] ).attr( 'class', 'price-'+i );
				k++;
			}
			
			// количество товара
			amountInput.val( productInfo.count ).attr( 'id', result.product_id );
			
			// цена
			jQuery('td.product-price', newProductRow).text( (productInfo.price).replace( 'руб.', 'р.' ) );
			
			// скидка
			jQuery('td.product-discount', newProductRow).text( productInfo.discount + '%' );
			
			// кредит
			jQuery('td.credit input', newProductRow).val( productInfo.count ).attr( 'id', 'cr_chkbox_' + result.product_id );
			jQuery('td.credit img', newProductRow).click( 
					function ()
					{ 
						window.open('/cc/product'+result.product_id+'/', null,'top=100, left=100, height=700, width=600, scrollbars=yes') 
					}
				);
			
			// итого
			jQuery('td.prod-total-sum', newProductRow).text( productInfo.total_price );
			
			// отображаем все что сделали
			newProductRow.insertAfter( lastProductRow );
			jQuery('#b_tab td.prod-del span').show();
			
			// кнопка удаления
			jQuery('td.prod-del span', newProductRow).removeAttr('onclick').click( 
					function()
					{ 
						del_prod_from_cart('pr_row_'+result.product_id) 
					}
				);
			
			// пересчитываем корзину
			cal(amountInput);
		}
	};
	
	function handle_del_present(){};
	function handle_add_present(){};
	
	
	function updateCartPrices( cos ) {
		//Во-первых, меняем заголовок с классом обслуживания
		jQuery('#currHeadCOS span').css('display', 'none');
		jQuery('#currHeadCOS span.cos-name-'+cos).css('display', 'inline');
		
		//Во-вторых, пересчитываем цены в корзине
		var b_tab = document.getElementById('b_tab');
		for(i=1;i<b_tab.rows.length - 2;i++)
		{
			currPrices = getElementsByClassName('cos-prices', b_tab.rows[i])[0];
			currAmount = getElementsByClassName('product-amount', b_tab.rows[i])[0];
			getElementsByClassName('product-price', b_tab.rows[i])[0].innerHTML = getElementsByClassName('price-'+cos, currPrices)[0].value;
			cal(currAmount.getElementsByTagName('input')[0], 1);
		}
		
		var elems = getElementsByClassName( cos );
		var selectListAcc = getElementsByClassName( 'select-cos' );

		//---------------------------------------------------------
		//Сообщаем о понижении класса обслуживания
		var currCos = document.getElementById('currentCos').value;
		var currCosPriority =  getElementsByClassName( 'cp-'+currCos, document.getElementById('cosPriorities') )[0].value;
		var newCosPriority =  getElementsByClassName( 'cp-'+cos, document.getElementById('cosPriorities') )[0].value;
		if( newCosPriority > currCosPriority )
		{
			createMessage("Класс обслуживания был понижен!", "#4f4f4f", 2000);
		}
		document.getElementById('currentCos').value = cos;
	}
	
	
/***************************************************************************************************************************************/
/********************							jQuery Cart functional implementation                      			********************/	

function recalculateCart(obj){
	
	var productAmount = jQuery(obj).val();
	var currentRow = jQuery(obj).parent().parent();
	var productPrice  = jQuery('td.product-price', currentRow).text();
	var trimmedProductPrice = trim( productPrice );
	var productPriceCurrency = 'р.';
	var totalProdSumContainer = jQuery('td.prod-total-sum', currentRow );
	var totalProductSums = jQuery('td.prod-total-sum');
	var totalPrice = 0;
	
	productPrice = parseInt( trimmedProductPrice );//Выдернули цифры
	var currency = trimmedProductPrice.replace( productPrice, '' );
	productPriceCurrency = ( currency == 'руб.' ) ? productPriceCurrency : currency;//Выдернули валюту
	
	totalProdSumContainer.text( numberFormat( productPrice*productAmount ) + ' ' + productPriceCurrency );
	
	for(i=0;i<totalProductSums.length;i++)
	{
		totalPrice += parseInt( trim( jQuery(totalProductSums.get(i)).text() ) );	
	}
	jQuery('span#sum_span').text( numberFormat( totalPrice ) + ' ' + productPriceCurrency );
}
	
//-------------------------------------------------------------------------------------------
//Разбивает число по разрядам
function numberFormat (number)
{
	var number = Math.round(number);
	var formattedSum = '';
	var subSum = '';
	if( number > 9999 )
	{
		while( number/1000 > 1 )//Идем по разрядам
		{
			cutNum = number%1000;
			number = (number - cutNum)/1000;
			
			if( ( cutNum >= 0 ) && ( cutNum <= 9 ))
			{
				subSum = '00' + cutNum ;
			}
			else
			if( ( cutNum >= 10 ) && ( cutNum <= 99 ) )
			{
				subSum = '0' + cutNum;
			}
			else
			{
				subSum = cutNum;
			}

			formattedSum = ' ' + subSum + formattedSum;	
		}
		
		formattedSum = number + formattedSum;
	}
	else
	{
		formattedSum = number;
	}
	
	return formattedSum;
}	
	
//-------------------------------------------------------------------------------------------
//Удаляет прбелы из строки
function trim(str)
{
	return str.replace(/\s+|\s+$/g, '');
}
	
	