function CheckForm(f)
{
	var allok = true;
	
	var inputs = f.getElementsByTagName('input');
	
	for( var i=0; i < inputs.length; i++)
	{
		if (inputs[i].type != 'submit' && inputs[i].className != '')
		{
			fieldok = checkField(inputs[i]);
			if (fieldok == false) allok = false;
		}
	}
	
	selects = f.getElementsByTagName('select');
	
	for( var i=0; i < selects.length; i++)
	{
		if (selects[i].options[selects[i].selectedIndex].value == 0)
		{
			var mesg = 'This field must contain a valid value';
			writeError(selects[i], mesg);
			allok = false;
		}
	}
	
	return allok;
}

function checkField(obj)
{
	if (obj.className.match(/alpha\b/))
	{
		if (!isalpha(obj))
		{
			var mesg = 'This field can only contain letters';
			writeError(obj, mesg);
			return false;
		}
	}
	if (obj.className.match(/numeric\b/))
	{
		if (!isnumeric(obj))
		{
			var mesg = 'This field can only contain numbers';
			writeError(obj, mesg);
			return false;
		}
	}
	if (obj.className.match(/alphanum\b/))
	{
		if (!isalphanumeric(obj))
		{
			var mesg = 'This field can only contain numbers and letters';
			writeError(obj, mesg);
			return false;
		}
	}
	if (obj.className.match(/notempty\b/))
	{
		if (!isnotempty(obj))
		{
			var mesg = 'This field cannot be empty';
			writeError(obj, mesg);
			return false;
		}
	}
	if (obj.className.match(/telephone\b/))
	{
		if (!istelephone(obj))
		{
			var mesg = 'This field must contain a valid phone number';
			writeError(obj, mesg);
			return false;
		}
	}
	if (obj.className.match(/email\b/))
	{
		if (!isemailaddress(obj))
		{
			var mesg = 'This field must contain a valid e-mail address';
			writeError(obj, mesg);
			return false;
		}
	}
	if (obj.className.match(/terms\b/))
	{
		if (!ischecked(obj))
		{
			var mesg = 'Please agree with the general conditions';
			writeError(obj, mesg);
			return false;
		}
	}
	return true;
}

function writeError(obj,message)
{
	obj.className = obj.className.replace(/errorMessage/,'');
    obj.className += ' errorMessage';
    obj.onblur = removeError;
    if (obj.errorMessage || obj.parentNode.errorMessage) return;
	
	var br = document.createElement('br');
	obj.parentNode.appendChild(br);
	
    var errorMessage = document.createElement('span'); // label
    errorMessage.className = 'errorMessage';
    //errorMessage.setAttribute('class', 'obj.id');
    //errorMessage.setAttribute('htmlFor',obj.id);
    errorMessage.appendChild(document.createTextNode(message));
    obj.parentNode.appendChild(errorMessage);
    obj.errorMessage = errorMessage;
    obj.parentNode.errorMessage = errorMessage;
}

function removeError()
{
    this.className = this.className.replace(/errorMessage/,'');
	this.className = this.className.replace(/^\s/,'');
	this.className = this.className.replace(/\s$/,'');
    
	var br = this.parentNode.getElementsByTagName('br');
	for(var i=0; i < br.length; i++)
	{
		this.parentNode.removeChild(br[i]);
	}
	
	if (this.errorMessage)
	{
        this.parentNode.removeChild(this.errorMessage);
        this.errorMessage = null;
        this.parentNode.errorMessage = null;
    }
    this.onblur = null;
}

function removeElemError(obj)
{
    obj.className = obj.className.replace(/errorMessage/,'');
	obj.className = obj.className.replace(/^\s/,'');
	obj.className = obj.className.replace(/\s$/,'');
    
	var br = obj.parentNode.getElementsByTagName('br');
	for(var i=0; i < br.length; i++)
	{
		obj.parentNode.removeChild(br[i]);
	}
	
	if (obj.errorMessage)
	{
        obj.parentNode.removeChild(obj.errorMessage);
        obj.errorMessage = null;
        obj.parentNode.errorMessage = null;
    }
    obj.onblur = null;
}

function isPattern(formField, pattern)
{
    var regExp = new RegExp("^"+pattern+"$");
    return regExp.test(formField.value);
}

function isalpha(formField)
{
    return isPattern(formField, "\[\\sa-zA-Z]+");
}

function isnumeric(formField)
{
    return isPattern(formField, "\\d+");
}

function isalphanumeric(formField)
{
    return isPattern(formField, "\[\\s\\w]+");
}

function istelephone(formField)
{
	return isPattern(formField, "[\\d\-\(\)\\s\.]+");
}

function isemailaddress(formField)
{
    return isPattern(formField, "[\\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}");
}

function isnotempty(formField)
{
	return formField.value != '';
}

function ischecked(formField)
{
	return formField.checked;
}

