<!--
/// Universal functions, not related to the specific site.

var ie = false;
var msPerDay = 86400000;
var page_submitted = false;
if(document.uniqueID) ie = true;

var dictionary = {};
var bbcodes = [
	{search: new RegExp(/\[url=([a-z0-9.:&?\/\-@]+)\]/ig), text: "<a href=\"$1\" target=\"blank\">"},
	{search: new RegExp(/\[\/url\]/ig), text: "</a>"},
	{search: new RegExp(/\[br\]/ig), text: "<br/>\r\n"}
];

/// show message in popup alert
function ShowMessage(message)
{
	if(message && message.length) {
		if(dictionary[message]) message = dictionary[message].text; // try to translate message
		message = message.replace(/\[br\]/g,'\n'); /// replace linebreak command with real linebreak
		alert(message);
	}
}

/// show confirm question in popup
function Confirm(message)
{
	if(message && message.length) {
		if(dictionary[message]) message = dictionary[message].text; // try to translate message
		message = message.replace(/\[br\]/g,'\n'); /// replace linebreak command with real linebreak
		return confirm(message);
	}

	return false;
}

/// Extract a form input contains 'YYYY-MM-DD' string into separated input fields.
/// Parameters:
///  form: FORM object, contains search and destination <input fields
///  basename: string, date basename
///  timetoo: boolean, if true process time too (HH:MM)
function ExtractSQLDate(basename, timetoo)
{
	if(!form || !form[basename]) return;
	var datetime = form[basename].value.split(' ');

	// process date
	var date = datetime[0].split('-');
	if(date.length == 3) {
		SetInput(basename+'_year', date[0]);
		SetInput(basename+'_month', date[1]);
		SetInput(basename+'_day', date[2]);
	} else {
		ClearInputs(basename+'_year', basename+'_month', basename+'_day');		
	}

	// process time
	if(timetoo && datetime[1]) {
		var time = datetime[1].split(':');
		if(time.length >= 2) {
			SetInput(basename+'_hour', time[0]);
			SetInput(basename+'_minute', time[1]);
		} else {
			ClearInputs(basename+'_hour', basename+'_minute');
		}
	}
}

/// Compile an YYYY-MM-DD' string from separated input fields (_year...) into one.
/// Parameters:
///  form: FORM object, contains source and destination <input fields
///  basename: string, date basename
///  timetoo: boolean, if true process time too (HH:MM)
function CreateSQLDate(basename, timetoo)
{
	if(!form) return;
	
	if(form[basename+'_day'].value.length == 1) form[basename+'_day'].value = '0'+form[basename+'_day'].value;
	form[basename].value = form[basename+'_year'].value+'-'+form[basename+'_month'].value+'-'+form[basename+'_day'].value;

	// process time
	if(timetoo) form[basename].value += ' '+form[basename+'_hour'].value+':'+form[basename+'_minute'].value;

	// if the result smaller than 5 chars (x-x-x) then the result will be an empty string
	if(form[basename].value.length < 5) form[basename].value = '';
}

/// Clear input fields contents (value).
/// Parameters:
///  form: FORM object, contains the <input fields
///  string list: strings, input fields name
function ClearInputs()
{
	if(!form) return;

	for(i=0; i<arguments.length; i++) {
		var input = form[arguments[i]];
		if(input) {
			if(input.type == 'checkbox') input.checked = false;
			else input.value = '';
		}
	}
}

/// Set an <input value.
function SetInput(name, value)
{
	if(form && form[name]) form[name].value = value;
}

/// Disable/enable an <input.
function DisableInput(name, status)
{
	if(form && form[name]) form[name].disabled = status;
}

/// Get an <input value.
function GetInput(name)
{
	if(form && form[name]) return form[name].value;
}

/// Get an <input value length.
function InputLength(name)
{
	return GetInput(name).length;
}

/// we allow only integers (0-9)
function OnKeyInteger(event)
{
	var code;
	if(window.event) code = window.event.keyCode; //IE
	else code = event.charCode;

	if(
		code < 32 || // control char
		code == 63272 || // delete - safari
		code == 63234 || // left arrow - safari 
		code == 63235 || // right arrow - safari
		(code >= 48 && code <= 57 )
	) return true;
	
	return false;
}

