/**
 * Отображает страницы 
 * @class Отображает страницы
 * генерирует события 
 * pages show top - страница прокручена до низа "верха"
 * pages show magazine - страница прокручена до "журнала"
 */

/* m-pages.js
Pages module
Страницы
*/

;function Pages(scaled) {
    // номер текущей страницы
    // TODO определять текущую при инициализации
    this.current = '';

    // режим 
	// true - одностраничный
	// false - двух страничный
    this._scaled = scaled;
    
    // names of topPages
    this._names = {};
    
    // number of topPages
    this._topPages = 0;
    
    // TODO поменять id на #m-pages
	// блок(div) модуля
    this._module = $('#scroll_container');
    
    
    // показано видео с fancybox
    this.isVideo = false;
    
    // Открыты ли верхние страниц
    this.topPageIsOpen = false;
}

Pages.prototype = {
    /**
     * @param {String} page
     */
	 /*
	 показать страницу
	 принимает страницув формате 0, 00, 000, 001, 002 и тд. 0-00, 000-001, 002-003 и тд, buy
	 buy - страница номер 115. с предложением купить
	 */
    showPage: function(page) {
        var animate = false;
        
        var animateAfter = false;
    	
    	// отметить страницу как не "Верхнюю"
        this.topPageIsOpen = false;
        
		// scrollTop
        var st;
        
        // добавка из-за страницы сверху
        var ADD = 0;

        // save last page
        var last = this.current;
        
        // callback after animate
        var callback = $.noop;
        
		//  установить отображаемую страницу как текущую
        this.current = page;

        // отправить событие изменения страницы
        this._module.trigger('pagechange');

        // если страница в формате 003-004, берём первую часть
        if(/\d{1,3}-\d{2,3}/.test(page)) {
            page = page.split('-')[0];
        }

		// для режима разворота
        if (this._scaled) {
  		
            if (page === '0') {			               
                if (!!this._names[last]) {
                    animateAfter = 1143 * this._topPages; 
                    st = 1142 * this._topPages - $(window).height() + 10;
                    callback = function() { 
                        // страница прокручена до "журнала"
                        coreNotice('pages show magazine'); 
                    }
                } else {
                 // 0 главная (самая первая страница)
                    st = 0 + this._topPages * 1142;
                }
            } else if (page === '00') {
				// 00 - обложка
                st = 1425 + this._topPages * 1142;
            } else if (page === 'buy') {
				// buy - страница 115 - купить
                st = 2563 + 115 * 1142 + this._topPages * 1142;
            } else if (this._names[page]) {
                
                st = 1142 * (this._topPages - this._names[page]) + 44;
                animate = true;
                
                // отметить страницу как "Верхнюю"
                this.topPageIsOpen = page;
            /*} else if (page === 'voting') {
                st = 1186;
            } else if (page === 'archive') {
                st = 0;
            } else if (page === 'community/71') {
                st = 0;
                //*/
            } else if (/video\/(\d+)/.test(page)) {
                var videoId = page.match(/video\/(\d+)/)[1];
                st = 0 + this._topPages * 1142;
                this.isVideo = true;
                Video.show(videoId);      
            } else if (page == 'topstart') {
                //st = 1142 * this._topPages - $(window).height() + 10;
                animateAfter = 1142 * this._topPages - $(window).height() + 10;
                st = 1143 * this._topPages;
                callback = function() { 
                    // страница прокручена до низа "верха"
                    coreNotice('pages show top'); 
                }
            } else {
				// остальные страницы от 000 до 115
                st = 2563 + parseFloat(page) * 1142 + this._topPages * 1142;
            }
        } else {
			// для режима страницы
            ADD = 0;
            
            if (page === '0' || page==='00') {
                st = 0 + ADD;
            } else if (page === 'buy') {
                st = 57 * 570 + 570 + ADD;
            } else {
                page = parseFloat(page) + 1;
                page = (page % 2) ? (page - 1) / 2 : page / 2;
                st = parseFloat(page) * 570 + 570 + ADD;
            }
        }
        
        if (animate) {
            $('body, html').animate({ scrollTop : st});
        } else if (animateAfter) {
            $('body, html').scrollTop(st).animate({ 'scrollTop' : animateAfter }, 1000, function() {
                callback();
                // TODO
                // перезаписать callback, т.к. он вызывается 2 раза
                callback = $.noop;
            });
        } else {
            $(window).scrollTop(st);
        }
    },
    /**
     * @param {String} page - страница в формате 001, 002
     * @param {String} side - сторона 'left' или 'right'
     * @param {Boolean} scaled
     * TODO deprecated
     */
    showPageNumber: function(page, side, scaled) {
        var st = $('#page' + page).offset().top;

        // сохранить текущую страницу
        this.current = page;

        // если большая и правая - нужен отступ
        if (scaled && side == 'right') {
            // у первой страницы отступ больше
            if (page == '001') {
                st += 1420;
            } else {
                // отступ в одну страницу
                st += 1142;
            }
        }
        $(window).scrollTop(st);
    },

    /**
     * @param {Event} event - scroll event
     */
    scroll: function(event) {
        
        var newPage = this._get_current_page();

        
        if (newPage === '115' || newPage === '114-115') newPage = 'buy';
        
        // если страница изменилась и модуль не в режеме video
        if(this.current !== newPage && !this.isVideo) {
            this.current = newPage;
            
            // отметить страницу как "Верхнюю" или НЕ "Верхнюю"
            this.topPageIsOpen = (!!this._names[newPage]) ? newPage : false;
                       
            this._module.trigger('pagechange');
        }

    },

    /**
     * возвращает текущее состояние в формате 1 страницы на номер
     */
   _get_current_page: function() {
        // TODO scrollTop in core
        // TODO задать высоты константами
        var page_offset = $(".main").offset().top - $(document).scrollTop() - $("#blanckpalce").height();
        var page_height = $(".normalpage:last").height();
        var first_page_height = $("#page001").height();
       
        var index, page;

        if (this._scaled) {
            /**
             * Страница записывается в формате 0, 00, 000, 001, 002
             */
            // -1 потому что сверху 4 стр
            var additionalIndex = - this._topPages / 2;
            
            index = additionalIndex + 1.15 + ( (page_offset + first_page_height  ) / - page_height );
            
            index = (index - 0.15) * 2;
            if (index > 0 - 0.5) {
                page = parseInt(index) - 2;
            } else {
                page = parseInt(index - 0.5) - 2;
            }
            
            if (page === -2) {
                page = '0';
            } else if (page === -1) {
                page = '00';
            } else if (page <= -3){
                $.each(this._names, function(k,v) {
                   if (v == -page - 2) {
                       page = k;
                   } 
                });
                
                if (page == 'empty') page = 'blog';
            } else if (page == -4){
                page = 'archive'; 
            } else {
                page = page.toString3();
            }
        } else {
            /**
             * Разворот записывается в формате 0-00, 000-001, 002-003
             */
            index = 1.15 + ( (page_offset + first_page_height  ) / - page_height );
            
            page = parseInt(index);
            if (page === 0) {
                page = '0-00';
            } else {
                page =  (page * 2 - 2).toString3() + '-' + (page * 2 - 1).toString3();
            }
        }

        return page;

    },

    _bind: function() {
        var that = this;
    },

    bind: function(eventType, handler) {
        $.fn.bind.apply(this._module, arguments);
    },

    onePageMode: function() {
        this._scaled = true;
        this.showPage(this.current.split('-')[0]);
    },
    
    twoPageMode: function() {
        this._scaled = false;
        var c = this.current,page, intpage;
		
		// если текущая страница уже в формате 001-002
		if(/\d{1,3}-\d{2,3}/.test(c)) {
            // оставить ту же страницу
			page = c;
		} else {			
			if (c === 'buy') {
				intpage = 115;
			} else {
				intpage  = parseFloat(c);
			}

			/*перевод страниц
			0   - 0-00
			00  - 0-00
			000 - 000-001
			001 - 000-001*/
			if(c === '0' || c === '00') {
				page = '0-00';
			} else if(intpage % 2) {
				page = (intpage - 1).toString3() + '-' + (intpage).toString3();
			} else {
				page = (intpage).toString3() + '-' + (intpage + 1).toString3();
			}
		}
		
        this.showPage(page);
    },
	
	scrollToWidget: function(id) {	
		$('html,body').animate({ 'scrollTop' : $('#' + id).closest('.leftdivimage, .rightdivimage').offset().top });
	},
	
	// right - правая страница
	scrollToPage: function(page_id, right) {		
		if (typeof page_id === "number")  page_id = page_id.toString3();
		var st = $('#page' + page_id).offset().top;
		
		// если увеличенная правая - добавить отступ в 1 страницу
		if (right && this._scaled) st += 1142;
		$('html,body').animate({ 'scrollTop' : st });
		
	},
	
	/**
	 * показать следующую страницу \ разворот
	 */
	showNextPage: function() {
		var c = this.current, next;
		
		if (this._scaled) {
			// следующая страница
			switch(c) {
				case '0'  : next = '00'; break;
				case '00' : next = '000'; break;
				case 'buy': return; break;
				default   : next = (parseFloat(c) + 1).toString3();			
			}
		} else {
			// следующий разворот
			switch(c) {
				case '0-00': next = '000-001'; break;
				case 'buy' : return; break;
				default    : 
					c = c.split('-');
					next = (parseFloat(c[0]) + 2).toString3() + '-' + (parseFloat(c[1]) + 2).toString3();
			}
		}

		this.showPage(next);
	},
	
	/**
	 * показать предыдущую страницу \ разворот
	 */
	showPrevPage: function() {
		var c = this.current, prev;
		
		if (this._scaled) {
			// следующая страница
			switch(c) {
				case '0'  : return; break;
				case '00' : prev = '0'; break;
				case '000' : prev = '00'; break;
				case 'buy': prev = '114'; break;
				default   : prev = (parseFloat(c) - 1).toString3();			
			}
		} else {
			// следующий разворот
			switch(c) {
				case '0-00': return; break;
				case '000-001' : prev = '0-00'; break;
				case 'buy' : prev = '112-113'; break;
				default    : 
					c = c.split('-');
					prev = (parseFloat(c[0]) - 2).toString3() + '-' + (parseFloat(c[1]) - 2).toString3();
			}
		}

		this.showPage(prev);
	},
	
	addContainerPageAfter: function(page) {
	    //if (this._fakepage.length) this._fakepage.remove();
	    this._fakepage = $('<div id="fakepage" class="normalpage" style="height: 0px;"></div>').insertAfter('#page' + page).animate({ 'height' : '1124px' });
	    $('html,body').animate({ 'scrollTop' : this._fakepage.offset().top });
	},
	
	// number of top
	getTopPage: function(number, pageName) {
	    this._names[pageName] = number;
	    this._topPages += 1;
	    var t = $('.toppage > div');
	    return t.eq(t.length - number);
	},

	topHas: function(pageName) {	    
	    return this._names.hasOwnProperty(pageName);
	},
	
	topIndex: function() {
	    if (this.topPageIsOpen) return this._names[this.topPageIsOpen];	    
	},
	
	topCount: function() {
	    return this._topPages;
	}

	//i('003')

};
