//{{{ promoOrderLoginRegSubmitSuccess
/**
 * Обрабатывает результат логина на странице заказа
 * @since  27.08.2008 11:26:44
 * @author jikk
 * @param Object Json то, что пришло от сервера
 */
function promoOrderLoginRegSubmitSuccess( Json )
{
	if ( Json.errors )
	{
		this.$el.find('div.j-error').text( Json.errors[0][0] );
		this.trigger('fail');
		this.submitInProgress = false;
	}
	else if ( ! Json.formErrors || ! Json.formErrors.length ) {
		document.location.href = promoOrderLoginRegSubmitSuccessUrl;
	}
}
//===========================================================================}}}
//{{{ bumsOrderRbtnVersionSelect
/**
 * Этот метод обрабатывает изменение типа продукта (саас, коробка)
 * @since  27.08.2008 11:29:42
 * @author jikk
 * @param string Id идентификатор
 */
function bumsOrderRbtnVersionSelect( Id )
{
	var id = typeof( Id ) === 'string' ? Id : this.id;
	var $j1 = $( '#' + id ), otherId = (id === 'rbtnSaas' ? 'rbtnBox' : 'rbtnSaas');
	var $p = $j1.parents( '.radio-btn' );
	var $j0 = $p.find('div[id="' + otherId + '"]');
	$j1.attr( 'class', 'sel' );
	$j0.attr( 'class', '' );
	if ( id === 'rbtnSaas' )
	{
		$( '#orderProductType' ).val( 'saas' );
		$( 'table.configurator').removeClass('type-box').addClass('type-saas');
	}
	else
	{
		$( '#orderProductType' ).val( 'box' );
		$( 'table.configurator').removeClass('type-saas').addClass('type-box');
	}
	bumsOrderRecalc();
}
//===========================================================================}}}
//{{{ bumsOrderRbtnClientTypeSelect
/**
 * Этот метод обрабатывает изменение типа клиента (юр, физ)
 * @since  27.08.2008 11:29:42
 * @author jikk
 * @param string Id идентификатор
 */
function bumsOrderRbtnClientTypeSelect( Id )
{
	var id = typeof( Id ) === 'string' ? Id : this.id;
	if ( id === 'rbtnYur' )
	{
		$( '#rbtnYur' ).attr( 'class', 'sel' );
		$( '#rbtnFiz').attr( 'class', '' );
		$( '#fClientType' ).val( 'yur' );
		$( '.fiz').hide();
		$( '.yur').show();
	}
	else
	{
		$( '#rbtnFiz' ).attr( 'class', 'sel' );
		$( '#rbtnYur').attr( 'class', '' );
		$( '#fClientType' ).val( 'fiz' );
		$( '.yur').hide();
		$( '.fiz').show();
	}
	if ( $('#orderProductType').val() === 'saas' ) {
		$( 'tr.delivery-addr.' + $('#fClientType').val() ).hide();
	}
	else {
		$( 'tr.delivery-addr.' + $('#fClientType').val() ).show();
	}
	//bumsOrderRecalc();
}
//===========================================================================}}}
//{{{ promoOrderUpdateLicenseCnt
/**
 *	Обновляет значение количества лицензий
 * Нужно, чтобы при изменении конфигурации число в инпуте обновлялось корректно.
 *	@since	09.09.2008	15:10:18
 *	@author	eugene
 * @param bool IsUserInput Является ли данное обновление значения последствием ввода новой цифры пользователем (по умолчанию ложь)
 */
