/* --------------------------------------------------------------------------------
   Farbverlauf

   Autor: Dietmar Rabich
   Datei: farbverlauf.js

   Copyright (c) Dietmar Rabich, Duelmen.
   Alle Rechte vorbehalten.

   Diese Datei stammt von http://skripte.rabich.de/.

   Das Entfernen oder Veraendern dieser Informationen ist
   ohne ausdrueckliche Zustimmung des Autors nicht gestattet.

   Aenderungen:
   5.10.2003  Erstellung
-------------------------------------------------------------------------------- */

// Hexadezimalziffern
var	hex_digits	= ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];

// Vergleich fuer das Sortieren der Farben
function cmp(a, b)
{
	return a - b;
}

// Berechnen eines Verlaufs
function verlauf(start, ende, anzahl, typ)
{
	if(anzahl < 3)
		return null;

	var a = new Array();
	switch(typ)
	{
		case "linear":
			var i;
			for(i = 0; i < anzahl; i++)
				a[i] = Math.round(start + (ende - start) * i / (anzahl - 1));
			break;

		case "drittel1":
			var tanz = Math.floor(anzahl / 3) + 2;
			var lin = verlauf(start, ende, tanz, "linear");
			var i;
			for(i = 0; i < tanz; i++)
				a[i] = lin[i];
			for(i = tanz; i < anzahl; i++)
				a[i] = ende;
			break;

		case "drittel2":
			var tanz = Math.floor(anzahl / 3) + 2;
			var lin = verlauf(start, ende, tanz, "linear");
			var i;
			var g = Math.floor((anzahl - tanz) / 2);
			for(i = 0; i < g; i++)
				a[i] = start;
			for(i = g; i < g + tanz; i++)
				a[i] = lin[i - g];
			for(i = g + tanz; i < anzahl; i++)
				a[i] = ende;
			break

		case "drittel3":
			var tanz = Math.floor(anzahl / 3) + 2;
			var lin = verlauf(start, ende, tanz, "linear");
			var i;
			for(i = 0; i < anzahl - tanz; i++)
				a[i] = start;
			for(i = anzahl - tanz; i < anzahl; i++)
				a[i] = lin[i - anzahl + tanz];
			break;

		case "trigonometrisch":
			var i;
			for(i = 0; i < anzahl; i++)
				a[i] = Math.round(start + (ende - start) * ((Math.sin((-Math.PI / 2) + Math.PI * i / (anzahl - 1)) + 1) / 2));
			break;

		case "zufall":
			var i;
			for(i = 1; i < anzahl - 1; i++)
				a[i] = Math.round(start + (ende - start) * Math.random());
			a[0]	= start;
			a[anzahl - 1]	= ende;
			break;

		case "zufall_geordnet":
			var i;
			for(i = 1; i < anzahl - 1; i++)
				a[i] = Math.round(start + (ende - start) * Math.random());
			a[0]	= start;
			a[anzahl - 1]	= ende;
			if((typeof(a.sort) == "function") && (typeof(a.reverse) == "function"))
			{
				a.sort(cmp);
				if(start > ende)
					a.reverse();
			}
			break;
	}
	return a;
}

// Ermitteln des gewaehlten Radioknopfs
function get_radio_selected(r)
{
	var i;
	for(i = 0; i < r.length; i++)
		if(r[i].checked)
			return i;
	return null;
}

// Pruefen, ob Zeichenkette aus Hexadezimalziffern besteht
function is_hexdigits(s)
{
	var	i, j;
	var	found;
	for(i = 0; i < s.length; i++)
	{
		found	= false;
		for(j = 0; j < hex_digits.length; j++)
			if(s.substr(i, 1) == hex_digits[j])
				found	= true;
		if(!found)
			return false;
	}
	return true;
}

// Umrechnung in zweistellige Hexadezimalzahl
function hex(x)
{
	return isNaN(x) ? "00" : hex_digits[(x - x % 16) / 16] + hex_digits[x % 16];
}

// Berechnung der Farbwerte
function farbwerte_berechnen(f)
{
	var	farbwerte	= new Array();
	var	start_r	= parseInt(f.wert_start_rot.value);
	var	start_g	= parseInt(f.wert_start_gruen.value);
	var	start_b	= parseInt(f.wert_start_blau.value);
	var	ende_r	= parseInt(f.wert_ende_rot.value);
	var	ende_g	= parseInt(f.wert_ende_gruen.value);
	var	ende_b	= parseInt(f.wert_ende_blau.value);
	var	anzahl	= parseInt(f.anzahl_werte.value);
	if(isNaN(start_r))
	{
		start_r	= 0;
		f.wert_start_rot.value	= String(start_r);
	}
	if(isNaN(start_g))
	{
		start_g	= 0;
		f.wert_start_gruen.value	= String(start_g);
	}
	if(isNaN(start_b))
	{
		start_b	= 0;
		f.wert_start_blau.value	= String(start_b);
	}
	if(isNaN(ende_r))
	{
		ende_r	= 255;
		f.wert_ende_rot.value	= String(ende_r);
	}
	if(isNaN(ende_g))
	{
		ende_g	= 255;
		f.wert_ende_gruen.value	= String(ende_g);
	}
	if(isNaN(ende_b))
	{
		ende_b	= 255;
		f.wert_ende_blau.value	= String(ende_b);
	}
	if(isNaN(anzahl))
	{
		anzahl	= 10;
		f.anzahl_werte.value	= String(anzahl);
	}
	abgleich_hex(f.wert_start_rot, f.wert_start_gruen, f.wert_start_blau, f.wert_start_hex);
	abgleich_hex(f.wert_ende_rot, f.wert_ende_gruen, f.wert_ende_blau, f.wert_ende_hex);

	var	rgb_r	= verlauf(start_r, ende_r, anzahl, f.verlauf_rot[get_radio_selected(f.verlauf_rot)].value);
	var	rgb_g	= verlauf(start_g, ende_g, anzahl, f.verlauf_gruen[get_radio_selected(f.verlauf_gruen)].value);
	var	rgb_b	= verlauf(start_b, ende_b, anzahl, f.verlauf_blau[get_radio_selected(f.verlauf_blau)].value);

	var	ausgabe_fkt	= f.ausgabe[0].checked;
	for(i = 0; i < anzahl; i++)
		farbwerte[i]	= ausgabe_fkt ? ("rgb(" + rgb_r[i] + "," + rgb_g[i] + "," + rgb_b[i] + ")") : ("#" + hex(rgb_r[i]) + hex(rgb_g[i]) + hex(rgb_b[i]));

	return farbwerte;
}

