/*******************************************************************************
 * Партнерский JS магазин товаров GOODBODY.RU
 * Автор : GOODBODY.RU
 * Email : support@goodbody.ru
 ******************************************************************************/
/*******************************************************************************
 * Партнерский JS магазин товаров GOODBODY.RU
 * Автор : GOODBODY.RU
 * Email : support@goodbody.ru
 ******************************************************************************/

/*******************************************************************************
 * Конструктор класса клиентского магазина.
 * @return NULL
 ******************************************************************************/
GBShopC = function(){
	
	if( this.isCookieEnabled() ){
		
		this.charset = document.charset || document.characterSet;
		document.write( '<div id="GBScripts"></div>' );
		document.write( '<div id="GBShop"></div>' );
		document.write( '<div id="GBCurtain"></div>' );
		document.write( '<div id="GBDownload"></div>' );
		
		if( !this.getCookie( 'GBSID' ) )
		this.setCookie( 'GBSID' , this.sessionID , 1 );
		else{
			this.sessionID = this.getCookie( 'GBSID' );
			this.setCookie( 'GBSID' , this.sessionID , 1 );
		}
		
	}else{
		
		document.write( '<p>В Вашем броузере отключена поддержка cookie, ' +
		'работа магазина невозможна.</p>' );
		
	}
	
	return;
	
};

/*******************************************************************************
 * Идентификатор партнёра. Заменяется на целое число (реальный идентификатор),
 * после обфускации JS кода. Данный парамерт должен браться из переменной id
 * GET запроса.
 ******************************************************************************/
GBShopC.prototype.partnerID = '1739800';

/*******************************************************************************
 * Абсолютный путь к скрипту контроллера. Заменяется на реальный путь после
 * обфускации JS кода. Данный парамерт берётся из конфигурации магазина.
 ******************************************************************************/
GBShopC.prototype.controller = 'http://shop.goodbody.ru/js/controller.js';

/*******************************************************************************
 * Идентификатор сессии магазина. Заменяется на реальный идентификатор после
 * обфускации JS кода.
 ******************************************************************************/
GBShopC.prototype.sessionID = 'pb0n08tdfig85l0eh4mi1c7hv7';

/*******************************************************************************
 * Кодировка клиентской стороны. Данное значение свойства заполняется после
 * работы конструктора и хранит наименование кодировки страницы.
 ******************************************************************************/
GBShopC.prototype.charset = '';


/*******************************************************************************
 * Метод перегрузки контента всего блока магазина. Входным параметром метода
 * является html содержимое в виде строки, которое будет записано в блок
 * магазина.
 * @param string content HTML - контент, новое содержимое блока.
 * @return GBShopC
 ******************************************************************************/
GBShopC.prototype.block = function( content ){
	
	$( '#GBShop' ).html( content );
	return this;
	
};

/*******************************************************************************
 * Метод перегрузки контента блока корзины. Входным параметром метода является
 * html содержимое в виде строки, которое будет записано в блок корзины.
 * @param string content HTML - контент, новое содержимое корзины.
 * @return GBShopC
 ******************************************************************************/
GBShopC.prototype.basket = function( content ){
	
	$( '#GBBasket' ).html( content );
	return this;
	
};

/*******************************************************************************
 * Метод перегрузки контента блока меню. Входным параметром метода является
 * html содержимое в виде строки, которое будет записано в блок меню.
 * @param string content HTML - контент, новое содержимое меню.
 * @return GBShopC
 ******************************************************************************/
GBShopC.prototype.menu = function( content ){
	
	$( '#GBMenu' ).html( content );
	return this;
	
};

/*******************************************************************************
 * Метод перегрузки контента основного блока. Входным параметром метода является
 * html содержимое в виде строки, которое будет записано в основной блок.
 * @param string content HTML - контент, новое содержимое меню.
 * @return GBShopC
 ******************************************************************************/
GBShopC.prototype.main = function( content ){
	
	$( '#GBMain' ).html( content );
	return this;
	
};

/*******************************************************************************
 * Метод создания затенения области магазина. Данный метод устанавливает на
 * область магазина полупрозразрачный фон с прогрессом загрузки.
 * @return GBShopC
 ******************************************************************************/