function promoOrderUpdateLicenseCnt( IsUserInput )
{
	if ( typeof( IsUserInput ) == 'undefined' ) IsUserInput = false;

	var $licenseCnt = $( '#licenseCnt' );
	var $licenseCntInput = $( '.license-cnt-input:visible' );
	var $minLicenses = $( '#orderMinLicenses:visible span' );
	var $orderAddMegaplan = $( '#orderAddMegaplan:visible span' );

	var licenseCnt = $licenseCnt.length ? Number( $licenseCnt.val() ) : 0;
	var minLicenses = ( $minLicenses.length ? Number( $minLicenses.text() ) : 0 ) + ( $orderAddMegaplan.length ? Number( $orderAddMegaplan.text() ) : 0 );

	if ( ! IsUserInput && ! $licenseCntInput.attr('val') )
	{
		var inputVal = Math.max( licenseCnt - minLicenses, 0 );
		$licenseCntInput.val( inputVal || '' );
	}
	else if ( $licenseCntInput.val() != $licenseCntInput.attr('val') ) {
	// Значение поменяно пользователем. Нужно сказать всем инпутам об этом
		$('.license-cnt-input').not(':visible').attr('val', '');
	}
	$licenseCnt.val( ( $licenseCntInput.length ? Number( $licenseCntInput.val() ) : 0 ) + minLicenses );
	$licenseCntInput.attr( 'val', $licenseCntInput.val() );

	var curLis = window.promoOrderCurConf ? window.promoOrderCurConf.LicenseQuantity : 0;
	var extraLis = Number( $licenseCnt.val() );
	var totalLis = ! isNaN( extraLis ) ? curLis + extraLis : curLis;

	$('#diskSpaceInfo').html( sdfGetText( '%1% Mb', 100 * totalLis ) );
}
//===========================================================================}}}
//{{{ bumsOrderRecalc
/**
 * Пересчет параметров заказа
 * @since  27.08.2008 11:42:25
 * @author jikk
 */
function bumsOrderRecalc( Evt )
{
	$( '#orderTotal div.error' ).text( '' );

	promoOrderUpdateLicenseCnt( typeof( Evt ) == 'undefined' ? false : true );
	var isBox = $( '#orderProductType' ).val() === 'box';
	var licenseCntVal = $( '#licenseCnt' ).val();
	var licenseMonthsVal = $( '#licenseMonths' ).val();
	if ( $( '#productLine .sel div' ).length ) {
		var productName = $( '#productLine .sel div' ).attr( 'type' );
	}
	else if ( window.promoOrderCurConf ) {
		var productName = window.promoOrderCurConf.Product;
	}
	else {
		productName = 'task';
	}
	var checkFailed = false;

	if( typeof licenseCntVal == 'string' )
	{
		if ( ! /^(-)?[0-9]*$/.test( licenseCntVal ) )
		{
			$( '#licenseTotal' ).text( sdfGetText( 'what did you smoke? Enter a number please' ) );
			checkFailed = true;
		}
		else
		{
			var licenseCnt = Number( licenseCntVal );
			if ( licenseCnt <= 0 )
			{
				if ( ! isBox && window.promoOrderCurConf && Number( licenseMonthsVal ) > 0 ) {
				// это нормальная ситуция
				}
				else if ( ! isBox && window.promoOrderCurConf && productName != window.promoOrderCurConf.Product ) {
				// это тоже нормальная ситуция
				}
				else
				{
					if ( licenseCntVal ) {
						$( '#licenseTotal' ).html( sdfGetText('licence quantity should be positive') );
					}
					else {
						$( '#licenseTotal' ).text( sdfGetText('enter licence quantity') );
					}
					checkFailed = true;
				}
			}
		}
	}
	if ( ! isBox )
	{
		if( typeof licenseMonthsVal == 'string' )
		{
			if ( ! /^(-)?[0-9]*$/.test( licenseMonthsVal ) )
			{
				$( '#monthsTotal' ).text( sdfGetText( 'what did you smoke? Enter a number please' ) );
				checkFailed = true;
			}
			else
			{
				var licenseMonths = Number( licenseMonthsVal );
				if( licenseMonths <= 0 )
				{
					if ( licenseMonths == 0 && window.promoOrderCurConf && window.promoOrderCurConf.daysLeft >= 0 ) {
					// это нормальная ситуация
					}
					else
					{
						$( '#monthsTotal' ).html( sdfGetText('months number should be positive') );
						checkFailed = true;
					}
				}
				else {
					$( '#monthsTotal' ).text( sdfGetText( 'months', null, licenseMonths ) );
				}
			}
		}
		else
		{
			$( '#monthsTotal' ).text( sdfGetText('enter months number') );
			checkFailed = true;
		}
	}

	if ( checkFailed )
	{
		$( '#orderTotal strong' ).text( '' );
		$( '#orderNextStepSw' ).hide();
		return;
	}
	var total = promoCalcOrderSum( productName, isBox ? 'box' : 'saas', licenseCnt, licenseMonths, window.promoOrderCurConf );

	$( '#licenseTotal' ).text( ' = ' + sdfGetText('%1% ' + $.promo.currency, total, total) );
	$( '#orderTotal strong' ).html(
				/*sdfGetText('%1% licence', licenseCnt, licenseCnt)
				+ ' '
				+ sdfGetText('sum total')
				+ ' '
				+*/ sdfGetText('%1% ' + $.promo.currency, total, total) );
	$( '#orderTotalSum' ).val( total );
	if ( ! window.promoOrderCurConf )
	{
		var licensePrice = Math.round( total / licenseCnt );
		if ( isBox ) {
			$( '#licensePrice .r8' ).text( sdfGetText( '%1% ' + $.promo.currency, licensePrice, licensePrice ) );
		}
		else
		{
			licensePrice = Math.round( licensePrice / licenseMonths );
			$( '#licensePrice .r8' ).text( sdfGetText( '%1% ' + $.promo.currency + ' per month' , [licensePrice, $.promo.currency], licensePrice ) );
		}
		$( '#licensePrice' ).show();
	}
	$( '#orderTotal' ).show();
// если получилась отрицательная сумма заказа, то нельзя давать возможность двигаться дальше
	if ( total <= 0 )
	{
		$( '#orderNextStepSw' ).hide();
		$( '#orderTotal div.error' ).text( 'Сумма заказа должна быть положительной' );
	}
	else
	{
		$( '#orderNextStepSw' ).show();
	}

	// промо-акция Apple
	 bumsOrderUpdateSlider( total );
}
//===========================================================================}}}
//{{{ promoCalcOrderSameProduct
/**
 * Вычисляет сумму заказа при неизменных продукте и типе продукта.
 * @since  04.11.2009 15:37:26
 * @author jikk
 * @param string ProductName продукт (task, project, intranet)
 * @param string ProductType тип продукта (saas, box)
 * @param int ExtraLicenses дополнительные лицензии. Может быть отрицательным, но в любом случае сумма ExtraLicenses + CurLicenses должна быть положительной
 * @param string int|float ExtraMonths дополнительно докупаемые месяцы (может быть нецелым числом)
 * @param int|NULL CurLicenses текущее количество лицензий (актуально при докупке / изменении конфигурации)
 * @param int DayLeft количество дней, которое осталось до окончания текущего срока аренды
 */