/// we allow only float numbers (0-9.)
function OnKeyFloat(event)
{
	var code;
	if(window.event) code = window.event.keyCode; //IE
	else code = event.charCode;

	if(
		code < 32 || // control char
		code == 63272 || // delete - safari
		code == 63234 || // left arrow - safari 
		code == 63235 || // right arrow - safari
		(code >= 48 && code <= 57) ||
		code == 46
	) return true;
	
	return false;
}

/// Scroll to an input field.
/// Parameters:
///  name: string, name of the input field
function ScrollTo(name)
{
	if(!name.length) return;
	
	// search INPUT fields
	var objs = document.body.getElementsByTagName('INPUT');
	for(var i=0; i<objs.length; i++)
		if(objs[i].name == name)
		{
			window.scrollTo(0,GetObjectPosY(objs[i])-100);
			objs[i].focus();
			return;
		}

	// search SELECT fields
	objs = document.body.getElementsByTagName('SELECT');
	for(var i=0; i<objs.length; i++)
		if(objs[i].name == name)
		{
			window.scrollTo(0,GetObjectPosY(objs[i])-100);
			objs[i].focus();
			return;
		}
}

/// Get document (frame) real size.
/// Based on "http://www.quirksmode.org/" inner width script.
/// Return value: array(width : x, height : y)
function GetDocumentSize()
{
	var size = {};
	var x,y;
	
	// all except Explorer
	if (self.innerHeight) {
		size.width = self.innerWidth;
		size.height = self.innerHeight;
	}

	// Explorer 6 Strict Mode	
	else if (document.documentElement && document.documentElement.clientHeight) {
		size.width = document.documentElement.clientWidth;
		size.height = document.documentElement.clientHeight;
	}

	// other Explorers
	else if (document.body) {
		size.width = document.body.clientWidth;
		size.height = document.body.clientHeight;
	}
	
	return size;
}

/// Get an object size on the page.
function GetElementSize(obj)
{
	var size = {}
	size.width = 0;
	size.height = 0;
	
	if(obj) {
		if(obj.offsetHeight) size.height = obj.offsetHeight;
		if(obj.offsetWidth) size.width = obj.offsetWidth;	
	}

	return size;
}

/// Get an object real position on the page.
/// Based on "http://www.quirksmode.org/" script.
/// Parameters:
///  obj: object
/// Return value: array(x : left, y : top)
function GetElementPosition(obj) 
{
	var pos = {};
	pos.x = 0;
	pos.y = 0;

	if (obj.offsetParent) {
		pos.x = obj.offsetLeft
		pos.y = obj.offsetTop
		while (obj = obj.offsetParent) {
			pos.x += obj.offsetLeft
			pos.y += obj.offsetTop
		}
	}

	return pos;
}

/// Find a rule from a linked CSS file.
/// Return value: rule object or null
function FindLinkedCSSRule(selector)
{
	var rules = [];
	
	// search for the given selector
	for(var s=0; s<document.styleSheets.length; s++) {
		if(document.styleSheets[s].rules) rules = document.styleSheets[s].rules;
		else if(document.styleSheets[s].cssRules) rules = document.styleSheets[s].cssRules;
		for(var r=0; r<rules.length; r++) {
			if(rules[r].selectorText == selector) return rules[r];
		}
	}

	return null;
}

/// Init a callback to a function called on an event (different in IE/Mozilla),
function InitCallback(obj,type,funct){
	//IE, Opera
	if(obj.attachEvent)
		obj.attachEvent('on'+type,funct);
		
	//Safari, Mozilla
	else if(obj.addEventListener)
 		obj.addEventListener(type,funct,true);
}

/// Destroy callback (different in IE/Mozilla).
function DestroyCallback(obj,type,funct)
{
	//IE, Opera
	if(obj.detachEvent)
		obj.detachEvent('on'+type,funct);
	
	//Safari, Mozilla
	else if(obj.removeEventListener)
		obj.removeEventListener(type,funct,true);
}

/// search a value in an array
function array_search(arr, value)
{
	for(var i in arr)
		if(arr[i] == value) return true;

	return false;
}

