function change_ticketstatus()
{
	if ( document.getElementById('ticket_status').value == '13' )
	{
		document.getElementById('no_version').disabled = false;
		document.getElementById('major_version').disabled = false;
		document.getElementById('minor_version').disabled = false;
		document.getElementById('patch_version').disabled = false;

		display_div('status_21', 'empty');
	}
	else if ( document.getElementById('ticket_status').value == '21' )
	{
		display_div('empty', 'status_21');
	}
	else
	{
		document.getElementById('no_version').disabled = true;
		document.getElementById('major_version').disabled = true;
		document.getElementById('minor_version').disabled = true;
		document.getElementById('patch_version').disabled = true;

		display_div('status_21', 'empty');
	}
}

function changelog_ausblenden(css_class)
{
	var divs = getElementsByClassName(css_class);

	for (var i = 0, j = divs.length; i < j; i++)
	{
		divs[i].style.display = "none";
	}
}

function changelog_einblenden(div)
{
	changelog_ausblenden('changelog_layerdiv');
	
	div = document.getElementById(div);
	
	if ( div.style.display=="none" )
	{
		div.style.display="inline";
	}
	else
	{
		div.style.display="none";
	}
}

function check_begruendung(frmname)
{
	if ( document.delete_question.message.value == '' )
	{
		alert("Es wurde keine Begründung angegeben !!!");
		document.delete_question.message.focus();
		return false;
	}
	else
	{
		return true;
	}
}

function check_module_update()
{
	var fm = document.module_update;

	if ( fm.ticket_status.value == '13' && fm.next_version[0].checked )
	{
		alert("Keine Versionsnummer ausgewählt");
		return false;
	}
}

function checkLoginForm()
{
	var frm = document.loginform;

	if ( frm.username.value == '' )
	{
		alert('Ohne Benutzername wird das nicht klappen :)');

//		frm.username.select();
//		frm.username.focus();
		return false;
	}

	if ( frm.password.value == '' )
	{
		alert('Kein Passwort eingegeben !!!');

//		frm.password.select();
//		frm.password.focus();
		return false;
	}
}

function create_scrolling_div(mode, scrollmode)
{
	//
	// facebook, wenn ende der seite, dann inhalt nachladen
	// onScroll="nextElements(\'' + scrollmode + '\');" 
	//

	if ( mode == 'normal' )
	{
		document.write('<div id="textblock" align="left" style="width: 98%; height: ' + ( myHeight - 140 ) + 'px; overflow: auto; border: 0px solid;">');
	}
	else if ( mode == 'ppa' )
	{
		document.write('<div id="textblock" align="left" style="width: 98%; height: ' + ( myHeight - 350 ) + 'px; overflow: auto; border: 0px solid;">');
	}
	else
	{
		document.write('<div id="textblock" align="left" style="width: 98%; height: 98%; overflow: auto; border: 0px solid;">');
	}
}

function display_div(hide,show)
{
	document.getElementById(hide).style.display = "none";
	document.getElementById(show).style.display = "";
}

function display_close(id)
{
	if (document.getElementById)
	{
		var mydiv = document.getElementById(id);
		mydiv.style.display = (mydiv.style.display!='none'?'none':'');
	}
}

function display_open(id)
{
	if (document.getElementById)
	{
		var mydiv = document.getElementById(id);
		mydiv.style.display = (mydiv.style.display=='none'?'':'none');
	}
}

function getElementsByClassName(strClass, strTag, objContElm)
{
	//
	// see http://muffinresearch.co.uk/archives/2006/04/29/getelementsbyclassname-deluxe-edition/
	//

	strTag = strTag || "*";
	objContElm = objContElm || document;
	var objColl = objContElm.getElementsByTagName(strTag);
	if (!objColl.length &&  strTag == "*" &&  objContElm.all) objColl = objContElm.all;
	var arr = new Array();
	var delim = strClass.indexOf('|') != -1  ? '|' : ' ';
	var arrClass = strClass.split(delim);

	for (var i = 0, j = objColl.length; i < j; i++)
	{
		var arrObjClass = objColl[i].className.split(' ');

		if (delim == ' ' && arrClass.length > arrObjClass.length) continue;

		var c = 0;
		comparisonLoop:

		for (var k = 0, l = arrObjClass.length; k < l; k++)
		{
		  	for (var m = 0, n = arrClass.length; m < n; m++)
			{
				if (arrClass[m] == arrObjClass[k]) c++;

				if (( delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length))
				{
					arr.push(objColl[i]);
					break comparisonLoop;
				}
			}
		}
	}

	return arr;
}

function get_myWidth()
{
	if ( window.innerWidth )
	{
		return window.innerWidth;
	}
	else if ( document.body && document.body.offsetWidth )
	{
		return document.body.offsetWidth;
	}
	else
	{
		return 0;
	}
}