// Generieren der Farbwerte und Darstellung
function generieren(f)
{
	var	fw	= farbwerte_berechnen(f);
	var	s	= "";
	for(i = 0; i < fw.length; i++)
		s	+= ((s == "") ? "" : "\n") + fw[i];

	f.farben.value	= s;
}

// Darstellung der Farbwerte in einem Fenster
function anzeigen(f)
{
	var	fw	= farbwerte_berechnen(f);
	var	wnd	= open("", "", "status=0,directories=0,toolbar=0,dependent,scrollbars,resizable,menubar=0,location=0,width=200,innerWidth=200,height=320,innerHeight=320");
	with(wnd.document)
	{
		open("text\/html");
		writeln("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		writeln("<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD XHTML 1.1\/\/EN\" \"http:\/\/www.w3.org\/TR\/xhtml11\/DTD\/xhtml11.dtd\">");
		writeln("<html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\" xml:lang=\"de\">");
		writeln("<head>");
		writeln("<title>Farbverlauf<\/title>");
		writeln("<meta http-equiv=\"CONTENT-TYPE\" content=\"text\/html; CHARSET=UTF-8\">");
		writeln("<meta http-equiv=\"CONTENT-SCRIPT-TYPE\" content=\"text\/javascript\">");
		writeln("<meta http-equiv=\"CONTENT-STYLE-TYPE\" content=\"text\/css\">");
		writeln("<style><!--");
		writeln("body {font-family: sans-serif;}");
		writeln("table {margin-left: auto; margin-right: auto; border-spacing: 1px; border: 1px solid; margin-bottom: 2px;}");
		writeln("--><\/style>");
		writeln("<\/head><body onload=\"self.focus()\"><div style=\"text-align: center;\"><table><tbody>");
		var	i;
		for(i = 0; i < fw.length; i++)
			writeln("<tr><td style=\"background-color: " + fw[i] + "; color: inherit;\"><div style=\"position: relative; width: 20px; height: 20px;\">&nbsp;<\/div><\/td><\/tr>");
		writeln("<\/tbody><\/table><form action=\"\" style=\"margin: 0;\">");
		var	s	= "";
		for(i = 0; i < fw.length; i++)
			s	+= ((s == "") ? "" : "\n") + fw[i];
		write("<textarea cols=\"16\" rows=\"8\">" + s + "<\/textarea>");
		writeln("<\/form><\/div><\/body><\/html>");
		close();
	}
}

// Hexadezimalzahl nach den Dezimalzahlen uebernehmen
function abgleich_nmb(hx, r, g, b)
{
	validate_hex(hx);
	r.value	= parseInt(hx.value.substr(1, 2), 16);
	g.value	= parseInt(hx.value.substr(3, 2), 16);
	b.value	= parseInt(hx.value.substr(5, 2), 16);
}

// Hexadezimalzahl pruefen
function validate_hex(el)
{
	if(!el.value || (el.value == "") || (el.value == "#"))
	{
		el.value	= "#" + hex(Math.floor(Math.random() * 256)) + hex(Math.floor(Math.random() * 256)) + hex(Math.floor(Math.random() * 256));
		return;
	}
	el.value	= el.value.toUpperCase();
	switch(el.value.length)
	{
		case 6:
			el.value	= "#" + el.value;
		case 7:
			if(is_hexdigits(el.value.substr(1)))
				return;
			break;
		case 3:
			el.value	= "#" + el.value;
		case 4:
			if(is_hexdigits(el.value.substr(1)))
			{
				el.value	= "#" + el.value.substr(1, 1) + el.value.substr(1, 1) + el.value.substr(2, 1) + el.value.substr(2, 1) + el.value.substr(3, 1) + el.value.substr(3, 1);
				return;
			}
			break;
		default:
			if(el.value.substr(0, 1) == "#")
			{
				el.value	= ((is_hexdigits(el.value) ? el.value : "") + "000000").substr(0, 7);
				return;
			}
	}
	el.value	= "#000000";
}

// Dezimalzahl nach Hexadezimalzahl uebernehmen
function abgleich_hex(r, g, b, hx)
{
	validate_nmb(r);
	validate_nmb(g);
	validate_nmb(b);
	var wert_r	= parseInt(r.value);
	var wert_g	= parseInt(g.value);
	var wert_b	= parseInt(b.value);
	hx.value	= "#" + hex(parseInt(r.value)) + hex(parseInt(g.value)) + hex(parseInt(b.value));
}

// Dezimalzahl pruefen
function validate_nmb(el, min, max)
{
	if(!el.value || (el.value == ""))
	{
		el.value	= "0";
		return;
	}
	if(!min || !max)
	{
		min	= 0;
		max	= 255;
	}
	var wert = parseInt(el.value);
	if(wert < min)
	{
		wert = min;
		el.value	= String(wert);
	}
	if(wert > max)
	{
		wert = max;
		el.value	= String(wert);
	}
}

// EOF