function promoCalcOrderSameProduct( ProductName, ProductType, ExtraLicenses, ExtraMonths, CurLicenses, DaysLeft )
{
	var priceList = $.promo.priceList;
	var yearDiscount = 9900 / 12000;
	var sum = 0;

	if ( typeof CurLicenses == "undefined" )
	{
		sum = promoCalcPriceSum( priceList[ProductName+'.'+ProductType], ExtraLicenses );
	// Если саас, то есть зависимость от сроков
		if ( ProductType == 'saas' )
		{
			sum = sum / 12 * ExtraMonths;
			if ( ExtraMonths < 12 ) {
				sum = sum / yearDiscount;
			}
		}
	}
	else
	{
		if ( ProductType == 'saas' )
		{
		// Считаем сумму по продлениям лицензий на нужное число месяцев
			var prolongationSum = promoCalcOrderSameProduct( ProductName, ProductType, CurLicenses + ExtraLicenses, ExtraMonths );
		// И добавок - продлить новые лицензии до уровня всех остальных
			var addSum = promoCalcPriceSum( priceList[ProductName+'.'+ProductType], ExtraLicenses, CurLicenses );
			var yearCoeff = DaysLeft / 365;
			addSum *= yearCoeff;
			if ( yearCoeff < 1 ) {
				addSum = addSum / yearDiscount;
			}
			sum = prolongationSum + addSum;
		}
		else {
			sum = promoCalcPriceSum( priceList[ProductName+'.'+ProductType], ExtraLicenses, CurLicenses );
		}
	}
	return sum;
}
//===========================================================================}}}
//{{{ promoCalcOrderSum
/**
 * Считает сумму по заказу
 * @since  09.09.2008 14:30:18
 * @author eugene
 * @param string ProductName Название продукта (project/task/intranet)
 * @param string ProductType Тип (saas/box)
 * @param int ExtraLicenses Количество лицензий (может быть отрицательным)
 * @param int ExtraMonths Количество месяцев продления
 * @param obj Conf Текущая конфигурация (если есть)
 */