GBShopC.prototype.showCurtain = function(){
	
	var el     = $('#GBShop'); // Элемент блока
	var offset = el.offset();  
	var top    = offset.top;   // Абсолютная ордината
	var left   = offset.left;  // Абсолютная абсциса
	var height = el.height();  // Высота элемента
	var width  = el.width();   // Ширина элемента
	$( '#GBCurtain' ).css({
		position        : 'absolute',
		top             : top,
		left            : left,
		height          : height,
		width           : width,
		opacity         : 0.3,
		display         : 'block',
		backgroundColor : '#000000'
	});
	$( '#GBDownload' ).css({
		position        : 'absolute',
		top             : top,
		left            : left,
		height          : height,
		width           : width,
		display         : 'block'
	});
	
	return this;
	
};

/*******************************************************************************
 * Метод удаления затенения области магазина.
 * @return GBShopC
 ******************************************************************************/
GBShopC.prototype.hideCurtain = function(){
	
	var targetOffset = $( '#GBShop' ).offset().top;  
	$( 'html,body' ).animate( { scrollTop : targetOffset } , 400 );
	$( '#GBCurtain, #GBDownload' ).css( { display : 'none' } );
	return this;
	
};

/*******************************************************************************
 * Метод загрузки категории товаров. Возвращает JS-хеш с контентом вложенных
 * категорий и/или товаров.
 * @param string category Идентификатор категории.
 * @return NULL
 ******************************************************************************/
GBShopC.prototype.category = function( category ){
	
	this.load( this.controller , { category : category } );
	return;
	
};

/*******************************************************************************
 * Метод загрузки подробной информации о товаре. Возвращает JS-хеш с описанием
 * товара.
 * @param string id Идентификатор товара.
 * @return NULL
 ******************************************************************************/
GBShopC.prototype.detail = function( id ){
	
	this.load( this.controller , { detail : id } );
	return;
	
};

/*******************************************************************************
 * Метод инициализации магазина. Возвращает JS-хеш с полным содержимым всех
 * блоков.
 * @return NULL
 ******************************************************************************/
GBShopC.prototype.init = function(){
	
	this.load( this.controller , { init : '' } );
	return;
	
};

/*******************************************************************************
 * Метод загрузки содержания корзины.
 * @return NULL
 ******************************************************************************/
GBShopC.prototype.order = function(){
	
	this.load( this.controller , { order : '' } );
	return;
	
};

/*******************************************************************************
 * Метод добавления товара в корзину.
 * @param string id Идентификатор товара.
 * @param string color Цвет товара.
 * @param string size Размер товара.
 * @return GBShopC
 ******************************************************************************/
GBShopC.prototype.toBasketOne = function( id , size , color  ){
	
	var params = { basket : id , count : 1};
	if( color ) params.color = color.toString();
	if( size )  params.size  = size.toString();
	this.load( this.controller , params );
	
};

GBShopC.prototype.toBasket = function( id ){
	
	if( this.toBasketP === 1 ){
		// В корзину
		
		var count  = $( '#GBCount' );
		count = count[ 0 ].value;
		
		if( count != this.toCount( count ) || this.toCount( count ) == 0 ){
			alert( 'Не верно задано поле "Количество"!' );
			return false;
		}
		
		var params = { basket : id , count : count };
		if( $( '#GBColor' ).size() > 0 ) params.color = $( '#GBColor' )[ 0 ].value;
		if( $( '#GBSize' ).size() > 0 ) params.size = $( '#GBSize' )[ 0 ].value;
		
		this.load( this.controller , params );
		
		$( 'input.GBNoShow' ).css( { visibility : 'visible' } );

	}else if( this.toBasketP === 2 ){
		// Оформить

		this.order();
		
	}
	
	return false;
	
};

GBShopC.prototype.toBasketP = null;

/*******************************************************************************
 * Метод вывода сообщений клиенту. Данный метод является безопастной
 * альтернативой функции alert. Для того, чтобы передать многосторочное
 * сообщение необходимо этому методу передавать столько параметров с текстом
 * каждой строчки.
 * @return GBShopC
 ******************************************************************************/
GBShopC.prototype.echo = function(){
	
	var message = new Array();
	
	for( var i = 0 ; i < arguments.length ; i++ )
	message.push( arguments[ i ] );
	
	alert( message.join( '\n' ) );
	
	return this;
	
};

