$(function(){
	if( $("div#porfolioLayer").length ){
		bindPositionsJson(".css_achievements", positionsWorking)
    }
});


function formSelectList(){
	//console.log('formSelectList() working');
	$('.css_portfolio_sort').remove();
	if( $('#idCategorySeoPortfolio').length ){
		$('#idCategorySeoPortfolio').html('');
	} else {
		$('<form action method="get" class="css_portfolio_sort" id="seoCategories"><h5>Категория:</h5>' +
			'<div class="css_select"><select id="idCategorySeoPortfolio"></select></div></form>').appendTo('.css_achievements');
	}
	
	var stringToAppend = '<option value="0">Все категории</option>';
	for(var category in ( se = $(".css_achievements").data('positions')[getCurrentSearchEngine()])){
		if( getProperties(se[category]).length >= 3 ){
			stringToAppend += '<option value="' + category + '">' + category + '</option>';
		}
	}
	delete se;
	$('#idCategorySeoPortfolio').append(stringToAppend).resetSS();
	$('#idCategorySeoPortfolio').getSetSSValue('0');
	addToJsSelect();
	$('#idCategorySeoPortfolio').bind('change', scrollToSelectedCategory);
}

function positionsWorking(workingSpace){
	formSelectList();
	showAllCategoriesPositions(getBestKeywordsPositions(3));
}


// Function returns the best keywords in each category
function getBestKeywordsPositions(numOfBest, positions, searchEngine){
	//delete positions['Без категории'];
	numOfBest = numOfBest ? numOfBest : 3; //Testing for the initialized numOfBest, setting default value
	//positions = positions ? positions[getCurrentSearchEngine()] : $('div#porfolioLayer').data('positions')[getCurrentSearchEngine()];
	searchEngine = searchEngine ? searchEngine : getCurrentSearchEngine();
	positions = $('.css_achievements').data('positions')[searchEngine];
	//console.log(positions);
	var result = {}; // Will contain object {category: array[numOfBest] = [{site, keyword, position}]}
	var worstPosition = 0; // Will contain the current worst position for category
	var worstPositionIndex = 0;
	resultSites = {}; // Will contain the object {category: array[numberOfBest] = [siteNames]}
	for(var category in positions){
		if(getProperties(positions[category]).length >= 3 ){
			result[category] = [];
			resultSites[category] = [];
			for(var site in positions[category]){
				for(var keyword in positions[category][site]){
					if(result[category].length >= numOfBest){
						worstPosition = 0;
						for(var i in result[category]){//Begin cycle to find what to delete or not to delete
							if(result[category][i].position > worstPosition){//If there is position worse than current worst position
								worstPosition = result[category][i].position;
								worstPositionIndex = i;
							}
						}
						//console.log(!($.inArray(site, resultSites[category]) > -1));
						if(positions[category][site][keyword].position < worstPosition && !(objectPropertyValueIndex(result[category], 'site', site) > -1)){ // If current keyword position less than worst position
							//console.log(getProperties(result[category]));
							//console.log(result[category][worstPositionIndex].keyword + " (" + result[category][worstPositionIndex].position +" replaced with " + keyword + " (" + positions[category][site][keyword].position);
							result[category][worstPositionIndex] = {site: site, keyword: keyword, position: positions[category][site][keyword].position, region: positions[category][site][keyword].region};
							resultSites[category][worstPositionIndex] = site;
						}
					} else {
						if(!($.inArray(site, resultSites[category]) > -1)){// If site is not already in result array
							result[category][result[category].length] = {site: site, keyword: keyword, position: positions[category][site][keyword].position};
							resultSites[category][resultSites[category].length] = site;
						} else if(positions[category][site][keyword].position < result[category][objectPropertyValueIndex(result[category], 'site', site)].position){
							// If site is already in result, but contains not the best it's position of keyword
							//console.log('changing ' + result[category][objectPropertyValueIndex(result[category], 'site', site)].keyword + ' (' + result[category][objectPropertyValueIndex(result[category], 'site', site)].position + ') on ' + keyword + ' (' + positions[category][site][keyword].position + ')');
							result[category][objectPropertyValueIndex(result[category], 'site', site)] = {site: site, keyword: keyword, position: positions[category][site][keyword].position, region: positions[category][site][keyword].region};
						}
					}
				}
				if( site == 'site001.ru' ){
					if( objectPropertyValueIndex(result[category], 'site', 'site001') == -1 ){
						result[category][0] = getBestPositionOfSite(positions[category][site]);
						result[category][0].site = site;
					}
				}
			}
		}
	}
	//console.log(result, resultSites);
	return result;
}