function promoCalcOrderSum( ProductName, ProductType, ExtraLicenses, ExtraMonths, Conf )
{
	if ( typeof( Conf ) == 'undefined' ) {
		Conf = null;
	}
	var priceList = $.promo.priceList;

	var yearDiscount = 9900 / 12000;
	var sum = 0;
	if ( Conf )
	{
	// Делаем просто докупку лицензий
		if ( Conf.ProductType == ProductType && Conf.Product == ProductName ) {
			sum = promoCalcOrderSameProduct( ProductName, ProductType, ExtraLicenses, ExtraMonths, Conf.LicenseQuantity, Conf.daysLeft );
		}
	// Докупка лицензий с переходом на другой продукт
		else
		{
		// считаем, сколько денег стоит оставшийся период использования текущего продукта (та сумма, которую клиент еще не "израсходовал" из выплаченных нам денег)
			var curSum = promoCalcOrderSameProduct( Conf.Product, Conf.ProductType, Conf.LicenseQuantity, Conf.daysLeft / 30 );
		// считаем, сколько стоит новый продукт на заказанный срок плюс оставшийся период
			var newSum = promoCalcOrderSameProduct( ProductName, ProductType, Conf.LicenseQuantity + ExtraLicenses, ExtraMonths + Conf.daysLeft / 30);
			sum = newSum - curSum;
		}
	}
	else {
		sum = promoCalcOrderSameProduct( ProductName, ProductType, ExtraLicenses, ExtraMonths );
	}
	return Math.ceil( sum );
}
//===========================================================================}}}
//{{{ promoCalcPriceSum
/**
 *	Вспомогательный метод - считает сумму по прайсу и количеству.
 * Если передан прайс по таску, то этот метод считает, сколько стоит Quantity дополнительных лицензий
 * таска на год, если уже есть curQuantity лицензий
 *	@since	09.09.2008	15:10:18
 *	@author	eugene
 * @param obj Price - прайс
 * @param int Quantity - количество позиций
 * @param int CurQuantity - текущее оплаченное количество
 * @return float
 */
function promoCalcPriceSum( Price, Quantity, CurQuantity )
{
	if ( typeof( CurQuantity ) == 'undefined' ) {
		CurQuantity = 0;
	}

	var sum = 0;
	var cnt = 0;
	quantity = Quantity + CurQuantity;
	for ( i = Price.length - 2; i >= 0; i -= 2 )
	{
		if ( quantity >= Price[i] && quantity > CurQuantity )
		{
			cnt = Math.min( quantity - Price[i] + 1, quantity - CurQuantity );
			sum += cnt * Price[i+1];
			quantity -= cnt;
		}
	}
	return sum;
}
//===========================================================================}}}
//{{{ bumsOrderFormErrorHandler
/**
 * Обработчик ошибок для формы заказа
 * @since  27.08.2008 11:45:12
 * @author jikk
 * @param SdfField Field
 */