function get_myHeight()
{
	if ( window.innerHeight )
	{
		return window.innerHeight;
	}
	else if ( document.body && document.body.offsetHeight )
	{
		return document.body.offsetHeight;
	}
	else
	{
		return 0;
	}
}

function initialize()
{
	return true;
}

function in_array(item,arr)
{
	for(p=0;p<arr.length;p++) if (item == arr[p]) return true;
	return false;
}

function marklist(id, name, state)
{
	var parent = document.getElementById(id);

	if (!parent)
	{
		eval('parent = document.' + id);
	}

	if (!parent)
	{
		return;
	}

	var rb = parent.getElementsByTagName('input');
	
	for (var r = 0; r < rb.length; r++)
	{	
		if (rb[r].name.substr(0, name.length) == name)
		{
			rb[r].checked = state;
		}
	}
}

function neuAufbau()
{
	if ( myHeight != get_myHeight() )
	{
		location.href = location.href;
	}
}

function nextElements(scrollmode)
{
	var element = document.getElementById('textblock');
	var height = element.scrollHeight;
	var scroll = element.scrollTop;

	var diff = height - scroll;

	// document.getElementById('showdebugtext').innerHTML = diff;

	if ( scrollmode == 'audis_firmen' && diff <= myHeight && global_block == false )
	{
		global_block = true;

		// appendNewElements();  --> siehe backup.js
	}
}

function privmsgs_ausblenden(css_class)
{
	var divs = getElementsByClassName(css_class);

	for (var i = 0, j = divs.length; i < j; i++)
	{
		divs[i].style.display = "none";
	}
}

function privmsgs_einblenden(div)
{
	privmsgs_ausblenden('privmsgs_layerdiv');
	
	div = document.getElementById(div);
	
	if ( div.style.display=="none" )
	{
		div.style.display="inline";
	}
	else
	{
		div.style.display="none";
	}
}

function setfocus()
{
	if (document.loginform)
	{
		document.loginform.username.focus();
	}
}

