var first_load;

function load_image(prefix,selector_id,target_id)
{
  var t=document.getElementById(target_id)
  var s=document.getElementById(selector_id)

  t.src=prefix+s.value

}

function addslashes (str) {
	return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\u0000/g, "\\0");
}
/* Wird nicht mehr verwendet */
function catapult_check_and_submit(submit_type, hero_id)
{
	var val = parseInt(document.forms["attack_form"].elements["crystal_amount"].value);
	if (val <= res_possess)
	{
		if (submit_type == 'submit')
		{
			ajax_submit(attack_form,false, {'hero_id':hero_id});
		}
		if (submit_type == 'confirm_submit')
		{
			ajax_confirm_submit(lang_js.attErr_breachPact,attack_form,false, {'hero_id':hero_id});
		}
	}
	else
	{
		document.getElementById("cata_error").innerHTML = lang_js.cataErr_noCrystals;
	}
	return false;
}

function catapult_slider_add_step(dir)
{
	var dir = parseInt(dir);
    if (isNaN(dir)) dir=0;
    var val = parseInt(document.forms["attack_form"].elements["crystal_amount"].value);
    val = val + dir;
    if (val < 1) val=1;
    if (val > max) val=max;
	document.forms["attack_form"].elements["crystal_amount"].setValue(val);
	//catapult_slider.setValue(val/max);
}

function catapult_set_amount(amount)
{
	var amount = parseInt(amount);
    if (isNaN(amount)) amount=0;
	var max = parseInt($('catapult_track').getAttribute('max'));
	catapult_update_values(amount/max);
	catapult_slider.setValue(amount/max);
}

function catapult_update_values(pos)
{
	var slider_track = $('catapult_track');
	var max = parseInt(slider_track.getAttribute('max'));
	var res_possess = parseInt(slider_track.getAttribute('possess'));
	var maxdmg = parseInt(slider_track.getAttribute('maxdmg'));
	var damage = Math.round(pos*maxdmg);
	var val = Math.round(pos*max);
	if (val <= 0)
	{
		val = 1;
	}
	$("crystal_amount").value = val;
	$("sidebar_max_damage").innerHTML = numberFormat(damage);
	if (val > res_possess)
	{
		catapult_slider.setValue(catapult_get_max_amount(res_possess, max));
		catapult_slider.setDisabled();
	}
}

function catapult_get_max_amount(res_possess, max)
{
	if (max > 0)
		return (res_possess / max);
	else
		return 0;
}

function unit_set_amount(id,amount)
{
  units_updating=true;
  units_sliders[id].cntrl.setValue(amount/units_sliders[id].max_quantity);
  units_updating=false;
  unit_update_ress_amount(id, amount);
}

function unit_update_ress_amount(id, amount)
{
	var units = parseInt($('numeric[units_amount]['+id+']').value);
	if(isNaN(units) || units == 0)
		units = 1;

	$$('form#build_units_'+id+' span[name="ressvalue"]').each(function(span) {
		span.innerHTML = numberFormat(span.getAttribute("defaultvalue") * units);
	});
}

function units_add_step(id,dir)
{
  var val=parseInt($('numeric[units_amount]['+id+']').value);
  if (isNaN(val)) val=0;
  val=Math.floor(val/units_sliders[id].quantity)*units_sliders[id].quantity;
  $('numeric[units_amount]['+id+']').value=val+(units_sliders[id].quantity*dir);
  unit_set_amount(id,$('numeric[units_amount]['+id+']').value);
}

function units_add_step_max(id, dir)
{
  var val=units_sliders[id].max_quantity;
  if (isNaN(val) || dir==-1) val=0;
  $('numeric[units_amount]['+id+']').value=val;
  unit_set_amount(id,$('numeric[units_amount]['+id+']').value);
}

function is_numeric(value)
{
   return ((!isNaN(value)) && (value.length > 0))
}


function sliderChange(ename,id,value)
{
  var rid='numeric['+ename+'][to_right]['+id+']';
  var rval=Math.round((value-0.5)*transfer_sliders[ename][id].left*2);
  if (rval<=0) rval=''; else rval=numberFormat(rval);
  document.getElementsByName(rid)[0].value=rval;


  var lid='numeric['+ename+'][to_left]['+id+']';
  var lval=Math.round((0.5-value)*transfer_sliders[ename][id].right*2);
  if (lval<=0) lval=''; else lval=numberFormat(lval);
  var elem=document.getElementsByName(lid)
  if (isdefined(elem[0]))
  {
    elem[0].value=lval;
  }
}


/**
 * Function : dump()
 * Arguments: The data - array,hash(associative array),object
 *    The level - OPTIONAL
 * Returns  : The textual representation of the array.
 * This function was inspired by the print_r function of PHP.
 * This will accept some data as the argument and return a
 * text that will be a more readable version of the
 * array/hash/object that is given.
 * Docs: http://www.openjs.com/scripts/others/dump_function_php_print_r.php
 */
