﻿/// <reference path="jquery-vsdoc2.js" />

// This file adds depency functionality and adding of multiple languages to product search bar.
// When user user selects a product group (tuoteryhmä) some of 
// the other fields will have less options as some no longer apply.
//
// original author: Juhani

var logging = false;
var hasConsole = typeof console != "undefined" ? true : false;
var nextLanguageToShow = 1; // One is always shown

// Dependency options:
var DISABLED = -1;
var AJAX_DEPENDENCY = -2;
var CAT_SANAKIRJA_FI = 114;
var CAT_SANAKIRJA_EN = 211;
var CAT_KIELENTARKISTUS_FI = 116;
var CAT_KIELENTARKISTUS_EN = 213;
var CAT_KONEKAANTAMINEN_FI = 115;
var CAT_KONEKAANTAMINEN_EN = 212;
var CAT_KIELIOPPAAT_FI = 295;
var CAT_KIELIOPPAAT_EN = 297;
var CAT_SUOMI_FI = 81;
var CAT_SUOMI_EN = 204;
var CAT_ENGLANTI_FI = 80;
var CAT_ENGLANTI_EN = 184;
var CAT_INTERNETPALVELU_FI = 78;
var CAT_INTERNETPALVELU_EN = 174;
var CAT_WINDOWS_FI = 77;
var CAT_WINDOWS_EN = 176;
var CAT_YRITYKSENINTRANET_FI = 86;
var CAT_YRITYKSENINTRANET_EN = 177;

//       [] = show all options
//     [-1] = disable input
//     [-2] = get options by ajax (for languages only)
// [n, ...] = options (categories) to show only. Others will be hidden.
var dependencies = {
    sanakirja: {
        self: [CAT_SANAKIRJA_FI, CAT_SANAKIRJA_EN],
        kieli: [],
        ala: [],
        kayttoymparisto: [],
        kustantaja: [],
        kayttajamaara: []
    },
    kielentarkistus: { /* TODO: Get used languages as ajax */
        self: [CAT_KIELENTARKISTUS_FI, CAT_KIELENTARKISTUS_EN],
        kieli: [AJAX_DEPENDENCY],
        ala: [DISABLED],
        kayttoymparisto: [CAT_WINDOWS_FI, CAT_WINDOWS_EN, CAT_INTERNETPALVELU_FI, CAT_INTERNETPALVELU_EN, CAT_YRITYKSENINTRANET_FI, CAT_YRITYKSENINTRANET_EN],
        kustantaja: [DISABLED],
        kayttajamaara: []
    },
    konekaantaminen: {
        self: [CAT_KONEKAANTAMINEN_FI, CAT_KONEKAANTAMINEN_EN],
        kieli: [CAT_ENGLANTI_FI, CAT_ENGLANTI_EN, CAT_SUOMI_FI, CAT_SUOMI_EN],
        ala: [DISABLED],
        kayttoymparisto: [CAT_WINDOWS_FI, CAT_WINDOWS_EN, CAT_INTERNETPALVELU_FI, CAT_INTERNETPALVELU_EN, CAT_YRITYKSENINTRANET_FI, CAT_YRITYKSENINTRANET_EN],
        kustantaja: [DISABLED],
        kayttajamaara: []
    },
    kielioppaat: {
        self: [CAT_KIELIOPPAAT_FI, CAT_KIELIOPPAAT_EN],
        kieli: [AJAX_DEPENDENCY],
        ala: [],
        kayttoymparisto: [],
        kustantaja: [],
        kayttajamaara: []
        /* TODO: Get used languages as ajax */
    }
};

var optionCache = {
	kieli: [],
	ala: [],
	kayttoymparisto: [],
	kustantaja: [],
	kayttajamaara: []
}

$(document).ready(function() {
	fillCache();
//	if (logging) console.info("Setting up onChange event for tuoteryhmä select.");
	$("#product_search select.tuoteryhma").change(function() {
		resetOptions();
		processAllDependencies();
	});

//	if (logging) console.info("Applying rules for preloaded selected value");
	processAllDependencies();

//	if (logging) console.info("Setting up visibilities of languages and adding link.");
	setLanguagesVisibilities();

//	if (logging) console.info("Setting up onClick event for language links.");
	$("#product_search #add_language_link").click(function(event) {
		$("#product_search .language_row_" + nextLanguageToShow).attr("style", "display: table-row");
		$("#product_search .language_row_" + nextLanguageToShow + " select").show();
		
		nextLanguageToShow++;
		setAddLanguageLinkVisibility();
		return false;
	});

	$(document).unload(function() {
		optionCache = null;
		dependencies = null;
	});

	//Tyhjennä/Reset -namiska
	if (!$.browser.msie) {
		$("#search_resetor").bind("click", function() {
			$.post("/scripts/kielikone/ClearProductSearchSession.aspx", "");
				nextLanguageToShow = 1;
				$.post("/scripts/kielikone/ClearProductSearchSession.aspx", "");
				resetOptions();
				product_search_lang_rows_initialize();
				setDefaultOptions();
				processAllDependencies(); 
				setLanguagesVisibilities();
				$("#vapaa").val("");
		});
	}  
});