/// get number of days in the given month
function getDaysPerMonth(month, year)
{
	var days_per_month = [31,28,31,30,31,30,31,31,30,31,30,31];
	month = month.valueOf()-1
	var days = days_per_month[month];
	
	// leap year count
	if(
		month == 1 &&
		(year || year.length)
	) {
		year = year.valueOf();		

		if(
			(year%400 == 0) || 
			((year%4 == 0) && (year%100 != 0))
		) days++;
	}

	return days;
}

/// Validate date and time.
var date_flag_no_past_date = 1;
var date_flag_time_too = 2;
function isValidDate(form, basename, flag)
{
	var year = form[basename+'_year'].value;
	var month = form[basename+'_month'].value;
	var day = form[basename+'_day'].value;
	if(flag & date_flag_time_too) {
		var hour = form[basename+'_hour'].value;
		var minute = form[basename+'_minute'].value;
	}

	// check full empty field
	if(
		(!(flag & date_flag_time_too) && !year.length && !day.length && !month.length) ||
		(flag & date_flag_time_too && !year.length && !day.length && !month.length && !hour.length && !minute.length)
	) return 1;

	// check 'no past date' option
	if(flag == date_flag_no_past_date) {
		var date = new Date(year, month-1, day);
		var now = new Date();
		now.setHours(0,0,0,0);
		if(date.getTime() < now.getTime()) return 0;
	}

	// check valid day
	if(
		!year.length || !month.length || !day.length ||
		day > getDaysPerMonth(month, year) || day < 1
	) return 0;

	// check valid time
	if(
		flag & date_flag_time_too &&
		(!hour.length || !minute.length ||
		hour < 0 || hour > 23 || minute < 0 || minute > 59)
	) return 0;
	
	return 1;
}

var included_js_files = [];
/// Include (load) an external javascript file.
/// Based on: http://www.phpied.com/javascript-include/
function IncludeJSFile(filename)
{
	// check if it is already included
	for(var i in included_js_files)
		if(included_js_files[i] == filename) return;
	included_js_files.push(filename);

	// create new DOM element
	var element = document.createElement('script');
	element.type = "text/javascript";
	element.src = filename;

	// append it to the <head
	var head = document.getElementsByTagName('head').item(0);
	if(head) head.appendChild(element);
}


var dtt_regexp = new RegExp(/\%([a-z0-9_]*)\%/ig);
var bbcodes_regexp = new RegExp(/\[.*\]/);
/// Inject data (from 'data' and 'dictionary') to template by %...% keys.
/// Parameters:
///  data: hash, array with key/value pairs
///  template: string, template with %key%
/// Return value: string, injected template
function InjectTemplate(data, template, no_bbcodes)
{
	var keys = null;
	var result = template;
	var processed_keys = {};
	dtt_regexp.lastIndex = 0;

	if(!data || !template.length) return '';

	while(keys = dtt_regexp.exec(template)) { // search keys in template
		if(!processed_keys[keys[1]]) {
			var key_regexp = new RegExp(keys[0],'ig');
			if(data[keys[1]] != null) result = result.replace(key_regexp,data[keys[1]]); // search in data
			else if(dictionary[keys[1]] != null) result = result.replace(key_regexp,dictionary[keys[1]].text); // search in dictionary
//			else result = result.replace(key_regexp,'');
			
			processed_keys[keys[1]] = true; // save key as processed
		}
	}
	
	// process bbcodes
	if(!no_bbcodes && bbcodes_regexp.test(result)) {
		for(var i=0;i<bbcodes.length;i++)
			result = result.replace(bbcodes[i].search, bbcodes[i].text);
	}

	return result;
}


/// Translate timestamp to formatted date. 
/// Parameters:
///  timestamp: SQL timestamp
/// Return value: string, formatted date by dictionary 'format_date'
function TimestampToDate(timestamp) {
	if(!dictionary.format_date) return;
	
	var fdate = dictionary.format_date.text; // formatted date
	var jsdate = TimestampToJSDate(timestamp);

	fdate = fdate.replace('%Y',jsdate.getFullYear());
	fdate = fdate.replace('%c',dictionary['honapok_'+jsdate.getMonth()].text);
	fdate = fdate.replace('%e',jsdate.getDate());
	fdate = fdate.replace('%w',dictionary['napok_'+jsdate.getDay()].text);
	
	return fdate;
}