function bumsOrderFormErrorHandler( Field )
{
	var ers = Field.errors;

// ищем "строку" (для поля "Адрес доставки" для юр.лица "строкой" будет родительский див)
	if ( Field.inputName == 'yur_delivery_address' ) {
		jRow = Field.jEl.parent( 'div' );
	}
	else {
		jRow = Field.jEl.parents( 'td' );
	}
// возможно, элемент с ошибкой уже был создан
	errCell = jRow.find( 'span.c-error' );

	if ( ers.length )
	{
	// если элемент с ошибкой не создан, создаем его
		if ( 0 == errCell.length )
		{
			jRow.append( '<span class="c-error">' + ers[0].message + '</span>' );
			errCell = jRow.find( 'span.c-error' );
		}
	// если уже был, надо удалить "ошибочный" css-класс у строки
		else {
			jRow.removeClass( errCell.attr( 'type' ) );
		}
		errCell.html( ers[0].message );
		errCell.attr( 'type', ers[0].type );
		jRow.addClass( ers[0].type );
	}
	else
	{
	// если есть элемент с ошибкой, удаляем его и удаляем "ошибочный" css-класс у строки
		if ( errCell.length )
		{
			jRow.removeClass( errCell.attr( 'type' ) );
			errCell.remove();
		}
	}
}
//===========================================================================}}}
//{{{ bumsOrderInitForm
/**
 * Инициализация формы заказа
 * @since  27.08.2008 11:45:59
 * @author jikk
 * @param SdfForm OForm
 */
function bumsOrderInitForm( OForm )
{
	oForm.preValidatorCheck = bumsOrderPreValidatorCheck;
	oForm.beforeSubmitSpecial = function() { return ! $('#orderFirstStep').is(':visible'); };
	$('#orderForm input[name="email"]')
		.bindCheck( 'change|blur', [sdfValidatorNotEmpty,sdfEmailValidator], bumsOrderFormErrorHandler, oForm, false );
	var checkEmpty = ['yur_name', 'phone_num', 'email', 'company_name', 'yur_address', 'yur_delivery_address', 'fiz_name', 'fiz_delivery_address'];
	for ( var i = 0; i < checkEmpty.length; i++ )
	{
		$('#orderForm input[name="'+ checkEmpty[i] +'"]')
			.bindCheck( 'change|blur', [sdfValidatorNotEmpty], bumsOrderFormErrorHandler, oForm, false );
	}
	oForm.onSuccess = function()
	{
		$sdf('#orderBuyBtn').endProgress();
		bumsOrderChangeBlock( '#orderSecondStep', '#orderSuccess' );
	}
}
//===========================================================================}}}
//{{{ bumsOrderPreValidatorCheck
/**
 * Специфические проверки перед стандартной валидацией полей
 * (смысл в том, что если видно первый шаг заказа, то не надо валидировать поля во втором шаге)
 * @since  27.08.2008 11:46:36
 * @author jikk
 * @param SdfField Field
 */
function bumsOrderPreValidatorCheck( Field )
{
	var yurik = ($('#fClientType').val() === 'yur');
	if ( Field.jEl.parents('tr').is( yurik ? '.fiz' : '.yur' ) ) {
		return false;
	}

// поле "Адрес доставки" для юр. лица надо проверять, только если выключена галочка "Совпадает с юр. адресом"
	if ( Field.inputName == 'yur_delivery_address' && $('#yurDeliveryAddressSame').attr( 'checked' ) ) {
		return false;
	}

	return true;
}
//===========================================================================}}}
//{{{ bumsOrderChangeBlock
/**
 * Скрывает/раскрывет блоки
 * @since  27.08.2008 11:48:12
 * @author jikk
 * @param mixed Hide блок, который надо спрятать
 * @param mixed Show блок, который надо спрятать
 */
function bumsOrderChangeBlock( Hide, Show )
{
	$( Hide ).fadeOut( 'normal', function() { $(Show).fadeIn('normal') } );
}
//===========================================================================}}}
function bumsOrderChangeBlock2( Evt )
{
	$( Evt.data.hide ).fadeOut( 'normal', function() { $( Evt.data.show ).fadeIn('normal') } );
}
//{{{ bumsOrderRbtnVersionSelect
/**
 * Этот метод обрабатывает изменение типа продукта (саас, коробка)
 * @since  27.08.2008 11:29:42
 * @author jikk
 * @param string Id идентификатор
 */
