/*		ВСЯКИЕ РАЗНЫЕ ПОЛЕЗНЫЕ ФУНКЦИИ		*/

/*
	Сколько у объекта свойств?
	Number howManyProperties( Object obj )
*/
function howManyProperties( obj )
{
	var count = 0;
	for( var i in obj ) count++;
	return count;
}

/*
	Escape'ирование спец.символов ( '<' заменить на '&lt;' ).
*/
function htmlspecialchars( str )
{
    str = String( str );
	
	str = str.replace( /\&/g, '&amp;' );
	str = str.replace( /\</g, '&lt;' );
	str = str.replace( /\>/g, '&gt;' );
	str = str.replace( /\"/g, '&quot;' );
	return str;
};

/*
	Раз'escape'ирование спец.символов ( '&gt;' заменить на '>' ).
*/
function unhtmlspecialchars( str )
{
	str = str.replace( /&lt;/g, '<' );
	str = str.replace( /&gt;/g, '>' );
	str = str.replace( /&quot;/g, '"' );
	str = str.replace( /&amp;/g, '&' );
	return str;
};

/*
	Замена перевода строки на <br>.
*/
function nl2br( str )
{
	return str.replace( /\n/g, '<br>' );
};

/*
	Замена <br> переводом строки.
*/
function br2nl( str )
{
	str = str.replace( /\<br\>/g, '\n' );
	str = str.replace( /\<br\/\>/g, '\n' );
	str = str.replace( /\<BR\/\>/g, '\n' );
	return str.replace( /\<BR\>/g, '\n' );
};

/*
	Дополнение String: вырезает подстроку из строки.
*/
String.cut = function( str, sub_str )
{
	var index, count;

	while( -1 != ( index = str.indexOf( sub_str ) ) )
	{
		str = str.substring( 0, index ) + str.substring( index + sub_str.length, str.length );
	}

	//замена последовательности пробелов одним
	while( -1 != ( index = str.indexOf( '  ' ) ) )
	{
		str = str.substring( 0, index ) + ' ' + str.substring( index + 2, str.length );
	}

	return str;
};

/*
	Выровнять высоту node в зависимости от высоты окна, вычитанием offset_height. 
	Минимальная высота - min_height.
*/
function setHeight( node, offset_height, min_height )
{
	if( undefined == node )
		return;

	if( screen.height - offset_height < min_height )
		node.style.height = min_height + 'px';
	else
		node.style.height = ( screen.height - offset_height ) + 'px';
};
/*  МАРКЕР "Идёт запрос"                */
/*  Курсор мышки меняется на песочные   */
/*  часы на всей площади html-страницы. */

//константы
var marker_WIDTH  = 200;
var marker_HEIGHT = 200;
var marker_TIMEOUT_MINUTES = 5; //сколько минут отводиться на ошибку по timeout

//переменные
var marker_node;
var marker_div;
var marker_timeoutId;
var marker_errorTimeoutId;

function getMouseXY( event )
{
	if( ! event )
		event = window.event;

	window.mouseClickX = event.clientX;
	window.mouseClickY = event.clientY;
};


/*
	Инициализация. Передается id блока, в котором рисовать часы.
*/
function marker_init( node_id )
{
	marker_node = document.getElementById( node_id );
	marker_node.className = 'hide';
	marker_node.style.background = 'url(http://static.100.ru/img/clock.gif) no-repeat';

	try
	{
		window.captureEvents( Event.MOUSEDOWN );
		window.onmousedown = getMouseXY;
	}
	catch( e )
	{
		document.attachEvent( 'onmousedown', getMouseXY );
	}
	window.mouseClickX = 0;
	window.mouseClickY = 0;

	marker_div = document.createElement( 'div' );

	marker_div.style.background = 'transparent';
	marker_div.style.cursor     = 'wait';
	marker_div.style.display    = 'none';
	marker_div.style.height     = marker_HEIGHT + 'px';
	marker_div.style.position   = 'absolute';
	marker_div.style.width      = marker_WIDTH  + 'px';
	marker_div.style.zIndex     = '10';

	document.body.appendChild( marker_div );
};

/*
	Показать маркер.
*/
function marker_show()
{
	marker_div.style.top     = ( window.mouseClickY - marker_HEIGHT / 2 ) + 'px';
	marker_div.style.left    = ( window.mouseClickX - marker_WIDTH  / 2 ) + 'px';

	marker_div.style.display = 'block';

	document.body.onmousemove = marker_move;

	marker_node.className = 'show';

	marker_errorTimeoutId = setTimeout( 'marker_errorTimeout()', marker_TIMEOUT_MINUTES * (60*1000) );
};

/*
	Скрыть маркер.
*/
function marker_hide()
{
	clearTimeout( marker_errorTimeoutId );
	marker_timeoutId = setTimeout( 'marker_hide2()', 600 );
};
function marker_hide2()
{
	clearTimeout( marker_timeoutId );

	marker_div.style.display = 'none';

	document.body.onmousemove = function(){;};

	marker_node.className = 'hide';
};

/*
	Ошибка по timeout.
*/
function marker_errorTimeout()
{
	clearTimeout( marker_errorTimeoutId );
	alert( 'Запрос к серверу длится более ' + marker_TIMEOUT_MINUTES + ' минут. Возможен сбой на линии связи.' );
};


/*
	Передвижение маркера. Функция вызывается от имени BODY.
*/
function marker_move( event )
{
	if( ! event ) event = window.event;

	var body = this;

	var delta;
	
	delta = body.offsetWidth - event.clientX;
	if( delta > marker_WIDTH / 2 )
		marker_div.style.left = ( event.clientX - marker_WIDTH / 2 ) + 'px';
	else
		marker_div.style.left = ( event.clientX - marker_WIDTH + delta ) + 'px';

	delta = window.screen.availHeight - 145 - event.clientY;
	if( delta > 100 )
		marker_div.style.top = ( event.clientY - 100 ) + 'px';
	else
		marker_div.style.top = ( event.clientY - 100 * 2 + delta ) + 'px';
};

/*  ФУНКЦИИ ДЛЯ РАБОТЫ С КОРЗИНОЙ.  */
//compress=no
/*
	Обязательно в xsl-шаблоне должна быть определена глобальная переменная
	var config = 
	{
		'status':       ...,
		'company_id':   ...,
		'image_domain': ...
	};
*/

/*uses jQuery*/
$.ajaxSetup( { 'error': function(){	alert( 'ошибка загрузки ' + this.url ); } } );

var cart_pushedGoodId = [];
var cart_goods;

/*
	"Включение" иконок.
	У тех товаров, которые в корзине,	будет изменена иконка.
*/
//запрос
function cartIcon_On()
{
	$.getJSON( '/goods_in_cart', { 'company_id': config['company_id'] }, catchCartIconOn );
};
//ответ
function catchCartIconOn( data )
{
	var i, cart, a, span;

	cart = data['GoodsInCartBlock'];

	for( i = 0; i < howManyProperties( cart ); i++ )
		cart_pushedGoodId.push( cart[i] );

	if( cart_pushedGoodId.length > 0 )
	{
		a = document.createElement( 'a' );
		a.href = '/cart?company_id=' + config['company_id'];
		a.innerHTML = 'Корзина <b id="cartCount">' + cart_pushedGoodId.length + '</b>';

		span = document.getElementById( 'cartCount' ).parentNode;
		span.parentNode.replaceChild( a, span );
	}
};

/*
	Добавить товар в корзину.
*/
//запрос
function pushGoodInCart( good_id )
{
	var is_good_in_cart = false;
	var i;

	for( i = 0; i < cart_pushedGoodId.length; i++ )
	{
		if( good_id == cart_pushedGoodId[i] )
		{
			is_good_in_cart = true;
			break;
		}
	}

	if( ! is_good_in_cart )
	{
		$.getJSON(
			'/cart_edit',
			{
				'action':     'push',
				'good_id':    good_id,
				'company_id': config['company_id']
			},
			function( data )
			{
				var span, a, b;

				cart_pushedGoodId.push( good_id );

				b = document.getElementById( 'cartCount' );
				b.innerHTML = cart_pushedGoodId.length;

				if( 'SPAN' == b.parentNode.tagName )
				{
					span = b.parentNode;

					a = document.createElement( 'a' );
					a.href = '/cart?company_id=' + config['company_id'];
					a.innerHTML = span.innerHTML;

					span.parentNode.replaceChild( a, span );
				}
			}
		);
	}
};


/*
	Сумма товаров в виде массива
*/
function cart_sumAsArray()
{
	var i, sum;

	sum = { 1: 0, 2: 0, 3: 0 };

	for( i in cart_goods )
	{
		if( -1 != cart_goods[i].cost )
			sum[ cart_goods[i].currency_id ] = Math.round( 100 * ( sum[ cart_goods[i].currency_id ] + cart_goods[i].cost * cart_goods[i].quantity ) ) / 100;
	}

	return sum;
};

/*
	Сумма товаров в виде строки.
*/
function cart_sumAsString()
{
	var sum, result;

	sum = cart_sumAsArray();

	result = [];

	if( sum[1] > 0 )
  	result.push( sum[1] + ' руб.' );

	if( sum[2] > 0 )
		result.push( '$' + sum[2] );

	if( sum[3] > 0 )
		result.push( sum[3] + ' &#8364;' ); // &#8364; -- юникод "евро"

	return result.join( ' + ' );
};

/*
	Показать сумму товаров на html-странице.
*/
function cart_showGoodSum()
{
	var h2;

	h2 = document.createElement( 'h2' );
	h2.id = 'totalSum';

	if( howManyProperties( cart_goods ) > 0 )
		h2.innerHTML = 'Итого: <b>' + cart_sumAsString() + '</b> <a href="/order?company_id=' + config['company_id'] + '">Отправить заказ</a>';

	document.getElementById( 'totalSum' ).parentNode.replaceChild( h2, document.getElementById( 'totalSum' ) );
}


/*
	Убрать лишние символы из INPUT, оставить только число без ведущих нулей.
*/
function keyFilter( node )
{
	node.value = node.value.replace( /[^0-9]/g, '' ); //убрать все символы, кроме цифр

	if( '' == node.value )
		node.value = '0';
};

/*
	Обновить число единиц товара.
*/
function cart_updateQuantity( good_id, quantity )
{
	$.getJSON(
		'/cart_edit',
		{
			'action':     'update',
			'good_id':    good_id,
			'count':      quantity,
			'company_id': config['company_id']
		},
		function()
		{
			var i;

			for( i in cart_goods )
			{
				if( cart_goods[i].id == good_id )
					cart_goods[i].quantity = quantity;
			}

			cart_show();
		}
	);
};


/*
	Удалить (убрать) товар из козины.
*/
function popTheGood( good_id )
{
	$.getJSON(
		'/cart_edit',
		{
			'action':     'pop',
			'good_id':    good_id,
			'company_id': config['company_id']
		},
		function()
		{
			var i;

			for( i in cart_goods )
			{
				if( cart_goods[i].id == good_id )
					delete( cart_goods[i] );
			}

			cart_show();
		}
	);
};


/*
	Открыть изображение в новом окне.
*/
function openImageById( id, width, height )
{
	var image_url, image_window, image_document, img;

	image_url = 'http://' + config['image_domain'] + '/img?id=' + id;

	image_window   = window.open( '', 'image' + id, 'width=' + width + ',height=' + height + ',resizable=yes' );
	image_document = image_window.document;

	img =image_document.createElement( 'img' );
	img.src = image_url;
	img.onclick = function(){ image_window.close(); };
	img.style.cursor = 'pointer';
	img.alt = '';

	image_document.body.style.margin = '0px';
	image_document.body.innerHTML = '';
	image_document.body.appendChild( img );

	image_window.focus();
}

/*
	Показать на html-странице число товаров в корзине.
	Число отображается в TITLE и закладке "Корзина".
*/
function cart_showGoodCount()
{
	var good_count = howManyProperties( cart_goods ) ;

	if( document.getElementById( 'cartCount' ) )
		document.getElementById( 'cartCount' ).innerHTML = good_count;

	if( -1 != document.title.indexOf( '(' ) )
		document.title = document.title.substring( 0, document.title.indexOf( '(' ) + 1 ) + good_count + document.title.substring( document.title.indexOf( ')' ) );
}

/*
	Отобразить товары из корзине.
*/
function cart_showGoodTable()
{
	var i, j, table, tr, img, cost_string, good;

	table = document.createElement( 'table' );
	table.id = 'cart';

	for( i in cart_goods )
	{
		good = cart_goods[i];

		tr = table.insertRow( -1 );

		for( j = 1; j <= 6; j++ )
			tr.insertCell( -1 );

		//фотография
		tr.cells[0].className = 'photo';
		if( null !== good['image_id'] )
		{
			img = document.createElement( 'img' );
			img.src     = 'http://' + config['image_domain'] + '/img?id=' + good['image_id'];
			img.width   = good['image_width'];
			img.height  = good['image_height'];
			img.original_id     = good['original_image_id'];
			img.original_width  = good['original_image_width'];
			img.original_height = good['original_image_height'];
			img.onclick = function(){ openImageById( this.original_id, this.original_width, this.original_height ); }

			tr.cells[0].appendChild( img );
		}

		//товар
		tr.cells[1].className = 'name';
		tr.cells[1].innerHTML = '<h2>' + good['name'] + '</h2><p>' + good['description'] + '</p>';

		//цена, ед.изм.
		tr.cells[2].className = 'price';
		switch( good['cost'] )
		{
			case -1: cost_string = 'договорная'; break;
			case  0: cost_string = 'бесплатно'; break;
			default:
				cost_string = good['cost'];
				switch( good['currency_id'] )
				{
					case 1: cost_string += ' руб.'; break;
					case 2: cost_string += ' USD';  break;
					case 3: cost_string += ' EUR';  break;
				}
		}
		tr.cells[2].innerHTML = '<p class="cost">' + cost_string + '</p><p>' + good['measure'] + '</p>';

		//знак "умножить"
		tr.cells[3].className = 'multiple';
		tr.cells[3].innerHTML = 'x';

		//сумма
		tr.cells[4].className  = 'sum';
		tr.cells[4].innerHTML  = '<input name="quantityInput" type="text" id="good_id' + good['id'] + '" value="' + good['quantity'] + '" onchange="keyFilter( this ); cart_updateQuantity( this.id.substring( \'good_id\'.length ), this.value );">';
		tr.cells[4].innerHTML += ' = ';
		switch( good['cost'] )
		{
			case -1: cost_string = 'договорная'; break;
			case  0: cost_string = 'бесплатно'; break;
			default:
				cost_string = good['cost'] * good['quantity'];
				switch( good['currency_id'] )
				{
					case 1: cost_string += ' руб.'; break;
					case 2: cost_string += ' USD';  break;
					case 3: cost_string += ' EUR';  break;
				}
		}
		tr.cells[4].innerHTML += '<p class="cost">' + cost_string + '</p>';

		//текстовая кнопка "удалить товар"
		tr.cells[5].className = 'goodAction';
		tr.cells[5].innerHTML = '<a href="#" class="pseudo" name="popGoodAnchor" id="good_id' + good['id'] + '" onclick="popTheGood( this.id.substring( \'good_id\'.length ) ); return false;">Убрать из корзины</a>';
	}

  //замена таблиц
	document.getElementById( 'cart' ).parentNode.replaceChild( table, document.getElementById( 'cart' ) );
}


/*
	Показать всю информацию по корзине товаров.
*/
function cart_show()
{
	cart_showGoodCount();
	cart_showGoodTable();
	cart_showGoodSum();
}


/*
	Загрузка корзины товаров ч/з AJAX
*/
//запрос
function cart_load()
{
	$.getJSON( '/cartblock', { 'company_id': config['company_id'] }, cart_catch );
}
//ответ
function cart_catch( data )
{
	if( data['CartBlock']['data'] )
		cart_goods = data['CartBlock']['data'];
	else
		cart_goods = {};

	cart_show();
}


/*ПО ОКОНЧАНИИ ЗАГРУЗКИ*/
(
function()
{
	var i, icons, anchors, inputs, form;

	//иконки корзины на странице "Прайс"
	icons = document.getElementsByName( 'cartIcon' );
	for( i = 0; i < icons.length; i++ )
		icons[i].onclick = function(){ pushGoodInCart( this.id.substring( 'good_id'.length ) ); };

	if( '/cart' == location.pathname )
		cart_load();

}
)();//определили безымянную функцию и тут же её выполнили


