

var catalogAjax = function(options){
	var self  = this;
	this.ajaxElements = [];
	
	this.inLoading = false;  // Флаг, что каталог в загрузке
	
	this.config = {
		ajaxElementsSelector: '.ajax',
		ajaxNaviLeftSelector: '.ajaxNaviLeft',
		ajaxNaviRightSelector: '.ajaxNaviRight',
		naviButtonTpl: '<div class="naviButton {class}"></div>',
		ajaxNaviInactiveButtonClass: 'inActiveButton',
		ajaxNaviLeftClass: 'naviButtonLeft',
		ajaxNaviRightClass: 'naviButtonRight',
		ajaxContainerSelector: '.second_wrap',
		ajaxBlockSelector: '.newsBlock'
	}
	
	// Объект навигации
	this.navi = {
		currPage: 1,
		allPages: 1,
		leftButton: false,
		rightButton: false
	}
	
	
	// История просмотров
	this.history = {
		finded:  false,
		lastUrl: '',
		prevPage:-1,
		seq: -1,	// Какой текущий УРЛ в истории по счету
		URLs:[]			
		
	}
	
	this.pagesReg = /(\?*)page=[0-9]*(\&*)/;	// Регулярное выражение для определения страниц
	
	this.data = false;		// Последние данные, полученные с сервера
	this.docId = 1;
	this.obj = {
		ajaxContainer: false,
		ajaxContainerWidth: false
	}
	
	// Инициализация
	this.init = function(){   
		// Навешиваем событие на прокрутку по истории окна
		if(this.pjaxIsValid()){
			$(window).bind('popstate', function(e){
				self.event = e;
				self.onPopState();
			});
		}
		
		// Инициализируем основной контейнер каталога
		this.obj.ajaxContainer = $(this.config.ajaxBlockSelector);
		if(typeof this.obj.ajaxContainer[0] == 'undefined'){
			return false;
		}
		
		
		
		// навешиваем события на ссылки
		this.addListeners();
		this.base = location.href.replace(/(https*:\/\/.+?)\/.*/,"$1");
		// Данные текущей страницы
		this.title = document.title;
		this.url = this.getHref();
		this.history.lastUrl = this.url;
		this.data = $(this.config.ajaxBlockSelector).html();
		this.docId=1;
		this.page = (window.page ? window.page : 1);
		this.totalPages = (window.totalPages ? window.totalPages : 1);
		// Флаг  кэшируемый документ или нет
		this.isNotCacheable = (window.Page && window.Page.isNotCacheable ? true : false);
		// Сохраняем историю
		this.saveHistory(); 

		return;
	}
	
	this.getHref = function(){
	    var hr= window.location.href.replace(/^https*:\/\/.*?\//,"");
	       if(hr==""){
		 return '/';
		 }else{
		return '/'+hr;
		 }
	}
	
	// навешиваем события на ссылки
	this.addListeners = function(){
		// Находим все Ajax-ссылки
		var links = $(self.config.ajaxElementsSelector);
		var projectBlock = $('.projectBlock');
		var newsBlock = $('.shortNews');
		// Сбрасываем для все события Click
		links.unbind('click');
		projectBlock.unbind('hover');
		//newsBlock.unbind('hover');
		// навешиваем события на ссылки
		links.click(this.onClick);
        projectBlock.hover(this.onHover,this.outHover);	
		//newsBlock.hover(this.onHoverNews,this.outHoverNews);
	}
	// Проверяем возможность Ajax
	this.ajaxIsValid = function(){
		return Boolean($(this.config.ajaxContainerSelector)[0]);
	}
    this.onHoverNews = function(){
	$(this).css({opacity: 1});
	 }
	this.outHoverNews = function(){
	 $(this).css({opacity: 0.95});
	}
	
	
	this.onHover = function(){
	$(this).children('.minProjectBlock').stop().animate({"background-color": "#423b29"}, "slow");
	 }
	this.outHover = function(){
	 $(this).children('.minProjectBlock').stop().animate({"background-color": "#1a1710"}, "slow");
	}
	// Проверяем pjax
	this.pjaxIsValid  = function(){
		return Boolean(
			window.history && window.history.pushState && window.history.replaceState
			&& !(
				
				(/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
				
				|| (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
			)
		)
	}
	
	
	
	
	// Навешиваем событие на прокрутку по истории окна
	this.onPopState = function(){
		try{
			this.historyGo();
		}
		catch(err){
			alert(err);
		}
	}
	
	this.historyGo = function(){
		this.direction = 'prev';
		var page, oldPage, id;
		// Определяем, историческая это запись, или нет 
			// Есть ли метка на оригинальное событие
		if(this.event && this.event.originalEvent){
				// Определяем, вперед мотают или нет
			if(this.event.originalEvent.state != null){
			}
			else{
				
			}
		}
		
		this.url  = this.getHref(); 
		
		return this.showPage();
	}
	
	// Показываем новую страницу, по возможности из кэша
	this.showPage = function(){
		if(this.history.lastUrl){
			if(this.searchUrlInHistory(this.history.lastUrl)){
				oldPage =  this.history.finded ;
			}
		}
			
		// 1 Пробуем получить данные из стейта
		// Если там есть, мы сможем получить данные о странице
		//console.log('Пытаемся получить документ  из State');
		if(history.state && history.state.page && history.state.page.url ==  this.url){
			page = history.state.page;
		}
		else if(this.searchUrlInHistory()){
			page = this.history.finded;
		}
		else{
			return this.request();
		}
		
		// Если по какой-то причине не была получена страница, реквестим
		if(!page){
			return this.request();
		}
		
		// Обновляем индекс страницы, если надо
		if(page.id > this.history.URLs.length || !this.history.URLs[page.id] || this.history.URLs[page.id].url != page.url){
		
			this.title = page.title;
			this.saveHistory({
				data: page.data,
				title: page.title,
				visits: page.visits
			});
		
			this.fetchContent();
			return;
		}
		
		
		// 2 Пытаемся набить все данные
		this.title = page.title;
		this.history.seq = page.id;
		// Указываем прошлую историческую страницу
		if(oldPage && this.history.URLs[oldPage.id]){
			this.history.prevPage = oldPage.id;
		}
		else if(this.history.URLs[page.parent]   ){
			this.history.prevPage = page.parent;
		}
		else{
			this.history.prevPage = this.history.URLs.length;
		}
		this.updateHistory();
		this.fetchContent();
	}
	 
	
	// Иначе записываем УРЛ в историю
	this.saveHistory = function(options){
		
		if(!options) var options = {}
		var id = (this.history.URLs.length);
		this.history.URLs.push({
			id: id,
			title: options.title ? options.title : this.title,
			url: this.url,
			docId:this.docId,
			data: options.data ? options.data : this.data,
			visits: options.visits ? options.visits : 0,
			page: Number(this.page),
			totalPages:  Number(this.totalPages),
			isNotCacheable: this.isNotCacheable
		})
		// Сохраняем сиквенцию
		this.history.seq =  id;
		this.updateHistory();
	}
	
	// Обновляем историю
	this.updateHistory = function(){
		this.history.lastUrl = this.getHref();
		
		var page = this.getCurrentPage();
		
		page.visits++
		
		
		// Если уже установлен родитель, то не обновляем
		typeof page.parent == 'undefined' ?  
			page.parent = (this.history.prevPage >= this.history.URLs.length ? 
				this.history.prevPage : (this.history.URLs.length - 1)) : "";
		// Обновляем информацию о прошлой странице 
		this.history.prevPage = page.id;
		 
		//  Проверяем,  поддерживается ли подмена УРЛ-ов
		if(this.pjaxIsValid()){
			// Сохраняем историю окна
			this.saveWindowHistory();
		}
		else{
			document.title = this.title;
		}
	}
	
	// Сохраняем историю окна
	this.saveWindowHistory = function(){	
		var page = this.getCurrentPage();
		// Определяем, историческая это запись, или нет
		if(this.event){
			history.replaceState({
				page: page
			},
			page.title,
			this.url
			);
			document.title = this.title;
			this.event = false;
			return;
		} 
		
		// Если это стартовая страница, то пропускаем сохранение истории
		var state = history.state;
		if(history.length == 1 && this.history.seq < 1){
		}
		else if(this.history.lastUrl == this.url){
		}
		else{
			history.pushState({
				page: page
			},
			page.title,
			this.url
			);
		}
	
		// Проверяем на актуальность.   Если не верный документ, то обновляем историю
		if(history.state && history.state.page && history.state.page.url != this.url){
			history.replaceState({
				page: page
			},
			page.title,
			this.url
			);
			document.title = this.title;
		}
		
		document.title = this.title;
	}
	
	// Событие, когда страница найдена
	this.onFindUrl = function(){
		// Проверяем, если ресурс не кэшируемый
		if(this.checkIsNotCacheable()){
			return false;
		}
		// Обновляем информацию по странице
		this.updateHistory();
		
		// Выводим информацию
		this.fetchContent();
		return;
	}
	
	// Проверяем, если ресурс не кэшируемый
	this.checkIsNotCacheable = function(){ 
		var page = this.getCurrentPage();
		if(page.isNotCacheable){
			// Выполняем запрос
			this.request__();
			return true;
		}
		return false;
	}
	
	// Поиск УРЛ-а в  истории
	this.searchUrlInHistory = function(url__){
		if(!url__)  var url__ = this.url;
		// Проходимся по каждому элементу истории
		for(var i in this.history.URLs){
			// Находим совпадение по УРЛ-у
			if(url__ == this.history.URLs[i].url){
				this.history.finded = this.history.URLs[i];
				return  true;	
			}
		}
		return false;
	}
	// Получаем текущую страницу из истории
	this.getCurrentPage = function(){
		var page = this.history.URLs[this.history.seq];
		if(typeof page == 'undefined' || !page.data) return false;
		else return page;
	}
	
	// Функция при клике на ссылку
	this.onClick = function(el){
		// Проверяем, выполняется ли уже загрузка
		if(self.inLoading != false) return false;
		
		// Получаем ссылку
		self.url = $(this).attr('href');
		self.docId = $(this).attr('doc');
		// Проdеряем, является ли данная страница текущей
		if(self.getCurrentPage().url == self.url) return false;
		
		self.inLoading = false;
		// Выполняем запрос
		self.request();
		return false;
	}
	
	// Выполняем запрос
	this.request = function(){
		if(!this.url){ 
			this.inLoading = false;
			return false;
		}
		
		// Проверяем, есть ли у нас Ajax-контейнер
		if(!this.ajaxIsValid()){
			// Перекидываем на адрес 
			return window.location = this.href;
		}
		
		// Проверяем наличие УРЛ-а в истории
		// Если есть, то выводим его 
		if( this.searchUrlInHistory()){
			// Устанавливаем счетчик текущей страницы
			this.history.seq = this.history.finded.id;
			this.onFindUrl();
			return;
		}
		 
		// Выполняем непосредственно запрос
		self.request__();
	}
	
	// Выполняем непосредственно запрос
	this.request__ = function(){
		$.ajax({
		 // url: '/connectors/ajax/loadPage.php',
   url: '/ajax-news.html',
	type: "POST",
    dataType: 'html',
	data:{id:self.docId,page:1},
    beforeSend: function(xhr){
	    popupLoad();
	  $('#teni').show();
      $('#loading').show();
    },
    success: function(data){
	  $('#loading').hide();
	  $('#teni').hide();
	  $.scrollTo(0,300);
       self.data = data;
       self.docId = self.docId;
	   //self.title = title;
					//self.page = 1;
					self.totalPages = 1;
					self.isNotCacheable =  false;		// Флаг, что не кешировать результат
					// Иначе записываем УРЛ в историю
					self.saveHistory();
		
					// Выводим информацию на страницу
					self.fetchContent();
     

    }
	});
	}
	
	// Выводим информацию на страницу
	this.fetchContent = function(direction){
		if(!direction && this.direction){
			direction = this.direction;  
		} 
		this.direction  =  false;
		// Получаем текущую страницу
		var page = this.getCurrentPage();
		// Если не была получена страница, или страница текущая
		if(page == false ){
			this.inLoading = false;
			return false;
		}
		var data = page.data;
		this.page  = page.page;
		this.totalPages = page.totalPages;	
		if(direction){
			this.dir = direction;
		}
		else{
			this.dir = 'next';
			if(page.id < (this.history.URLs.length - 1)){
				this.dir = 'prev';
			}
		}
	
	
		
		
		
		// Мотаем вперед
		if(this.dir == 'next'){
			this.obj.ajaxContainer.html(data);
			self.onRequestComplite();
		}
		// Мотаем назад
		else{
		
            this.obj.ajaxContainer.html(data); 
			self.onRequestComplite();
		}
		return;
	}
	
	// Восстанавливаем блоки
	this.onAfterShiftPage = function(){
		this.onRequestComplite();
	}
	
	// Завершение запроса
	this.onRequestComplite =  function(){
		this.addListeners();
	}
	
	
	// Выполняем инициализацию
	this.init();
}

$(document).ready(function(){
	window.catalogAjax = new catalogAjax();
});