function promoOrderLoginRegistrationSelect( Id )
{
	var id = typeof( Id ) === 'string' ? Id : this.id;
	var $j1 = $( '#' + id ), otherId = (id === 'rbtnLogin' ? 'rbtnReg' : 'rbtnLogin');
	var $p = $j1.parents( '.radio-btn' );
	var $j0 = $p.find('div[id="' + otherId + '"]');
	$j1.attr( 'class', 'sel' );
	$j0.attr( 'class', '' );
	if ( id === 'rbtnLogin' )
	{
		$( '#registrationContainer' ).hide();
		$( '#loginContainer' ).show();
	}
	else
	{
		$( '#registrationContainer' ).show();
		$( '#loginContainer' ).hide();
	}
}
//===========================================================================}}}
//{{{ promoOrderRegistrationPreValidatorCheck
/**
 * Предварительная валидация поля в регистрации при покупке
 * @since  27.08.2008 18:28:43
 * @author jikk
 * @param SdfField Field
 */
function promoOrderRegistrationPreValidatorCheck( Field )
{
	return Field.inputName != 'model[AccountName]' || $('#accountNameReg').is(':visible');
}
//===========================================================================}}}
/**
* Переключение продукта
* @since  10.03.2009 15:28:18
* @author eugene
* @param Evt событие
*/
function bumsOrderProductClick( Evt )
{
	var me = null;
	if ( typeof Evt == 'undefined' )
	{
	// get anchor from url
		var product = unescape( self.document.location.hash.substring(1) );
		if ( product != 'project' && product != 'task' && product != 'intranet' ) {
			product = window.promoOrderCurConf ? window.promoOrderCurConf.Product : $('#orderProduct').val();
		}
		me = $( '#productLine div[type="' + product + '"]' );
	}
	else {
		me = $( this );
	}
	var $tab = me.parents( 'table' );
	var currentProduct = $tab.attr( 'product' );
	var selectedProduct = me.attr( 'type' );
	$('#orderProduct').val( selectedProduct );
	$tab.removeClass( currentProduct ).addClass( selectedProduct );
	$tab.attr( 'product', selectedProduct );
	me.parents( '.product-line' ).find( '.j-prd-block' ).removeClass( 'sel' );
	me.parents( '.j-prd-block' ).addClass( 'sel' );
	bumsOrderRecalc();
}
//===========================================================================}}}
/**
* Обновление слайдера в зависимости от цены
* @since  15.12.2009 15:33:18
* @author barb
* @param total сумма заказа
*/
function bumsOrderUpdateSlider( total )
{
	var sliderStep = 40;
	var sliderRanges = [];
	sliderRanges[0] = 0;
	sliderRanges[1] = 9900;
	sliderRanges[2] = 20000;
	sliderRanges[3] = 30000;
	sliderRanges[4] = 50000;
	sliderRanges[5] = 90000;
	sliderRanges[6] = 150000;
	sliderRanges[7] = 300000;

	var sliderValue = Math.min( total, sliderRanges[sliderRanges.length-1] );

	for ( var i = sliderRanges.length-1; i >= 0; i-- )
	{
		if ( sliderValue >= sliderRanges[i] )
		{
			if ( i < sliderRanges.length-1 )
			{
				var sliderMin = sliderRanges[i];
				var sliderMax = (i < sliderRanges.length-1) ? sliderRanges[i+1] : sliderRanges[i];
				var sliderWidth = sliderStep * i + Math.floor( sliderStep * ( sliderValue - sliderMin ) / ( sliderMax - sliderMin ) ) + 1;
			}
			else {
				var sliderWidth = sliderStep * i + 1;
			}
			$('.slider-fill').css( 'width', sliderWidth + 'px' ).fadeTo( 1, 0.75 );
			$('.slider-current div').addClass( 'ui-helper-hidden' );
			$('.slider-current div.range-' + i).removeClass( 'ui-helper-hidden' );
			if ( i < sliderRanges.length-1 )
			{
				var title = $('.slider-images .range-' + (i+1)).attr( 'title' );
				var comment = 'До <b>' + title + '</b> вам осталось докупить еще на <b>' + sdfGetText( '%1% rubles', (sliderRanges[i+1] - total), (sliderRanges[i+1] - total) ) + '</b>';
			}
			else {
				var comment = '';
			}
			$('.slider-comment').html( comment );
			break;
		}
	}
}
//===========================================================================}}}