    var users=[];

    //class
  	function user()
  	{
  	  	this.name="User";
  	  	this.bills=[];

  	  	this.total= function()
  	  	{
  	  	  	var sum=0;
  	  	  	for (var i=0;i<this.bills.length;i++)
  	  	  	{
  	  	  	  	sum+=this.bills[i].amount;
  	  	  	}
  	  	  	return sum;
  	  	}

  	  	this.addBill=function(b)
  	  	{
  	  	  	this.bills[this.bills.length]=b;
  	  	}
  	}

  	//class
  	function bill()
  	{
  	  	this.amount=0;
  	  	this.desc="Rechnung";
  	}

  	
  	function attachUserSubmit()
  	{
  		$jq("#eventDetails").submit(function(e) { 
	  		 
	  	    // get user input 
	  	    var userName = $jq("#userName").val(); 
	  	    var billAmount = $jq("#billAmount").val();
	  	    
		  	clearErrMsg('userError');
			clearErrMsg('amountError');

	  	    //check if username already exists
	  	    var exists=false
	  	    for (var i=0;i<users.length;i++)
	  	    {
		  	    if (userName==users[i].name)
		  	    {
			  	    exists=true;
		  	    }
	  	    }

	  	    if ((!exists) && (userName!=''))
	  	    {
	  	    	if (billAmount=='')
	  	    	{
	  	    		billAmount=0;
	  	    	}
	  	    	
			  	if (billAmount==parseFloat(billAmount))
			  	{
				  	billAmount=parseFloat(billAmount);
				  	
			  	    // do something with the answer 
			  	    var u=addUser(userName);
		
				  	if (billAmount>=0)
				  	{
				  	    b=new bill();
				  	    b.amount=billAmount;
				  	    u.addBill(b);
				  	}
				  	$jq('#userName').val('');
				  	$jq('#billAmount').val('');
				  	$('userName').focus();
		  	 
			  	    // close the overlay 
			  	    //triggers.eq(0).overlay().close(); 
				  	
		        	recalc();
		        	renderUsers();
			  	} else {
			  		errMsg('amountError',' fehlerhaft - bitte evtl. Punkt statt Komma verwenden');
			  	}
	  	    } else {
	  	    	if (userName=='')
	  	    	{
			  		errMsg('userError',' fehlt!');
	  	    	} else {
	  	    		errMsg('userError'," gibt's doch schon!");
	  	    	}
	  	    }
	  	    // do not submit the form 
		  	return e.preventDefault(); 
	  	});
    }

  	function errMsg(errField,msg)
  	{
  	  $jq('#'+errField).html(msg);
  	  $jq('#'+errField).show();
  	}
  	
  	function clearErrMsg(errField)
  	{
  	  $jq('#'+errField).html('');
  	  $jq('#'+errField).hide();
  	}
  	
    function addUser(name)
    {
        var u=new user();
        u.name=name;
        users[users.length]=u;
        return u;
    }

    function delUser(delIndex)
    {
    	var i=-1;
    	users = jQuery.grep(users, function(u) {
    		i++;
    		return i != delIndex;
    	});
    	recalc();
    	renderUsers();
    }

    function changeAmount(changeIndex)
    {
      var oldAmt=users[changeIndex].total();
      var newAmt=prompt("Alter Betrag für " + users[changeIndex].name + " war " + oldAmt + ". Was soll's statt dessen werden?",oldAmt);
	  if (newAmt==parseFloat(newAmt))
	  {
	  	newAmt=parseFloat(newAmt);
	  	if (users[changeIndex].bills.length==0)
	  	{
	  		var b=new bill();
	  		users[changeIndex].addBill(b);
	  	} 
	  	users[changeIndex].bills[0].amount=newAmt;
	  	users[changeIndex].bills[0].amount=newAmt;
	  	recalc();
	  	renderUsers();
  	  }
    }
    
    function addUserWithBill(name, billAmount)
    {
        var u=addUser(name);
        var b=new bill();
        b.amount=billAmount;
        u.addBill(b);
    }
    
    function testInit()
    {
        addUserWithBill("Andi",150);
        addUserWithBill("Benno",200);
        addUser("Charlie");
        addUser("Detlev");
        addUserWithBill("Emil",150);
        addUserWithBill("Felix",100);
        addUserWithBill("Guillaume",100);
    }
    
    function testInit2()
    {
        addUserWithBill("Ich bekomm 50",150);
        addUserWithBill("Ich bekomm 100",200);
        addUser("Ich zahl 100");
        addUser("Ich zahl 2x50");
        addUserWithBill("Ich bekomm auch 50",150);
        addUserWithBill("Ich zahl nix",100);
        addUserWithBill("Ich zahl auch nix",100);
    }
    
    function renderUsers()
    {
        $jq('#users').html('');
        if (users.length==0)
        {
            $jq('#users').append('<div class="username"> <span class="name">Noch keine Teilnehmer</span> </div>');
            $jq('#users').append('<div class="clearer"></div>');
        }
        
        for (var i=0;i<users.length;i++)
        {
            $jq('#users').append('<div class="username"> <span class="name">' + users[i].name + '</span> <span class="amount1" onclick="changeAmount(' + i + ')">' + users[i].total() + ' €</span> <span class="delete" onclick="delUser(' + i + ')">X</span> </div>');
            $jq('#users').append('<div class="clearer"></div>');
        }
    }

    function Numsort (a, b) { return a - b; }

    function r2(num) { return Math.round(num*100)/100 }
    function ar2(num) { return Math.abs(r2(num)) }
    
    function addTrx(from, amount, to)
    {
	  //$jq('#transactions').append('<span class="p1">' + from + ' </span>' + '<span class="amount2">' + amount + ' €</span> <em class="to">&rarr;</em> <span class="p2">' + to + '</span><br />');
	  $jq('#transactions').append('<tr><td class="p1">' + from + ' </td><td class="amount2">' + amount + ' €</td><td><em class="to">&rarr;</em></td><td class="p2">' + to + '</td></tr>');
    }
    
    function recalc()
    {
        var amounts={}
        var overallTotal=0;
        var userCount=users.length;
        for (var i=0;i<users.length;i++)
        {
            overallTotal+=users[i].total();
            amounts[users[i].name]=users[i].total();
        }
        if (userCount>0)
        {
        	toPayPerUser=overallTotal/userCount;
        } else {
        	toPayPerUser=0;
        }
        
        $jq.each(amounts, function(key,val)
		{
    		amounts[key]=val-toPayPerUser;
		});

        $jq('#results').html('');
        
        $jq('#results').append('Gesamtbetrag: ' + ar2(overallTotal) + ' €<br />');
		$jq('#results').append('Nasen: ' + userCount + '<br />');
		$jq('#results').append('Kosten pro Nase: ' + ar2(toPayPerUser) + ' €<br />');


		var maxLoops=users.length
		var loopcount=0;
		var finished=false;
		var trx={};

        $jq('#transactions').html('');
		while (!finished)
		{
			if (loopcount>maxLoops)
			{
				finished=true;
			} else {
				//find the highest and lowest amounts to match
				var minIndex='';
				var maxIndex='';
				var min=0;
				var max=0;

			    $jq.each(amounts, function(key,val)
		   		{
			   		if (val<min)
			   		{
				   		min=val;
				   		minIndex=key;
			   		}
			   		
			   		if (val>max)
			   		{
				   		max=val;
				   		maxIndex=key;
			   		}
			   		
		   		});
	
			    if ((maxIndex=='') || (minIndex==''))
			    {
				    finished=true;
			    }
	
			    if (!(finished))
			    {
				    if (max+min>0)
				    {
				    	//$jq('#transactions').append(max + ':' + min + '<br />');
					    //recipient will still get money, payer goes 0
					    amounts[minIndex]=0;
					    amounts[maxIndex]=r2(amounts[maxIndex]+min);
					    addTrx(minIndex,ar2(min),maxIndex);
				    } else {
				    	//$jq('#transactions').append(max + ':' + min + '<br />');
					    //will still have to pay, recipient goes 0
					    amounts[maxIndex]=0;
					    amounts[minIndex]=r2(amounts[minIndex]+max);
					    addTrx(minIndex,ar2(max),maxIndex);
				    }
			    }
		   		
			    $jq.each(amounts, function(key,val)
		   		{
		     		//$jq('#transactions').append(key + ': ' + val + '<br />');
		   		});
		   		loopcount++;
			}
		}
		if (loopcount-1==0)
		{
			$jq('#transactions').append('<span class="p1">Ihr seid quitt</span>');
		}
    }