function absLeft(el) {
	return (el.offsetParent) ? el.offsetLeft + absLeft(el.offsetParent) : el.offsetLeft;
}
function absTop(el) {
	return (el.offsetParent) ? el.offsetTop + absTop(el.offsetParent) : el.offsetTop;
}

function makeArray() {
    for (i = 0; i < makeArray.arguments.length; i++)
        this[i] = makeArray.arguments[i];
}

function miscWindow(url, name, width, height, param) {
	
	if(param != '') {
		param = '?param=' + param;
	}

	window.open(url + param, name, 'width=' + width + ', height=' + height + ', titlebar=yes, directories=no, location=no, dependent=yes, resizable=yes, scrollbars=yes, status=no, toolbar=no, menubar=yes');
	
	return;
}

function printWindow(url) {

	window.open(url, 'printWindow', 'width=640, height=480, titlebar=yes, directories=no, location=no, dependent=yes, resizable=no, scrollbars=yes, status=no, toolbar=no, menubar=no');
	
	return;
}

function showAddress(address) {
  	if (GBrowserIsCompatible()) {
    var geocoder = new GClientGeocoder();
	geocoder.getLatLng(address, 
	function(point) {	
		if (point) {
			var map = new GMap2(document.getElementById('google_map'));
		    map.addControl(new GSmallMapControl());
			map.addControl(new GMapTypeControl());
			map.setCenter(point, 13);
			var marker = new GMarker(point);
			map.addOverlay(marker);
			marker.openInfoWindowHtml(address);
			}
		});
    }
}