/// Translate timestamp to formatted time. 
/// Parameters:
///  timestamp: SQL timestamp
/// Return value: string, hh:mm
function TimestampToTime(timestamp)
{
	var ftime = {};
	var jsdate = TimestampToJSDate(timestamp);
	
	ftime.minutes = jsdate.getMinutes();
	ftime.hours = jsdate.getHours();

	if(ftime.minutes < 10) ftime.minutes = '0'+ftime.minutes;
	if(ftime.hours < 10) ftime.hours = '0'+ftime.hours;

	return ftime.hours+':'+ftime.minutes;
}


/// Convert SQL unix timestamp to JS date object.
function TimestampToJSDate(timestamp)
{
	var jsdate = new Date(timestamp*1000);
	return jsdate;
}


/// Convert JS date object to SQL unix timestamp.
function JSDateToTimestamp(date)
{
	return Math.round(date.getTime()/1000);
}

/// Disable/enable form widgets.
/// Parameters:
///  disabled: boolean, on true widgets will disabled, on false they will enabled
///  following parameters: string, widgets name
function DisableWidgets(disabled)
{
	if(form) {
		for(var i=1; i<arguments.length; i++)
			if(form[arguments[i]]) form[arguments[i]].disabled = disabled;
	}
}

var animate = {};
animate.anims = [];
animate.fps = 25;

/// Modify some value by the time.
function Animate(anim) 
{	
	anim.start_time = (new Date()).getTime();
	anim.end_time = anim.start_time+anim.length;
	anim.range = anim.end-anim.start;
	if(anim.valueaddon == null) anim.valueaddon = '';
	if(anim.valuefixed == null) anim.valuefixed = 0
	
	animate.anims.push(anim);

	if(!animate.timerid) animate.timerid = setInterval(AnimateC,1000/animate.fps); // start animation engine
}

/// Modify some value by the time. Callback.
function AnimateC()
{
	var done_nr = 0;

	// process animations
	for(var i=0;i<animate.anims.length;i++) {
		var anim = animate.anims[i];

		// animate
		if(!anim.done) {
			var now = (new Date()).getTime();
			// calculate value
			var value = anim.start+((now-anim.start_time)/anim.length)*anim.range;

			// if end_time is in the past, finish this animation
			if(anim.end_time < now) {
				anim.done = true;
				value = anim.end;
			}

			if(anim.targetobj[anim.targetattr] != null && value >= 0)	anim.targetobj[anim.targetattr] = value.toFixed(anim.valuefixed)+anim.valueaddon;
			if(anim.callback_on_frame) anim.callback_on_frame.call(null, anim);

			// call 'callback_on_end' function if animation finished
			if(anim.done) {
				anim.callback_on_end.call(null, anim);
				done_nr++;
			}
		}
		else done_nr++;
	}
	
	// done_nr animation engine
	if(done_nr == animate.anims.length) {
		clearInterval(animate.timerid);
		animate.timerid = null;
		animate.anims = [];
	}
}


/// Center element on the screen.
/// Parameters:
///  node: Element
///  hor: boolean, center horizontally if true
///  ver: boolean center vertically if true
function CenterElement(node, hor, ver)
{
	if(node) {
		var size = GetDocumentSize();
		var nodesize = GetElementSize(node);

		if(ver)	node.style.top = ((size.height-nodesize.height)/2)+'px';
		if(hor) node.style.left = ((size.width-nodesize.width)/2)+'px';
	}
}


/// Delete an item from an array.
/// Parameters:
///  arr: array
///  value: deletable item's value
///  index: deletable item's index (faster)
function DeleteArrayItem(arr, value, index)
{
	if(!arr) return [];
	
	var length = arr.length;
	
	// we have to search index
	if(index == null) {
		for(var i=0; i<length; i++)
			if(arr[i] == value) {
				index = i;
				break;
			}
	}
	
	// remove item
	length--;
	while(index < length) arr[index] = arr[++index]
	arr.pop(); // last entry is duplicated
	
	return arr;
}


/// Copy a hash content (only single values) into another.
function CopyHash(source, target)
{
	if(!target) target = {};
	for(var i in source) target[i] = source[i];
	return target;
}


/// Call a widget's callback (like onkeydown).
function CallWidgetsCallback(name, type)
{
	var widget = form[name];
	if(widget && widget[type]) widget[type].call(widget);
}
	
//-->

