(function($)
{
    $.log = function()
    {
	if( 'console' in window )
	{
	    console.log.apply(null, arguments);
	}
    };
}(jQuery));


function Pushing()
{

    var SELF = this;
    /**
     * By Hans Reisner, 02/2011
     */

    /**
     * NEEDED MEMBERS
     */
    //var ISIN;
    var TIMEOUTS;
    var BLINKERS;
    var FORMAT;
    var APPEND;
    //var IE_SWITCH;
    var PIPE;
    var OLDVALUE;
    //var INIT;

    //COLORS
    var COLOR_LESS;
    var COLOR_MORE;
    var COLOR_EQUAL;
    //var COLOR_BACKGROUND;

    //BUTTON-TEXT
    var ACTIVATED;
    var DEACTIVATED;

    var USERNAME;

    var CHANNELS;
    var STARTING;

    //TIMER
    var LAST;

    //APE
    var CLIENT = new APE.Client();

    //SWITCHER
    var IS_GOOD_STUFF;
    var AWAKE;
    var IS_QUOTES_LOADED;

    //LINKS
    var WAITING;
    var RECEIVING;
    var PUSHLIST;

    //CONSTANTS
    var TIMEOUT;
    var NAP;
    var DRAG;

    var DATE;
    var TIME;
    var DATE_TIME;
    var DECIMAL;
    var STRING;

    var TRENDLIST;

    var ANIMATION;
    var SHOW_CHANGES;

    var UPDATE;
    var BLINK;
    var FADE;
    var DO_NOTHING;

    var PUSH_BUTTON_ID;
    var PUSH_LIST_ID;
    var SMALL_LIST;

    /**
     * IMPLEMENTS FUNCTION FOR INCLUDING OTHER SCRIPTS
     */
    this.include = function(destination)
    {
	var e = window.document.createElement('script');
	e.setAttribute('src', destination);
	window.document.body.appendChild(e);
    }

    /**
     * IMPLEMENTS FUNCTION FOR PREPARING ALL NECCESARY OBJECTS:
     * BROWSERTEST, BUTTON-TEXT, BLINKING-FIELDS, FORMATTING-DEFINITIONS
     */
    this.prepare = function()
    {
	SELF.IS_GOOD_STUFF = jQuery.support.opacity;

	SELF.ANIMATION = SELF.BLINK;

	if(!SELF.IS_GOOD_STUFF)
	{
	    SELF.ANIMATION = SELF.BLINK;
	    //TIMEOUT = 5000;
	    //alert($.browser.msie+" => "+$.browser.version)
	}


	/*browser("opacity: "+jQuery.support.opacity);
	browser("boxModel: "+jQuery.support.boxModel);
	browser("changeBubbles: "+jQuery.support.changeBubbles);
	browser("cssFloat: "+jQuery.support.cssFloat);
	browser("hrefNormalized: "+jQuery.support.hrefNormalized);
	browser("htmlSerialize: "+jQuery.support.htmlSerialize);
	browser("leadingWhitespace: "+jQuery.support.leadingWhitespace);

	browser("noCloneEvent: "+jQuery.support.noCloneEvent);
	browser("scriptEval: "+jQuery.support.scriptEval);
	browser("style: "+jQuery.support.style);
	browser("submitBubbles: "+jQuery.support.submitBubbles);
	browser("tbody: "+jQuery.support.tbody);*/

	SELF.ACTIVATED = $('#'+SELF.PUSH_BUTTON_ID).attr("off");
	SELF.DEACTIVATED = $('#'+SELF.PUSH_BUTTON_ID).attr("on");

	SELF.debug("UI-Extensions available: "+SELF.IS_GOOD_STUFF);

	var blinkers = new Array();

	blinkers["i"] = SELF.DO_NOTHING;
	blinkers["N"] = SELF.DO_NOTHING;
	blinkers["S"] = SELF.DO_NOTHING;
	blinkers["g"] = SELF.DO_NOTHING;
	blinkers["P"] = SELF.BLINK;
	blinkers["p"] = SELF.BLINK;
	blinkers["t"] = SELF.UPDATE;
	blinkers["T"] = SELF.UPDATE;
	blinkers["b"] = SELF.BLINK;
	blinkers["a"] = SELF.BLINK;
	blinkers["j"] = SELF.BLINK;
	blinkers["J"] = SELF.BLINK;
	blinkers["o"] = SELF.BLINK;
	blinkers["h"] = SELF.BLINK;
	blinkers["l"] = SELF.BLINK;
	blinkers["c"] = SELF.UPDATE;

	for(var keyB in blinkers)
	{
	    if(!SELF.isDefined("BLINKERS"))
	    {
		SELF.BLINKERS[keyB] = blinkers[keyB];
	    }
	    else if(!SELF.BLINKERS[keyB])
	    {
		SELF.BLINKERS[keyB] = blinkers[keyB];
	    }
	}

	var format = new Array();

	format["i"] = SELF.STRING;
	format["N"] = SELF.STRING;
	format["S"] = SELF.STRING;
	format["P"] = SELF.DECIMAL;
	format["p"] = SELF.DECIMAL;
	format["t"] = SELF.TIME;
	format["T"] = SELF.TIME;
	format["b"] = SELF.DECIMAL;
	format["a"] = SELF.DECIMAL;
	format["j"] = SELF.DECIMAL;
	format["J"] = SELF.DECIMAL;
	format["c"] = SELF.DECIMAL;
	format["b"] = SELF.DECIMAL;
	format["l"] = SELF.DECIMAL;
	format["h"] = SELF.DECIMAL;
	format["o"] = SELF.DECIMAL;

	for(var keyF in format)
	{
	    if(!SELF.isDefined("FORMAT"))
	    {
		SELF.FORMAT[keyF] = format[keyF];
	    }
	    else if(!SELF.FORMAT[keyF])
	    {
		SELF.FORMAT[keyF] = format[keyF];
	    }
	}

	var append = new Array();

	append["i"] = "";
	append["N"] = "";
	append["S"] = "";
	append["P"] = "";
	append["p"] = "";
	append["t"] = "";
	append["T"] = "";
	append["b"] = "";
	append["a"] = "";
	append["j"] = "";
	append["J"] = "";
	append["c"] = "";

	for(var keyA in append)
	{
	    if(!SELF.isDefined("SELF.APPEND"))
	    {
		SELF.APPEND[keyA] = append[keyA];
	    }
	    else if(!SELF.APPEND[keyA])
	    {
		SELF.APPEND[keyA] = append[keyA];
	    }
	}

	if(!SELF.isDefined("SELF.TIMEOUT"))
	{
	    SELF.TIMEOUT = 3000;
	}

	/*if(!isDefined("IE_SWITCH"))
	{
	    IE_SWITCH = 5000;
	}*/

	if(!SELF.isDefined("SELF.NAP"))
	{
	    SELF.NAP = 120;
	}

	if(!SELF.isDefined("SELF.TRENDLIST"))
	{
	    SELF.TRENDLIST = false;
	}

	if($("#selectTimeout"))
	{
	    $("#selectTimeout").val(SELF.TIMEOUT);

	    $("#selectTimeout").change(function()
	    {
		SELF.TIMEOUT = Number($("#selectTimeout option:selected").val());
	    });
	}


	if($("#selectAnimation"))
	{
	    $("#selectAnimation").val(SELF.ANIMATION);

	    $("#selectAnimation").change(function()
	    {
		SELF.ANIMATION = Number($("#selectAnimation option:selected").val());
	    });
	}

	if($("#checkChanges"))
	{
	    $("#checkChanges").attr("checked", !SELF.SHOW_CHANGES);

	    $("#checkChanges").change(function()
	    {
		SELF.SHOW_CHANGES = !Boolean($("#checkChanges").attr("checked"));

	    });
	}

	$("#"+SELF.PUSH_LIST_ID).droppable(
	{
	    drop: function(event, ui)
	    {
		//if($("#pushButton").val() == DEACTIVATED)
		{
		    var length = $('tr', $("#"+SELF.PUSH_LIST_ID)).length;
		    var i = 1;

		    $('tr', $("#"+SELF.PUSH_LIST_ID)).each(function(column)
		    {
			if (i == length)// ($(this).attr("id") == "system_debug")
			{
			    var content = "";
			    $('td', $(this)).each(function(c)
			    {
				content += "<td></td>";
			    });

			    var stockId = $("#"+SELF.DRAG).attr("stockId");
			    var title = $("#"+SELF.DRAG).attr("title");
			    var isin = $("#"+SELF.DRAG).attr("drag");

			    //if(!CHANNELS.contains(isin+"_"+stockId))
			    {
				//CHANNELS += ","+isin+"_"+stockId
			    }

			    $("#"+SELF.DRAG).html("");
			    //alert("CLIENT LOAD DRAG");
			    SELF.CLIENT.load({'channel':'quote', 'isin':isin, 'stockId':stockId, 'title':title});

			    //uniPipeCreate(isin, stockId, title);

			}
			i++;
		    });
		}
	    }
	});

    }

    /**
     * IMPLEMENTS FUNCTION FOR CHECKING DEFINED VARIABLES
     */
    this.isDefined = function (defined)
    {
	return (typeof(window[defined]) == undefined) ?  false : true;
    }

    /**
     * IMPLEMENTS FUNCTION FOR FINDING DRAG-VALUES
     */
    this.prepareDrags = function ()
    {
	var rows = document.getElementsByTagName("div");

	for(var i = 0; i < rows.length; i++)
	{
	    if(rows[i].getAttribute("drag"))
	    {
		$("#"+rows[i].getAttribute("id")).draggable(
		{
		    drag: function(event, ui) {SELF.DRAG = $(this).attr("id")}
		});
	    }
	}
    }

    /**
     * IMPLEMENTS FUNCTION FOR FINDING CHANNELS
     */
    this.prepareChannels = function ()
    {	
	var rows = $('#'+SELF.PUSH_LIST_ID+' tbody').find('tr')//getElementsByTagName("tr");
	
	var stockIds = new Array();
	var isin = new Array();
	var channels = "";
	var j = 0;

	SELF.debug("Lade Liste...");

	for(var i = 0; i < rows.length; i++)
	{
	    isin[i] = rows[i].getAttribute("id");
	    stockIds[i] = rows[i].getAttribute("stockId")

	    if(isin[i] && stockIds[i])
	    {
		channels += isin[i]+"_"+stockIds[i]+",";
		j++;
		SELF.debug("Bereite "+isin[i]+" vor...");
	    }
	}
	SELF.CHANNELS = "";
	SELF.CHANNELS = channels.substring(0, channels.length-1);

	if(j < 5)
	{
	    SELF.SMALL_LIST = true;
	}
	SELF.debug("Fertig.");
    }

    /**
     * IMPLEMENTS FUNCTION FOR FINDING CHANNELS
     */
    this.isQuotesLoaded = function ()
    {
	var rows = document.getElementsByTagName("tr");

	for(var i = 0; i < rows.length; i++)
	{
	    var columns = rows[i].getElementsByTagName("div");

	    for(var j = 0; j < columns.length; j++)
	    {
		if(columns[j] != null && columns[j].getAttribute("id").length == 17)
		{
		    try
		    {
			if($("#"+columns[j].getAttribute("id")).html().indexOf(".gif") != -1)
			{
			    SELF.IS_QUOTES_LOADED = false;
			    return false;
			}
		    }
		    catch(err)
		    {
			alert(err);
		    }
		}
	    }
	}
	SELF.IS_QUOTES_LOADED = true;
	return true;
    }

    

    /**
     * IMPLEMENTS FUNCTION FOR STARTING _AFTER_ BROWSER IS READY
     */
    this.ready = function ()
    {
	window.addEvent('domready', function()
	{
	    //Let's save ressources, so stop pushing
	    //every NAP seconds if guest is sleeping

	    $.fn.nap.standbyTime = SELF.NAP;

	    var to = SELF.NAP;
	    SELF.setStandBy(to);
	    

	    $(this).everyTime(1000, 'controlled', function()
	    {
		if($('#'+SELF.PUSH_BUTTON_ID).val() == SELF.ACTIVATED)
		{
		    to -= 1;
		    SELF.setStandBy(to);
		}
		else
		{
		    to = SELF.NAP;
		}
	    });

	    $(window).mousemove(function()
	    {
	       to = SELF.NAP;
	    });
	    $(window).click(function()
	    {
	       to = SELF.NAP;
	    });
	    $(window).keypress(function()
	    {
	       to = SELF.NAP;
	    });



	    //Action after timeout of NAP
	    $(window).nap( function()
	    {
		SELF.change();
	    },
	    function()
	    {
	    });

	    //Start pushing...
	    SELF.start();
	});

	$(window).bind('beforeunload', function()
	{
	    if($('#'+SELF.PUSH_BUTTON_ID).val() == SELF.ACTIVATED)
	    {
		SELF.pushButton();
	    }
	});

	$(window).bind('unload', function()
	{
	    if($('#'+SELF.PUSH_BUTTON_ID).val() == SELF.ACTIVATED)
	    {
		SELF.pushButton();
	    }
	});
    }

    this.setStandBy = function (standBy)
    {
	var min = Math.floor(standBy/60);
	var sec = Math.floor(standBy%60);

	$('#standBy').html(SELF.number_format(min,0,",",".",2)+":"+SELF.number_format(sec,0,",",".", 2)+" min.");
    }

    this.prepareVars = function ()
    {
	SELF.OLDVALUE = new Array();
	SELF.TIMEOUTS = new Array();
	SELF.BLINKERS = new Array();
	SELF.FORMAT = new Array();

	if(SELF.APPEND == undefined)
	{
	    SELF.APPEND = new Array();
	}

	if(SELF.SMALL_LIST == null || SELF.SMALL_LIST == 'undefined')
	{
	    SELF.SMALL_LIST = false;
	}

	//COLORS
	SELF.COLOR_LESS = "#b60d0d";
	SELF.COLOR_MORE = "#008000";
	SELF.COLOR_EQUAL = "#605f95";//lightblue";

	//BUTTON-TEXT
	SELF.ACTIVATED = "";
	SELF.DEACTIVATED = "";

	SELF.CHANNELS = "";
	SELF.STARTING = 0;

	//TIMER
	SELF.LAST = new Date().getTime();

	//SWITCHER
	SELF.IS_GOOD_STUFF = false;
	SELF.AWAKE = true;
	SELF.IS_QUOTES_LOADED = false;

	//LINKS
	SELF.WAITING = IMAGES_URL+"Table/waiter.gif";
	SELF.RECEIVING = IMAGES_URL+"Table/waiter.gif";
	SELF.PUSHLIST = "http://www.boerse.neu/testfiles_for_classes/Push.php";

	SELF.DRAG = "";

	SELF.DATE = 0;
	SELF.TIME = 1;
	SELF.DATE_TIME = 2;
	SELF.DECIMAL = 3;
	SELF.STRING = 4;

	if(SELF.SHOW_CHANGES == null || SELF.SHOW_CHANGES == 'undefined')
	{
	    SELF.SHOW_CHANGES = false;
	}

	SELF.UPDATE = 0;
	SELF.BLINK = 1;
	SELF.FADE = 2;
	SELF.DO_NOTHING = 3;
    }

    /**
     * IMPLEMENTS FUNCTION FOR START PUSHING
     */
    this.start = function ()
    {
	SELF.prepareVars();
	SELF.prepare();
	SELF.prepareChannels();
	SELF.prepareDrags();

	//$.log(ACTIVATED);

	if($('#'+SELF.PUSH_BUTTON_ID) && $('#'+SELF.PUSH_BUTTON_ID).val() == SELF.ACTIVATED && SELF.ACTIVATED != undefined && SELF.DEACTIVATED != undefined)
	{
	    SELF.setRequest();
	}
    }

    /**
     * IMPLEMENTS FUNCTION FOR STARTING / RUNNING PUSH: MAIN FUNCTION
     */
    this.setRequest = function ()
    {
	SELF.debug("Sende Anfrage...");
	SELF.STARTING = 0;


	SELF.debug("Lade Pusher, bitte warten... <img src=\""+SELF.WAITING+"\" />");

	/**
	 * IMPLEMENTS FUNCTION FOR STARTING PUSH
	 */
	SELF.CLIENT = new APE.Client();

	SELF.CLIENT.load({'channel': '*starter'});

	SELF.CLIENT.addEvent('load', function(channel)
	{
	    var time = new Date().getTime().toString();
	    var random = Math.floor(Math.random()*100).toString();


	    SELF.USERNAME = time+""+random;
	    SELF.debug("Neuen User generiert: "+SELF.USERNAME);
	    

	    if(channel.options.channel == "*starter")
	    {
		this.core.start({'name': SELF.USERNAME})
	    }
	    else if(channel.options.channel == "quote")
	    {
		this.core.start({'name': time+""+random});
	    }
	    SELF.debug("Starte Session...");
	});


	/**
	 * IMPLEMENTS FUNCTION FOR RECEIVING SNAPSHOT
	 * ACTUALLY THERE'S NO NEED
	 */
	SELF.CLIENT.onRaw("Quotes", function(params)
	{
	    SELF.STARTING++;

	    if($('#'+SELF.PUSH_BUTTON_ID).val() == SELF.DEACTIVATED)
	    {
		SELF.push(params, "Quotes");
	    }
	});

	/**
	 * IMPLEMENTS FUNCTION FOR RECEIVING PUSH:
	 */
	SELF.CLIENT.onRaw('mailnotif', function(params)
	{
	    var time = new Date().getTime();
	    //var difference = Number(Number(time)-Number(SELF.LAST));

	    if(SELF.AWAKE)
	    {
		SELF.push(params, "mailnotif");
	    }
	});

	/**
	 * IMPLEMENTS FUNCTION FOR CREATING MULTIPIPE:
	 * LOADING SNAPSHOT AND BOOKING PUSH
	 */
	SELF.CLIENT.addEvent("multiPipeCreate", function(pipe, args)
	{
	    if(pipe.name == "*starter")
	    {
		SELF.debug("Erzeuge Kan&auml;le...");

		SELF.PIPE = pipe;
		var parts = SELF.CHANNELS.split(",");

		var json = new Object();

		for(var i = 0; i < parts.length; i++)
		{
		    var fields = parts[i].split("_");
		    json[SELF.trim(fields[0].toUpperCase())] = SELF.trim(fields[1]);

		    SELF.debug(SELF.trim(fields[0].toUpperCase())+" erzeugt...");
		}
		pipe.request.send('QuoteServer', json);

		SELF.debug("<img src=\""+SELF.WAITING+"\" /> Warte auf Daten...");
	    }
	});

	/**
	 * IMPLEMENTS FUNCTION FOR CREATING MULTIPIPE:
	 * LOADING SNAPSHOT AND BOOKING PUSH
	 */
	//CLIENT.addEvent("uniPipeCreate", this.uniPipeCreate);

	SELF.CLIENT.addEvent('userJoin', function(user, channel)
	{
	    if(channel.name == "quote")
	    {
		var pipe = this.core.getPipe(user.pubid);

		var json = new Object();

		var isin = channel.ape.options.isin.toUpperCase();
		var stockId = channel.ape.options.stockId.toUpperCase();
		var title = channel.ape.options.title;

		if(!SELF.CHANNELS.contains(isin+"_"+stockId))
		{
		    SELF.CHANNELS += ","+isin+"_"+stockId
		    //browser("Adding dataset ..."+isin+" ("+user.properties.name+"/"+user.properties.name.substring(0,1)+")");
		    json[SELF.trim(isin)] = SELF.trim(stockId);

		    pipe.request.send('QuoteServer', json);
		    SELF.debug("\""+SELF.trim(title)+"\" erzeugt...");
		}
	    }
	});

	SELF.CLIENT.addEvent('multiPipeDelete', function(pipe)
	{
	    if(pipe == "leave")
	    {
		var parts = SELF.CHANNELS.split(",");
		var json = new Object();

		for(var i = 0; i < parts.length; i++)
		{
		    var fields = parts[i].split("_");
		    json[SELF.trim(fields[0].toUpperCase())] = SELF.trim(fields[1]);
		}

		json['leave'] = 1;
		json['username'] = SELF.USERNAME;

		SELF.PIPE.request.send('QuoteServer', json);

		setTimeout(function()
		{
		    SELF.PIPE.request.send('QuoteServer', json);

		}, 100);

		if(this.core != null && this.core != "undefined")
		{
		    this.core.clearSession();
		}
	    }
	}, 0);

	SELF.debug("Fertig... <img src=\""+SELF.WAITING+"\" />");
	return true;
    }


    this.sleep = function snooze(sleeptime)
    {
	var sleeping = true;
	var now = new Date();
	var startingMSeconds = now.getTime();

	while(sleeping)
	{
	     if(new Date().getTime() - startingMSeconds > sleeptime)
	     {
		 sleeping = false;
	     }
	}
    }


    /**
     * IMPLEMENTS FUNCTION FOR WAITING: WON'T WORK THIS WAY, LET'S FIX LATER...
     */
    this.wait = function ()
    {
	SELF.isQuotesLoaded();
    }

    this.htmlentities = function (str)
    {
	return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
    }


    this.doAnimation = function (arr, parts, ani)
    {
	for(var key in arr)
	{
	    var isin = parts['i'];
	    var id = isin+"_"+key;

	    var value = parts[key];


	    if(SELF.FORMAT[key])
	    {
		if(SELF.FORMAT[key] == SELF.TIME)
		{
		    //value = $.format.date(value, "HH:mm:ss");
		    value = SELF.trim(value.substring(10));
		}
		else if(SELF.FORMAT[key] == SELF.DATE)
		{
		    value = $.format.date(value, "dd.MM.yyyy");
		}
		else if(SELF.FORMAT[key] ==SELF. DATE_TIME)
		{
		    value = $.format.date(value, "dd.MM.yyyy HH:mm:ss");
		}
		else if(SELF.FORMAT[key] == SELF.DECIMAL)
		{
		    value = SELF.number_format(value, 2, ".", "");
		}

		if(SELF.APPEND[key])
		{
		    value = value+SELF.APPEND[key];
		}
	    }
	    if(SELF.OLDVALUE[id] == 'undefined' || SELF.OLDVALUE[id] == undefined || SELF.OLDVALUE[id] == null)
	    {
		SELF.OLDVALUE[id] = $("#"+id+"_bg").html();

	    }
	    var oldValue = SELF.OLDVALUE[id];

	    var color = SELF.COLOR_EQUAL;

	    if(SELF.FORMAT[key] == SELF.DECIMAL)
	    {
		if(value*1 > oldValue*1)
		{
		    color = SELF.COLOR_MORE;
		}
		else if(value*1 < oldValue*1)
		{
		    color = SELF.COLOR_LESS;
		}
		else
		{
		    color = SELF.COLOR_EQUAL;
		}
	    }
	    else
	    {
		if(value > oldValue)
		{
		    color = SELF.COLOR_MORE;
		}
		else if(value < oldValue)
		{
		    color = SELF.COLOR_LESS;
		}
		else
		{
		    color = SELF.COLOR_EQUAL;
		}
	    }

	    SELF.OLDVALUE[id] = value;

	    if(SELF.FORMAT[key] == SELF.DECIMAL)
	    {
		value = SELF.number_format(value, 2, ",", ".");
	    }

	    if(color != SELF.COLOR_EQUAL || SELF.SHOW_CHANGES)
	    {
		SELF.animate(isin+"_"+key, color, value, ani, parts['c'], parts['p']);
	    }
	}
    }

    /**
     * IMPLEMENTS FUNCTION FOR PUSHING TEXT INTO FIELDS
     */
    this.push = function (params, worker)
    {
	var time = new Date().getTime();

	var parts = params.data;

	var lastUpdate = "";
	var company = "";
	var trend = "";

	var update = false;

	var add = false;
	/*
	if($("#"+parts["i"].toUpperCase()).length == 0)
	{
	    //var drag = DRAG.replace("drag", "");

	    //var rowId = $('#'+PUSH_LIST_ID+' tr:last').attr("id").toUpperCase();
	    //var stock = $('#'+PUSH_LIST_ID+' tr:last').attr("stockId");
	    //var content = $('#'+PUSH_LIST_ID+' tr:last').html();

	    //var row = "<tr id=\""+drag+"\" stockId=\""+stock+"\">"+content+"</tr>";
	    //var replacer = new RegExp(rowId, "g");
	    //var row2 = row.replace(replacer, drag.toUpperCase());

	    //$('#'+PUSH_LIST_ID+' tr:last').after(row2);

    //$("#pushList").trigger("addRow", row2);
	    //$('#'+PUSH_LIST_ID).trigger("update");
	    //$('#'+PUSH_LIST_ID).trigger("appendCache");
	    //tablesorter(true, 1, 0);

	    //$('#'+drag+'_N_bg').html(parts['N']);

	    for(var key1 in parts)
	    {
		if(parts[key1])
		{
		    var value1 = trim(parts[key1]).replace("&nbsp;", " ");

		    if(FORMAT[key1])
		    {
			if(FORMAT[key1] == TIME)
			{
			    value1 = $.format.date(value1, "HH:mm:ss");
			}
			else if(FORMAT[key1] == DATE)
			{
			    value1 = $.format.date(value1, "dd.MM.yyyy");
			}
			else if(FORMAT[key1] == DATE_TIME)
			{
			    value1 = $.format.date(value1, "dd.MM.yyyy HH:mm:ss");
			}
			else if(FORMAT[key1] == DECIMAL)
			{
			    value1 = number_format(value1, 2, ",", ".");
			}

			if(APPEND[key1])
			{
			    value1 = value1+APPEND[key1];
			}
		    }

		    color = COLOR_EQUAL;

		    if(value > oldValue)
		    {
			color = COLOR_MORE;
		    }
		    else if(value < oldValue)
		    {
			color = COLOR_LESS;
		    }
		    else
		    {
			color = COLOR_EQUAL;
		    }
		    //animate(drag+'_'+key1, color, value1);
		    //$('#'+drag+'_'+key1+'_bg').html(value1);

		}
	    }
	    //$("#pushList").trigger("update");
	    //$("#pushList").trigger("appendCache");
	    //tablesorter(true, 0, 0);
	    add = true;
	}*/

	if(!add)
	{
	    if(!SELF.IS_GOOD_STUFF && !SELF.SMALL_LIST)
	    {
		var modulo = 2;
		var ie = false;
		if($.browser.msie)
		{
		    ie = true;
		    var vers = $.browser.version;

		    if(vers == "8.0")
		    {
			modulo = 3;
		    }
		    else if(vers == "7.0")
		    {
			modulo = 3;
		    }
		    else if(vers == "6.0")
		    {
			modulo = 3;
		    }
		}

		if(new Date().getTime()%modulo == 0 || (SELF.SMALL_LIST && !ie))
		{
		    var arr = new Array();
		    arr['a'] = "a";
		    arr['b'] = "b";

		    SELF.doAnimation(arr, parts, SELF.BLINK)

		    var arr2 = new Array();
		    arr2['t'] = "t";
		    arr2['j'] = "j";
		    arr2['J'] = "J";
		    arr2['h'] = "h";
		    arr2['l'] = "l";
		    arr2['p'] = "p";

		    SELF.doAnimation(arr2, parts, SELF.UPDATE)
		}
		else
		{
		    return;
		}
	    }
	    else
	    {
		var close = parts["c"];
		var last = parts["p"];

		for(var key in parts)
		{
		    if(parts[key])
		    {
			var value = SELF.trim(parts[key]).replace("&nbsp;", " ");

			if(key == "t")
			{
			    lastUpdate = value;
			}
			else if(key == "N")
			{
			    company = value;
			}
			else if(key == "g")
			{
			    var symbol;
			    if(value == -1)
			    {
				symbol = "down";
			    }
			    else if(value == 1)
			    {
				symbol = "up";
			    }
			    else if(value == 0)
			    {
				symbol = "right";
			    }
			    //<!--"+value+"-->
			    value = "<!--"+value+"--><img src=\"http://images.boerse.neu/Symbole/"+symbol+".png\" style=\"text-align: center\"/>";
			}

			if(SELF.BLINKERS[key] == SELF.DO_NOTHING && !add && worker != "Quotes")
			{
			    continue;
			}

			var id = parts["i"].toUpperCase()+"_"+key;

			var difference = Number(Number(time)-Number(SELF.TIMEOUTS[id]));

			if(SELF.FORMAT[key])
			{
			    if(SELF.FORMAT[key] == SELF.TIME)
			    {
				value = $.format.date(value, "HH:mm:ss");
			    }
			    else if(SELF.FORMAT[key] == SELF.DATE)
			    {
				value = $.format.date(value, "dd.MM.yyyy");
			    }
			    else if(SELF.FORMAT[key] == SELF.DATE_TIME)
			    {
				value = $.format.date(value, "dd.MM.yyyy HH:mm:ss");
			    }
			    else if(SELF.FORMAT[key] == SELF.DECIMAL)
			    {
				value = SELF.number_format(value, 2, ".", "");
			    }

			    if(SELF.APPEND[key])
			    {
				value = value+SELF.APPEND[key];
			    }
			}

			if((key == "j" || key == "J") && !add && worker != "Quotes")
			{
			    //$("#"+id+"_bg").html(value);
			    //continue;
			}

			var color = "";

			if(worker == "Quotes" || (SELF.TIMEOUTS[id] && difference > Number(SELF.TIMEOUT)) || !SELF.TIMEOUTS[id])
			{
			    if(worker != "Quotes")
			    {
				SELF.TIMEOUTS[id] = time;

				if(SELF.OLDVALUE[id] == 'undefined' || SELF.OLDVALUE[id] == undefined || SELF.OLDVALUE[id] == null)
				{
				    SELF.OLDVALUE[id] = $("#"+id+"_bg").html();
				    continue;
				}
				var oldValue = SELF.OLDVALUE[id];

				color = SELF.COLOR_EQUAL;

				if(SELF.FORMAT[key] == SELF.DECIMAL)
				{
				    if(value*1 > oldValue*1)
				    {
					color = SELF.COLOR_MORE;
				    }
				    else if(value*1 < oldValue*1)
				    {
					color = SELF.COLOR_LESS;
				    }
				    else
				    {
					color = SELF.COLOR_EQUAL;
				    }
				}
				else
				{
				    if(value > oldValue)
				    {
					color = SELF.COLOR_MORE;
				    }
				    else if(value < oldValue)
				    {
					color = SELF.COLOR_LESS;
				    }
				    else
				    {
					color = SELF.COLOR_EQUAL;
				    }
				}

				SELF.OLDVALUE[id] = value;

				if(SELF.FORMAT[key] == SELF.DECIMAL)
				{
				    value = SELF.number_format(value, 2, ",", ".");
				}
			    }
			    else if(SELF.IS_GOOD_STUFF)
			    {
				color = SELF.COLOR_EQUAL
			    }

			    if(worker != "Quotes")
			    {
				if(SELF.IS_GOOD_STUFF && SELF.TIMEOUT > 1000)
				{
				    //debug("<img src=\""+WAITING+"\" /> Empfange...");// ("+$.format.date(lastUpdate, "HH:mm:ss")+") "+company+"...");
				    if(color != SELF.COLOR_EQUAL || SELF.SHOW_CHANGES)
				    {
					SELF.animate(id, color, value, SELF.ANIMATION, close, last);
					update = true;
				    }
				}
				else if(color != SELF.COLOR_EQUAL || SELF.SHOW_CHANGES)
				{
				    //debug("<img src=\""+WAITING+"\" /> Empfange..."+company);// ("+$.format.date(lastUpdate, "HH:mm:ss")+") "+company+"...");
				    SELF.animate(id, color, value, SELF.ANIMATION, close, last);
				    update = true;
				}
			    }
			    else if(worker == "Quotes")
			    {
				update = true;
				//$("#"+id+"_bg").html(value);
				SELF.animate(id, color, value, UPDATE, close, last);
			    }
			}
		    }
		}
	    }
	}

	if(update)
	{
	    //browser("Last received dataset: "+$.format.date(lastUpdate, "dd.MM.yyyy HH:mm:ss")+" ("+company+")");
	    //NOT GOOD IN COMBINATION WITH PUSHING
	    //$('#pushList').trigger("update");
	}

	if(add)
	{
	    //$('#'+PUSH_LIST_ID).trigger("update");
	    //$('#'+PUSH_LIST_ID).trigger("appendCache");
	    //tablesorter(true, 0, 0);
	}
    }

    /**
     * IMPLEMENTS FUNCTION FOR FORMATTING DECIMALS:
     */
    this.number_format = function (number, decimals, dec_point, thousands_sep, numbers)
    {
	if(number == null)
	{
	    return "";
	}

	var exponent = "";
	var numberstr = number.toString ();
	var eindex = numberstr.indexOf ("e");

	if (eindex > -1)
	{
	    exponent = numberstr.substring (eindex);
	    number = parseFloat (numberstr.substring (0, eindex));
	}

	if (decimals != null)
	{
	    var temp = Math.pow (10, decimals);
	    number = Math.round (number * temp) / temp;
	}

	var sign = number < 0 ? "-" : "";
	var integer = (number > 0 ? Math.floor (number) : Math.abs (Math.ceil (number))).toString ();

	var fractional = number.toString ().substring (integer.length + sign.length);
	dec_point = dec_point != null ? dec_point : ".";
	fractional = decimals != null && decimals > 0 || fractional.length > 1 ? (dec_point + fractional.substring (1)) : "";

	if (decimals != null && decimals > 0)
	{
	    for (var i = fractional.length - 1, z = decimals; i < z; ++i)
	    {
		fractional += "0";
	    }
	}

	thousands_sep = (thousands_sep != dec_point || fractional.length == 0) ? thousands_sep : null;

	if (thousands_sep != null && thousands_sep != "")
	{
	    for (i = integer.length - 3; i > 0; i -= 3)
	    {
		integer = integer.substring (0 , i) + thousands_sep + integer.substring (i);
	    }
	}

	if (numbers != null && numbers > 0)
	{
	    for(var x = integer.length; x < numbers; x++)
	    {
		integer = "0"+integer;
	    }
	}

	return sign + integer + fractional + exponent;
    }

    this.animate = function (id, color, value, animation, close, last)
    {
	SELF.debug("<img src=\""+SELF.WAITING+"\" /> Empfange Daten...");

	if(color != SELF.COLOR_EQUAL)
	{
	    
	    $("#"+id+"_bg").html(value)
	}

	var key = id.substring(id.length-1, id.length);

	var delay = SELF.TIMEOUT/2;
	var animate = SELF.TIMEOUT/2;

	if(animation == null)
	{
	    animation = SELF.ANIMATION;
	}

	if(animation == SELF.BLINK)
	{
	    delay = SELF.TIMEOUT;
	    animate = 0;
	}
	else if(animation == SELF.FADE)
	{
	    delay = SELF.TIMEOUT/2;
	    animate = SELF.TIMEOUT/2;
	}
	else if(animate == SELF.UPDATE)
	{
	    delay = SELF.TIMEOUT/2;
	    animate = SELF.TIMEOUT/2;
	}

	if(SELF.TIMEOUT == 0)
	{
	    animate = 300;
	    delay = 200;
	}

	var col = $("#"+id+"_bg").parent().css("color");
	var bgcol = $("#"+id+"_bg").parent().css("background-color");

	var temp = "";
	if(key == "j" || key == "J" || key == "p")
	{
	    var clazz = "";
	    if(last*1 < close*1)
	    {
		temp = SELF.COLOR_LESS;
		clazz = "red";
	    }
	    else if(last*1 > close*1)
	    {
		temp = SELF.COLOR_MORE;
		clazz = "green";
	    }
	    else
	    {
		temp = SELF.COLOR_EQUAL;
		clazz = "grey";
	    }

	    col = temp;
	}



	if(animation == SELF.UPDATE || SELF.BLINKERS[key] == SELF.UPDATE)
	{
	    $("#"+id+"_bg").css('font-weight', 'bold');

	    $("#"+id+"_bg").delay(delay).animate({color: col}, animation, function()
	    {
		$("#"+id+"_bg").css('font-weight', 'normal')

		$("#"+id+"_bg").animate({color: col}, 0);
	    });
	}
	else
	{

	    if(SELF.IS_GOOD_STUFF)
	    {
		$("#"+id+"_bg").animate({backgroundColor: color, color: "white"}, 0);
		$("#"+id+"_bg").delay(delay).animate({backgroundColor: bgcol, color: col}, animate);
	    }
	    else
	    {
		$("#"+id+"_bg").animate({backgroundColor: color, color: "white"}, 0);
		$("#"+id+"_bg").delay(delay).animate({backgroundColor: bgcol, color: col}, animate);
	    }


	    if(clazz != "")
	    {
		$("#"+id+"_bg").addClass(clazz);

	    }
	}

    }

    /**
     * IMPLEMENTS FUNCTION FOR TRIMMING TEXT
     */
    this.trim = function (str, chars)
    {
	return SELF.ltrim(SELF.rtrim(str, chars), chars);
    }

    /**
     * IMPLEMENTS FUNCTION FOR TRIMMING TEXT AT THE LEFT END
     */
    this.ltrim = function (str, chars)
    {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
    }

    /**
     * IMPLEMENTS FUNCTION FOR TRIMMING TEXT AT THE RIGHT END
     */
    this.rtrim = function (str, chars)
    {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
    }

    /**
     * IMPLEMENTS FUNCTION TO WRITE DEBUG-TEXTS
     */
    this.debug = function (text)
    {
	$("#debug").html(text);
    }

    /**
     * IMPLEMENTS FUNCTION TO WRITE BROWSER-FUNCTIONALITY
     */
    this.browser = function (text)
    {
	$("#browser").html(text);
    }

    this.activatePush = function ()
    {
	$('#'+SELF.PUSH_BUTTON_ID).val(SELF.ACTIVATED);

	SELF.start();
    }

    this.deactivatePush = function ()
    {
	$('#'+SELF.PUSH_BUTTON_ID).val(SELF.DEACTIVATED);
	$('#'+SELF.PUSH_LIST_ID).trigger("update");
	$('#'+SELF.PUSH_LIST_ID).trigger("appendCache");

	SELF.debug("Push gestoppt.")
	SELF.AWAKE = false;

	if(SELF.CLIENT != null && SELF.CLIENT != undefined && SELF.CLIENT.core != null && SELF.CLIENT.core != undefined)
	{
	    SELF.CLIENT.fireEvent("multiPipeDelete", "leave");
	}
    }


    /**
     * IMPLEMENTS FUNCTION FOR THE START-/STOP-BUTTON
     */
    this.pushButton = function ()
    {
	if($('#'+SELF.PUSH_BUTTON_ID).val() == SELF.ACTIVATED)
	{
	    SELF.deactivatePush();
	}
	else if($('#'+SELF.PUSH_BUTTON_ID).val() == SELF.DEACTIVATED)
	{
	    SELF.activatePush();
	}
    }

    /**
     * IMPLEMENTS FUNCTION FOR CHANGING THE RUNNING-STATE AUTOMATICALLY
     */
    this.change = function ()
    {
	if($('#'+SELF.PUSH_BUTTON_ID).val() == SELF.ACTIVATED)
	{
	    $('#'+SELF.PUSH_BUTTON_ID).val(SELF.DEACTIVATED);
	    $('#'+SELF.PUSH_LIST_ID).trigger("update");
	    $('#'+SELF.PUSH_LIST_ID).trigger("appendCache");

	    SELF.debug("Push gestoppt.")

	    SELF.AWAKE = false;
	    if(SELF.CLIENT != null && SELF.CLIENT != undefined && SELF.CLIENT.core != null && SELF.CLIENT.core != undefined)
	    {
		SELF.CLIENT.fireEvent("multiPipeDelete", "leave");
	    }
	    alert("Da Sie l"+unescape("%E4")+"nger als 15 Min. inaktiv waren, wurde der Realtime-Push automatisch gestoppt.\n\nMit nur einem Klick auf \""+SELF.DEACTIVATED+"\" k"+unescape("%F6")+"nnen Sie die Funktion reaktivieren.");
	}
    }
}