function ChangeCountry(e, c_id)
{
	removeElemError(e);
	
	var ac_region_id = document.getElementById('ac_region_id');
	removeElemError(ac_region_id);
	
	if(c_id == 0)
	{
		var list = ["select", {disabled:'disabled', id:'ac_region_id', name:'offer[ac_region_id]'}];
		
		var mylabel = (language == 'NL') ? 'Kies een land' : 'Wählen Sie ein Land';
		list.push(['option', {value:'0'}, mylabel]);
		
		ac_region_id.parentNode.removeChild(ac_region_id);
		
		graft(document.getElementById("insert-here"), list);
	}
	else
	{
		DoHttpRequest('/?act=change_country&c_id='+c_id, 'BuildRegionSelect', 'buildregionselect');
	}
}

function ChangeCategory(e, cat)
{
	removeElemError(e);
	
	var ac_subtype_id = document.getElementById('ac_subtype_id');
	removeElemError(ac_subtype_id);
	
	var st_id = document.getElementById('st_id');
	removeElemError(st_id);
	
	if(cat == 0)
	{
		var list = ["select", {disabled:'disabled', id:'ac_subtype_id', name:'offer[ac_subtype_id]'}];
		
		var mylabel = (language == 'NL') ? 'Kies een hoofdcategorie' : 'Wählen Sie eine Hauptkategorie';
		list.push(['option', {value:'0'}, mylabel]);
		
		ac_subtype_id.parentNode.removeChild(ac_subtype_id);
		
		graft(document.getElementById("insert-subcats-here"), list);
		
		var list = ["select", {disabled:'disabled', id:'st_id', name:'offer[st_id]'}];
		
		var mylabel = (language == 'NL') ? 'Kies een hoofdcategorie' : 'Wählen Sie eine Hauptkategorie';
		list.push(['option', {value:'0'}, mylabel]);
		
		st_id.parentNode.removeChild(st_id);
		
		graft(document.getElementById("insert-subscriptions-here"), list);
	}
	else
	{
		DoHttpRequest('/?act=change_category&cat='+cat, 'BuildSubcategorySelect', 'buildsubcategoryselect');
	}
}

function BuildSubscriptionSelect(xml, el)
{
	var xmlDoc = xml;
	
	var ids		= [];
	var names	= [];
	
	var subscriptions = xmlDoc.getElementsByTagName('subscription');
	
	for( var i=0; i < subscriptions.length; i++)
	{
		if(subscriptions[i].getElementsByTagName('id')[0].textContent == undefined)
		{
			ids[i]		= subscriptions[i].getElementsByTagName('id')[0].text;
			names[i]	= subscriptions[i].getElementsByTagName('name')[0].text;
		}
		else
		{
			ids[i]		= subscriptions[i].getElementsByTagName('id')[0].textContent;
			names[i]	= subscriptions[i].getElementsByTagName('name')[0].textContent;
		}
	}
	
	
	var list = ["select", {id:'st_id', name:'offer[st_id]'}];
	
	var mylabel = (language == 'NL') ? 'Kies een abonnement' : 'Wählen Sie ein Inserat möglichkeit';
	list.push(['option', {value:'0'}, mylabel]);
	
	var options = [];
	
	for( var j=0; j < ids.length; j++)
	{
		list.push(['option', {value:ids[j]}, utf8decode(names[j])]);
	}
	
	var st_id = document.getElementById('st_id');
	st_id.parentNode.removeChild(st_id);
	
	graft(document.getElementById("insert-subscriptions-here"), list);
}

function BuildSubcategorySelect(xml, el)
{
	var xmlDoc = xml;
	
	var ids		= [];
	var names	= [];
	
	var subcategories = xmlDoc.getElementsByTagName('subcategory');
	
	for( var i=0; i < subcategories.length; i++)
	{
		if(subcategories[i].getElementsByTagName('id')[0].textContent == undefined)
		{
			ids[i]		= subcategories[i].getElementsByTagName('id')[0].text;
			names[i]	= subcategories[i].getElementsByTagName('name')[0].text;
		}
		else
		{
			ids[i]		= subcategories[i].getElementsByTagName('id')[0].textContent;
			names[i]	= subcategories[i].getElementsByTagName('name')[0].textContent;
		}
	}
	
	
	var list = ["select", {id:'ac_subtype_id', name:'offer[ac_subtype_id]'}];
	
	var mylabel = (language == 'NL') ? 'Kies een categorie' : 'Wählen Sie eine Kategorie';
	list.push(['option', {value:'0'}, mylabel]);
	
	var options = [];
	
	for( var j=0; j < ids.length; j++)
	{
		list.push(['option', {value:ids[j]}, utf8decode(names[j])]);
	}
	
	var ac_subtype_id = document.getElementById('ac_subtype_id');
	ac_subtype_id.parentNode.removeChild(ac_subtype_id);
	
	graft(document.getElementById("insert-subcats-here"), list);
}

