IndexPage =
{
	initialize: function (nodes)
	{
		var params = {
"cocktails":["Старомодный","Шампань коктейль","Московский мул","Мартини мохитато","Вишня и вишня","Мартинез","Манхэттен"],
"links":[["Коктейли с Angostura bitter","/cocktails.html#ingredients=Ангостура биттер"],["Коктейли с Absolut Pears","/cocktails.html#state=byIngredients\u0026ingredients=Водка%20грушевая"],["Коктейли с Sambuca Antica","/cocktails.html#state=byIngredients\u0026ingredients=Самбука%20светлая"],["Коктейли с Bombay Sapphire","/cocktails.html#ingredients=Джин"],["Коктейли с De Kuyper Cream de Сafe","/cocktails.html#state=byIngredients\u0026ingredients=Кофейный%20ликер"],["Коктейли с Nonino Tradizione","/cocktails.html#ingredients=Граппа"],["Коктейли с Olmeca Gold","/cocktails.html#state=byIngredients\u0026ingredients=Золотая%20текила"],["Коктейли с Frapin","/cocktails.html#ingredients=Коньяк"],["Коктейли с Martini Bianco","/cocktails.html#ingredients=Белый вермут"],["Коктейли с Hakushika","/cocktails.html#state=byIngredients\u0026ingredients=Саке"],["Коктейли с Bacardi Black","/cocktails.html#ingredients=Темный ром"],["Коктейли с Barline Grenadine","/cocktails.html#state=byIngredients\u0026ingredients=Гренадин"]],
"promos":[{"href":"/cocktails/white_sangria.html","html_name":"cocktail_white_sangria","name":"Cocktail White Sangria"},{"href":"/cocktails.html#state=byIngredients\u0026ingredients=Апельсиновый%20биттер","html_name":"brand_angostura_orange","name":"Brand Angostura orange"},{"href":"/cocktails/naomi.html","html_name":"cocktail_naomi","name":"Cocktail Naomi"},{"href":"/bars/moskva/noor.html","html_name":"bar_noor","name":"Bar Noor"},{"href":"/cocktail/gogol-mogol/","html_name":"cocktail_gogol_mogol","name":"Cocktail Gogol Mogol"},{"href":"/bars/moskva/bamboo.html","html_name":"bar_bamboo","name":"Bar Bamboo"},{"href":"/cocktail/paloma/","html_name":"cocktail_paloma","name":"Cocktail Paloma"},{"href":"/events/moskva/cocktail-week-8","html_name":"event_london_week_in_city_space","name":"Event London week in City Space"},{"href":"/cocktails.html#state=byIngredients\u0026marks=Absolut","html_name":"brand_absolut","name":"Brand Absolut"},{"href":"/cocktails.html#state=byIngredients\u0026marks=Nonino","html_name":"brand_nonino","name":"Brand Nonino"},{"href":"/cocktails.html#state=byIngredients\u0026ingredients=Коньяк","html_name":"brand_frapin","name":"Brand Frapin"},{"href":"/cocktails.html#ingredients=Виски\u0026state=byIngredients","html_name":"brand_black_bottle","name":"Brand Black Bottle"},{"href":"/bars/moskva/all_time_bar.html","html_name":"bar_all_time_bar","name":"Bar All TIme Bar"},{"href":"/cocktail/ocha_karai/","html_name":"brand_hakushika","name":"Brand Hakushika"},{"href":"/bars/sankt-peterburg/big_liver_place.html","html_name":"bar_big_liver_place","name":"Bar Big Liver Place"},{"href":"/cocktails.html#ingredients=Розовый%20вермут\u0026state=byIngredients","html_name":"brand_martini_rosato","name":"Brand Martini Rosato"},{"href":"/bars/moskva/denis_simachev_shop_and_bar.html","html_name":"bar_denis_simachev","name":"Bar Denis Simachev"},{"href":"/cocktails.html#state=byIngredients\u0026marks=Antica","html_name":"brand_antica","name":"Brand Antica"},{"href":"/bars/moskva/dream_bar.html","html_name":"bar_cosmopolitan_jelly_in_dream_bar","name":"Bar Cosmopolitan jelly in Dream Bar"},{"href":"/cocktails.html#state=byIngredients\u0026marks=Olmeca","html_name":"brand_olmeca","name":"Brand Olmeca"},{"href":"/cocktails/captain_s_soul_goes_to_heaven.html","html_name":"cocktail_captain_soul_goes_to_heaven","name":"Cocktail Captain soul goes to heaven"},{"href":"/cocktails/pushkin_tini.html","html_name":"cocktail_pushkin_tini","name":"Cocktail Pushkin tini"},{"href":"/cocktails.html#state=byIngredients\u0026marks=De%20Kuyper","html_name":"brand_de_kuyper","name":"Brand De Kuyper"},{"href":"/bars/moskva/help.html","html_name":"bar_cocktail_winners_in_help","name":"Bar Cocktail winners in HELP"},{"href":"cocktails.html#state=byIngredients\u0026ingredients=Персиковый%20ликер","html_name":"brand_de_kuyper_peachtree","name":"Brand De Kuyper Peachtree"},{"href":"/cocktails/rum_ice-cream.html","html_name":"cocktail_rum_ice-cream","name":"Cocktail Rum Ice-Cream"},{"href":"/bars/moskva/tema_bar.html","html_name":"bar_shots_in_tema","name":"Bar Shots in Tema"},{"href":"/cocktails.html#state=byName\u0026name=мохито","html_name":"brand_bacardi_mojito","name":"Brand Bacardi Mojito"},{"href":"/bars/moskva/sushi_rumba.html","html_name":"bar_sushi_rumba","name":"Bar Sushi Rumba"},{"href":"/cocktails/b-black.html","html_name":"cocktail_b-black","name":"Cocktail B-black"},{"href":"/cocktails.html#state=byIngredients\u0026marks=Marini","html_name":"brand_martini","name":"Brand Martini"},{"href":"/events/moskva/cocktail-week-9","html_name":"event_ny_week_in_city_space","name":"Event NY week in City Space"}]
}
		var model       = this.model         = new IndexPageModel(params)
		var controller  = this.controller    = new IndexPageController()
		var view        = this.view          = new IndexPageView(nodes)
		
		model.view = view
		controller.view = view
		controller.model = model
		view.controller = controller
		
		view.start()
	}
}

