//namespace
if (typeof GP == "undefined") { var GP = {}; }
if (typeof GP.stat == "undefined") { GP.stat = {}; }

/** FrameUtil object
 * contains specific functions for loaded frames 
 * 
 **/


GP.stat.FrameUtil=(function(){
	var $C=YAHOO.util.Connect, $E=YAHOO.util.Event, $D=YAHOO.util.Dom, $=function(x) {return YAHOO.util.Dom.get(x);};

	var page_types={
		'page_game' : function() {
			currentChampScript();
		},
		'page_teamstage' : function() {
			currentChampScript();
		}
	}

	/**
	 * 
	 */
	var frameScriptExecutor = function (pageName) {
		if(pageName in page_types) {
			page_types[pageName]();
			var yearGameCount = $D.getElementsByClassName('year_game', 'tr').length;	
			var needCheckbox = $D.getElementsByClassName('other_champ', 'tr').length; //проверка на наличие игр из других чемпионатов, если таких нету, то галочка нам не нужна, прячем
			if((needCheckbox == 0) || (yearGameCount <= needCheckbox)) {
				$D.addClass($('current_champ_mode_div_default'), 'hidden');
			}
		}
	}
	
	var changeElements = function (method, container) {
		if(typeof(container) == "object")
			var element_list = container;
		else
			var element_list = $D.getElementsByClassName(container);
		for(var index = 0; index < element_list.length; index++)
			if(element_list[index] !== null || element_list[index] !== undefined)
				method(element_list[index]);
	}
	
	var initFrame = function() {
		$D.removeClass($("current_champ_mode_div"), "hidden");
		
		changeElements(function(el){
			$D.addClass(el, "hidden");
		}, "no_js_total");		
		
		changeElements(function(el){
			$D.removeClass(el, "hidden");
		}, "more_or_less_select");	
		
		changeElements(function(el) {
			$D.addClass(el, "hidden");
		}, "long_result")	
	
		changeElements(function(el) {
			$D.removeClass(el, "hidden");
		}, "short_result")	
				
	}
	
	var initLeftMenu = function() {
		changeElements(function(el){
			el.href = document.location.href;
		}, "left_menu_item");
	}
	
	var initTables = function() {
		changeElements(function(el) {
			if(!$D.hasClass(el.parentNode.parentNode, "stattable_more_or_less")) {
				var team_table = $D.getChildren($D.getChildren(el)[0]);
				changeElements(function(el) {
					var result = $D.getChildren(el)[3];
					var long_result_link = $D.getElementsByClassName("show_long_result_link", "span", result);
					$D.removeClass(long_result_link, "hidden");
				}, team_table);
			}
		}, "stattable_body");
	}
		
	var initFiltres = function() {
		$D.addClass($('any_champ'), "champ_filter_active");
		$D.addClass($('any_place'), "champ_filter_active");
		$D.addClass($('any_champ_type'), "champ_filter_active");
	}
	
	var currentChampScript = function () {
		initFrame();
		initLeftMenu();
		initTables();
		initFiltres();
			
		var menu_items = $D.getElementsByClassName("left_menu_item");
		$E.addListener(menu_items, "click", showGameBlock);
		$E.addListener($D.getElementsByClassName("champ_filter"), 'click', processChampFilter);
		$E.addListener($D.getElementsByClassName("more_or_less_select"), "change", processMoreOrLess);
		$E.addListener($D.getElementsByClassName('show_long_result_link'), "click", processLongResult);
		var formBox = $D.getElementsByClassName("form_box", "a", $("form"));
		$E.addListener(formBox, 'mouseover', showFormInfo);
		$E.addListener(formBox, 'mouseout', hideFormInfo);
		$E.addListener(formBox, 'click', dummyFormInfoListener);
		showGameBlock(null, menu_items[0]);
	}	
	
	var dummyFormInfoListener = function(event) {
		$E.stopEvent(event);
	}
	
	var processChampFilter = function(event) {
		$E.stopEvent(event);
		var root = $("frame_content");
		var any_champ_form = $D.getElementsByClassName("any_champ_form", "div", $("form"));
	  	var this_champ_form =  $D.getElementsByClassName("this_champ_form", "div", $("form"));
		var active_filter = $D.getElementsByClassName("champ_filter_active", "a", this.parentNode.parentNode)[0];
		if(active_filter == this)
			return;
		$D.removeClass(active_filter, "champ_filter_active");
		$D.addClass(this, "champ_filter_active");
		if(this.id=="home") {
			$D.addClass(root, "only_guest");
			$D.removeClass(root, "only_home")
		}
		if(this.id=="guest") {
			$D.addClass(root, "only_home");
			$D.removeClass(root, "only_guest")
		}
		if(this.id=="any_place") {
			$D.removeClass(root, "only_guest");
			$D.removeClass(root, "only_home")
		}	
	  	if (this.id == "this_champ") {
	  		$D.addClass(root, 'only_champ');
	  		if(this_champ_form[0].children.length) {
	  			$D.addClass(any_champ_form, "hidden");
	  			$D.removeClass(this_champ_form, "hidden");
	  		}
	  		
	  	}
		if (this.id == "any_champ") {
			$D.removeClass(root, 'only_champ');
	  		$D.removeClass(any_champ_form, "hidden");
	  		$D.addClass(this_champ_form, "hidden");
	  		$D.removeClass(any_champ_form, "hidden")
		}
		if(this.id=="cup") {
			$D.addClass(root, "only_group");
			$D.removeClass(root, "only_cup");
		}
		if(this.id=="group") {
			$D.addClass(root, "only_cup");
			$D.removeClass(root, "only_group");
		}
		if(this.id=="any_champ_type") {
			$D.removeClass(root, "only_group");
			$D.removeClass(root, "only_cup");
		}		
		buildChart({"own_chart1":$("own_chart1"),
			"own_chart2":$("own_chart2"),
			"joint_chart":$("joint_chart")});		
	}
		
	var showFormInfo = function (event) {
		
		var form_info = $("form_info");
		$D.removeClass(form_info, "hidden");
		form_info.innerHTML = $D.getAttribute(this, "title");
		$D.setAttribute(this, "title", "");
	}

	var hideFormInfo = function (event) {
		$D.setAttribute(this, "title", $("form_info").innerHTML);
		var form_info = $("form_info")
		$D.addClass(form_info, "hidden");
		form_info.innerHTML = "";
	}

	var swapMarker = function(marker, isMoar, isLess) {
		if(marker == 1 && isMoar.hasChildNodes())
			return;
		if(marker == 0 && isLess.hasChildNodes())
			return;
		if (isMoar.hasChildNodes()) {
			isLess.appendChild($D.getChildren(isMoar)[0]);
			return;
		}
		if (isLess.hasChildNodes()) {
			isMoar.appendChild($D.getChildren(isLess)[0]);
			return;		
		}	
	}

	var processMoreOrLess = function(event) {
		var selectedValue = parseFloat(this.options[this.selectedIndex].text);
		var table = this.parentNode;
		while(!$D.hasClass(table, "stattable_header"))
			table = table.parentNode;
		table = $D.getNextSibling(table);
		var chart = table.parentNode;
		chart = $D.getNextSibling(chart);
		var tr_list = $D.getChildren($D.getChildren($D.getChildren(table)[0])[0]);
		var more = 0;
		var less = 0;
		changeElements(function(el) {
			var total = parseInt($D.getChildren(el)[0].innerHTML);
			var isMore = $D.getChildren(el)[1];
			var isLess = $D.getChildren(el)[2];;
			if(total < selectedValue) {
				less++;
				swapMarker(0, isMore, isLess);
			}	
			else {
				more++;
				swapMarker(1, isMore, isLess);
			}		
		}, tr_list);
		buildChart({"more_or_less_chart": chart}, {"more": more, "less": less});
	}

	var showGameBlock = function(event, menuItem) {
		if(event === null)
			targetMenuItem = menuItem;
		else {
			targetMenuItem = this;
			$E.stopEvent(event);
		}
		$D.removeClass($D.getElementsByClassName('left_menu_item'), "activelink")
		$D.addClass(targetMenuItem, "activelink")
		var game_block = $D.getElementsByClassName('game_block');
		$D.addClass(game_block, "hidden");
		changeElements(function(el) {
			if(el.id == targetMenuItem.id) {
				if(targetMenuItem.id == 'team_info' || targetMenuItem.id == 'more_or_less') {
					$D.addClass($('current_champ_mode_div'), "hidden");
				} else {
					$D.removeClass($("form"), "hidden");
					$D.removeClass($('current_champ_mode_div'), "hidden");
					if (targetMenuItem.id == "joint")
						$D.addClass($('current_champ_mode_div_ext'), "hidden");
					else
						$D.removeClass($('current_champ_mode_div_ext'), "hidden");
				}
				$D.getChildren(el)[0].appendChild($("current_champ_mode_div"));
				$D.removeClass(el, "hidden");
			}		
		},game_block);
	}
	
	var processLongResult = function(event) {	
		var result = $D.getElementsByClassName("short_result", "span", this.parentNode);  
		var long_result = $D.getElementsByClassName("long_result", "span", this.parentNode);
		$D.addClass(result, "hidden");
		$D.removeClass(long_result, "hidden");
		$D.addClass(this, "hidden");		
	}

	var getGoogleUrl = function(scores, sum) {
		var colors = {"win":"FFCD00", "lose":"006633", "draw":"AAAAAA"};
		var google_url1 = "http://chart.apis.google.com/chart?cht=p&chco="
		var google_url2 = "&chd=t:";
		if(scores["win"] || scores["lose"] || scores["draw"]) {
			google_url1 += colors["win"] + "|" + colors["lose"] + "|" + colors["draw"];
			google_url2 += Math.round(100 * (scores["win"] / sum)) + "," +
				Math.round(100 * (scores["lose"] / sum)) + "," +
				Math.round(100 * (scores["draw"] / sum));
		} else {
			google_url1 += colors["win"] + "|" + colors["lose"] ;
			google_url2 += Math.round(100 * (scores["more"] / sum)) + "," +
				Math.round(100 * (scores["less"] / sum)) ;			
		}	
		return google_url1 + google_url2 + "&chs=100x100";		
	}

	var getScores = function(team_table, scores) {
		var team_table = $D.getElementsByClassName("stattable_body", "table", team_table)[0];			
		var wrapper = team_table.parentNode;
		wrapper = wrapper.parentNode.parentNode;
		team_table = $D.getChildren(team_table)[0];
		team_table = $D.getChildren(team_table);
		var flag = true;
		changeElements(function(el) {		
			if($D.getStyle(el, "display") != "none") {
				flag = false;
				for(var result in scores) 
					if($D.hasClass(el, result)) {
						scores[result]++;							
						break;
					}
			}	
		}, team_table);
		if(flag) {
			$D.addClass(wrapper, "hidden");;
		}	
		else {
			$D.removeClass(wrapper, "hidden");
		}				
		return scores;
	}

	var getScoresSum = function(scores) {
		var sum = 0;
		for(var index in scores) 
			sum += scores[index];
		return sum;
	}
	
	var buildChartLegend = function(chart_legend, scores, sum) {
		var target_scores = [];
		if($D.hasClass(chart_legend, "more_or_less_legend")) {
			var target_scores = ["more", "less"];
			var target_scores_for_boxes = ["more", "less"];
		}
		else {
			var target_scores = ["win", "lose", "draw"];
			var target_scores_for_boxes = ["win_own", "lose_own", "draw"];
		}
		for(var result = 0; result < target_scores.length; result++) {
			var legendText = $D.getElementsByClassName("team_color_box_"+target_scores_for_boxes[result], "div", chart_legend)[0];
			legendText = $D.getNextSibling(legendText);
			legendText = $D.getChildren(legendText)[0];
			legendText.innerHTML =  scores[target_scores[result]] + 
				" (" + Math.round(100 * (scores[target_scores[result]] / sum)) + "%)";				
		}	
	}

	var buildChart = function(charts, precalcValues) {
		var chart_list = [];
		for(chart in charts) 
			chart_list.push(charts[chart]);
		changeElements(function(el){
			var scores = {"win": 0, "lose": 0, "draw": 0, "more": 0, "less": 0};
			var chart_src = $D.getElementsByClassName("chart_src", "div", el);
			chart_src = chart_src[0];
			var chart_legend = $D.getElementsByClassName("chart_legend", "div", el);
			chart_legend = chart_legend[0];
			if(precalcValues !== undefined) {
				for(result in precalcValues) {
					if(result in scores)
						scores[result] = precalcValues[result];
				}
			} else
				if(el !== null)
					getScores(el.parentNode, scores);
			var sum = getScoresSum(scores)
			if(sum == 0) {
				$D.addClass(el, "hidden");
				return;
			} else {
				$D.removeClass(el, "hidden");
				if((el.id != "more_or_less_chart1") && (el.id != "more_or_less_chart2"))
					$D.removeClass($("form"), "hidden");
				buildChartLegend(chart_legend, scores, sum);				
				$D.setStyle(chart_src, "background-image", "url(" + getGoogleUrl(scores, sum) + ")");								
			}					
		}, chart_list);		
	}
	
	/**
	 * FrameUtil object initiator
	 */
	var init = function(){
		GP.util.Event.addListener("FrameScript exec", frameScriptExecutor)
	}
	
	return {init:init};
})()