function BuildRegionSelect(xml, el)
{
	var xmlDoc = xml;
	
	var ids		= [];
	var names	= [];
	
	var xmlregions = xmlDoc.getElementsByTagName('region');
	
	for( var i=0; i < xmlregions.length; i++)
	{
		if(xmlregions[i].getElementsByTagName('id')[0].textContent == undefined)
		{
			ids[i]		= xmlregions[i].getElementsByTagName('id')[0].text;
			names[i]	= xmlregions[i].getElementsByTagName('name')[0].text;
		}
		else
		{
			ids[i]		= xmlregions[i].getElementsByTagName('id')[0].textContent;
			names[i]	= xmlregions[i].getElementsByTagName('name')[0].textContent;
		}
	}
	
	var list = ["select", {id:'ac_region_id', name:'offer[ac_region_id]'}];
	
	var mylabel = (language == 'NL') ? 'Kies een regio' : 'Wählen Sie ein Gebiet';
	list.push(['option', {value:'0'}, mylabel]);
	
	var options = [];
	
	for( var j=0; j < ids.length; j++)
	{
		list.push(['option', {value:ids[j]}, utf8decode(names[j])]);
	}
	
	var ac_region_id = document.getElementById('ac_region_id');
	ac_region_id.parentNode.removeChild(ac_region_id);
	
	graft(document.getElementById("insert-here"), list);
}

function DoHttpRequest(url, callback_function, el, tag)
{
    var http_request = false;
	
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
        http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/xml');
        }
    } else if (window.ActiveXObject) { // IE
        try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) { }
        }
    }
	
    if (!http_request) {
        alert('Unfortunately you browser doesn\'t support this feature.');
        return false;
    }
	
    http_request.onreadystatechange = function() {
	
        if (http_request.readyState == 4) {
            if (http_request.status == 200) {
				eval(callback_function + "(http_request.responseXML, el, tag)");
            } else {
                alert('There was a problem with the request.(Code: ' + http_request.status + ')');
            }
        }
    }
    http_request.open('GET', url, true);
    http_request.send(null);
}

function utf8encode(string)
{
    string = string.replace(/\r\n/g,"\n");
    var utftext = "";
	
    for (var n = 0; n < string.length; n++)
	{
        var c = string.charCodeAt(n);
		
        if (c < 128)
		{
            utftext += String.fromCharCode(c);
        }
        else if((c > 127) && (c < 2048))
		{
            utftext += String.fromCharCode((c >> 6) | 192);
            utftext += String.fromCharCode((c & 63) | 128);
        }
        else
		{
            utftext += String.fromCharCode((c >> 12) | 224);
            utftext += String.fromCharCode(((c >> 6) & 63) | 128);
            utftext += String.fromCharCode((c & 63) | 128);
        }
    }
	
    return utftext;
}

function utf8decode(utftext)
{
    var string = "";
    var i = 0;
    var c = c1 = c2 = 0;
	
    while ( i < utftext.length )
	{
        c = utftext.charCodeAt(i);
		
        if (c < 128)
		{
            string += String.fromCharCode(c);
            i++;
        }
        else if((c > 191) && (c < 224))
		{
            c2 = utftext.charCodeAt(i+1);
            string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
            i += 2;
        }
        else
		{
            c2 = utftext.charCodeAt(i+1);
            c3 = utftext.charCodeAt(i+2);
            string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }
    }
	
    return string;
}

// graft() function
// Originally by Sean M. Burke from interglacial.com
// Closure support added by Maciek Adwent
//
// Modified by Kasper to support style attributes in IE
//
function graft (parent, t, doc)
{
    doc = (doc || parent.ownerDocument || document);
    var e;
	
    if(t == undefined) {
        throw complaining( "Can't graft an undefined value");
    } else if(t.constructor == String) {
        e = doc.createTextNode( t );
    } else if(t.length == 0) {
        e = doc.createElement( "span" );
        e.setAttribute( "class", "fromEmptyLOL" );
    } else {
        for(var i = 0; i < t.length; i++) {
            if( i == 0 && t[i].constructor == String ) {
                var snared;
                snared = t[i].match( /^([a-z][a-z0-9]*)\.([^\s\.]+)$/i );
                if( snared ) {
                    e = doc.createElement(   snared[1] );
                    e.setAttribute( 'className', snared[2] );
                    continue;
                }
                snared = t[i].match( /^([a-z][a-z0-9]*)$/i );
                if( snared ) {
                    e = doc.createElement( snared[1] );  // but no class
                    continue;
                }
				
                // Otherwise:
                e = doc.createElement( "span" );
                e.setAttribute( "class", "namelessFromLOL" );
            }
			
            if( t[i] == undefined ) {
                throw complaining("Can't graft an undefined value in a list!");
            } else if(  t[i].constructor == String ||
                                    t[i].constructor == Array ) {
                graft( e, t[i], doc );
            } else if(  t[i].constructor == Number ) {
                graft( e, t[i].toString(), doc );
            } else if(  t[i].constructor == Object ) {
                // hash's properties => element's attributes
                for(var k in t[i]) {
                    // support for attaching closures to DOM objects
                    if(typeof(t[i][k])=='function'){
                        e[k] = t[i][k];
                    } else {
						if( k == "style" )
							e.style.cssText = t[i][k]; // this bit modified by Kasper
						else
							e.setAttribute( k, t[i][k] );
                    }
                }
            } else {
                throw complaining( "Object " + t[i] +
                    " is inscrutable as an graft arglet." );
            }
        }
    }
	
    parent.appendChild( e );
    return e; // return the topmost created node
}

function complaining (s) { alert(s); return new Error(s); }

