var Utils = {};
Utils.PeriodicalFunction = function(ainterval, afunction) {
	this.func = afunction;
	this.period = ainterval || 1000;
	this.run();
}
Utils.PeriodicalFunction.prototype.run = function() {
	this.func();
	var that = this;
	window.setTimeout(function() {that.run()}, this.period);
}

Utils.getChecked = function(aformname, aelname, acheck, ignore_disabled) {
	if (!ignore_disabled) ignore_disabled = false;
	var el = document.forms[aformname].elements[aelname];
	var arr = [];
	if (!el.length) {
		if (el.checked == acheck && !(ignore_disabled && el.disabled)) {
			arr.push(el);
		}
	}
	else for(var i = 0; i < el.length; i++) {
		if (el[i].checked == acheck && !(ignore_disabled && el[i].disabled)) {
			arr.push(el[i]);
		}
	}
	return arr;
}
Utils.checkAll = function(aformname, aelname, acheck, ignore_disabled) {
	var arr = Utils.getChecked(aformname, aelname, !acheck, ignore_disabled);
	for(var i = 0; i < arr.length; i++) arr[i].checked = acheck;
	return arr;
}
Utils.collectProperty = function(arr, property) {
	var arr2 = [];
	for(var i = 0; i < arr.length; i++) {
		arr2.push(arr[i][property]);
	}
	return arr2;
}

Utils.getType = function(value) {
	var type = typeof value;
	switch (type) {	
		case 'string':
			return type;
		case 'object': 
			if (value.constructor == Array) return 'array';
			return 'object';
		default:
			return type;
	}
}

Utils.each = function(arr, func) {
	if (arr.constructor == Array) {
		for(var i = 0; i < arr.length; i++) func(arr[i], i);
	}
	else {
		for(var i in arr) func(arr[i], i);
	}
}
Utils.array_pick = function(arr, keys, nonempty) {
	var arr2 = {};
	for(var i = 0; i < keys.length; i++) {
		if (!nonempty || arr[keys[i]])
			arr2[keys[i]] = arr[keys[i]];
	}
	return arr2;
}
Utils.array_keys = function(arr) {
	var arr2 = [];
	Utils.each(arr, function(item, key) {
		arr2.push(key);
	});
	return arr2;
}
Utils.in_array = function(what, arr) {
	for(var i = 0; i < arr.length; i++) {
		if (what == arr[i]) return true;
	}
	return false;
}


if (window.GControl) {
Utils.GHtmlControl = Class.create();
Utils.GHtmlControl.prototype = Object.extend(new GControl(), {
	initialize: function(innerHTML, opt) {
		this.initialize = this.initialize_GMap;
		this.innerHTML = innerHTML;
	},
	initialize_GMap: function(map) {
		var container = document.createElement("div");
		container.innerHTML = this.innerHTML;
		map.getContainer().appendChild(container);
		return container;	
	}
});
}

Utils.GMapEventHandler = function(map, fn) {
	var that = this;
	var infoWindow = map.getInfoWindow();
	var events = [
		{event: 'closeclick', object: infoWindow},
		{event: 'maximizeclick', object: infoWindow},
		{event: 'maximizeend', object: infoWindow},
		{event: 'restoreclick', object: infoWindow},
		{event: 'restoreend', object: infoWindow},
		{event: 'infowindowopen', object: map},
		{event: 'infowindowbeforeclose', object: map},
		{event: 'infowindowclose', object: map}
	];
	
	events.each(function(a) {
		that[a.event] = (fn && fn[a.event]) ? fn[a.event] : function() {};
		GEvent.addListener(a.object, a.event,  function() {
			if (that[a.event]) that[a.event]();
		});
	});
}

Utils.VerticalScroller = function(ainterval, divtxt, pic1txt, pic2txt) {
	var period = ainterval || 500;
	var myDiv = document.getElementById(divtxt);
	if (myDiv.scrollHeight <= myDiv.offsetHeight) return;
	var pic2 = document.getElementById(pic2txt);
	pic2.innerHTML = document.getElementById(pic1txt).innerHTML;
	var myDivScrollTop;
	var picMarquee = function() {
		if(pic2.offsetHeight - myDiv.scrollTop <= 0){
			myDiv.scrollTop = 0;
		}else{
			myDivScrollTop = myDiv.scrollTop;
			myDiv.scrollTop++;
			if(myDivScrollTop == myDiv.scrollTop)
				myDiv.scrollTop =0;
		}
	}
	var timer = window.setInterval(picMarquee, period);
	myDiv.onmouseover = function() {
		window.clearInterval(timer);
	}
	myDiv.onmouseout=function() {
		timer = window.setInterval(picMarquee, period);
	}
}

Utils.getDivDimension = function(div) {
	var visibility = div.style.visibility;
	div.style.visibility = 'hidden';
	var display = div.style.display;
	div.style.display = 'block';
	var dimensions = {
		width: div.offsetWidth,
		height: div.offsetHeight
	}
	div.style.visibility = visibility || 'visible';
	div.style.display = display || 'block';
	return dimensions;
}

Utils.setBackgroundFrame = function(div) {
	if (!div._iframe) {
		var iframe = $(document.createElement('iframe'));
		var haveHeight = parseInt(div.style.height);
		if (!haveHeight) dimensions = Utils.getDivDimension(div);
		Element.setStyle(iframe, {
			position: 'absolute',
			width: '100%',
			height:  haveHeight ? '100%' : (dimensions.height - parseInt(div.style.borderBottomWidth) - parseInt(div.style.borderTopWidth)) + 'px',
			border: '0px',
			padding: '0px',
			margin: '0px',
			background: '#FFFFFF',
			left: '0px',
			top: '0px',
			zIndex: '-1'
		});
		iframe.setAttribute("frameBorder","0");
		div.appendChild(iframe);
		div._iframe = true;
		if (!haveHeight) {
			Event.observe(div, 'resize', function() {
				iframe.style.height = (div.offsetHeight - parseInt(div.style.borderBottomWidth) - parseInt(div.style.borderTopWidth)) + 'px';
			});
		}
	}
}

Utils.now = function() {
	return (new Date().getTime());
}
Utils.getTime = function(time, unit) {
	if (unit == 's') return Math.round(time / 1000);
	return '';
}
