//
// Speichert Quelleninfos
//
function Quelle(quellname, kuerzel, imgName, quelllabel, selected, imgPath,
	queryUrlPrefix, queryUrlParams)
{
	this.imgUnchecked = 'checkbox_unchecked.jpg';
	this.quellname = quellname;
	this.tagId = "qm" + this.quellname;
	this.kuerzel = kuerzel;
	this.quelllabel = quelllabel;
	this.tooltip = quelllabel;
	this.selected = selected;
	this.imgPath = imgPath;
	this.imgName = imgName;
	
	this.containerId = "wi" + this.quellname + "Result";
	this.queryUrlPrefix = (typeof queryUrlPrefix == "undefined") ? null : queryUrlPrefix;
	this.queryUrlParams = (typeof queryUrlParams == "undefined") ? null : queryUrlParams;
	
	this.children = $A();
	this.parent = null;
	
	
	this.addChild = function addChild(child)
	{
		this.children[this.children.size()] = child;
		child.setParent(this);
	};

	this.getChildren = function getChildren()
	{
		return this.children;
	};
	
	this.getParent = function getParent()
	{
		return this.parent;
	};

	this.setParent = function setParent(parent)
	{
		this.parent = parent;
	};
	
	this.queryIfSelected = function queryIfSelected()
	{
		if (this.selected || this.children.size() <= 0)
			this.setVisible(this.selected, false);
		else
		{
			var childKuerzel = '';
			this.children.each(function(child) {
				if (child.getSelected())
				{
					if (childKuerzel.length > 0)
						childKuerzel = childKuerzel + ",";
					childKuerzel = childKuerzel + child.getKuerzel();
				}
			});
			
			this.setVisible(childKuerzel.length > 0, false);
		}
	};
	
	this.setVisible = function setVisible(visible, useEffect)
	{
		// Kinder rekursiv (un)sichtbar machen:
		this.children.each(function(child) {
			child.setVisible(visible, useEffect);
		});
		
		// Kennt diese Quelle einen Container, den sie (unsichtbar) machen und evtl. mit Artikeln bestücken soll?
		if (this.containerId == null)
			return;
			
		var myContainer = $(this.containerId);
		if (myContainer == null)
			return;
	
		if (visible)
		{
			// Inneren Aktenreiter und Throbber (für Container ohne Ajax) sichtbar machen
			var elem = $(this.containerId + "Working"); 
			if (elem != null)
				elem.show();
				
			// Äußeren Aktenreiter (wieder) sichtbar machen
			elem = $("wiCoTabLabel" + this.quellname);
			if (elem != null)
				elem.show();
			
			// Container (wieder) sichtbar machen
			if (useEffect)
				Effect.Appear(this.containerId, {duration: 0.5});
			else
				myContainer.show();
		
			if (this.queryUrlPrefix != null)
			{
				// Falls noch nicht geschehen Artikel suchen
				var unloadedMarkers = null;
				if (this.containerId != null)
					unloadedMarkers = $$("#" + this.containerId + " .wiSourceUnloaded");
				
				if (unloadedMarkers.length >= 1)
				{
					unloadedMarkers[0].removeClassName('wiSourceUnloaded');

					// Quellenauswahl anpassen, wenn überhaupt Quellen angegeben waren:					
					if (this.queryUrlParams.quellen)
						this.queryUrlParams.quellen = qm.getSelectedQuellen();
						
					if (typeof(wiSuchenLaufend) != 'undefined' && wiSuchenLaufend &&
					    (!queryUrlParams.ignoreNoHits || queryUrlParams.ignoreNoHits == null))
						wiSuchenLaufend.set(this.quellname, true);

					//alert("Container " + this.quelllabel + " wird geladen von '" + this.queryUrlPrefix + Object.toQueryString(this.queryUrlParams) + "'...");
					new Ajax.Updater(this.containerId, 
									 this.queryUrlPrefix + Object.toQueryString(this.queryUrlParams),
						     		 {asynchronous: true, evalScripts: true, method: 'get', encoding: 'utf-8'});
				}
			}
			else
			{
				var throbbers = null;
				if (this.containerId != null)
					throbbers = $$("#" + this.containerId + " .wiWorkingArtikelsuche");
				
				if (throbbers.length >= 1)
					throbbers[0].hide();
			}
		}		
		else
		{
			// Container (wieder) verstecken
			
			if (useEffect)
				Effect.Fade(this.containerId, {duration: 0.5});
			else
				myContainer.hide();
				
			// Äußeren Aktenreiter (wieder) verstecken
			elem = $("wiCoTabLabel" + this.quellname);
			if (elem != null)
				elem.hide();
				
		}
	};

	this.getSelected = function getSelected()
	{
		return this.selected;
	};

	this.setSelected = function setSelected(aval)
	{
		this.selected = aval;
	};

	this.getName = function getName()
	{
		return this.quellname;
	};

	this.getLabel = function getLabel()
	{
		return this.quelllabel;
	};

	this.getTooltip = function getTooltip()
	{
		return this.tooltip;
	};

	this.setTooltip = function setTooltip(newTooltip)
	{
		this.tooltip = newTooltip;
	};

	this.writeLabel = function writeLabel()
	{
		var buf = '<a href="#" title="' + this.tooltip + '" onclick="qm.click(\'' + this.kuerzel + '\'); return false;">';
		buf = buf + this.quelllabel;
		buf = buf + '</a>';
	
		document.write(buf);
	};

	this.getKuerzel = function getKuerzel()
	{
		return this.kuerzel;
	};

	this.getImage = function getImage()
	{
		var val = '';

        val = this.imgName;

		return val.toLowerCase();
	};

    this.getCheckboxImage = function getCheckboxImage()
    {
        var val = '';

        if (this.selected)
            val = 'checkbox_checked.jpg';
        else
            val = this.imgUnchecked;

        return val.toLowerCase();
    };

	/** (De)aktiviert eine Quelle (ändert das Icon); wirkt auch auf Kinder und Eltern */
	this.toggle = function toggle()
	{
		this.toggleTo(! this.selected);

		if (this.children.size() > 0)
		{
			// Alle Kinder an- oder abwählen:
			this.children.invoke('toggleTo', this.selected);
		}
		else if (this.parent != null && this.parent.getChildren().size() > 0)
		{
			// Den Elter ändern, wenn alle Kinder den selben Status haben:
			var allSelected = true;
			var allDeselected = true;

            for (var i = 0; i < this.parent.getChildren().length; i++)
            {
                var child = this.parent.getChildren()[i];

                if (child.getSelected())
                    allDeselected = false;
                else
                    allSelected = false;

                if (!allSelected && !allDeselected)
                    break;
            }

            if (this.parent.getSelected() && !allSelected)
                this.parent.toggleTo(false);
            else if (!this.parent.getSelected() && allSelected)
                this.parent.toggle();
		}
		
		this.setVisible(this.selected, true);
	};
	
	/** (De)aktiviert eine Quelle (ändert das Icon); wirkt NICHT auf Kinder und Eltern */
	this.toggleTo = function toggleTo(selectedValue)
	{
		this.selected = selectedValue;

		// img swappen
		var imgTag = document.getElementById(this.tagId);
		if (imgTag && imgTag != null)
			imgTag.src = this.imgPath + this.getCheckboxImage();
	};

	this.toString = function toString()
	{
		var buf = "";
        buf += '<img id="' + this.tagId + '" src="' + this.imgPath + this.getCheckboxImage() + '"';
        if (this.parent != null || this.kuerzel == 'BXDIC') //Wörterbuch extra behandeln, da nicht in +BX eingeordnet aber für den Nutzer soll es so aussehen 
            buf += ' style="margin-left: 9px;"';
        buf += ' width="18" height="18" alt="' + this.quelllabel;
        buf += '" title="' + this.tooltip;
        buf += '" onclick="qm.click(\'' + this.kuerzel + '\')" ';
        buf += '\/>';

		buf += '<img id="' + this.tagId + '" src="' + this.imgPath;
		buf += this.getImage() + '"';
        buf += ' style="margin-left: 9px;"';
		buf += ' width="18" height="18" alt="' + this.quelllabel;
		buf += '" title="' + this.tooltip + '"\/>';

		document.write(buf);
	};
}