function objectPropertyValueIndex(arr, prop, value){ // Matches the first entering of value of setted property in array of objects
	for(var i in arr){
		if(arr[i][prop] == value){
			return +i;
		}
	}
	return -1;
}

function getBestPositionOfSite(site){
	var bestPosition = {keyword: 'keyword', position: 51, region: 0};
	for(keyword in site){
		if( site[keyword].position < bestPosition.position ){
			bestPosition = {keyword: keyword, position: site[keyword].position, region: site[keyword].region}
			if(bestPosition.position == 1){
				return bestPosition;
			}
		}
	}
	return bestPosition;
}

function getProperties(obj){
	var result = [];
	for(prop in obj){
		result[result.length] = prop;
	}
	return result;
}

function showAllCategoriesPositions(positions){
	$('div#porfolioLayer').html('');
	for(var category in positions){
		var stringToAppend = '<h4>' + category + '</h4>'
						   + '<table class="css_achievements_table">';
		for(var i in positions[category]){
			if (typeof(positions[category][i]) != 'object') continue;
			stringToAppend += '<tr><td class="first"></td><td class="css_achievements_project">&laquo;'
							+ '<a href="' + formSearchRequestURL(positions[category][i]) + '" class="seo_link" target="blank">' + positions[category][i].keyword + '</a>&raquo;' + '</td>'
							+ '<td style="width:75px;">позиция</td><td style="width:3px;">-</td>'
							+ '<td class="css_achievements_number"><span>' + positions[category][i].position + '</span></td>'
							+ '<td class="portfolio_site"><span>'
							+ positions[category][i].site + '</span></td><td class="last"></td></tr>'; 
		}
		stringToAppend += '</table>';
		$('div#porfolioLayer').append(stringToAppend);
		$('div#porfolioLayer table:last-child tr:even').addClass('css_achievements_line');
	}
}

function formSearchRequestURL(keyword){
	if(getCurrentSearchEngine() == 'yandex'){
		switch(keyword.region){
			case 'Санкт-Петербург': return "http://yandex.ru/yandsearch?text=" + keyword.keyword + '&lr=2';
				break;
			case 'Москва': return "http://yandex.ru/yandsearch?text=" + keyword.keyword + '&lr=213';
				break;
			default: return "http://yandex.ru/yandsearch?text=" + keyword.keyword;
		}
	}
	return "http://google.com/search?q=" + keyword.keyword
}

function getCurrentSearchEngine(){
	if($.inArray($('#portfolioMenu .css_active a').attr('rel'), ['yandex', 'google']) > -1){
		return $('#portfolioMenu .css_active a').attr('rel');
	}
	return false;
}

function scrollToSelectedCategory(){
	var currentCategoryIndex = $('#idCategorySeoPortfolio option:selected').index();
	//console.log( $('#idCategorySeoPortfolio option:selected'));
	//console.log(currentCategoryIndex);
	var $neededHeader = $('#porfolioLayer>h4:nth-child(' + (currentCategoryIndex * 2 - 1) + ')');
	$neededHeader.length ? window.scrollTo(0, $neededHeader.offset().top) : 0;
}

function bindPositionsJson(id, callback){
	$.getJSON('/positions.json', function(json){
		// Delete category 'Without thematics'
		for(se in json){
			delete json[se]['Без тематики'];
		}//////////////////////////////////
        $(id).data({positions: json});
		if(callback){callback()}
        });
}

function makePositionsArray(positions){
	var result = [];
	positions = $('.css_requests').data('positions');
	for(var SE in positions){
		for( var category in positions[SE]){
			for( var site in positions[SE][category]){
				for( var keyword in positions[SE][category][site]){
					result.push({keyword: keyword, se: SE, position: positions[SE][category][site][keyword].position});
				}
			}
		}
	}
	$('.css_requests').data('positions', result);
	if(result.length){
		fillRequests();
		scrollRequests();
	}
}