function Calendar(datfield) {

	this.y2k = function(number) {
	
		return (number < 1000) ? number + 1900 : number;
	}
	
	this.fillDat = function()  {
	
	    this.month++;
	    
	    var strDay = this.day.toString();
	    var strMonth = this.month.toString();
	
	    if(strMonth.length < 2)
	    	strMonth = '0' + strMonth;
	    if(strDay.length < 2)
	    	strDay = '0' + strDay;
	    	
	    document.getElementById(this.datfield).value = strDay + '.' + strMonth + '.' + this.year;
	}
	
	this.changeDay = function(day) {
	    this.day = day;
	    this.fillDat();
	    this.hide();
	}

	this.changeMonth = function(month) {
	    this.month = month;
	    this.reload();
	}
	
	this.changeYear = function(year) {
	    this.year = year;
	    this.reload();
	}
	
	this.reload = function() {
		this.window.innerHTML = this.content(this.month, this.year);
		this.bug(true);	
	}
	
	this.hide = function() {
		if(this.window != null) {
			this.bug(false);
			this.window.style.visibility = 'hidden';
			this.window.innerHTML = '';
		}
	}
	
	this.content = function(month, year) {

		var output = '';
	   
	    output += '<table width="100%" align="center" border="0" cellpadding="0" cellspacing="0" class="calendar"><tr><td align="center" width="50%" class="calendarheader" nowrap="nowrap">' + this.names[month] + ' ' + year + '</td><td width="50%" align="center" class="calendarheader"><table align="center" border="0" cellpadding="0" cellspacing="0"><tr><td>';
	    
	    output += '<select name="month" onchange="javascript:self.calendar.changeMonth(this.value);" style="visibility:hidden;">';
	
	    for (m = 0; m < 12; m++) {
	        if (m == month) {
	        	output += '<option value="' + m + '" selected>' + this.names[m] + '</option>';
	        }
	        else {
	        	output += '<option value="' + m + '">' + this.names[m] + '</option>';
	        }
	    }
	
	    output += '</select></td><td><select name="year" onchange="javascript:self.calendar.changeYear(this.value);" style="visibility:hidden;">';
	
	    var today = new Date();
	    
	    var ycurrent = today.getYear();
	    if (ycurrent < 1000) {
			ycurrent += 1900;
	    }
	    
	    var ystart = today.getYear() - 70;
		if (ystart < 1000) {
			ystart += 1900;
	    }
	    
	    var yend = today.getYear() + 5;
	    if (yend < 1000) {
			yend += 1900;
	    }
	    
	    for (y = ystart; y < yend; y++) {
	    	if (y == year) {
	    		output += '<option value="' + y + '" selected>' + y + '</option>';
	    	}
	        else {
	        	output += '<option value="' + y + '">' + y + '</option>';
	        }
	    }
	
	    output += '</select></td></tr></table></td></tr><tr><td colspan="2" align="center" valign="middle">';
	
	    firstDay = new Date(year, month, 1);
	    startDay = firstDay.getDay() -1 ;
	    if (startDay < 0)
			startDay = 6;
	
	    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
	    	this.days[1] = 29;
		}
	    else {
	    	this.days[1] = 28;
	    }
	
	    output += '<table align="center" cellspacing="0" cellpadding="0" border="0"><tr>';
	
	    for (i = 0; i < 6; i++)
	        output += '<td align="center" valign="middle" width="30" height="30">' + this.dow[i] +'</td>';
	
		// Sunday...
	    output += '<td align="center" valign="middle" width="30" height="30">' + this.dow[i] +'</td>';
	
	    output += '</tr><tr>';
	
	    var column = 0;
	    var lastMonth = month - 1;
	    if (lastMonth == -1) lastMonth = 11;
	
	    for (i = 0; i < startDay; i++, column++)
	        output += '<td align="center" valign="middle" width="30" height="30">' + (this.days[lastMonth] - startDay + i + 1) + '</td>';

		/*
	    for (i = 0; i < startDay; i++, column++)
	        output += '<td align="center" valign="middle" width="30" height="30" />';
		*/
		
		for (i = 1; i <= this.days[month]; i++, column++) {
			if (i == today.getDate() && (month == today.getMonth()) && (year == ycurrent)) {
				// Today... 
				output += '<td align="center" valign="middle" width="30" height="30" class="calendarheader" style="padding:0px;font-weight:bold;">' + '<a href="javascript:self.calendar.changeDay(' + i + ');">' + i + '</a>' +'</td>';
			}
			else {
				output += '<td align="center" valign="middle" width="30" height="30" style="font-weight:bold;">' + '<a href="javascript:self.calendar.changeDay(' + i + ');">' + i + '</a>' +'</td>';
			}
			if (column == 6) {
				output += '</tr><tr>';
				column = -1;
			}
		}
	
	    if (column > 0) {
	        for (i = 1; column <= 6; i++, column++) {
	        	output += '<td align="center" valign="middle" width="30" height="30">' + i + '</td>';
	        }
	        /*
	        for (i = 1; column <= 6; i++, column++) {
	        	output += '<td align="center" valign="middle" width="30" height="30" />';
	        }
	        */
	    }
	    
	    output += '</tr></table></td></tr>';
	    
	    output += '<tr><td colspan="2" align="center" valign="middle" style="padding:5px;font-weight:bold;"><a href="javascript:self.calendar.hide()">Schlie&szlig;en</a></td></tr>';
	
	    output += '</table>';
	
	    return output;
	}
	
	this.bug = function(show) {
		
		var shimWindow = document.getElementById('shim');
		
		if(show && this.window.style.visibility == 'visible') {
			shimWindow.style.zIndex = this.window.style.zIndex - 1;
			shimWindow.style.width = parseInt(this.window.offsetWidth) + 'px';
			shimWindow.style.height = parseInt(this.window.offsetHeight) + 'px';
			shimWindow.style.top = parseInt(this.window.style.top) + 'px';
			shimWindow.style.left = parseInt(this.window.style.left) + 'px';
			
			this.window.getElementsByTagName('select')[0].style.visibility = 'visible';
			this.window.getElementsByTagName('select')[1].style.visibility = 'visible';
			
			shimWindow.style.visibility = 'visible';
		}
		else {
			shimWindow.style.visibility = 'hidden';
		}
		
		/*
		if(this.window.style.visibility == 'visible') {
			var offsetWidth = parseInt(this.window.offsetWidth);
			var offsetHeight = parseInt(this.window.offsetHeight);
			var selects = document.getElementsByTagName('select');
			for(var i = 0; i < selects.length; i++) {
				var left = absLeft(selects[i]);
				var top = absTop(selects[i]);
				if(top >= parseInt(this.window.style.top) && top <= parseInt(this.window.style.top) + offsetHeight && left >= parseInt(this.window.style.left) && left <= parseInt(this.window.style.left) + offsetWidth) {
					if(show) {
						selects[i].style.visibility = 'hidden';
					}
					else {
						selects[i].style.visibility = 'visible';
					}
				}
			}
			if(show) {
				this.window.getElementsByTagName('select')[0].style.visibility = 'visible';
				this.window.getElementsByTagName('select')[1].style.visibility = 'visible';
			}
			else {
				this.window.getElementsByTagName('select')[0].style.visibility = 'hidden';
				this.window.getElementsByTagName('select')[1].style.visibility = 'hidden';
			}
		}
		*/
	}
	
	self.calendar = this;
	closeWindows();
	
	this.datfield = datfield;
	this.today = new Date();
	this.day   = this.today.getDate();
	this.month = this.today.getMonth();
	this.year = this.y2k(this.today.getYear());
	this.window = document.getElementById('calendar');
	this.target = document.getElementById(this.datfield).parentNode;
	this.names = new makeArray('Januar', 'Februar', 'M&auml;rz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember');
	this.days = new makeArray(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	this.dow = new makeArray('Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So');
	
	this.window.style.zIndex = this.target.style.zIndex + 2;
	this.window.style.top = absTop(this.target) + 'px';
	this.window.style.left = absLeft(this.target.parentNode) + 'px';
	this.window.style.visibility = 'visible';

	this.reload();
}