function dump(arr,level) {
	var dumped_text = "";
	if(!level) level = 0;
	
	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";
	
	if(typeof(arr) == 'object') { //Array/Hashes/Objects 
		for(var item in arr) {
			var value = arr[item];
			
			if(typeof(value) == 'object') { //If it is an array,
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += dump(value,level+1);
			} else {
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			}
		}
	} else { //Stings/Chars/Numbers etc.
		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
}

function print_r(theObj){
	  if(theObj.constructor == Array ||
	     theObj.constructor == Object){
	    document.write("<ul>");
	    for(var p in theObj){
	      if(theObj[p].constructor == Array||
	         theObj[p].constructor == Object){
	document.write("<li>["+p+"] => "+typeof(theObj)+"</li>");
	        document.write("<ul>");
	        print_r(theObj[p]);
	        document.write("</ul>");
	      } else {
	document.write("<li>["+p+"] => "+theObj[p]+"</li>");
	      }
	    }
	    document.write("</ul>");
	  }
	}

function setAllSliders(ename,value)
{
  $H(transfer_sliders[ename]).each(function(e)
    {
      e.value.cntrl.setValue(value);
    }
  );
}

function setTransferSlider(transfer,id,value)
{

  transfer_sliders[transfer][id].cntrl.setValue(value);
}





function numberFormat(nStr){
  nStr += '';
  x = nStr.split('.');
  x1 = x[0];
  x2 = x.length > 1 ? '.' + x[1] : '';
  var rgx = /(\d+)(\d{3})/;
  while (rgx.test(x1))
    x1 = x1.replace(rgx, '$1' + '.' + '$2');
  return x1 + x2;
}

function ajax_handler(transport,data)
{

	var json=transport.responseJSON;
	var error;

	if (json.redirect)
	{
    redirect(json.redirect);
    return;
  }

	nd();
	try {
	$H(json).each(
		function(pair)
		{
		  error=pair.key
		  if (pair.key!='javascript')
		  {
        $(pair.key).innerHTML=pair.value;
			}

      if (pair.key=='palace_info')
      {
        palace_InPlaceEditor();
      }
		}
  	);


	}
	catch(e)
	{
		var error_message="Exception:"+e.name+' '+e.message+" ID: "+error;
		var url=game_path+"javascript_error_saving.php";
		new Ajax.Request( url,
				{ method: "post",
			parameters: { "error_message":error_message }
				});
		if(game_debug == 1)
		{
			alert(error_message);
		}
	}
	try {
    if (json)
    {
      eval(json.javascript);
    }
  }
  catch(e)
  {
	  var error_message=lang_js.js_error+e.fileName+' '+e.lineNumber+' '+e.name+' '+e.message+' '+e.stack;
	  var url=game_path+"javascript_error_saving.php";
	  new Ajax.Request( url,
			  { method: "post",
		  parameters: { "error_message":error_message }
			  });
	if(game_debug == 1)
	{
	  alert(error_message);
	}
  }

	ajax_load(false);
	if (json.message)
	{
    show_message();
    setTimeout("hide_message()",5000);
  }


}

function show_message()
{
  $('message').setOpacity(1);
  $('message').style.display='block';
}


function hide_message()
{
	$('message').fade({ duration: 1.0 });
}


function ajax_load(display)
{
  if (display)
  {
    $('ajax-loading').style.display='inline';
  }
  else
  {
    $('ajax-loading').style.display='none';
  }
}

function ajax_link(url,self,params,no_history,method)
{
  if (!isdefined(params))
  {
    params={};
  }
  params.ajax=1;
  if (isdefined(self)) {params.self=self};



  ajax_load(true);

  if (!isdefined(method)) {method='get'}

	var myRequest = new Ajax.Request(url,
  {
    method: method,
    parameters: params,
    onSuccess: ajax_handler
  });
  if (!no_history)
  {
    dhtmlHistory.add(url);
  }
  //alert(dhtmlHistory.getCurrentLocation());
  return false;
}

function ajax_request(url,params)
{
	if (!isdefined(params))
	{
		params={};
	}
	params.ajax=1;

	var myRequest = new Ajax.Request(url,
		{
			method: 'post',
			parameters: params,
			onSuccess: ajax_handler
		}
	);
	dhtmlHistory.add(url);
	return false;
}


function ajax_submit(form_id,self,p)
{
  var aForm=$(form_id);
  var params=aForm.serialize(true);
  ajax_load(true);
  params.ajax=1;
  if (self) {params.self=self};
  params=$H(params).merge(p);
	var myRequest = new Ajax.Request(aForm.action,
  {
    method: 'post',
    parameters: params,
    onSuccess: ajax_handler
  });
  return false;
}

function ajax_confirm_submit(msg,form_id,self,p)
{
    var is_confirmed = confirm(msg);
    if (is_confirmed) {
      return ajax_submit(form_id,self,p);
    }

    return is_confirmed;
}

function ajax_confirm_link(url,msg, self, params,no_history,method)
{
    var is_confirmed = confirm(msg);
    if (is_confirmed)
    {
    	return ajax_link( url, self, params ,no_history,method);
    }

    return is_confirmed;
}

function ajax_confirm_prompt(url,msg, self, params,no_history,method)
{
	if (!isdefined(params))
	{
		params={};
	}
	params.ajax=1;
	if (isdefined(self)) {params.self=self};
	
	params.unban_reason=prompt(msg);
    if (params.unban_reason)
    {
      return ajax_link( url, self, params ,no_history,method);
    }

    return false;
}

function getOrder(listid)
{
  var order = document.getElementById("res_order");
  order.value = (Sortable.serialize(listid));
}





function palace_InPlaceEditor()
{
	new Ajax.OutPlaceEditor( $('current_palace'),game_path+'/ajax/rename_palace.php?ajax=1',{
    rows:1,submitOnBlur:true,okButton:false,cancelLink:false,
    callback: function(form, value) { return 'rename_palace=' + escape(value) }
    });
}


function historyChange(newLocation, historyData)
{
  if (!first_load)
  {
    ajax_link(newLocation);

  }
  first_load=false;
};



function footer_script1()
{
  window.dhtmlHistory.create({
          toJSON: function(o) {
                  return Object.toJSON(o);
          }
          , fromJSON: function(s) {
                  return s.evalJSON();
          }
  });


  window.onload = function() {
    first_load=true;
    dhtmlHistory.initialize();


           var initialLocation = dhtmlHistory.getCurrentLocation();
           if (initialLocation != '')
           {
             ajax_link(initialLocation,0);
           }
           else
           {
             dhtmlHistory.add(window.location);
          }
          dhtmlHistory.addListener(historyChange);




  };
	sliders=Array();

}

function footer_script2()
{
  palace_InPlaceEditor();


}

function isdefined(v)
{
	if(v!=null &&  typeof(v) !="undefined")
		return true;
	else
		return false;
}

function format_time(date)
{
	var now=new Date();
	ShowDays='';
	Year=date.getFullYear();
	Month=date.getMonth();
	Days=date.getDate();
	Houres=date.getHours();
  Minutes=date.getMinutes();
  Seconds=date.getSeconds();
  if (Houres<10) Houres='0'+Houres;
  if (Seconds<10) Seconds='0'+Seconds;
	if (Minutes<10) Minutes='0'+Minutes;

	if (Year!=now.getFullYear() || Month!=now.getMonth() || Days!=now.getDate())
	{
		Month=Month+1;
		ShowDays=Days+'.'+Month+'.'+Year;
	}


  return ShowDays+' '+Houres+':'+Minutes+':'+Seconds;

}
function bar_to_value(pos)
{
	change_slider_forground(pos);

	if (!disable_slider_update)
	{
			var klicks=bar_to_klicks();
			var d=klickleft_to_time(klicks)
			document.getElementById('input_build_hour').value=d.getHours();
			document.getElementById('input_build_minute').value=d.getMinutes();
			display_endtime(klicks);
			recalc_time(klicks);

	}
}


function change_slider_forground(pos)
{
	var result=Math.floor(521*pos);
	$('summon_sliderTrack_0').style.backgroundPosition=result+'px';
	}

function bar_to_klicks()
{
	return parseInt((cntrSlider.value*287).toFixed())+1;
}


function klickleft_to_time(klicks)
{
	var time=new Date();
	time=new Date(time.getTime()-time.getTime() % (klick_length*1000)+klicks*klick_length*1000)
	return time;
}

function display_endtime(klicks)
{
	var endtime=format_time(klickleft_to_time(klicks+klick_diff));
	document.getElementById('build_endtime').innerHTML=endtime;
}

function recalc_time(input_value)
{
	document.getElementById('build_value').value=input_value;


		//time
		//endtime


		for (var idx=0;idx<item_time.length;idx++)
		{

			var mana=calc_build_mana(item_time[idx].id,input_value);
			if (mana>current_mana)
			{
				item_time[idx].innerHTML='<span class="error">'+mana+'</span>';
			}
			else
			{
				item_time[idx].innerHTML=mana;
			}
		}



}


function inc_slider()
{
	cntrSlider.setValue(cntrSlider.value+(1/288));
	return false;
}

function dec_slider()
{
	cntrSlider.setValue(cntrSlider.value-(1/288));
	return false;
}

var reloadWholePage = false;
function ReloadPage()
{
	if (reloadWholePage == false)
	{
		ajax_link('/xhodon/ajax/reload_header.php',false,{},true);
	}
	else
	{
		ajax_link(dhtmlHistory.getCurrentLocation());
	}
}



function TimeFunction()
{
	Now=new Date();
	
	var l=timer.length;				
	for (i=0;i<l;i++)
	{

		if (timer[i].normalCountdown)
		{
			
			Timeleft=client_time.getTime()/1000+timer[i].seconds-Math.floor(Now.getTime()/1000);
			
			if(Timeleft<0)
			{
				Timeleft=0;
			}
			
			Days=Math.floor(Timeleft/(3600*24))
			Timeleft=Timeleft-Days*3600*24;
			Houres=Math.floor(Timeleft/3600);
			Timeleft=Timeleft-Houres*3600;
			Minutes=Math.floor(Timeleft/60);
			Seconds=Math.floor(Timeleft % 60);
			if (Houres<10) Houres='0'+Houres;
			if (Seconds<10) Seconds='0'+Seconds;
			if (Days>0) ShowDays=Days+lang_js.days;
			var e=document.getElementById(timer[i].id);;
			ShowDays='';

			if (e)
			{
				if (in_klick && timer[i].klick)
				{
					e.innerHTML=lang_js.in_klick;
				}
				else if (timer[i].error==1)
				{
					e.innerHTML=lang_js.error;
				}
				else if (timer[i].short==1)
				{
					e.innerHTML=Minutes+':'+Seconds;
				}
				else
				{
					if (Minutes<10) Minutes='0'+Minutes;

					e.innerHTML=ShowDays+Houres+':'+Minutes+':'+Seconds;
				}
			}


		}


		else
		{

			if (timer[i].forward)
			{
				Timeleft=-client_time.getTime()/1000+timer[i].seconds+Math.floor(Now.getTime()/1000);				   
			}
			else
			{
				Timeleft=client_time.getTime()/1000+timer[i].seconds-Math.floor(Now.getTime()/1000);
			}
			if (Timeleft<=0)
			{							  				
				if (timer[i].reload==1)
				{
					Timeleft=0;
					timer[i].reload=0;
					ReloadPage();
					return;
				}
				else
				{				    	
					timer[i].seconds=timer[i].seconds+klick_length;
					Timeleft=0;				    	
				}
			}
			ShowDays='';

			Days=Math.floor(Timeleft/(3600*24))
			Timeleft=Timeleft-Days*3600*24;
			Houres=Math.floor(Timeleft/3600);
			Timeleft=Timeleft-Houres*3600;
			Minutes=Math.floor(Timeleft/60);
			Seconds=Math.floor(Timeleft % 60);
			if (Houres<10) Houres='0'+Houres;
			if (Seconds<10) Seconds='0'+Seconds;
			if (Days>0) ShowDays=Days+lang_js.days;
			var e=document.getElementById(timer[i].id);;


			if (e)
			{
				if (in_klick && timer[i].klick)
				{
					e.innerHTML=lang_js.in_klick;
				}
				else if (timer[i].error==1)
				{
					e.innerHTML=lang_js.error;
				}
				else if (timer[i].short==1)
				{
					e.innerHTML=Minutes+':'+Seconds;
				}
				else
				{
					if (Minutes<10) Minutes='0'+Minutes;

					e.innerHTML=ShowDays+Houres+':'+Minutes+':'+Seconds;
				}
			}

		}

	}
}

//deaktiviert die Entertaste beim premiumAttack auf Wächter
function stopRKey(evt) 
{
	var evt = (evt) ? evt : ((event) ? event : null);
	var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
	if ((evt.keyCode == 13) && (node.id=="premiumCreepAttack"))  {changeCreepLvlPremiumAttack(); return false;}
} 
document.onkeypress = stopRKey; 


function change_hero_order()
{
	var order=document.getElementsByName('numeric[order]')[0].value;
	var display='none';
	var display2='block';
	var display3='none';
	var display4='block';
	switch (order)
	{
		case '1':
		//plündern
		  display='block';
		  break;
		case '7':
		//premium attack
		  display='block';
		  display2='none';
		  display3='block';
		  display4='none';
		  break;
	}
	
	$('returnText').style.display=display4;
	$('returnField').style.display=display4;
	$('premiumAttack').style.display=display3;
	$('hero_steel_order').style.display=display;
	$('normal').style.display=display2;
	
	get_targets(order);
}

function change_hero_premiumAttOrder()
{
	var order=document.getElementsByName('numeric[premiumAttOrder]')[0].value;
	var display='block';
	var display2='none';
	var display3='block';
	var display4='none';

	$('returnText').style.display=display4;
	$('returnField').style.display=display4;
	$('premiumAttack').style.display=display3;
	$('hero_steel_order').style.display=display;
	$('normal').style.display=display2;
	
	document.getElementsByName('numeric[order]')[0].selectedIndex = $('heroCmd7').index;
	get_targets(order);
}

function get_targets(order)
{
	var order = order;
	
	if (order == 7)
	{
		var params={'numeric[order]':order};
		document.getElementsByName('numeric[x]')[0].value = 0;
		document.getElementsByName('numeric[y]')[0].value = 0;
		document.getElementsByName('numeric[z]')[0].value = 0;
		
		ajax_link(game_path+'ajax/hero_get_targets.php',true,params);
	}
	else
	{
		
	}
	var x_node = document.getElementsByName('numeric[x]')[0];
	var x=x_node.value;
	var y=document.getElementsByName('numeric[y]')[0].value;
	var z=document.getElementsByName('numeric[z]')[0].value;

	if (is_numeric(x) && is_numeric(y) && is_numeric(z))
	{
    	if(x_node.timer != null)
    		clearTimeout(x_node.timer);
    	x_node.timer = setTimeout(function() {
	    	var x_node = document.getElementsByName('numeric[x]')[0];
			var x=x_node.value;
			var y=document.getElementsByName('numeric[y]')[0].value;
			var z=document.getElementsByName('numeric[z]')[0].value;
	    	var params={'numeric[x]':x,'numeric[y]':y,'numeric[z]':z,'numeric[order]':order};

			//  params.order=order;
			ajax_link(game_path+'ajax/hero_get_targets.php',true,params);
			x_node.timer = null;
		}, 500);
  	}
	
}

function changeCreepLvlPremiumAttack()
{
	var order=document.getElementsByName('numeric[order]')[0].value;
	var creepLvl=document.getElementsByName('creepLvl')[0].value;
	var params={'creepLvl':creepLvl,'numeric[order]':order};
	ajax_link(game_path+'ajax/hero_get_targets.php',true,params);
}



  function bar_to_mana()
  {
  	return Math.ceil(cntrSlider.value*1000)+1;
  }

  function mana_to_bar(value)
  {
  	return (value-1)/1000
  }

function update_slider_klicks()
{
  var klicks_input=$('build_value').value;
  if (is_numeric(klicks_input))
  {
    cntrSlider.setValue((klicks_input-1)/287);
  }
  return;

}



  function update_slider()
  {
  	disable_slider_update=true;

  		hour=document.getElementById('input_build_hour').value
  		minute=document.getElementById('input_build_minute').value
  		if (hour>23 || isNaN(Number(hour)))
  		{
  			document.getElementById('input_build_hour').value=23;
  			hour=23;
  		}

  		if (minute>59 || isNaN(Number(minute)))
  		{
  			document.getElementById('input_build_minute').value=59;
  			minute=59;
  		}

  		time=new Date()
  		time.setHours(hour);
  		time.setMinutes(minute);
  		now=new Date()
  		if (time.getTime()<now.getTime()) time.setDate(time.getDate()+1);
  		klicks=time_to_klicks(time);
  		display_endtime(klicks);
  		recalc_time(klicks);
  		cntrSlider.setValue((klicks-1)/287);

  	disable_slider_update=false;
  }



    function inc_slider()
    {
    	cntrSlider.setValue(cntrSlider.value+(1/288));
    	return false;
    }

    function dec_slider()
    {
    	cntrSlider.setValue(cntrSlider.value-(1/288));
    	return false;
    }

    function time_to_klicks(time)
    {
    now=new Date()
    tdiff=time.getTime()-now.getTime()
    tdiff=tdiff-tdiff % (klick_length*1000);
    return Math.ceil(tdiff/(klick_length*1000))+1
    }

   	function setBuildId(id)
  	{
  	  var build_value=document.getElementById("build_value");
  	  if (build_value.value>0)
  	  {
  		  var order = document.getElementById("bauwerk_typ_id");
        order.value = id;
        document.build_form.submit();
      }
      return false;
  	}


    function calc_build_mana(id,klicks)
    {
    	var stufe=techtree[id][1];
    	var k=techtree[id][0];
    	return Math.ceil(stufe*(k/100)*(288-klicks));

    //	return Math.ceil((techtree[id][0]*techtree[id][1]*10)/klicks);
    }


    function calc_build_time(id,mana)
    {
    	//return Math.ceil((techtree[id][0]*techtree[id][1]*10)/mana);
    	var stufe=techtree[id][1];
    	var k=techtree[id][0];

    	return Math.ceil((288*stufe*k-(100*mana)/(stufe*k)));
    }





function select_target(id,self)
{
    $('target_'+id).checked=true;
    hero_target=id;
    return false;
}

/* Units_build_list_view->generate_sliders(): function that generates the javascript variables that store the sliders*/
function create_sliders(data)
{
	$H(data).each(
	function(pair)
	{
			data[pair.key]['cntrl'] = new Control.Slider('units_handle_'+pair.key, 'units_track_'+pair.key, {
			onChange: function(v) { units_build_slider_change(v,pair.key); },
			onSlide: function(v) { units_build_slider_change(v,pair.key); }
	});
	})
}

function create_transfer_sliders(name)
{
  data=transfer_sliders[name];
	$H(data).each(
	function(pair)
	{
       data[pair.key]['cntrl'] = new Control.Slider('sliderHandle_'+name+'_'+pair.key, 'sliderTrack_'+name+'_'+pair.key, {
         sliderValue:0.5,
			   onChange: function(v) { sliderChange(name,pair.key,v); },
			   onSlide: function(v) { sliderChange(name,pair.key,v); }
	     });
	})
}


/* Units_build_list_view->generate_sliders(): function called onChange */
function units_build_slider_change(value,id)
{
	var max_quantity = parseInt(units_sliders[id].max_quantity);
	var quantity = parseInt(units_sliders[id].quantity);
	var build_time = parseInt(units_sliders[id].build_time);
	// amount of units that will be build
	var amount = parseInt(value*max_quantity);
	if((value==1) || (value<=0))
  {
    units_updating=false
  }

 	if (!units_updating)
  	{
	    $('numeric[units_amount]['+id+']').value = amount;
	    unit_update_ress_amount(id, amount);
	}
	
	if (calcTime)
	{
		// calculating the number of clicks needed for the production
		var clicks = Math.ceil(amount/quantity)*build_time;
		// turning the clicks into time
		var time = klickleft_to_time(clicks);
		// displaying
		$('day_'+id).value = time.getDate();
		$('month_'+id).value = time.getMonth()+1;
		$('year_'+id).value = time.toString().substring(13,15);
		$('hrs_left_'+id).value = time.getHours();
		$('min_left_'+id).value = time.getMinutes();
	}
}

function pmod( a, b )
{
    if( a < 0 )
    {
        return b - ( Math.abs( a ) % b );
    }
    else
    {
        return a % b;
    }
}

/* Units_build_list.tpl: function that updates slider and unit_amount field
when the date or hour field are modified*/
function units_build_slider_time_change(unit_id,element_id)
{
	var max_quantity = parseInt(units_sliders[unit_id].max_quantity);
	var quantity = parseInt(units_sliders[unit_id].quantity);
	var build_time = parseInt(units_sliders[unit_id].build_time);
	// amount of units that will be build
	var amount = parseInt($('numeric[units_amount]['+unit_id+']').value);
	// calculating the number of clicks needed for the production
	var clicks = Math.ceil(amount/quantity)*build_time;
	// turning the clicks into time
	var time = klickleft_to_time(clicks);

	var changed_value = parseInt($(element_id).value);
	var previous_value;
	var clicks_diff;

	switch(element_id)
	{
		case 'day_'+unit_id:
			previous_value = time.getDate();
			clicks_diff = (changed_value - previous_value)*288;
			break;
		case 'hrs_left_'+unit_id:
		// TODO: fix 24:00 --> 00:00 UHR BUG!
			previous_value = time.getHours();
			clicks_diff = (changed_value - previous_value)*12;
			break;
	}


	var new_clicks = clicks + clicks_diff;
	var new_value = ((new_clicks/build_time)*quantity)/max_quantity;
	if(0<= new_value && new_value <= 1){
		units_sliders[unit_id]['cntrl'].setValue(new_value);
		}
		// don't allow if the change was outside of the legal range
		else if (is_numeric(previous_value))
			$(element_id).value = previous_value;
			else $(element_id).value = "";

}

function submit_summoned_building( building_type_id)
{
    	document.getElementById('bauwerk_typ_id').value = building_type_id;
      return ajax_submit('build_form',0);
}

function getkey(e)
{
 if (e == null)
 {
 kcode = event.keyCode;
 } else
 { // mozilla
 if (e.altKey || e.ctrlKey)
 {
 // moz doesn't override ctrl keys,
 // eg, Ctrl-N won't bypass this function to open new window
 return true;
 }
 kcode = e.which;
 }
 //key = String.fromCharCode(kcode);
 // allow some keys to work w/o triggering prekey

// if (allowkeys.indexOf(key) == -1) {
// if (xprekey()) return true;
// }
 return kcode;
}

function remove_element(e)
{
  if (isdefined(e))
  {
    e.parentNode.removeChild(e);
  }
}

function toggle_buildqueue(){


  var layer = $('build_list_layer');
  if (layer.className=='layer')
  {
		layer.className='layer_hidden';
	}
	else
	{
		layer.className='layer';
	}




}

function mouseover_buildqueue(){
  if(is_build_queue_toggled) return;
  cssRule = $('build_list_layer');
  cssRule.style.width = '637px';
  cssRule.style.height = '219px';
  cssRule.style.minHeight = '';

}

function mouseout_buildqueue(){
  if(is_build_queue_toggled) return;
  cssRule = $('build_list_layer');
  cssRule.style.width = '85px';
  cssRule.style.minHeight = '';
  cssRule.style.height = '20px';
}

function crude_hack(){
  cssRule = $('build_list_layer');
  if(cssRule){
    cssRule.style.width = '85px';
    cssRule.style.minHeight = '';
    cssRule.style.height = '20px';
    cssRule.style.display = 'block';
  }
}


function cancel_summon( cancelID, position )
{
    check = '';
  if (position == 0){
    check = confirm(lang_js.cancelBuilding);
  }else{
    check = confirm(lang_js.cancelBuildqueue);
  }

  if (check == true){
    $('cancel_id').value =  cancelID;
    is_build_queue_toggled=false;
    return ajax_submit('build_queue_form',0);
    }
  is_build_queue_toggled=false;
}


function getBrowserType()
//function getBrowserType(debug)
{
  var Browser = '';
  var a = document.all;
  var b = document.layers;
  var c = document.getElementById;
  var d = navigator.userAgent.search(/Firefox/);
  var e = navigator.userAgent.search(/Opera/);
  var f = navigator.userAgent.search(/Netscape/);
  var g = navigator.userAgent.search(/Safari/i);

//debug.innerHTML=a+','+b+','+c+','+d+','+e+','+f+','+g;


  if ( (a) && (c) && !(e) ) {Browser = 'IE_ab_5';}
  else if ( (a) && !(c) && !(e) ) {Browser = 'IE_bis_4';}
  else if (d!=-1) {Browser = 'FF';}
  else if (g!=-1) {Browser = 'Safari';}
  else if (e!=-1) {Browser = 'OP';}
  else if (b) {Browser = 'NS_bis_4';}
  else if ( !(b) && (c) ) {Browser = 'NS_ab_6';}
  else {Browser = 'alternative';}

  return Browser;
}

function textCounter(textarea, counter, max) {
	if(!isdefined(max))
	{
		max=200;
	}

	val = textarea.value;
	if (val.length > max)
	{
		textarea.value = val.substring(0,max);
		textarea.focus();
		counter.style.color = 'red';
		counter.style.backgroundColor = 'black';
	}
	else
	{
		counter.style.color = '';
		counter.style.backgroundColor = '';
	}

	counter.innerHTML = max-parseInt(textarea.value.length);
}

function ticker_check(max) {
	if(!isdefined(max))
	{
	  max=200;
	}
  var e=$('text');
  var eLeft=$('zeichen');
  str = e.value;
  if (str.length > max){
    str = str.substring(0, max);
    $('max_zeichen').style.color='red';
    $('max_zeichen').style.backgroundColor='black';
  }else{
    $('max_zeichen').style.color='';
    $('max_zeichen').style.backgroundColor='';
  }
  e.value = str;
	eLeft.innerHTML=max-str.length;
}

function submit_ticker_message(){

      subject=$('subject').value;
      text=$('text').value;
      return ajax_submit('ticker_form',0);

}

function makeRequest(url, parameters, handler) {
    var http_request = false;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
       http_request = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // IE
       try {
          http_request = new ActiveXObject("Msxml2.XMLHTTP");
       } catch (e) {
          try {
             http_request = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (e) {}
       }
    }
    if (!http_request) {
       alert('Cannot create XMLHTTP instance');
       return false;
    }


    http_request.onreadystatechange = function(){handler(http_request)};
    http_request.open('GET', url + parameters, true);
    http_request.send(null);
}

function redirect(url)
{
	location.href=url;
}

function do_nothing()
{
}

function enter_key_is_pressed(e)
{
  if (!e)
    e = window.event;

  if (e.which) {
    code = e.which;
  }
  else if (e.keyCode)
  {
    code = e.keyCode;
  }


  if (code == 13)
  {
  	return true
  }
  else
  {
  	return false;
  }
}

function change_titel(user_id, e)
{
	ally_titel=document.getElementById('request_input').value;
	document.getElementById('rank['+user_id+']').innerHTML=ally_titel;
	makeRequest('ally.php','?page=change_title&title='+ally_titel+'&user_id='+user_id,do_nothing);
	document.getElementById('rank['+user_id+']').onclick=clickcode;
}

function show_input(parent,size,value,func)
{
	clickcode=document.getElementById(parent).onclick;
	document.getElementById(parent).onclick='';

	document.getElementById(parent).innerHTML='<input class="input_txt" onblur="'+func+'" onkeydown="if (enter_key_is_pressed(event)) {'+func+'}" id="request_input" size="'+size+'"type="text" value="'+value+'">';
	document.getElementById(parent).width=10;
	document.getElementById('request_input').focus();
}


function send_profile_tab0_data()
{
  return ajax_submit('profile_tab0_data',0);
}

function profile_preview(){
  $('profile_tab0[profile_preview_switch]').value=1;
  return ajax_submit('profile_tab0_data',0);
}

function teaser_check() {
	var max=450;
  var e=$('profile_tab0[teaser]');
  var eLeft=$('profile_zeichen');
  str = e.value;
  if (str.length > max){
    str = str.substring(0, max);
    $('max_zeichen').style.color='red';
    $('max_zeichen').style.backgroundColor='black';
  }else{
    $('max_zeichen').style.color='';
    $('max_zeichen').style.backgroundColor='';
  }
  e.value = str;
	eLeft.innerHTML=max-str.length;
}

function reset_profile_preview()
{
  if($('profile_tab0[profile_preview_switch]')==null) return;
  $('profile_tab0[profile_preview_switch]').value=0;
}




function remove_friend_req(value)
{
	var e=document.getElementById('friend_req['+value+']')
	e.parentNode.removeChild(e);
}

function accept_friend_req(accept)
{
	req=document.getElementsByName('friend_req');
	params='accept_friend='+accept+'&';

	i=0;
	//for (var i=0, l=req.length; i<l;++i)
	while (i<req.length)
	{

		if (req[i].checked)
		{
			params = params +'user_id[]='+req[i].value+'&';
			remove_friend_req(req[i].value);
		}
		else
		{
			i++;
		}
	}

	if (accept==0)
	{
		new Ajax.Request('/game/simplex.php',{method:'post',parameters: params});
	}
	else
	{
		new Ajax.Request('/game/simplex.php',
		  {
		    method:'post',
		    parameters: params,
		    onSuccess: function(transport,users)
				{
		    	for (var i=0, l=users.length; i<l;++i)
					{
		      	if (isdefined(users[i]))
		      	{
		      		if (users[i]['online'])
		      			list=document.getElementById('friend_online');
		      		else
		      		  list=document.getElementById('friend_offline');

		      		add_user_to_list(list,users[i]);
				    }
				  }
			  }
		  });
	}

	return false;
}

function add_user_to_list(list,user)
{
	list.innerHTML=list.innerHTML+'<a href="/game/user_profil.php?numeric[user_id]='+user['user_id']+'">'+user['username']+'</a><br />';
}

function add_friend_req()
{
	e=document.getElementsByName('friend[new]')[0]
	friend_name=e.value;
	e.value='';
	new Ajax.Request('/game/simplex.php',
  		{
	    method:'post',
	    parameters: {add_friend: friend_name},
	    onSuccess: function(transport,user){

	      if (isdefined(user))
	      {
	      	if (user['request'])
	      		list=document.getElementById('friend_req');
	      	else
					{
						remove_friend_req(user['user_id']);
						if (user['online'])
		      	  list=document.getElementById('friend_online');
		      	else
		      	  list=document.getElementById('friend_offline');
		      }
	      	add_user_to_list(list,user);
	      }
    	}
	});
}


function reset_gb_inputt()
{
  $('input_message').value='';
  $('input_username').value='';
  $('input_subject').value='';
}

function updateCheckboxes(form, name, checkbox)
{
	if(checkbox == true)
	{
		var inputObjs = document.forms[form].elements[name + '[]'];
		for(var i = 0; i < inputObjs.length; i++)
		{
			inputObjs[i].checked = document.forms[form].elements['msg_del_all'].checked;
		}
		
		document.forms[form].elements[0].checked = document.forms[form].elements['msg_del_all'].checked;
	}
	else
	{
		var checked = 0;
		var inputObjs = document.forms[form].elements[name + '[]'];
		for(var i = 0; i < inputObjs.length; i++)
		{
			if( inputObjs[i].checked == true )
			{
				checked++;
			}
		}
		if( checked == inputObjs.length )
		{
			document.forms[form].elements['msg_del_all'].checked = true;
		}
		else
		{
			document.forms[form].elements['msg_del_all'].checked = false;
		}
	}
}

var recipientCount = 0;
function addUser(name) {
	if(name == '')
	{
		return false;
	}

	var list = $('addresseeList');
	var li = document.createElement('li');
	var text = document.createTextNode(name);

	if(navigator.appName == 'Microsoft Internet Explorer')
	{
		var checkbox = document.createElement('<input type="checkbox" name="recipients[]">');
		var span = document.createElement('<span class="error" id="recipient'+recipientCount+'_error">');
	}
	else
	{
		var checkbox = document.createElement('input');
		checkbox.setAttribute('type', 'checkbox');
		checkbox.setAttribute('name', 'recipients[]');

		var span = document.createElement('span');
		span.setAttribute('id', 'recipient'+recipientCount+'_error');
		span.setAttribute('class', 'error');
	}

	list.insertBefore(li, list.firstChild);

	li.appendChild(checkbox);
	li.appendChild(text);
	li.appendChild(span);

	checkbox.setAttribute('checked', true);
	checkbox.setAttribute('value', name);

	recipientCount = recipientCount + 1;
}

 function set_ingame_rcpt(name)
 {
  if(name == '')
	{
		return
	}
	$('addressee').value=name;
 }

 function toggle_element(element)
 {
   if( $(element).style.display == "none")
   {
     $(element).style.display='';
   }
   else
   {
     $(element).style.display='none';
   }
 }

 function show_element_on_condition(element, condition)
 {
   if( condition )
   {
     $(element).style.display='';
   }
   else
   {
     $(element).style.display='none';
   }
 }

     function remove_user(user_id)
    {
        new Ajax.Request('/xhodon/profile/profile_sameip.php',
      {
        method:'post',
        onSuccess: display_list,
        parameters: {remove: user_id}

      });
        return false;
    }

    function display_list(transport)
    {
        var response = transport.responseText;
        $('user_list').innerHTML=response;
    }

function desc(main,element, text)
{
    document.getElementById(element).firstChild.data =(text=='')?'':text;
}

function toggle_visibility(id)
{
	var visible = document.getElementById(id).style.visibility;
	if (visible == 'visible')
	{
		document.getElementById(id).style.visibility = 'hidden';
	}
	else
	{
		document.getElementById(id).style.visibility = 'visible';
	}
	return false;
}
function toggle_desc(element, text,text2)
{
    var desc = document.getElementById(element).firstChild.data;
    if ( desc == text)
    {
        document.getElementById(element).firstChild.data =text2;
    }
    else
    {
        document.getElementById(element).firstChild.data =text;
    }
}

function change_value(element,new_value)
{
	document.getElementById(element).value=new_value;
	
	return false;
}

function runen_tausch(username,count_id)
{
    runen=document.getElementById(count_id).value;
    check = confirm(lang_js.giveRunes_confirm1+runen+lang_js.giveRunes_confirm2+username+lang_js.giveRunes_confirm3);
    if (check == true){
       return ajax_submit('tausch_form', 0);
    }
    return;
}
function toggle_display(id)
{
    var visible = document.getElementById(id).style.display;
    if (visible == 'none')
    {
        document.getElementById(id).style.display = 'block';
    }
    else
    {
        document.getElementById(id).style.display = 'none';
    }
    return false;
}
function delete_reservation( cancelID)
{
    check = confirm(lang_js.valleyReservation_delete);

    if (check == true){
        return ajax_link("/xhodon/profile/profile_reservation.php?action=delete&uid="+cancelID);
    }

	return false;
}

/**
*	=== H�ndler-Funktionen ====
*/
function calc_supply_results()
{
    var amount = parseInt(document.supply_form.amount.value, 10);
    var trade_choice_id = parseInt(document.supply_form.choice.selectedIndex);

    if (trade_choice_id < 0)
    {
    	return false;
    }
    if (amount == '' || amount == null || amount < 0 || isNaN(amount) )
    {
       	amount = 0;
       	document.supply_form.amount.value = '';
	}
    else
    {
    	document.supply_form.amount.value = amount;
    }

	if (amount>trade_possess[trade_choice_id])
	{
		amount = trade_possess[trade_choice_id];
		document.supply_form.amount.value = amount;
		document.supply_form.amount.setAttribute("style", "color:#FF0000");
	}
	else
	{

		document.supply_form.amount.setAttribute("style", "color:#000000");
	}

	// aus einem mir unempfindlichen Grund ist trade_rates.length f�r Zutaten 'undefined'
	// und macht nur Probleme. Deshalb hier Schleife mit trade_possess.length :
    for (var i = 0; i < trade_possess.length; i++)
    {
        var result = amount / (trade_rates[i] * 100) * (trade_rates[trade_choice_id] * 100);
        document.getElementById("supply_result_"+i).innerHTML = (isNaN(Math.floor(result))) ? 0 : Math.floor(result);

        if (result == null || trade_choice_id == i  || amount > trade_possess[trade_choice_id] || Math.floor(result) <= 0)
        {
        	document.getElementById("supply_result_container_"+i).style.visibility="hidden";
        }
        else
        {
        	document.getElementById("supply_result_container_"+i).style.visibility="visible";
        }
    }
}

function calc_demand_results()
{
	var amount = parseInt(document.demand_form.amount.value, 10);
	var trade_choice_id = parseInt(document.demand_form.choice.selectedIndex);

    if (trade_choice_id < 0) return false;
    if (amount == '' || amount == null || amount < 0 )
    {
       	amount = 0;
       	document.demand_form.amount.setValue(amount);
	}

    for (var i = 0; i < trade_possess.length; i++)
    {
        var result = amount / (trade_rates[i] * 100) * (trade_rates[trade_choice_id] * 100);
        document.getElementById("demand_result_"+i).innerHTML = (isNaN(Math.floor(result))) ? 0 : Math.floor(result);
        if (result == null || trade_choice_id == i  || result > trade_possess[i] || Math.floor(result) <= 0)
	    {
	        document.getElementById("demand_result_container_"+i).style.visibility="hidden";
	    }
	    else
	    {
	        document.getElementById("demand_result_container_"+i).style.visibility="visible";
	    }
    }
}

function check_teleport()
{
	var check = true;
	for (var i; i<4; i++)
	{
		var amount = parseInt(document.getElementById("amount_"+i).value);
		if (amount < 0 || amount > resources[i])
		{
			check = false;
			break;
		}
	}
	var to_palace_id = parseInt(document.teleport_form.selected_to_palace_id.value);
	if (document.teleport_form.selected_to_palace_id.value == '')
	{
		check = false;
	}

	if (check == false)
	{
		alert(lang_js.invalidEntry);
	}
	return check;
}
// H�ndler - Ende

function translator_copy()
{
	var base = document.translation_form.base_area.value;
	document.translation_form.trans_area.value = base;
}

function translator_clear()
{
	document.translation_form.trans_area.value = "";
}

/*
	Die openBigPointPayment Funktion ist gut um immer eine 10Min gultige BP Payment Session zu bekommen
	Es gibt 2 verfahren das Payment aufzurufen (blockendes Popup / nichtgeblocktes Popup) 
	- eine nicht genutzt.	Es ist nicht klar was jetzt der bessere Weg ist - deswegen wird das Verfahren
	von Zeit zu Zeit vom einen auf die andere Methode umgestellt.
	Deshalb bitte diese Funktion nicht loschen. (Auch wenn sie gerade nicht benutzt wird.) 
*/
function openBigPointPayment (address)
{ 
  var external = window.open(address.replace(/\+/g,"%2B"), "paymentglobal", "width=840,height=680,left=100,top=200"); 
  external.focus(); 
  return false;
}

var LanguageManager = Class.create({
	initialize : function(gamepath)	{
		this.gamepath = gamepath;
		this.ajaxhandler = this._ajaxhandler.bind(this);
		this.cache = $H();
	},
	get : function(uid) {
		var paramString = '';
		var langList = [];
		if(Object.isArray(uid)) {
			langList = uid;
			var paramArray = [];
			for(var i = 0, len = uid.length; i < len; i++) {
				if(Object.isUndefined(this.cache.get(uid[i])))
					paramArray.push('language['+i+']='+uid[i]);
			}
			paramString = paramArray.join('&');
		} else {
			langList.push(uid);
			if(Object.isUndefined(this.cache.get(uid[i])))
				paramString = "language[0]="+uid;
		}

		//nur einen Request starten, wenn mindestens ein Element nicht im Cache ist
		if(paramString != "") {
			//synchroner Aufruf, da wir sofort das Ergebnis brauchen und
			//dies geht nur mit synchronen Request
			new Ajax.Request(this.gamepath+'ajax/get_language.php', {
				method : 'post',
				asynchronous : false,
				parameters : paramString,
				onSuccess: this.ajaxhandler
			});
		}

		//neuer Hash für die Rückgabe zurückgeben
		var ret = $H();
		
		if(langList.length == 1)
			return this.cache.get(langList[0]);
			
		langList.each(function(idx) {
			ret.set(idx, this.cache.get(idx));
		}.bind(this));

		return ret;
	},

	_ajaxhandler : function(transport) {
		var json = $H(transport.responseJSON);
	
		if(json != null)
			json.each(function(lang) {
				this.cache.set(lang.key, lang.value);
			}.bind(this));
	}
});


//Benutzung Beispiel $lang['navi']['forum']
// langManager.get('navi:forum') -> Hash wird zurückgegeben
// hash.get('navi:forum');
langManager = new LanguageManager('/xhodon/');

InputValueObserver = Class.create({
	_listeners: [],
	initialize : function(element, listeners) {
		this.element = $(element);
		if(this.element == null)
			this.element = $$('input[name="'+element+'"]')[0];
		if(listeners)
			this._listeners = listeners;

		this._keyuphandler = this.keyuphandler.bindAsEventListener(this);
		this.element.observe('keyup', this._keyuphandler);
	},
	keyuphandler : function(event) {
		var value = this.element.value;
		this._listeners.each(function(listener) {
			value = listener.checkValue(value);
		});
		this.element.value=value;
	},
	addListener: function(listener) {
		if(listener.checkValue && listener.dispose)
			this._listeners.push(listener);
	},
	dispose: function() {
		element.stopObserving('keyup', this._keyuphandler);
		this._listeners.invoke('dispose');
		this._listeners = [];
	}
});
ValueListener = Class.create( {
	checkValue : function(value) {
		return value;
	},
	dispose : function() {
	}
});
UnsignedIntValueListener = Class.create(ValueListener, {
	max : null,
	initialize: function(max) {
		max = parseInt(max, 10) || 0;
		if(max > 0)
			this.max = max;
	},
	checkValue: function(value) {
		if(this.max == null)
			return parseInt(value, 10) || 0;
		return Math.min(parseInt(value, 10) || 0, this.max);
	}
});
BasarStartAmountListener = Class.create(ValueListener, {
	initialize: function() {
		this.level = 0;
		this.set = 0;
		this._itemdrophandler = this.itemdrophandler.bindAsEventListener(this);
		document.observe('game:inventory:basar_item_dropped', this._itemdrophandler);
	},
	itemdrophandler: function(event) {
		var item = event.memo.curitem;
		this.level = item.level;
		this.set = (item.color == '00FF00') ? 2 : 1;
	},
	//wichtige Funktion, die von dem InputValueObserver aufgerufen wird
	checkValue: function(value) {
		var maxValue = (Math.pow(this.level, 3) * 5000) * this.set;
		var resources = [1, 1.125, 2.5, 5];
		var selRes = -1;
		$$('input[name="basar_input_general_tradegood_id"]').each(function(el) {
			if(el.checked == true)
				selRes = el.value;
		});
		if(selRes == -1)
			return 0;
		maxValue = Math.floor(maxValue / resources[selRes]);
		value = Math.min(value, maxValue);
		return Math.max(value, 0);
	},
	dispose: function() {
		try {
			document.stopObserving('game:inventory:basar_item_dropped', this._itemdrophandler);
		} catch(e) {}
	}
});
PayQuestionDialog = {
	lang : $H({ 
		question : 'bazar:start_question',
		cost : 'inventory:dialog:cost',
		mana : 'mana',
		or : 'or',
		ticks : 'bazar:click_on_hp',
		pay_rune : 'bazar:pay_rune',
		ok : 'inventory:Ok',
		abort: 'abort'
	}),
	values: $H({
		mana: 0,
		ticks: 0,
		rune: 0,
		free_runes: 0
	}),
	mana_path : '/xhodon/gfx/icons/mana.png',
	rune_path : '/xhodon/gfx/icons/runes.png',
	isShow : false,
	element : '',
	_dialogString : '',
	_diagDOM : null,
	_submitForm : '',
	show : function(outputElement, form, values, lang) {
		if(this._dialogString == '')
			this._buildDialog();

		if(this.isShow)
			this.hide();

		this.element = outputElement;
		this._submitForm = form;

		values = this.values.merge(values);
		lang = this.lang.merge(lang);
		
		var localizedLang = langManager.get(lang.values());

		var templateArray = $H();
		lang.each(function(pair) {
			templateArray.set('lang_'+pair[0], localizedLang.get(pair[1]));
		});
		values.each(function(pair) {
			templateArray.set('value_'+pair[0], pair[1]);
		});
		
		var template = new Template(this._dialogString);

		//Dialog erstellen
		if($('accept_dialog') == null)
		{
			/*
			 * this._diagDOM = new Element('div', {id:'accept_dialog', class:'dialogBox'});
			 * das geht beim ie nicht wegen dem 2. json param
			 * der param wird stattdessen kurz danach separat gesetzt
			 */
			
            this._diagDOM = new Element('div', {id:'accept_dialog'});
            document.body.appendChild(this._diagDOM);
            this._diagDOM.style.visibility='visible';
            this._diagDOM.hide();

            var ding = document.getElementById('accept_dialog');
            ding.setAttribute('class', 'dialogBox', 1);
		}

		this._diagDOM.innerHTML = template.evaluate(templateArray);
		if(this._dialog == null)
			this._dialog = new Dialog.Box('accept_dialog');

		this._diagDOM.show();
		this.isShow = true;
		return false;
	},
	hide : function() {
		if(this.isShow) {
			this._dialog.hide();
		}
	},
	_success: function() {
		var result = '';
		if($('diag_rune_cost').checked)
			result = 'runes';
		else
			result = 'mana';
		if(this.element != '') {
			var element = $(this.element);
			if(element == null)
				element = $$('input[name="'+this.element+'"]')[0];

			element.value = result;
		}

		if(this._submitForm != '')
			ajax_submit(this._submitForm, 0);
		this.hide();
	},
	_abort: function() {
		this.hide();
	},
	_buildDialog: function() {
		var diag = [];
		diag.push('<div class="top"></div>');
		diag.push('<form id="accept_formular" class="accept_formular">');
		diag.push('<div class="minheightHack_accsidech"></div>');
		diag.push('<table>');
		diag.push('<tr><td colspan="3">');
		diag.push('#{lang_question}<br />#{lang_cost}<br />');
		diag.push('<input type="radio" id="diag_mana_cost" name="cost" />');
		diag.push('#{value_mana} <img style="vertical-align:middle;" height="18" title="#{lang_mana}" alt="#{lang_mana}" src="'+this.mana_path+'" />#{lang_mana} (#{value_ticks} #{lang_ticks}) #{lang_or}<br />');
		diag.push('<input type="radio" id="diag_rune_cost" name="cost"  checked="checked" />');
		diag.push(' #{value_rune} <img style="vertical-align:middle;" height="18" src="'+this.rune_path+'" />#{lang_pay_rune} #{value_free_runes}</td>');
		diag.push('</tr><tr><td>');
		diag.push('<div class="stSubmitBtn" onClick="PayQuestionDialog._success();">#{lang_ok}</div>');
		diag.push('<div class="stSubmitBtn" onClick="PayQuestionDialog._abort();">#{lang_abort}</div>');
		diag.push('</td></tr></table>');
		diag.push('</form>');
		diag.push('<div class="bottom"></div>');
		this._dialogString = diag.join('');
	}
};

function teleport_transfer_all() {
	$$('span[transfer]').each( function(element) {
		var id = parseInt(element.getAttribute('transfer'));
		var textbox = $$('input[name="amount['+id+']"]')[0];
		if(textbox)
			textbox.value = element.innerHTML.replace(/\./g, "");
	});
	return false;
}

function abooks_action()
{
	$('ab_form').action = $('abooks').options[$('abooks').selectedIndex].value;
	
	return false;
}

function abooks_login(script)
{
	var aSetup = new Array(
			new Array("-","-",null),
			new Array("username","password","ad[service]=login&ad[server]=https://freemail.web.de"),
			new Array("Email","Passwd",null)
	);

	var index	= $('abooks').selectedIndex;
	
	if(index==0)
		return false;
	
	ajax_load(true);
	
	var url 	= $('ab_form').action;
	var user	= $('ab_form').ab_login.value;
	var passwd	= $('ab_form').ab_passwd.value;
	var post_params = "login_url="+url+"&"+aSetup[index][0]+"="+user+"&"+aSetup[index][1]+"="+passwd;
	if(isdefined(aSetup[index][2]))
		post_params += "&"+aSetup[index][2];
	
	var myRequest = new Ajax.Request(script,
					{
						method: 'post',
						parameters: post_params,
						onSuccess: ajax_handler
					});
	
	return false;
}

function ajax_fbs_click()
{
	u=location.href;
	t=document.title;
	window.open('http://www.facebook.com/sharer.php?u='+encodeURIComponent(u)+'&t='+encodeURIComponent(t),'sharer','toolbar=0,status=0,width=626,height=436');
	return false;
}

function input_only_numbers(el)
{
	if (isNaN(el.value)) {
		alert(el.value + " ist keine Zahl!");
		val = parseFloat(el.value);
		el.value = val;
	}
	return false;
}

function input_only_unsigned_int(el)
{
	val = parseInt(el.value);
	if (isNaN(val) || val<0) val='';
	el.value = val;
	return false;
}

function sumate_spent_points(inputId1,inputId2,inputId3,outputId,totalPoints)
{
	var val1 = parseInt(document.getElementById(inputId1).value);
	if (isNaN(val1)) val1=0;
	
	var val2 = parseInt(document.getElementById(inputId2).value);
	if (isNaN(val2)) val2=0;
	
	var val3 = parseInt(document.getElementById(inputId3).value);
	if (isNaN(val3)) val3=0;
	
	document.getElementById(outputId).innerHTML=totalPoints-(val1+val2+val3);
	
	return false;
}

function innerHTML_check(inputId,shouldBe,errorMessage)
{
	if (document.getElementById(inputId).innerHTML==shouldBe)
	{
		return true;
	}
	else
	{
		alert(errorMessage);
		return false;
	}
}


/*
 * -----------------------------------------------------------------------
 * getFreeDales() Gibt ein Array freier Täler von x - y zurück
 * @param: int x, int y
 * @return: array dales
 *
 * @author: Florian Palme <fptg@punkt16.de>
 * @since: 08.02.2010
 * @modified: -
 */
function getFreeDales(x, y)
{
	new Ajax.Request('/xhodon/admin/ajax/panel1_part1.php', {
		method : 'post',
		asynchronous : false,
		parameters : 'action=getZ&x=' + x + '&y=' + y,
		onSuccess: innerHtmlFreeDales
	});
}

/*
 * -----------------------------------------------------------------------
 *  updateFreeDales() Startet Täler-Abfrage und setzt zTarget
 *  @param: int x, int y, string target
 *  @return: null
 *  
 *  @author: Florian Palme <fptg@punkt16.de>
 *  @since: 08.02.2010
 *  @modified: -
 */
var zTarget;
function updateFreeDales(x, y, target)
{
	ajax_load(true);
	zTarget = target;
	var freeDales = getFreeDales(x, y);
}

/*
 * -----------------------------------------------------------------------
 *  innerHtmlFreeDales() Updatet das HTML, setzt Z-Koords rein :D
 *  @param: obj response
 *  @return: null
 *  
 *  @author: Florian Palme <fptg@punkt16.de>
 *  @since: 08.02.2010
 *  @modified: -
 */
function innerHtmlFreeDales(response)
{
	var output = response.responseJSON;
	
	document.getElementById(zTarget).innerHTML = output;
	
	ajax_load(false);
}

/*
 * -----------------------------------------------------------------------
 *  Gibt ID, Gesinnung sowie Meditations-Level eines Users aus...
 *  @param: string name
 *  @return: array user (id|gesinnung|meditationslevel)
 *  
 *  @author: Florian Palme <fptg@punkt16.de>
 *  @since: 09.02.2010
 *  @modified: -
 */
function getUserSideAndMeditateLvl(name)
{
	ajax_load(true);
	
	new Ajax.Request('/xhodon/admin/ajax/item_create.php', {
		method: 'post',
		asynchronous: false,
		parameters: 'action=getSideAndMeditateLvl&name=' + name,
		onSuccess: innerHtmlUserSideAndMeditateLvl
	});
}

/*
 * -----------------------------------------------------------------------
 *  Setzt das HTML im Admin-Bereich richtig...
 *  @param: json response
 *  @return: -
 *  
 *  @author: Florian Palme <fptg@punkt16.de>
 *  @since: 09.02.2010
 *  @modified: -
 */
function innerHtmlUserSideAndMeditateLvl(response)
{
	var data = response.responseJSON;
	
	if(data.alert == null)
	{
		var sideVal = 1;
		
		if(data.side == 'licht')
		{
			sideVal = 0;
		}
		
		selectOptionByValue('side', sideVal);
		document.item_create_form.lvl.value = data.meditatelvl;
	}
	else
	{
		alert(data.alert);
	}
	
	ajax_load(false);
}

/*
 * -----------------------------------------------------------------------
 *  Setzt ein Select-Feld eine bestimmte Option auf Selected :) Geht anderst nicht :/
 *  @param: string value
 *  @return: -
 *  
 *  @author: Florian Palme <fptg@punkt16.de>
 *  @since: 09.02.2010
 *  @modified: -
 */
function selectOptionByValue(id, value)
{
	var idx = document.getElementById(id);
	
	for(var i = 0; i < idx.options.length; i++)
	{
		if(idx.options[i].value == value)
		{
			idx.options[i].selected = true;
		}
		else
		{
			idx.options[i].selected = false;
		}
	}
}