$.onready
(
	function ()
	{
		var nodes =
		{
			cocktails: cssQuery('.info-blocks .cocktail-list')[0],
			links: cssQuery('.info-blocks .links-list')[0],
			promo: $('promo'),
			arrows:[cssQuery('#promo-prev')[0], cssQuery('#promo-next')[0]]
		}
		
		IndexPage.initialize(nodes)
	}
)

;(function(){

var decode = decodeURIComponent,
	encode = encodeURIComponent

var myName = 'UrlEncode',
	Me = self[myName] =
{
	paramDelimiter: '&',
	
	parse: function (string, forceArray)
	{
		var res = {}
	
		var parts = String(string).split(this.paramDelimiterRex || this.paramDelimiter)
		for (var i = 0; i < parts.length; i++)
		{
			var pair = parts[i].split('='),
				name = decode(pair[0]),
				val = decode(pair[1] || '')
		
			if (forceArray)
			{
				if (res[name])
					res[name].push(val)
				else
					res[name] = [val]
			}
			else
			{
				if (res[name])
				{
					if (typeof res[name] == 'array')
						res[name].push(val)
					else
						res[name] = [res[name], val]
				}
				else
					res[name] = val
			}
		}
	
		return res
	},
	
	stringify: function (data)
	{
		var pd = this.paramDelimiter
		
		if (!data)
			return ''
		
		if (typeof data.toUrlEncode == 'function')
			return data.toUrlEncode()
		
		switch (data.constructor)
		{
			case Array:
				var arr = []
				for (var j = 0, jl = data.length; j < jl; j++)
					arr.push(encode(data[j]))
				return arr.join(pd)
			
			case Object:
				var arr = []
				for (var i in data)
					if (i !== undefined && i != '')
					{
						var val = data[i]
						var enci = encode(i)
						if (val !== undefined && val !== null)
							switch (val.constructor)
							{
								case Array:
									for (var j = 0, jl = val.length; j < jl; j++)
										arr.push(enci + "=" + encode(val[j]))
									break
								case Object:
									arr.push(enci + "=" + encode('[object]'))
									break
								default:
									arr.push(enci + "=" + encode(val))
									break
							}
					}
				return arr.join(pd)
			
			default:
				return encode(data)
		}
	}
}

})();
function IndexPageModel ()
{
	IndexPageModel.name = "IndexPageModel"
	this.constructor = IndexPageModel
	this.initialize.apply(this, arguments)
}