// Fuer Quellenangelegenheiten
function QuellenManager()
{
	this.quellenByKuerzel = new Object();
	this.quellenByName = new Object();
	this.quellenliste = '';

	// hinzufuegen
	this.add = function add(quelle)
	{
		this.quellenByKuerzel[quelle.getKuerzel()] = quelle;
		this.quellenByName[quelle.getName()] = quelle;
	};

	// liefern
	this.getByKuerzel = function getByKuerzel(quellenkuerzel)
	{
		return this.quellenByKuerzel[quellenkuerzel];
	};

	this.get = function get(quellenkuerzel)
	{
		return this.getByKuerzel(quellenkuerzel);
	};

	this.getByName = function getByName(quellname)
	{
		return this.quellenByName[quellname];
	};

	// Icon der Quelle wurde geklickt
	this.click = function click(quellenkuerzel)
	{
		var quelle = this.quellenByKuerzel[quellenkuerzel];
		quelle.toggle();
	};

	this.trimComma = function trimComma(astring)
	{
		if(astring.indexOf(",") == 0)
		{
			astring = astring.substring(1, astring.length);
		}
		return astring;
	};

	// liefert eine Liste der ausgewaehlten Quellen-Kuerzel
	this.getSelectedQuellen = function getSelectedQuellen()
	{
		var kuerzel = '';
		
		for (var key in this.quellenByKuerzel)
		{
			var quelle = this.getByKuerzel(key);
			
			if (quelle.getParent() == null)  // Kinder hier überspringen
			{
				if (quelle.getSelected())
					kuerzel = kuerzel + ',' + quelle.getKuerzel();
				else if (quelle.getChildren().size() > 0)
				{
                    for (var i = 0; i < quelle.getChildren().length; i++)
                    {
                        var child = quelle.getChildren()[i];
                        if (child.getSelected())
                            kuerzel = kuerzel + ',' + child.getKuerzel();
                    }
				}
			}
		}
		return this.trimComma(kuerzel);
	};
	
	this.selectAll = function selectAll(selected)
	{
		for (var key in this.quellenByKuerzel)
		{
			var quelle = this.getByKuerzel(key);
			quelle.setSelected(selected);
		}
	};

	this.setQuellenliste = function setQuellenliste(alist)
	{
		this.quellenliste = alist;
	};

	this.update = function update()
	{
		var ql = "," + this.quellenliste + ",";
		
		for (var key in this.quellenByKuerzel)
		{
			var quelle = this.getByKuerzel(key);

			if (this.quellenliste == '')
			{
				quelle.setSelected(true);
			}
			else
			{
				if (ql.indexOf("," + quelle.getKuerzel() + ",") != -1)
					quelle.setSelected(true);
				else
					quelle.setSelected(false);
			}
		}
		
		// Wenn Eltern ausgewählt sind, auch die Kinder auswählen:
		for (var key in this.quellenByKuerzel)
		{
			var quelle = this.getByKuerzel(key);
			
			if (quelle.getSelected() && quelle.getChildren().size() > 0)
			{
				quelle.children.each(function(child) {
					child.setSelected(true);
				});
			}
		}
	};
}



//
//  Initialisierungen
//
var qm = new QuellenManager();

