;(function(){

var myName = 'GoodPage',
	Me = self[myName] = MVC.create(myName)

// Me.mixIn(EventDriven)

var myProto =
{
	initialize: function ()
	{
		this.model.initialize()
		this.view.initialize()
		this.controller.initialize()
	},

	bind: function (nodes, sources)
	{
		this.model.bind(sources)
		this.view.bind(nodes)
		this.controller.bind()
		
		return this
	}
}

Object.extend(Me.prototype, myProto)

})();


;(function(){

var Papa = GoodPage, Me = Papa.Model

var myProto =
{
	initialize: function ()
	{
		this.sources = {}
		this.state = {}
	},
	
	bind: function (sources)
	{
		this.sources = sources
	},
	
	selectGoodByName: function (name)
	{
		var Good = this.sources.good
		
		// this.view.renderPreviews(Good.getAll())
		this.view.selectGood(Good.getByName(name))
	}
}

Object.extend(Me.prototype, myProto)

})();
;(function(){

var Papa = GoodPage, Me = Papa.View

eval(NodesShortcut.include())

var myProto =
{
	previewsPageLength: 4,
	promosPageLength: 1,
	
	initialize: function ()
	{
		this.nodes = {}
		this.cache = {previews: {}, previewsGhosts: {}}
		this.previewsList = new LazyList()
	},
	
	bind: function (nodes)
	{
		this.nodes = nodes
		this.controller.selectGoodByName(this.nodes.name.firstChild.nodeValue)
	},
	
	selectGood: function (good)
	{
		this.selectGoodPreview(good)
		this.renderPromos(good)
	},
	
	renderPreviews: function (goods)
	{
		var previews = this.nodes.previews, surface = previews.surface, viewport = previews.viewport
		
		surface.empty()
		
		var previewsCache = this.cache.previews,
			nodes = []
		for (var i = 0; i < goods.length; i++)
		{
			var good = goods[i]
			
			var item = Nc('li', 'item')
			surface.appendChild(item)
			
			var preview = good.getPreviewNode(true)
			item.appendChild(preview)
			
			item.appendChild(Nc('div', 'mark'))
			
			previewsCache[good.name] = item
			nodes.push(item)
		}
		
		var page = this.previewsPageLength,
			previewsGhostsCache = this.cache.previewsGhosts
		if (goods.length >= page)
		{
			for (var i = 0; i < page; i++)
			{
				var good = goods[i]
				
				var item = Nc('li', 'item')
				surface.appendChild(item)
				
				var preview = good.getPreviewNode()
				item.appendChild(preview)
				
				item.appendChild(Nc('div', 'mark'))
				
				previewsGhostsCache[good.name] = item
				nodes.push(item)
			}
		}
		
		
		var list = this.previewsList
		list.bind(previews)
		list.configure({pageLength: 4, pageVelocity: 28})
		list.load = function (nodes)
		{
			for (var i = 0, il = nodes.length; i < il; i++)
			{
				nodes[i].firstChild.lazyLoad()
			}
		}
		list.setNodes(nodes, goods.length)
	},
	
	renderPromos: function (good)
	{
		var promos = this.nodes.promos, surface = promos.surface, viewport = promos.viewport
		
		surface.empty()
		
		var nodes = []
		for (var i = 0, il = good.promos; i < il; i++)
		{
			var promo = good.getPromoNode(i, true)
			surface.appendChild(promo)
			nodes.push(promo)
		}
		
		var page = this.promosPageLength
		if (good.promos >= page)
		{
			for (var i = 0; i < page; i++)
			{
				var promo = good.getPromoNode(i)
				surface.appendChild(promo)
				nodes.push(promo)
			}
		}
		
		var list = new LazyList()
		list.bind(promos)
		list.configure({pageLength: 1, friction: 100, pageVelocity: 48, soft: Infinity, min: 75, max: 100})
		list.load = function (nodes)
		{
			for (var i = 0, il = nodes.length; i < il; i++)
			{
				nodes[i].lazyLoad()
			}
		}
		list.setNodes(nodes, good.promos)
	},
	
	selectGoodPreview: function (good)
	{
		var item = this.cache.previews[good.name]
		if (item)
		{
			item.addClassName('selected')
			this.previewsList.jumpToNode(item)
		}
		
		var item = this.cache.previewsGhosts[good.name]
		if (item)
			item.addClassName('selected')
	}
}

Object.extend(Me.prototype, myProto)

})();

;(function(){

var Papa = GoodPage, Me = Papa.Controller

var myProto =
{
	initialize: function ()
	{
		
	},
	
	selectGoodByName: function (name)
	{
		this.model.selectGoodByName(name)
	},
	
	bind: function () {}
}

Object.extend(Me.prototype, myProto)

})();



function onready ()
{
	document.documentElement.removeClassName('loading')
	
	var nodes =
	{
		name: $$('#desc .name')[0],
		previews:
		{
			root: $$('.goods-previews')[0],
			prev: $$('.goods-previews .prev')[0],
			next: $$('.goods-previews .next')[0],
			viewport: $$('.goods-previews .viewport')[0],
			surface: $$('.goods-previews .surface')[0]
		},
		promos:
		{
			root: $$('.good-promos')[0],
			prev: $$('.good-promos .prev')[0],
			next: $$('.good-promos .next')[0],
			viewport: $$('.good-promos .viewport')[0],
			surface: $$('.good-promos .surface')[0]
		}
	}
	
	RoundedCorners.round(nodes.promos.root)
	
	var widget = new GoodPage()
	widget.bind(nodes, {good:Good})
}

$.onready(onready)
