/*
	Objekt: LED()
	
	Autor: J. Strübig

	Version 0.3 / Datum: 11:25 15.02.2009
	* Vererbung über prototype
	
	Version 0.2 / Datum: 11:24 14.02.2009
	
	Methoden:
	
	seText(string)
	charAt(top, left, char)
	print(string)

	stop()
	start()
	
	pause(millisekunden)
	up(anzahl)
	blink(anzahl)
	flash(anzahl)

*/
function LED(map) {

	// LED erbt von LED_Panel
	LED_Panel.call(this);
	
	this.speed = 100;

	this.blinkInterval = 350;
	this.blinkAmount = 3;

	this.scrollAmount = 1;
	this.scrollSpeed = 100;
	
	this.pause_ms = 500;
	
	// lokale var
	var text = '';
	var bitmap = map || LED_Chars;
	var columnPointer;
	var messageArray;
	var char_offset;

	var doScroll = false;
	var stop = false; // Flag um Aktionen stoppen zu können

	var _this = this;

	this.start = function() {
		if(!stop) return;
		doScroll = true;
		stop = true;
		scroll();
	};
	this.stop = function() {
		doScroll = false;
		stop = true;
	};
	var wait = function() {
		doScroll = !doScroll;
		stop = !stop;
		scroll();
	};
	var create = this.create; // Orginal sichern
	this.create = function(h, w, px, p)  {
		if(h && h < bitmap.length) h = bitmap.length;
		return create.call(this, h, w, px, p); // Orginal im Kontext aufrufen
	}
	this.setText = function(txt) {
		if(typeof txt == 'undefined' || !txt.length) return;
		this.stop();
		char_offset = parseInt(((this.height() - bitmap.length) / 2));
		
		text = txt.toUpperCase();
		messageArray = [];
		for (var i = 0; i < text.length; i++){
			var letter = LED_Chars.get(text.substr(i, 1));
			if(letter.length == 1) {
				// Sonderfunktionen.
				// Zahl in einer geschweiften Klammer dahinter, 
				// wird der zugehörigen Funktion übergeben
				var zahl = '';
				var k1 = text.indexOf('{', i) + 1;
				var k2 = text.indexOf('}', i);
				if(k1 && k1 - i == 2) { zahl = text.substring(k1, k2); i += k2 - k1 + 2;} 
				messageArray.push(letter + zahl); 
			} else  {
				// Das Bitmap-Array erzeugen
				for (var j = 0; j < letter.length; j++) messageArray.push(letter[j] << char_offset);
				
				messageArray.push(0);
			}
		}
		columnPointer = 0;
	};

	this.pause = function(c) {
		wait();
		window.setTimeout( function() {
					wait();
		}, c || this.pause_ms);
	};

	this.up = function(loop) {
		wait();
		var c = this.height();
		if(!loop) loop = this.scrollAmount;
		
		var scroll = function() {
			if(c--) {
				_this.scrollUp(true);
				window.setTimeout(scroll, _this.scrollSpeed);
			}
			else if(!stop) {
				if(--loop) {
					c = _this.height();
					window.setTimeout(scroll, _this.scrollSpeed);
				}
				else wait();
			}
		}
		window.setTimeout(scroll, this.scrollSpeed);
	};
	this.blink = function(c) {
		wait();
		var on = this.dots(true);
		if(!c) c = this.blinkAmount;
		c *= 2;
		var blink = function() {
			if(c--) {
				for(var i = 0; i < on.length; i++) on[i].toogle();
				window.setTimeout(blink, _this.blinkInterval);
			}
			else if(!stop) wait();
		}
		window.setTimeout(blink, this.blinkInterval);
	};
	this.flash = function(c) {
		wait();
		var on = this.dots(false);
		if(!c) c = this.blinkAmount;
		c *= 2;
		var blink = function() {
			if(c--) {
			for(var i = 0; i < on.length; i++) on[i].flash();
			window.setTimeout(blink, _this.blinkInterval);
			}
			else if(!stop)wait();
		}
		window.setTimeout(blink, this.blinkInterval);
	};
	this.charAt = function(t, l, c) {
		if(!t || t < 0) t = 0;
		if(!l || l < 0) l = 0;
		c = bitmap.get(c.toUpperCase());
		var off = char_offset - t;
		if(off < 0) off = 0;
		for(var i = 0; i < c.length; i++) {
			var tmp = c[i] << off;
			this.setByte(l + i, tmp);
			cursor++;
		}
		cursor++;
		if(cursor > this.width()) cursor = 0;
	};
	this.print = function(txt) {
		for(var i = 0; i < txt.length; i++) {
			this.charAt(0, cursor, txt.substr(i, 1));
		}
	};
	function scroll() {
		// Textausgabe
		var temp = messageArray[columnPointer++];
		if(columnPointer == messageArray.length) columnPointer = 0;
		if(isNaN(temp)) {
			// Sonderzeichen
			switch(temp.substr(0, 1)) {
				case '#': _this.blink(temp.substring(1)); break;
				case '^': _this.up(temp.substring(1)); break;
				case '_': _this.flash(temp.substring(1)); break;
				case '@': _this.pause(temp.substring(1)); break;
			}
		} else {
			_this.scrollLeft();
			_this.setByte(_this.width() - 1, temp);
		}
		// setTimeout verbrät weniger Resourcen als interval im FF 
		if(doScroll)window.setTimeout(scroll, _this.speed);
	}
}
LED.prototype = new LED_Panel;
LED.constructor = LED;