IndexPageModel.prototype =
{
	initialize: function (params)
	{
		for(var key in params)
			this[key] = params[key]
	},
	
	setState: function (state)
	{
		var data =
		{
			cocktails: this.cocktails.map(function (v) { return Cocktail.getByName(v) }),
			links: this.links,
			promos: this.promos
		}
		
		this.view.modelChanged(data, state)
	}
}

function IndexPageController ()
{
	IndexPageController.name = "IndexPageController"
	this.constructor = IndexPageController
	this.initialize.apply(this, arguments)
}

IndexPageController.prototype =
{
	initialize: function () {},
	
	start: function ()
	{
		var hash = window.location.hash.replace(/^#/, '')
		hash = UrlEncode.parse(hash)
		this.model.setState({initFrame: hash.name})
	},
	
	updateHash: function (name)
	{
		window.location.hash = UrlEncode.stringify({name: name})
	}
}

function IndexPageView ()
{
	IndexPageView.name = "IndexPageView"
	this.constructor = IndexPageView
	this.initialize.apply(this, arguments)
}

IndexPageView.prototype =
{
	initialize: function (nodes)
	{
		this.nodes = nodes
		this.imagesLoaded = false
		this.switchBlock = false
		
		new Programica.RollingImagesLite(nodes.promo, {animationType: 'easeInOutQuad', duration:0.75})
		new Programica.RollingImagesLite(nodes.links, {animationType: 'easeOutQuad'})
		new Programica.RollingImagesLite(nodes.cocktails, {animationType: 'easeOutQuad'})
	},
	
	start: function ()
	{
		this.controller.start()
	},
	
	modelChanged: function (data, state)
	{
		this.renderPromo(this.nodes.promo, data.promos, 1, state)
		this.renderLinks(this.nodes.links, data.links, 1)
		this.renderCocktails(this.nodes.cocktails, data.cocktails, 1)
	},
	
	_createCocktailElement: function (cocktail)
	{
		return cocktail.getPreviewNode()
	},
	
	_createLinkElement: function (link, links)
	{
		var li = document.createElement("li")
		var a  = document.createElement("a")
		a.href = link[1]
		var img = document.createElement("img")
		img.src = "/i/index/links/" + (links.indexOf(link) + 1) + ".png"
		var txt = document.createTextNode(link[0])
		a.appendChild(img)
		a.appendChild(txt)
		li.appendChild(a)
		return li
	},
	
	createPromoElement: function (promo)
	{
		var a  = document.createElement("a")
		a.href = promo.href
		var img = document.createElement("img")
		img.alt = promo.name
		img.setAttribute("lazy", "/i/index/promos/" + (promo.html_name) + ".jpg")
		a.appendChild(img)
		a.className = "point"
		return a
	},
	
	getPromoImages: function ()
	{
		return images = this.nodes.promo.getElementsByTagName("img")
	},
	
	loadFrames: function (list, onImageLoaded)
	{
		var images = this.getPromoImages()
		
		for (var i = 0; i < list.length; i++)
		{
			var img = images[list[i]]
			if (!img.src)
			{
				img.src = img.getAttribute("lazy")
				if (onImageLoaded)
					img.onload = onImageLoaded
			}
		}
	},
	
	getRange: function (initFrame)
	{
		var range = [initFrame]
		var images = this.getPromoImages()
		
		if (images[initFrame - 1])
			range.push(initFrame - 1)
		if (images[initFrame + 1])
			range.push(initFrame + 1)
		
		var l = images.length
		
		if (range.indexOf(1) > -1)
			range.push(l - 1) // first == last (fake)
		if (range.indexOf(l - 2) > -1)
			range.push(0) // last == first (fake)
		
		return range
	},
	
	loadInitialFrames: function (initFrame)
	{
		var me = this, counter = 0
		var range = this.getRange(initFrame)
		
		this.loadFrames
		(
			range,
			function ()
			{
				counter++
				if (counter == range.length)
					me.imagesLoaded = true
			}
		)
	},
	
	renderCocktails: function (node, set, len)
	{
		this.renderSet(node, set, len, this._createCocktailElement)
	},
	
	renderLinks: function (node, set, len)
	{
		this.renderSet(node, set, len, this._createLinkElement)
	},
	
	renderPromo: function (node, set, len, state)
	{
		var ri = node.RollingImagesLite
		var parent = node.getElementsByClassName('surface')[0]
		
		parent.empty()
		
		// One fake before the actual series, one after
		parent.appendChild(this.createPromoElement(set[set.length - 1]))
		for (var i = 0; i < set.length; i++)
			parent.appendChild(this.createPromoElement(set[i]))
		parent.appendChild(this.createPromoElement(set[0]))
		ri.sync()
		
		if (set.length > 1)
		{
			var len = ri.points.length, me = this
			// Jumping to avoid fakes
			function switchFrame (prev)
			{
				if (!me.switchBlock)
				{
					var cur = ri.current, after = cur
					
					me.switchBlock = true
					function switchUnblock () { me.switchBlock = false }
					function jumpToAfter () { ri.goToFrame(after, 'directJump'); switchUnblock() }
					function slideToAfter () { ri.goToFrame(after).oncomplete = switchUnblock }
					
					if (prev)
					{
						if (cur == 1)
						{
							after = len - 2
							ri.goToFrame(0).oncomplete = jumpToAfter
						}
						else
						{
							after = cur - 1
							slideToAfter()
						}
					}
					else
					{
						if (cur == len - 2)
						{
							after = 1
							ri.goToFrame(len - 1).oncomplete = jumpToAfter
						}
						else
						{
							after = cur + 1
							slideToAfter()
						}
					}
					
					var promo = set[after-1]
					Statistics.magazinePromoViewed(promo)
					me.controller.updateHash(promo.name)
					me.loadFrames(me.getRange(after))
				}
			}
			
			this.nodes.arrows[0].addEventListener('click', function (e) { switchFrame(true)  }, false)
			this.nodes.arrows[1].addEventListener('click', function (e) { switchFrame(false) }, false)
			
			var initFrame = state.initFrame
			for (var i = 0; i < set.length; i++)
				if (set[i].name == initFrame)
				{
					initFrame = i + 1
					break
				}
			
			if (!initFrame)
				initFrame = 1//Math.round(Math.random() * (len - 1)) + 1
			if (!this.getPromoImages()[initFrame])
				initFrame = 1
			
			this.loadInitialFrames(initFrame)
			ri.jumpToFrame(initFrame)
			
			// Wait for initial images to load and start switching
			var tries = 0
			var imageLoadTimer = setInterval
			(
				function ()
				{
					if (me.imagesLoaded || tries++ > 10)
					{
						clearInterval(imageLoadTimer)
						me.showButtons()
					}
				},
				100
			)
		}
	},
	
	showButtons: function ()
	{
		var prev = this.nodes.arrows[0], next = this.nodes.arrows[1]
		prev.show()
		next.show()
		prev.animate('easeOutBounce', {left: -29}, 0.6)
		next.animate('easeOutBounce', {left: 962}, 0.6)
	},
	
	renderSet: function (node, set, len, renderFunction)
	{
		var parent = node.getElementsByClassName('surface')[0]
		parent.empty()
		for (var i = 0; i < set.length; i++)
		{
			if (i % len == 0)
			{
				var point = document.createElement('ul')
				point.className = 'point'
				parent.appendChild(point)
			}
			if (set[i])
				point.appendChild(renderFunction(set[i], set))
		}
		node.RollingImagesLite.sync()
	}
}