/*******************************************************************************
 * Метод загрузки JS-хеша, с уканием параметров. Результатом загрузки может быть
 * хеш разного рода (для разных блоков), это зависит от передаваемых параметров.
 * @param string script Контроллер.
 * @param string params GET параметры.
 * @return GBShopC
 ******************************************************************************/
GBShopC.prototype.load = function( script , params ){
	
	////////////////////////////////////////////////////////////////////////////////
	// Находим блок магазина
	var block = $( '#GBScripts' );
	if( block.size() === 0 ) return;
	block = block[ 0 ];
	////////////////////////////////////////////////////////////////////////////////
	
	this.showCurtain(); // Ставим шторку

	var element = document.createElement( 'script' );
	element.setAttribute( 'script' , 'text/javascript' );
	element.setAttribute( 'src'    , script + '?' + this.param2query( params ) );
	block.appendChild( element );
	
	return;
	
};

/*******************************************************************************
 * Метод преобразования числа в количество.
 * @param Number num Число.
 * @return Number
 ******************************************************************************/
GBShopC.prototype.toCount = function( num ){
	num = Number( num );
	num = num - num%1;
	num = num < 0 ? 0 : num;
	return num;
};

/*******************************************************************************
 * Метод преобразования объекта параметров в GET запрос.
 * @param Object params Объект параметров.
 * @param Boolean cashe Условный признак кеширования.
 * @return GBShopC
 ******************************************************************************/
GBShopC.prototype.param2query = function( params , cashe ){
	
	var query = new Array();
	for( var prop in params )
		query.push( encodeURI( prop ) + ( params[ prop ] ? '=' + encodeURI( params[ prop ] ) : '' ) );
	query.push( 'charset=' + this.charset.toLowerCase() );
	query.push( 'pid=' + this.partnerID );
	query.push( 'sid=' + this.sessionID );
	if( !cashe ) query.push( 'cashe=' + Number( new Date() ) );
	return query.join( '&' );
	
};

/*******************************************************************************
 * Метод устанавливает переменную COOKIE.
 * @param String name Название переменной.
 * @param String value Значение переменной.
 * @param Numeric expires Время жизни в днях.
 * @return NULL
 ******************************************************************************/
GBShopC.prototype.setCookie = function ( name, value, expires, path, domain, secure ) {

		var today = new Date();
		today.setTime( today.getTime() );
		if ( expires ) {
			expires = expires * 1000 * 60 * 60 * 24;
		}
		var expires_date = new Date( today.getTime() + (expires) );
		document.cookie = name+'='+escape( value ) +
			( ( expires ) ? ';expires='
	+expires_date.toGMTString() : '' ) +
	//expires.toGMTString()
			( ( path ) ? ';path=' + path : '' ) +
			( ( domain ) ? ';domain=' + domain : '' ) +
			( ( secure ) ? ';secure' : '' );

};

/*******************************************************************************
 * Метод для получения переменной COOKIE.
 * @param String name Название переменной.
 * @return NULL
 ******************************************************************************/
GBShopC.prototype.getCookie = function ( name ) {
	
		var start = document.cookie.indexOf( name + '=' );
		var len = start + name.length + 1;
		if ( ( !start ) && ( name != document.cookie.
	substring( 0, name.length ) ) ) {
			return null;
		}
		if ( start == -1 ) return null;
		var end = document.cookie.indexOf( ';', len );
		if ( end == -1 ) end = document.cookie.length;
		return unescape( document.cookie.substring( len, end ) );
		
};

/*******************************************************************************
 * Метод удаления переменной COOKIE.
 * @param String name Название переменной.
 * @return NULL
 ******************************************************************************/
GBShopC.prototype.deleteCookie = function( name, path, domain ){
	
	if ( this.getCookie( name ) ) document.cookie = name + '=' +
		( ( path ) ? ';path=' + path : '') +
		( ( domain ) ? ';domain=' + domain : '' ) +
		';expires=Thu, 01-Jan-1970 00:00:01 GMT';

};

/*******************************************************************************
 * Определить, включены у пользователя cookie или нет.
 * @return Boolean
 ******************************************************************************/
GBShopC.prototype.isCookieEnabled = function(){

		this.setCookie( 'tmpCookie' , '1');
		if( this.getCookie( 'tmpCookie' ) != null ){
			this.deleteCookie( 'tmpCookie' );
			return true;
		}
		return false;

};

