/* Sekalaisia apufunktioita

 */

// Luo form-elementin elementeistä assosiatiivisen arrayn (vastaa lomaketta php:n $_REQUEST-muuttujassa)
function form2array(form_element)
{
	this.parse_name = function(name)
	{
		if(!name) return new Array();
		var parts = name.replace(/\]/g, '').split('[');
		return parts;
	}
	var form_data = new Object();
	var indexes = new Object();
	for(var i=0; i<form_element.elements.length; i++)
	{
		var el = form_element.elements[i];
		var value = '';
		if(el.nodeName == 'TEXTAREA') el = el.value;
		else if(el.nodeName == 'SELECT') value = el.options[el.selectedIndex].value;
		else if(el.nodeName == 'INPUT')
		{
			if(el.type == 'radio' || el.type == 'checkbox')
			{
				if(el.checked) value = el.value;
				else continue;
			}
			else
			{
				value = el.value;
			}
		}
		else continue;
		if(typeof value != "string") continue;
		var name = this.parse_name(el.name);
		if(!name || name.length<1) continue;
		if(name.length == 1)
		{
			form_data[name[0]] = value;
		}
		else
		{
			var tmp = form_data;
			var index_name = 'i';
			for(var j=0; j<name.length; j++)
			{
				index_name += '_'+name[j];
				if(!name[j])
				{
					if(!indexes[index_name]) indexes[index_name] = 0;
					name[j] = indexes[index_name]++;
				}
				if(j == name.length-1)
				{
					tmp[name[j]] = value;
				}
				else
				{
					if(!tmp[name[j]]) tmp[name[j]] = new Object();
					tmp = tmp[name[j]];
				}
			}
		}
	}
	return form_data;
}

// Palauttaa objectin rakenteen html:nä (jäljittelee php:n de-funktiota) 
function js_de(v, pre)
{
	pre_str = '  ';
	if(!pre) pre = pre_str;
	var txt = '';
	for(var i in v)
	{
		if(typeof v[i] == 'object')
		{
			txt += pre+i+": {\n"+js_de(v[i], pre_str+pre)+pre+"},\n";
		}
		else
		{
			txt += pre+i+": "+v[i]+",\n";
		}
	}
	if(pre==pre_str) txt = "<pre>{\n"+txt+"}</pre>";
	return txt;
}