function serialize(mixed_value)
{
	// Returns a string representation of variable (which can later be unserialized)  
	// 
	// version: 1109.2015
	// discuss at: http://phpjs.org/functions/serialize	// +   original by: Arpad Ray (mailto:arpad@php.net)
	// +   improved by: Dino
	// +   bugfixed by: Andrej Pavlovic
	// +   bugfixed by: Garagoth
	// +	  input by: DtTvB (http://dt.in.th/2008-09-16.string-length-in-bytes.html)	// +   bugfixed by: Russell Walker (http://www.nbill.co.uk/)
	// +   bugfixed by: Jamie Beck (http://www.terabit.ca/)
	// +	  input by: Martin (http://www.erlenwiese.de/)
	// +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net/)
	// +   improved by: Le Torbi (http://www.letorbi.de/)	// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net/)
	// +   bugfixed by: Ben (http://benblume.co.uk/)
	// -	depends on: utf8_encode
	// %		  note: We feel the main purpose of this function should be to ease the transport of data between php & js
	// %		  note: Aiming for PHP-compatibility, we have to translate objects to arrays	// *	 example 1: serialize(['Kevin', 'van', 'Zonneveld']);
	// *	 returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'
	// *	 example 2: serialize({firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'});
	// *	 returns 2: 'a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}'

	var _utf8Size = function (str)
	{
			var size = 0,
			i = 0,
			l = str.length,
			code = '';
		for (i = 0; i < l; i++)
		{
			code = str.charCodeAt(i);
			if (code < 0x0080)
			{
				size += 1;
			}
			else if (code < 0x0800)
			{
				size += 2;
			}
			else
			{
				size += 3;
			}
		}
		return size;
	};

	var _getType = function (inp)
	{
		var type = typeof inp, match;
		var key; 
		if (type === 'object' && !inp)
		{
			return 'null';
		}
		if (type === "object")
		{
			if (!inp.constructor)
			{
				return 'object';
			}
			var cons = inp.constructor.toString();
			match = cons.match(/(\w+)\(/);
			if (match)
			{
				cons = match[1].toLowerCase();
			}
			var types = ["boolean", "number", "string", "array"];
			for (key in types)
			{
				if (cons == types[key])
				{
					type = types[key];
					break;
				}
			}
		}
		return type;
	};

	var type = _getType(mixed_value);
	var val, ktype = ''; 
	switch (type)
	{
		case "function":
			val = "";
			break;	case "boolean":
			val = "b:" + (mixed_value ? "1" : "0");
			break;
		case "number":
			val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;
			break;
		case "string":
			val = "s:" + _utf8Size(mixed_value) + ":\"" + mixed_value + "\"";
			break;
		case "array":	case "object":
			val = "a";

/*
			if (type == "object")
			{
				var objname = mixed_value.constructor.toString().match(/(\w+)\(\)/);
				if (objname == undefined)
				{
					return;
				}
				objname[1] = this.serialize(objname[1]);
				val = "O" + objname[1].substring(1, objname[1].length - 1);
			}
*/

			var count = 0;
			var vals = "";
			var okey;
			var key;
			for (key in mixed_value)
			{
				if (mixed_value.hasOwnProperty(key))
				{
					ktype = _getType(mixed_value[key]);
					if (ktype === "function")
					{
						continue;
					}
 
					okey = (key.match(/^[0-9]+$/) ? parseInt(key, 10) : key);
					vals += this.serialize(okey) + this.serialize(mixed_value[key]);
					count++;
				}
			}
			val += ":" + count + ":{" + vals + "}";
			break;	case "undefined":
			// Fall-through

		default:
			// if the JS object has a property which contains a null value, the string cannot be unserialized by PHP
			val = "N";		break;
	}

	if (type !== "object" && type !== "array")
	{
		val += ";";
	}	return val;
}

function unserialize(data)
{
	var that = this;
	var utf8Overhead = function (chr)
	{
		var code = chr.charCodeAt(0);

		if (code < 0x0080)
		{
			return 0;
		}

		if (code < 0x0800)
		{
			return 1;
		}
	
	        return 2;
	};

	var error = function (type, msg, filename, line)
	{
		throw new that.window[type](msg, filename, line);
	};

	var read_until = function (data, offset, stopchr)
	{
		var buf = [];
		var chr = data.slice(offset, offset + 1);
		var i = 2;

		while (chr != stopchr)
		{
			if ((i + offset) > data.length)
			{
				error('Error', 'Invalid');
			}

			buf.push(chr);
			chr = data.slice(offset + (i - 1), offset + i);
			i += 1;
		}

		return [buf.length, buf.join('')];
	};

	var read_chrs = function (data, offset, length)
	{
		var buf;
		buf = [];

		for (var i = 0; i < length; i++)
		{
			var chr = data.slice(offset + (i - 1), offset + i);
			buf.push(chr);
			length -= utf8Overhead(chr);
		}

		return [buf.length, buf.join('')];
	};

	var _unserialize = function (data, offset)
	{
		var readdata;
		var readData;
		var chrs = 0;
		var ccount;
		var stringlength;
		var keyandchrs;
		var keys;
 
		if (!offset)
		{
			offset = 0;
		}

		var dtype = (data.slice(offset, offset + 1)).toLowerCase();
 
		var dataoffset = offset + 2;

		var typeconvert = function (x)
		{
			return x;
		};
 
		switch (dtype)
		{
			case 'a':
				readdata = {};
				keyandchrs = read_until(data, dataoffset, ':');
				chrs = keyandchrs[0];
				keys = keyandchrs[1];
				dataoffset += chrs + 2;
				for (var i = 0; i < parseInt(keys, 10); i++)
				{
					var kprops = _unserialize(data, dataoffset);
					var kchrs = kprops[1];
					var key = kprops[2];
					dataoffset += kchrs;
					var vprops = _unserialize(data, dataoffset);
					var vchrs = vprops[1];
					var value = vprops[2];
					dataoffset += vchrs;
					readdata[key] = value;
				}
				dataoffset += 1;
			break;

			case 'b':
				typeconvert = function (x)
				{
					return parseInt(x, 10) !== 0;
				};
				readData = read_until(data, dataoffset, ';');
				chrs = readData[0];
				readdata = readData[1];
				dataoffset += chrs + 1;
			break;

			case 'd':
				typeconvert = function (x)
				{
					return parseFloat(x);
				};
				readData = read_until(data, dataoffset, ';');
				chrs = readData[0];
				readdata = readData[1];
				dataoffset += chrs + 1;
			break;

			case 'i':
				typeconvert = function (x)
				{
					return parseInt(x, 10);
				};
				readData = read_until(data, dataoffset, ';');
				chrs = readData[0];
				readdata = readData[1];
				dataoffset += chrs + 1;
			break;

			case 'n':
				readdata = null;
			break;

			case 's':
				ccount = read_until(data, dataoffset, ':');
				chrs = ccount[0];
				stringlength = ccount[1];
				dataoffset += chrs + 2;
				readData = read_chrs(data, dataoffset + 1, parseInt(stringlength, 10));
				chrs = readData[0];
				readdata = readData[1];
				dataoffset += chrs + 2;
				if (chrs != parseInt(stringlength, 10) && chrs != readdata.length)
				{
					error('SyntaxError', 'String length mismatch');
				}
				readdata = that.utf8_decode(readdata);
			break;

			default:
				error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype);
			break;
		}

		return [dtype, dataoffset - offset, typeconvert(readdata)];
	};
 
	return _unserialize((data + ''), 0)[2];
}