function setLanguagesVisibilities() {
	$("#product_search select[class^='kieli']").each(function() {
		var select = $(this);
		var name = select.attr("class");
		if (select.val() != "" && name != "kieli") {
			var tehnumber = parseInt(name.charAt(name.length - 1)) - 1;
			$("#product_search .language_row_" + tehnumber).attr("style", "display: table-row");

			if (tehnumber + 1 > nextLanguageToShow)
				nextLanguageToShow = tehnumber + 1;
		}
	});
	setAddLanguageLinkVisibility();
}

function setAddLanguageLinkVisibility() {
	if ($("#product_search .language_row_" + nextLanguageToShow).size() > 0)
		$("#more_languages_row").show();
	else
		$("#more_languages_row").hide();
}

function processAllDependencies() {
	var selected = parseInt($("#product_search select.tuoteryhma").val());
	if (selected) {
		processDependencies(dependencies.sanakirja, selected);
		processDependencies(dependencies.kielentarkistus, selected);
		processDependencies(dependencies.konekaantaminen, selected);
		processDependencies(dependencies.kielioppaat, selected);
	}
}

function processDependencies(depency, selectedCategory) {
	if (jQuery.inArray(selectedCategory, depency.self) >= 0) {
		processDependency("ala", depency.ala);
		processDependency("kayttoymparisto", depency.kayttoymparisto);
		processDependency("kustantaja", depency.kustantaja);
		processDependency("kayttajamaara", depency.kayttajamaara);
		processLanguageDependency("kieli", depency.kieli, selectedCategory);
	}
}

/*
    This method checks if options should be retrieved asynchronously (and does it). Either way it will then 
    launch the normal processing of dependencies for each language dropdown.
*/
function processLanguageDependency(inputName, visibles, selectedCategory) {
    if (visibles.length == 1 && visibles[0] == AJAX_DEPENDENCY) {
        $.ajax({
            url: "/scripts/kielikone/GetOptionsAsync.aspx",
            dataType: "json",
            data: { type: selectedCategory, target: inputName },
            success: processLanguages
        });
    } else {
        processLanguages(visibles);
    }
}

function processLanguages(options) {
    if (hasConsole) console.log(options);

    $("#product_search select[class^='kieli']").each(function () {
        var selectName = $(this).attr("class");
        //if(logging) console.info("found select with name: " + selectName);
        processDependency(selectName, options);
    });
}

function processDependency(inputName, visibles) {
	var select = $("#product_search select." + inputName);
	
	if (visibles.length == 1 && visibles[0] == DISABLED) {
		if(logging) console.debug("Disabled: " + inputName);
		select.attr("disabled", true);
		return;
	} else {
		select.removeAttr("disabled");

	    $("#product_search select." + inputName + " option").each(function() {
		    var node = $(this);
		    var option_id = parseInt(node.val())
		    setOptionVisibility(node, option_id, visibles);
	    });
	}
}

function setOptionVisibility(node, option_id, visibles) {
	if (visibles.length == 0 || !option_id || jQuery.inArray(option_id, visibles) >= 0)
		return;
	else {
		$(node).remove();
	}
}

function setDefaultOptions() {
	$("#product_search select option").each(function() {
		$(this).removeAttr("selected");
	});
	$("#product_search select option:first").each(function() {
		$(this).attr("selected", "selected");
	});
}

function resetOptions() {
//	console.info("Resetting values.")
	$("#product_search select").each(function() {
		$(this).removeAttr("disabled");
	});
	loadFromCache();
}

function loadFromCache() {
//	if(logging) console.info("Reloading options from cache");
	loadOptionsFromCache("ala", optionCache.ala);
	loadOptionsFromCache("kayttoymparisto", optionCache.kayttoymparisto);
	loadOptionsFromCache("kustantaja", optionCache.kustantaja);
	loadOptionsFromCache("kayttajamaara", optionCache.kayttajamaara);
	$("#product_search select[class^='kieli']").each(function() {
		loadOptionsFromCache($(this).attr("class"), optionCache.kieli);
	});
}

function loadOptionsFromCache(inputName, store) {
	var select = $("#product_search select." + inputName);
	select.html("");
	for (var i in store) {
		var cache = store[i];
		var optionNode = $(document.createElement("option"));
		optionNode.attr("value", cache.value);
		optionNode.text(cache.text);
		optionNode.appendTo(select);
	}
}

function fillCache() {
//	if(logging) console.info("Filling option cache");
	fillOptionsCache("ala", optionCache.ala);
	fillOptionsCache("kieli", optionCache.kieli);
	fillOptionsCache("kayttoymparisto", optionCache.kayttoymparisto);
	fillOptionsCache("kustantaja", optionCache.kustantaja);
	fillOptionsCache("kayttajamaara", optionCache.kayttajamaara);
}

function fillOptionsCache(inputName, store) {
	$("#product_search select." + inputName + " option").each(function() {
		var node = $(this);
		var cache = {
			value: node.val(),
			text: node.text()
		};
		store.push(cache);
	});
}
