Ext.ns('AVM');

AVM.Controller = function()
{
	var model_nav_tip = null;
	var hide_task = null;
	
	function initModelsNav()
	{
		model_nav_hide_task = new Ext.util.DelayedTask();
		
		var el, i, len, width, items = Ext.query('.model-nav-item'), ul = Ext.get('model-nav');
		if (items && ul) {
			for (width = 0, i = 0, len = items.length; i < len; i++) {
				el = Ext.fly(items[i]);
				width += el.getWidth();
				el.dom.removeAttribute('title');
				el.on('mouseover', onModelNavItemOver);
				el.on('mouseout', onModelNavItemOut);			
			}
			if (width > ul.getWidth()) {
				ul.setWidth(width + (Ext.isIE ? 3 : 0));
				initModelNavScroller();
			}
		}
	}
	
	// Model navigator floater methods
	
	function onModelNavItemOver(e)
	{
		var tip = getModelNavTip(), 
		    model_id = e.getTarget().id,
		    cur_parts,
		    need_parts;
		
		if (tip.hasActiveFx()) {
			tip.stopFx();
			tip.show();
		}
		else if (!tip.isVisible()) {
			tip.show();
			tip.fadeIn();
		}
		
		cur_parts = tip.img.dom.src.split('/');
		need_parts = AVM.Models[model_id].img.split('/');
		if (cur_parts[cur_parts.length - 1] != need_parts[need_parts.length - 1]) {
			tip.img.hide();
			tip.img.dom.src = AVM.Models[model_id].img;
			//tip.img.dom.width = AVM.Models[model_id].width;
			//tip.img.dom.height = AVM.Models[model_id].height;
			tip.img.setStyle({
			 width: AVM.Models[model_id].width + 'px',
			 height: AVM.Models[model_id].height + 'px'
			});
		}
		else {
			tip.img.show();
		}
		tip.alignTo(model_id, 'b-t');
		
		model_nav_hide_task.cancel();
	}
	
	function onModelNavItemOut(e)
	{
		model_nav_hide_task.delay(200, onModelNavItemOutDefer);
	}
	
	function onModelTipMouseOver()
	{
		model_nav_hide_task.cancel();
	}
	
	function onModelTipMouseOut()
	{
		model_nav_hide_task.delay(200, onModelNavItemOutDefer);
	}
	
	function onModelNavItemOutDefer()
	{
		var tip = getModelNavTip();
		
		if (tip.hasActiveFx()) {
			tip.stopFx();
			tip.hide();
			onModelNavTipHide();
		}
		else {
			tip.fadeOut({
				callback: onModelNavTipHide
			});
		}
	}
	
	function onModelNavImageLoad(e)
	{
		var tip = getModelNavTip();
		if (tip.isVisible()) {
			tip.img.show();
		}
	}

	function onModelNavTipHide()
	{
		getModelNavTip().img.hide();
	}
	
	function getModelNavTip()
	{
		if (!model_nav_tip) {
			model_nav_tip = createModelNavTip();
		}
		return model_nav_tip;
	}
	
	function createModelNavTip()
	{
		var tip, body = Ext.getBody();
		
		tip = body.createChild({
			tag: 'div',
			id: 'model-nav-tip',
			children: {
				tag: 'div', 
				children: {
					tag: 'img', 
					width: '149px', 
					height: '186px',
					src: '/shared/Avant/images/black_50_bg.png'
				}
			}
		});
		tip.position('absolute', 10000);
		tip.setVisibilityMode(tip.VISIBILITY);
		tip.hide();
		
		tip.img = tip.child('img');
		tip.img.setVisibilityMode(tip.VISIBILITY);
		tip.img.hide();
		tip.img.on('load', onModelNavImageLoad);
		
		tip.div = tip.child('div');
		tip.on('mouseover', onModelTipMouseOver);
		tip.on('mouseout', onModelTipMouseOut);
		
		return tip;
	}
	
	// End of model navigator floater methods
	
	// Model navigator scroller methods
	
	var model_nav_scroller = null;
	
	function initModelNavScroller()
	{
		createModelNavScrollerMarkup();
		updateModelNavArrowStates();
	}
	
	function createModelNavScrollerMarkup()
	{
		var cont = Ext.get('model-nav-frame'),
				ul = Ext.get('model-nav'),
				left_arr, right_arr, wl, wr;
				
		cont.position('relative');	
			
		left_arr = cont.createChild({
			tag: 'div',
			cls: 'left-arrow',
			style: 'position: absolute; top: 0px; left: 0px; bottom: 0px'
		});
		left_arr.addClassOnOver('left-arrow-active');
		
		right_arr = cont.createChild({
			tag: 'div',
			cls: 'right-arrow',
			style: 'position: absolute; top: 0px; right: 0px; bottom: 0px'
		});
		right_arr.addClassOnOver('right-arrow-active');
				
		wl = left_arr.getWidth();
		wr = right_arr.getWidth();
		
		model_nav_scroller = ul.wrap({
			tag: 'div',
			cls: 'scroller',
			style: 'overflow: hidden; position: absolute; top: 0px; bottom: 0px; left: ' + wl + 'px; right: ' + wr + 'px'
		});
		
		model_nav_scroller.left_arrow = left_arr;
		model_nav_scroller.right_arrow = right_arr;
		
		left_arr.on('click', onModelNavLeftArrowClick);
		right_arr.on('click', onModelNavRightArrowClick);
	}
	
	function updateModelNavArrowStates()
	{
		if (!modelNavCanScrollLeft()) {
			model_nav_scroller.left_arrow.addClass('left-arrow-disabled');
		}
		else {
			model_nav_scroller.left_arrow.removeClass('left-arrow-disabled');
		}
		
		if (!modelNavCanScrollRight()) {
			model_nav_scroller.right_arrow.addClass('right-arrow-disabled');
		}
		else {
			model_nav_scroller.right_arrow.removeClass('right-arrow-disabled');
		}
	}
	
	function modelNavCanScrollLeft()
	{
		return model_nav_scroller.dom.scrollLeft > 0;
	}
	
	function modelNavCanScrollRight()
	{
		return model_nav_scroller.dom.scrollWidth - model_nav_scroller.dom.scrollLeft > model_nav_scroller.dom.clientWidth;
	}
	
	function onModelNavLeftArrowClick()
	{
		if (modelNavCanScrollLeft()) {
			model_nav_scroller.scroll('right', Math.round(model_nav_scroller.getWidth() / 3), {
				callback: updateModelNavArrowStates
			});
		}
	}
	
	function onModelNavRightArrowClick()
	{
		if (modelNavCanScrollRight()) {
			model_nav_scroller.scroll('left', Math.round(model_nav_scroller.getWidth() / 3), {
				callback: updateModelNavArrowStates
			});
		}
	}
	
	// End of model navigator scroller methods
	
	// News calendar methods
	calendar_from = null;
	calendar_to = null;
	
	function initNewsCalendar()
	{
		calendar_from = new AVM.Calendar.Widget();
		calendar_from.render('news-calendar-from');
	}
	// End of news calendar methods
	
	// Shadowbox methods
	function initShadowBox()
	{
		Shadowbox.init({
			flvPlayer: '/shared/Avant/js/ShadowBox/flvplayer.swf',
			overlayColor: '#FFFFFF',
			flashBgColor: '#cacaca'
		});
	}
	// End of shadowbox methods
	
	// For models form methods
	var modelform_btns_div = null;
	var modelform_add_btn = null;
	var modelform_cnt = 1;
	var modelform_cnt_max = Ext.isIE ? 4 : 5;
	
	function initModelForm()
	{
		var fs = Ext.get('modelform-photo-fs');
		modelform_btns_div = fs.createChild({
			tag: 'div'
		});
		modelform_add_btn = modelform_btns_div.createChild({
			tag: 'input',
			type: 'button',
			value: 'add'
		});
		
		modelform_add_btn.on('click', addModelFormFileField);
	}
	
	function addModelFormFileField()
	{
		if (modelform_cnt < modelform_cnt_max) {
			modelform_cnt++;
			Ext.DomHelper.insertBefore(
				modelform_btns_div, {
					tag: 'input',
					type: 'file',
					name: 'photo[]'
				}
			);
			if (modelform_cnt == modelform_cnt_max) {
				modelform_add_btn.dom.disabled = true;
				modelform_add_btn.addClass('disabled');
			}
		}
	}
	// End of for models form methods
	
	// Declarative scrollers support methods
	var avm_vts_query = 'div.avm-vertical-transparent-scroller';
	var avm_hts_query = 'div.avm-horizontal-transparent-scroller';
	var avm_sp_query = '.avm-scrollable-panel';
	//var avm_scrollers = [];
	
	function initScrollers()
	{
		initVerticalTransparentScrollers();
		initHorizontalTransparentScrollers();
	}
	
	function initVerticalTransparentScrollers()
	{
		var i, len, scr = Ext.query(avm_vts_query);
		
		for (i = 0, len = scr.length; i < len; i++) {
			initVerticalTransparentScroller(scr[i]);
		}
	}
	
	function initHorizontalTransparentScrollers()
	{
		var i, len, scr = Ext.query(avm_hts_query);
		
		for (i = 0, len = scr.length; i < len; i++) {
			initHorizontalTransparentScroller(scr[i]);
		}
	}
	
	function initVerticalTransparentScroller(scr)
	{
		// Найти панель и если понель найдена, то:
		// Задать контейнеру стиль overflow: hidden и если не установлена position, то установить её в relative
		// Обернуть панель в div
		// Добавить в контейнер два div'a с position:absolute для стрелок
		// Прицепиться к событиям контейнера и стрелок для взаимодействия с пользователем
		var scr_el = Ext.get(scr), 
		    panel = scr_el.child(avm_sp_query),
		    arr_top_el, arr_bottom_el;
		    
		if (panel) {
			scr_el.position('relative');
			scr_el.setStyle('overflow', 'hidden');
			
			scr_el.avm_scroll_panel_el = panel.wrap({
				tag: 'div',
				style: 'position: absolute; overflow: hidden; width: '+scr_el.getWidth()+'px; height: '+scr_el.getHeight()+'px'
			});
			
			arr_top_el = scr_el.createChild({
				tag: 'div',
				style: 'position: absolute; visibility: hidden; top: 0px; left: 0px; right: 0px; height: 40px',
				cls: 'arrow-top',
				children: {
					tag: 'div',
					cls: 'arrow-icon'
				}
			});
			
			arr_bottom_el = scr_el.createChild({
				tag: 'div',
				style: 'position: absolute; visibility: hidden; left: 0px; right: 0px; bottom: 0px; height: 40px',
				cls: 'arrow-bottom',
				children: {
					tag: 'div',
					cls: 'arrow-icon'
				}
			});
			
			arr_top_el.addClassOnOver('arrow-top-active');
			arr_top_el.setVisibilityMode(Ext.Element.VISIBILITY);
			arr_top_el.hide();
			arr_bottom_el.addClassOnOver('arrow-bottom-active');
			arr_bottom_el.setVisibilityMode(Ext.Element.VISIBILITY);
			arr_bottom_el.hide();
			
			scr_el.avm_arrow_top_el = arr_top_el;
			scr_el.avm_arrow_bottom_el = arr_bottom_el;
			
			scr_el.on('mousemove', onVerticalScrollerMouseMove);
			scr_el.on('mouseout', onVerticalScrollerMouseOut);
			arr_top_el.on('click', onVerticalScrollerTopArrowClick);
			arr_bottom_el.on('click', onVerticalScrollerBottomArrowClick);
			
			scr_el.avm_task = new Ext.util.DelayedTask();
			//avm_scrollers.push(scr_el);
		}
		else if (console) {
			console.log("Can't find vertical transparent scroller panel.");
		}
	}
	
	function initHorizontalTransparentScroller(scr)
	{
		var scr_el = Ext.get(scr), 
		    panel = scr_el.child(avm_sp_query),
		    arr_left_el, arr_right_el;
		    
		if (panel) {
			scr_el.position('relative');
			scr_el.setStyle('overflow', 'hidden');
			
			scr_el.avm_scroll_panel_el = panel.wrap({
				tag: 'div',
				style: 'position: absolute; overflow: hidden; width: '+scr_el.getWidth()+'px; height: '+scr_el.getHeight()+'px'
			});
			
			arr_left_el = scr_el.createChild({
				tag: 'div',
				style: 'position: absolute; visibility: hidden; top: 0px; left: 0px; bottom: 0px; width: 40px',
				cls: 'arrow-left',
				children: {
					tag: 'div',
					cls: 'arrow-icon'
				}
			});
			
			arr_right_el = scr_el.createChild({
				tag: 'div',
				style: 'position: absolute; visibility: hidden; top: 0px; right: 0px; bottom: 0px; width: 40px',
				cls: 'arrow-right',
				children: {
					tag: 'div',
					cls: 'arrow-icon'
				}
			});
			
			arr_left_el.addClassOnOver('arrow-left-active');
			arr_left_el.setVisibilityMode(Ext.Element.VISIBILITY);
			arr_left_el.hide();
			arr_right_el.addClassOnOver('arrow-right-active');
			arr_right_el.setVisibilityMode(Ext.Element.VISIBILITY);
			arr_right_el.hide();
			
			scr_el.avm_arrow_left_el = arr_left_el;
			scr_el.avm_arrow_right_el = arr_right_el;
			
			scr_el.on('mousemove', onHorizontalScrollerMouseMove);
			scr_el.on('mouseout', onHorizontalScrollerMouseOut);
			arr_left_el.on('click', onHorizontalScrollerLeftArrowClick);
			arr_right_el.on('click', onHorizontalScrollerRightArrowClick);
			
			scr_el.avm_task = new Ext.util.DelayedTask();
		}
		else if (console) {
			console.log("Can't find horizontal transparent scroller panel.");
		}
	}
	
	function onVerticalScrollerMouseMove(event)
	{
		var h2, page_y, local_y, el;
		
		el = event.getTarget(avm_vts_query, 10, true);
		h2 = Math.round(el.getHeight() / 2);
		page_y = event.getPageY();
		local_y = el.translatePoints(0, page_y).top;
		if (local_y < h2) {
			if (elementCanScrollTop(el.avm_scroll_panel_el)) {
				if (!el.avm_arrow_top_el.isVisible()) {
					el.avm_arrow_top_el.show(true);
				}
			}
			if (el.avm_arrow_bottom_el.isVisible()) {
				el.avm_arrow_bottom_el.hide();
			}
		}
		else {
			if (elementCanScrollBottom(el.avm_scroll_panel_el))  {
				if (!el.avm_arrow_bottom_el.isVisible()) {
					el.avm_arrow_bottom_el.show(true);
				}
			}
			if (el.avm_arrow_top_el.isVisible()) {
				el.avm_arrow_top_el.hide();
			}
		}
		el.avm_task.cancel();
	}
	
	function onVerticalScrollerMouseOut(event)
	{
		var el = event.getTarget(avm_vts_query, 10, true);
		el.avm_task.delay(100, onVerticalScrollerMouseOutDelayed, window, [el]);
	}
	
	function onVerticalScrollerMouseOutDelayed(el)
	{
		if (el.avm_arrow_top_el.isVisible()) {
			el.avm_arrow_top_el.hide();
		}
		if (el.avm_arrow_bottom_el.isVisible()) {
			el.avm_arrow_bottom_el.hide();
		}
	}
	
	function onVerticalScrollerTopArrowClick(event)
	{
		var el = event.getTarget(avm_vts_query, 10, true);
		el.avm_scroll_panel_el.scroll('top', Math.round(el.avm_scroll_panel_el.getHeight() / 2), true);
	}
	
	function onVerticalScrollerBottomArrowClick(event)
	{
		var el = event.getTarget(avm_vts_query, 10, true);
		el.avm_scroll_panel_el.scroll('bottom', Math.round(el.avm_scroll_panel_el.getHeight() / 2), true);
	}
	
	function onHorizontalScrollerMouseMove(event)
	{
		var w2, page_x, local_x, el;
		
		el = event.getTarget(avm_hts_query, 10, true);
		w2 = Math.round(el.getWidth() / 2);
		page_x = event.getPageX();
		local_x = el.translatePoints(page_x, 0).left;
		if (local_x < w2) {
			if (elementCanScrollRight(el.avm_scroll_panel_el)) {
				if (!el.avm_arrow_left_el.isVisible()) {
					el.avm_arrow_left_el.show(true);
				}
			}
			if (el.avm_arrow_right_el.isVisible()) {
				el.avm_arrow_right_el.hide();
			}
		}
		else {
			if (elementCanScrollLeft(el.avm_scroll_panel_el))  {
				if (!el.avm_arrow_right_el.isVisible()) {
					el.avm_arrow_right_el.show(true);
				}
			}
			if (el.avm_arrow_left_el.isVisible()) {
				el.avm_arrow_left_el.hide();
			}
		}
		el.avm_task.cancel();
	}
	
	function onHorizontalScrollerMouseOut(event)
	{
		var el = event.getTarget(avm_hts_query, 10, true);
		el.avm_task.delay(100, onHorizontalScrollerMouseOutDelayed, window, [el]);
	}
	
	function onHorizontalScrollerMouseOutDelayed(el)
	{
		if (el.avm_arrow_left_el.isVisible()) {
			el.avm_arrow_left_el.hide();
		}
		if (el.avm_arrow_right_el.isVisible()) {
			el.avm_arrow_right_el.hide();
		}
	}
	
	function onHorizontalScrollerLeftArrowClick(event)
	{
		var el = event.getTarget(avm_hts_query, 10, true);
		el.avm_scroll_panel_el.scroll('right', Math.round(el.avm_scroll_panel_el.getWidth() / 2), true);
	}
	
	function onHorizontalScrollerRightArrowClick(event)
	{
		var el = event.getTarget(avm_hts_query, 10, true);
		el.avm_scroll_panel_el.scroll('left', Math.round(el.avm_scroll_panel_el.getWidth() / 2), true);
	}
	// End of declarative scroller support methods 
	
	// Google Maps methods
	function initGMaps(map_data)
	{
		var map = new GMap2(document.getElementById(map_data.container)),
  			pcenter = new GLatLng(map_data.latitude, map_data.longitude),
				marker_icon = new GIcon(),
  			zoom_ctl = new GSmallZoomControl(),
  			marker, extra_marker, route, rpt, i, len;

		marker_icon.image = map_data.marker_url;
		marker_icon.shadow = map_data.shadow_url;
		marker_icon.iconSize = new GSize(map_data.marker_width, map_data.marker_height);
		marker_icon.shadowSize = new GSize(map_data.shadow_width, map_data.shadow_height);
		marker_icon.iconAnchor = new GPoint(map_data.marker_anchor_x, map_data.marker_anchor_y);

  	map.setCenter(pcenter, parseInt(map_data.zoom));
		map.addControl(zoom_ctl);
		
		marker = new GMarker(pcenter, {icon: marker_icon});
  	GEvent.addListener(marker, "click", function() {
  		map.openInfoWindowHtml(marker.getPoint(), '<span style="font-weight: bold">' + map_data.text + '</span>');
  	});
		map.addOverlay(marker);
		
		if (map_data.extra_latitude != 0 && map_data.extra_longitude != 0) {
			extra_marker = new GMarker(new GLatLng(map_data.extra_latitude, map_data.extra_longitude));
			if (map_data.extra_text) {
  			GEvent.addListener(extra_marker, "click", function() {
  				map.openInfoWindowHtml(extra_marker.getPoint(), '<span>' + map_data.extra_text + '</span>');
  			});
			}
			map.addOverlay(extra_marker);
		}
		
		if (map_data.route && map_data.route.length) {
			route = [];
			for (i = 0, len = map_data.route.length; i < len; i++) {
				rpt = map_data.route[i];
				route.push(new GLatLng(rpt[0], rpt[1]));
			}
			map.addOverlay(new GPolyline(route, '#FF0000', 3, 0.5));
		}
		
		Ext.lib.Event.on(window, 'unload', GUnload);
	}	
	// End of Google Maps methods
	
	// Common methods
	function elementCanScrollTop(el)
	{
		el = el.dom ? el.dom : el;
		return el.scrollTop > 0;
	}
	
	function elementCanScrollBottom(el)
	{	  
	  el = el.dom ? el.dom : el;  
	  return (el.scrollHeight - el.scrollTop) > el.clientHeight;
	}
	
	function elementCanScrollLeft(el)
	{
	  el = el.dom ? el.dom : el;     
	  return (el.scrollWidth - el.scrollLeft) > el.clientWidth;
	}
	
	function elementCanScrollRight(el)
	{
		el = el.dom ? el.dom : el;  
	  return el.scrollLeft > 0;
	}
	// End of common methods

	return {
		run: function()
		{
			initModelsNav();
			initShadowBox();
			initScrollers();
			if (Ext.fly('news-calendar-from') && Ext.fly('news-calendar-to')) {
				initNewsCalendar();
			}
		},
		
		initGMaps : initGMaps,
		
		initModelForm : initModelForm
	};
}();

Ext.onReady(AVM.Controller.run);