/*******************************************************************************
 * Метод обновления корзины.
 * @return Boolean
 ******************************************************************************/
GBShopC.prototype.basketRefresh = function( form ){
	
	var params = new Object();
	params.order = '';
	$( 'input[type=hidden],input[type=text]' , form ).each(function(){
		params[ this.getAttribute( 'name' ) ] = this.value;
	});
	
	var error = false;
	var self  = this;
	$( 'input[type=text]' , form ).each(function(){
		if( this.value != self.toCount( this.value ) ) error = error || true;
	});
	
	if( error ){
		alert( 'Одно из полей колонки "Кол-во" задано неверно!' );
		return false;
	}
	
	this.load( this.controller , params );
	return false;
	
};

GBShopC.prototype.search = function(){
	
	var form = $( '#JSshop_search' );
	if( form.size() == 0 ) return false;
	form = form[ 0 ];
	
	var search_s = form.s.value.split( /\s+/ ).join( ' ' );
	search_s = search_s.split( /(^\s+|\s+$)/ ).join( '' );
	
	if( search_s.length < 4 ){
		alert( 'Поисковый запрос должен состоять более чем из 3 знаков!' );
		return false;
	}
	
	this.load( this.controller , { 'search' : search_s } );
	
	return false;
};

/*******************************************************************************
 * Метод отправки заказа.
 * @return Boolean
 ******************************************************************************/
GBShopC.prototype.sendOrders = function( form ){
	
	var messages = new Array();
	
	// Способ доставки
	var contact_delivery = $( ':radio[name=contact_delivery]' , form ).filter( ':checked' ).val();
	
	// Фамилия, имя, отчество - полностью
	var contact_name = $( 'input[name=contact_name]' , form ).val();
	contact_name = new String( contact_name );
	
	// Полный почтовый адрес
	var contact_addr = $( 'textarea[name=contact_addr]' , form ).val();
	contact_addr = new String( contact_addr );
	
	// Электронная почта
	var contact_email = $( 'input[name=contact_email]' , form ).val();
	contact_email = contact_email == '@' ? '' : contact_email;
	contact_email = new String( contact_email );
	
	// Телефон с кодом
	var contact_phone = $( 'input[name=contact_phone]' , form ).val();
	contact_phone = new String( contact_phone );
	
	// Оплата через Webmoney
	var contact_wmr = $( 'input[name=contact_wmr]' , form ).val();
	contact_wmr = new String( contact_wmr );
	
	// Дополнительная информация
	var additional = $( 'textarea[name=additional]' , form ).val();
	additional = new String( additional );

	// Проверка
	if( typeof contact_delivery === 'undefined' ) messages.push( 'Не выбран способ доставки!' );
	if( contact_name.length > 100 || contact_name.length < 5 )
		messages.push( 'Длина поля "Фамилия Имя Отчество" должна быть больше 5 символов и не превышать 100!' );
	if( contact_addr.length > 1000 || contact_addr.length < 15 )
		messages.push( 'Длина поля "Почтовый адрес" должна быть больше 15 символов и не превышать 1000!' );
	if( contact_phone.length > 100 || contact_phone.length < 7 )
		messages.push( 'Длина поля "Телефон" должна быть больше 7 символов и не превышать 100!' );
		
	// Вывод сообщений
	if( messages.length > 0 ){
		alert( messages.join( '\n' ) );
		return false;
	}
	
	var send = {
		'send[delivery]'   : contact_delivery ,
		'send[name]'       : contact_name ,
		'send[addr]'       : contact_addr ,
		'send[email]'      : contact_email,
		'send[phone]'      : contact_phone ,
		'send[wmr]'        : contact_wmr ,
		'send[additional]' : additional
	};
	
	this.load( this.controller , send );
	
	return false;
	
};

GBShopC.REMOTE_ADDR = '38.107.179.221';

GBShopC.initDebug = function(){};

GBShopC.isDebug = function(){
	if( this.REMOTE_ADDR == '109.188.236.129' )
		return true;
	else return false;
};

GBShopC.debug = function( message ){
	if( !this.isDebug() ) return;
	console.debug( message );
};

GBShopC.prototype.debug = function( message ){
	return GBShopC.debug( message );
};



var GBSp = new GBShopC();


GBSp.init();
//GBSp.debug( 'App init!' );