function this_date()
{
	var d = new Date();
	var str = d.getFullYear();
	str += "-";
	str += d.getMonth()<9?("0"+(d.getMonth()+1)):(d.getMonth()+1);
	str += "-";
	str += d.getDate()<10?("0"+(d.getDate()+0)):(d.getDate()+0);
	return str;
}
function elbyid(el)
{
	return document.getElementById(el);
}
function safename(filename)
{
	// Tämä myös PHP:ssa
	filename = filename.toLowerCase();
	filename = filename.replace(/\//g,"");
	filename = filename.replace(/ /g,"_");
	filename = filename.replace(/ä/g,"a");
	filename = filename.replace(/ö/g,"o");
	filename = filename.replace(/å/g,"a");
	filename = filename.replace(/ë/g,"e");
	filename = filename.replace(/[^a-z0-9_./]/g,"");
	return filename;
}
function str_replace(search,replace,subject)
{
	return subject.split(search).join(replace);
}
function safefilename(filename)
{
	// Tämä myös PHP:ssa
	var t=filename.lastIndexOf("/");
	var t2=filename.lastIndexOf("\\");
	t=t<t2?t2:t;
	if(t>=0) filename=filename.substring(t+1, t.length);
	filename = filename.toLowerCase();
	filename = filename.replace(/ /g,"_");
	filename = filename.replace(/ä/g,"a");
	filename = filename.replace(/ö/g,"o");
	filename = filename.replace(/å/g,"a");
	filename = filename.replace(/ë/g,"e");
	filename = filename.replace(/[^a-z0-9_./]/g,"");
	return filename;
}
function getElementValue(element)
{
	var el=element;
		var tagname = '';
		try {tagname = el.tagName.toLowerCase();} catch (e) {}
		if (element[0] && element.length && element[0].type && tagname=='')
		{
			for (var i=0;i<element.length;i++)
			{
				if (element[i].checked) return getElementValue(element[i]);
			}
			return false;
		}
		switch(tagname)
		{
			case "select":
				if(el.options!=null)
				{
					for(var j=0;j<el.options.length;j++)
					{
						if(el.options[j].selected==true)
						{
							key = el.name;
							value = el.options[j].value;
							return value;
						}
					}
				}
				break;
			case "textarea":
				return el.value;
			case "input":
				switch(el.type.toLowerCase())
				{
					case "checkbox":
					case "radio":
						if(el.checked==true)
						{
							key = el.name;
							value = el.value;
							return value;
						}
						break;
					case "text":
					case "hidden":
					case "file":
					case "password":
						key = el.name;
						value = el.value;
						return value;
						break;
					case "image":
					case "submit":
						key = el.name;
						value = el.value;
						return value;
						break;
					case "button":
					case "reset":
						break;
					default:
						break;
				}
				break;
			default:
				break;
		}
		return false;
}
function setElementValue(el,value,recstep,arr_ignore_hidden)
{
	if (el.tagName)
	{
		switch(el.tagName.toLowerCase())
		{
		case "select":
			for (var i=0;i<el.options.length;i++)
				if (el.options[i].value==value) {el.selectedIndex = i;return;}
			break;
		case "textarea":
			el.value = value;
			break;
		case "input":
			switch(el.type.toLowerCase())
			{
			case "checkbox":
			case "radio":
				if(el.value==value)
				{
					el.checked = true;
				}
				else
				{
					el.checked = false;
				}
				break;
			case "hidden":
				if (!arr_ignore_hidden) el.value = value;
				break;
			case "text":
			case "file":
			case "password":
				el.value = value;
				break;
			case "image":
			case "submit":
				el.value = value;
				break;
			case "button":
			case "reset":
				break;
			default:
				break;
			}
			break;
		}
	}
	else
	{
		if (el[0] && el.length && el[0].type && !recstep)
		{
			var is_all_hidden = true; // tällä käsitellään case jossa on hidden+checkbox combo inputtina
			for (var i in el) if (!el.type) is_all_hidden = false; else if (el.type!='hidden') is_all_hidden = false;
			for (var i in el)
			{
				setElementValue(el[i],value,true,!is_all_hidden);
			}
		}
	}
}

function explode(separator,item,maxcount)
{
	var a=item.split(separator);
	if (!maxcount) return a;
	var result = [];
	for (var i=0;i<maxcount;i++) result[i]=a[i];
	for (var j=i;j<a.length;j++) result[i]+=separator+a[j];
	return result;
}

function implode(separator,item)
{
	var result = '';
	for (var i=0;i<item.length;i++)
	{
		result+=(i>0?separator:'')+item[i];
	}
	return result;
}

function isFormChanged(form)
{
	if (!form) return false;
	try
	{
		for (var i=0;i<form.elements.length;i++)
		{
			var e=form.elements[i];
			if (!e.type) continue;
			var is_changed=false;
			switch (e.type.subString(0,4))
			{
			case 'sele':
				is_changed=e.defaultSelectedIndex!=e.selectedIndex;
				break;
			case 'chec':
			case 'radi':
				is_changed=e.defaultChecked!=e.checked;
				break;
			default:
				is_changed=e.defaultValue!=e.value;
			}
			if (is_changed) return true;
		}
	}
	catch (e)
	{
	}
	return false;
}

function emailLink(domain,beginpart, endpart)
{
	var at = "@";
	document.write("<a href=\"");
	document.write("mai");
	document.write("lto");
	document.write(":" + beginpart + (endpart?"."+endpart:"") + at + domain + "\">");
	document.write(beginpart + (endpart?"."+endpart:"") + at + domain);
	document.write("</a>");
}

function is_array(mixed)
{
	if (typeof mixed=="object") return true;
	return false;
}

function in_array(needle,haystack)
{
	if (!is_array(haystack)) return false;
	for (var i=0;i<haystack.length;i++)
		if (haystack[i]==needle) return true;
	return false;
}
function number_format(v,decimals,dec_separator,thousands_separator)
{
        if (typeof v=='number') v=v.toString();
        v=v.replace(/,/g,'.');
        for (var i=0;i<v.length;i++)
        {
                if('-0123456789.'.indexOf(v.charAt(i))==-1){v=v.replace(v.charAt(i), '');i--;}
        }
        if (v.length==0)v='0';
        while (v.charAt(0)=='0'&&v.length>1) v=v.replace('0','');
        while (v.indexOf('.')!=v.lastIndexOf('.')) v=v.replace('.','');
        if(v=='.'){v='0';}
        if (decimals)
        {
                if (v.indexOf('.')==-1) v+='.';
                if (v.indexOf('.')<v.length-decimals-1) v=v.substr(0,v.indexOf('.')+decimals+1);
                else for (i=v.length-v.indexOf('.')-1;i<decimals;i++) v+='0';
        }
        else
                if (v.indexOf('.')!=-1) v=v.substr(0,v.indexOf('.')+decimals);
        if (thousands_separator)
        {
                var fix = false;
                if(v.indexOf('.')==-1) 
                {
                        v = v+".00";
                        var fix = true;
                }
                var baselen=v.indexOf('.')+1;     
                var newbase='';
                var i=baselen-1;
                for (;i>2;i-=3)
                        newbase=v.substr(i-3,3)+(newbase?thousands_separator+newbase:'');
                if (i>0)
                        newbase=v.substr(0,i)+(newbase?thousands_separator+newbase:'');
                if(fix)
                        v=newbase+v.substr(baselen-1,-3);
                else 
                        v=newbase+v.substr(baselen-1);
        }
        if (dec_separator)
                v=v.replace(/\./g,dec_separator);
        if(v.indexOf('.')==0)v='0'+v;
        return v;
}

function getElementsByPrefix(form, prefix)
{
	var els = form.elements;
	if(!els || prefix.length==0) return false;
	var rels = new Array();
	var counter=0;
	for(var i=0;i<els.length;i++)
	{
		var el = els[i];
		if(el.id && el.id.substr(0,prefix.length)==prefix) rels[counter++] = el;
	}
	return rels;
}
function toggleDisabled(form_or_other_parent,disabled_status)
{
	var p = form_or_other_parent;
	var els = new Array();
	els.push(p.getElementsByTagName('INPUT'));
	els.push(p.getElementsByTagName('TEXTAREA'));
	els.push(p.getElementsByTagName('SELECT'));
	for (var i=0;i<els.length;i++)
	if (els[i])
	{
		var elist = els[i];
		for (var j=0;j<elist.length;j++)
		{
			var e = elist[j];
			if (!e) continue;
			if (e.getAttribute('nodisable')) continue;
			e.disabled = disabled_status;
		}
	}
}
function toggleStartingWith(form, prefix)
{
	var els = getElementsByPrefix(form,prefix);
	var changed = 0;
	var checked = 0;
	for(var i in els)
	{
		var el = els[i];
		if(el.type && el.type.toLowerCase()=="checkbox" && el.checked) checked++;
	}
	if(checked==els.length)
		var isChecked = false;
	else
		var isChecked = true;
	for(var i in els)
	{
		var el = els[i];
		if(el.type && el.type.toLowerCase()=="checkbox")
		{
			el.checked = isChecked;
			changed++;
		}
	}
	return changed;
}
function toggleDisplay(id,dest)
{
	var e = (typeof id == "object") ? id : document.getElementById(id);
	var isIE = false;
	var tmp = navigator.userAgent.split("MSIE");
	if(tmp.length>1) isIE = true;
	if(e.tagName=="TBODY")
	{
		if(isIE)
		{
			if(e.style.display=="none")
				e.style.display = dest?dest:"block";
			else
				e.style.display = dest?dest:"none";
		}
		else
		{
			if(e.style.display=="none")
				e.style.display = dest?dest:"table-row-group";
			else
				e.style.display = dest?dest:"none";
		}
	}
	else if(e.tagName=="TR")
	{
		if(isIE)
		{
			if(e.style.display=="none")
				e.style.display = dest?dest:"block";
			else
				e.style.display = dest?dest:"none";
		}
		else
		{
			if(e.style.display=="none")
				e.style.display = dest?dest:"table-row";
			else
				e.style.display = dest?dest:"none";
		}
	}
	else
	{
		if(e.style.display == "block")
			e.style.display = dest?dest:"none";
		else
			e.style.display = dest?dest:"block";
	}
}
function trim(s){s=s+"";return s.replace(/^\s+|\s+$/g,"");}
function hasClass(e,c){var t=" "+e.className+" ";if(t.indexOf(" "+c+" ")==-1)return false;else return true;}
function addClass(e,c){var t=" "+e.className+" ";if(t.indexOf(" "+c+" ")==-1)e.className=e.className+" "+c;}
function removeClass(e,c){var t=" "+e.className+" ";var s=t.indexOf(" "+c+" ");if(s==-1)return;t=t.substring(0,s)+t.substring(s+c.length+1,t.length);e.className=trim(t);}
function toggleClass(e,c) {if (hasClass(e,c)) removeClass(e,c); else addClass(e,c);}

function document_write(text) {document.write(text);}

function stopEvent(ev)
{
	ev = ev ? ev : window.event;
	ev.cancelBubble = true;
	if(ev.stopPropagation)ev.stopPropagation();
}

function addEvent(el,ev,f)
{
	if(el.addEventListener){el.addEventListener(ev,f,false);}
	else if(el.attachEvent){el.attachEvent('on'+ev,f);}
	else el['on'+ev]=f;
}

function removeEvent(el,ev,f)
{
	if(el.removeEventListener){el.removeEventListener(ev,f,false);}
	else if(el.detachEvent){el.detachEvent('on'+ev,f);}
	else el['on'+ev]=null;
}
// legacy-jäänne
function add_window_onload(f)
{
	addEvent(window,"load",f)
}

function storeFormDefaultStates()
{
	try
	{
		for (var i in document.forms)
		{
			if (document.forms[i].elements)
			storeFormDefaultState(document.forms[i]);
		}
	}
	catch (e)
	{
	}
}
function storeFormDefaultState(form)
{
	if (!form) return false;
	try
	{
		for (var i=0;i<form.elements.length;i++)
		{
			var e=form.elements[i];
			if (!e.type) continue;
			switch (e.type.substring(0,4))
			{
			case 'sele':
				e.setAttribute('defaultSelectedIndex',e.selectedIndex);
				e.defaultSelectedIndex=e.selectedIndex;
				break;
			}
		}
	}
	catch (e)
	{
	}
}
function wasFormChanged(form)
{
	if (!form) return false;
	try
	{
		for (var i=0;i<form.elements.length;i++)
		{
			var e=form.elements[i];
			if (!e.type) continue;
			var is_changed=false;
			if (e.getAttribute('IGNORE_CHANGE')) continue;
			switch (e.type.substring(0,4))
			{
			case 'sele':
				is_changed=e.defaultSelectedIndex!=e.selectedIndex;
				//for (var n in e) if (e[n]=='2') {alert(n+' '+e[n]);}return;
				break;
			case 'chec':
			case 'radi':
				is_changed=e.defaultChecked!=e.checked;
				break;
			case 'hidd':
				break;
			default:
				is_changed=e.defaultValue!=e.value;
			}
			if (is_changed) return true;
		}
	}
	catch (e)
	{
	}
	return false;
}

function addOption(select,value,text)
{
	var oOption = document.createElement("OPTION");
	oOption.text=text;
	oOption.value=value;
	return select.add(oOption);
}
function removeOption(select,value)
{
	if(!select || !select.options) return false;
	var removedItems = 0;
	for(var i in select.options)
	{
		var opt = select.options[i];
		if(opt.value == value)
		{
			select.remove(i);
			removedItems++;
		}
	}
	return removedItems;
}

/* el.x -viittaukset poistettu */
function xgetElementAbsX(el) { var p=getElementAbsPos(el); return (el.x)?el.x:p.x; }
function xgetElementAbsY(el) { var p=getElementAbsPos(el); return (el.y)?el.y:p.y; }

function getElementAbsX(el) { var p=getElementAbsPos(el); return p.x; }
function getElementAbsY(el) { var p=getElementAbsPos(el); return p.y; }
function getElementAbsPos(el) {
	var l=0,t=0;
	while (el.offsetParent)
	{
		l+=el.offsetLeft;
		t+=el.offsetTop;
		el=el.offsetParent;
	}
	l+=el.offsetLeft;
	t+=el.offsetTop;
	return {x:l, y:t};
}

function windowSize()
{
	if(!window.innerWidth)
	{
		if(!(document.documentElement.clientWidth == 0))
		{
			w = document.documentElement.clientWidth;
			h = document.documentElement.clientHeight;
		}
		else
		{
			w = document.body.clientWidth;
			h = document.body.clientHeight;
		}
	}
	else
	{
		w = window.innerWidth;
		h = window.innerHeight;
	}
	return {width:w,height:h}
}

function loadFileToHead(type, uri)
{
	var types = {
		css: {
			element: "link",
			link: "href",
			attributes: {
				rel: "stylesheet",
				type: "text/css"
			}
		},
		js: {
			element: "script",
			link: "src",
			attributes: {
				language: "Javascript1.2",
				type: "text/javascript"
			}
		}
	}
	if(!document.getElementsByTagName || !document.createElement || !types[type])return false;
	var h=document.getElementsByTagName('head');
	if(h.length<1)return false;
	var d=types[type];
	var l=document.createElement(d.element);
	for(var i in d.attributes)l[i]=d.attributes[i];
	l[d.link]=uri;
	h[0].appendChild(l);
	return true;
}

function ucfirst(str)
{
	return str.substr(0,1).toUpperCase()+""+str.substr(1);
}



function currency(number,num_decimal_places,dec_separator,thousands_separator)
{
	var formatted = number_format(number,num_decimal_places,dec_separator,thousands_separator);
	if (!g_currency_fmt) return formatted+' €';
	return str_replace('_SUM_',formatted,g_currency_fmt);
}
function currency_html(number,num_decimal_places,dec_separator,thousands_separator)
{
	var formatted = number_format(number,num_decimal_places,dec_separator,thousands_separator);
	if (!g_currency_fmt_html) return formatted+'&nbsp;&euro;';
	return str_replace('_SUM_',formatted,g_currency_fmt_html);
}
function currency_plain(number,num_decimal_places,dec_separator,thousands_separator)
{
	var formatted = number_format(number,num_decimal_places,dec_separator,thousands_separator);
	if (!g_currency_fmt_plain) return formatted+' EUR';
	return str_replace('_SUM_',formatted,g_currency_fmt_plain);
}


function get_computed_style(_elem, _style)
{
	var computedStyle;
	if (typeof _elem.currentStyle != 'undefined') computedStyle = _elem.currentStyle;
	else computedStyle = document.defaultView.getComputedStyle(_elem, null);
	return computedStyle[_style];
}


addEvent(window,"load",function(){setTimeout('storeFormDefaultStates();',1000);});