function bugMultiSelect(show) {
	
	var multiSelectWindow = document.getElementById('multiSelect');
	var shimWindow = document.getElementById('shim');

	if(show && multiSelectWindow.style.visibility == 'visible') {
		shimWindow.style.zIndex = multiSelectWindow.style.zIndex - 1;
		shimWindow.style.width = parseInt(multiSelectWindow.offsetWidth) + 'px';
		shimWindow.style.height = parseInt(multiSelectWindow.offsetHeight) + 'px';
		shimWindow.style.top = parseInt(multiSelectWindow.style.top) + 'px';
		shimWindow.style.left = parseInt(multiSelectWindow.style.left) + 'px';
		shimWindow.style.visibility = 'visible';
	}
	else {
		shimWindow.style.visibility = 'hidden';
	}
	
	/*
	var multiSelectWindow = document.getElementById('multiSelect');
	
	if(multiSelectWindow.style.visibility == 'visible') {
		var selects = document.getElementsByTagName('select');
		for(var i = 0; i < selects.length; i++) {
			var left = absLeft(selects[i]);
			var top = absTop(selects[i]);
			if(top >= parseInt(multiSelectWindow.style.top) && top <= parseInt(multiSelectWindow.style.top) + multiSelectWindow.offsetHeight && left >= parseInt(multiSelectWindow.style.left) && left <= parseInt(multiSelectWindow.style.left) + multiSelectWindow.offsetWidth) {
				if(show) {
					selects[i].style.visibility = 'hidden';
				}
				else {
					selects[i].style.visibility = 'visible';
				}
			}
		}
	}
	*/
}

function showMultiSelect(maxWidth, maxHeight, target, offset) {

	//var multiSelectLabel = multiSelectValues[2];
	var multiSelectHeaders = multiSelectValues[3];
	var multiSelectRows = multiSelectValues[4];
	var window = document.getElementById('multiSelect');
	var output = '';

	window.style.width = '0px';
	window.style.height = '0px';

	if(target == null) {
		target = document.getElementById(multiSelectCurrentField);
	}
	
	if(offset == null) {
		offset = 0;
	}

	closeWindows();

	output += '<table id="multiSelectTable" width="100%" align="center" border="0" cellpadding="0" cellspacing="0" class="formbody">';
	/*
	output += '<tr>';
	output += '<td align="left" valign="top" class="headlinesmall">';
	output += multiSelectLabel;
	output += '</td>';
	output += '</tr>';
	output += '<tr>';
	*/
	output += '<td align="left" valign="top">';
	output += '<table width="100%" align="center" border="0" cellpadding="0" cellspacing="0" class="formcontent">';
	
	output += '<tr>';
	output += '<td style="padding-right:10px;" class="formtitle"><a href="javascript:hideMultiSelect();" style="color:#FF0000;text-decoration:none;font-weight:bold;">Schlie&szlig;en</a></td>';
	for(var u = 0; u < multiSelectHeaders.length; u++) {
			output += '<td nowrap="nowrap" class="formtitle"><b>' + multiSelectHeaders[u] + '</b></td>'
	}
	output += '</tr>';
	
	for(var i = 0; i < multiSelectRows.length; i++) {
		output += '<tr>';
		output += '<td style="padding-right:10px;" class="forminfo"><a href="javascript:fillMultiSelect(' + i + ');hideMultiSelect();" style="color:#FF0000;text-decoration:none;font-weight:bold;">Ausw&auml;hlen</a></td>';
		for(var j = 0; j < multiSelectRows[i].length; j++) {
			output += '<td nowrap="nowrap" class="forminfo">' + multiSelectRows[i][j] + '</td>';
		}
		output += '</tr>';
	}
	
	output += '</table>';
	output += '</td>';
	output += '</tr>';
	output += '</table>';

	window.style.zIndex = target.style.zIndex + 2;
	window.style.top = (absTop(target) + offset) + 'px';
	window.style.left = (absLeft(target) + offset) + 'px';
	window.innerHTML = output;	
	window.style.width = Math.min(parseInt(document.getElementById('multiSelectTable').offsetWidth) + 25, maxWidth) + 'px';
	window.style.height = Math.min(parseInt(document.getElementById('multiSelectTable').offsetHeight) + 25, maxHeight) + 'px';
	window.style.visibility = 'visible';
	
	bugMultiSelect(true);
}

function hideMultiSelect() {
	
	var multiSelectWindow = document.getElementById('multiSelect');
	if(multiSelectWindow != null) {
		bugMultiSelect(false);
		multiSelectWindow.style.visibility = 'hidden';
		multiSelectWindow.innerHTML = '';
	}
}

function windowUnload() {
	
	closeWindows();
}

function closeWindows() {
	
	if(self.calendar != null && self.calendar.hide != null) {
		self.calendar.hide();
	}
	hideMultiSelect();
}

var multiSelectCurrentTable = null;
var multiSelectCurrentField = null;
var multiSelectValues = null;

window.onunload = windowUnload;