// Ellenorzesi tipusok kodjai
var CHK_TEXT = 0x0001;
	CHK_NUM = 0x0002;			// barmily szam
	CHK_INT = 0x0004;			// egesz szam
	CHK_EMAIL = 0x0008;			// email
	CHK_LENGTH = 0x0010;		// szoveghossz ellen. itt a param1 es param2 tartalmazza a min es max hosszt, ha valamelyik nincs megadva akkor az nem számit
	CHK_INTERVAL = 0x0020;		// szam ellen. itt a param1 es param2 tartalmazza a min es max erteket, ha valamelyik nincs megadva akkor az nem számit
	CHK_NOTSELECT = 0x0040;		// lista ellen. itt a param1 határozza meg hogy milyen érték nem lehet kiválasztva
	CHK_PWDMATCH = 0x0080;		// jelszó ellen. itt a param1 határozza meg az ellenőrző elemet
	CHK_FILE = 0x0100;		    // fájlfeltöltés ellen.
	CHK_REQUIRED = 0x0200;		// meg van-e adva érték.
	CHK_RADIO = 0x0400;		    // ki van-e valasztva jelologomb
	CHK_CHECKED = 0x0800;	    // be van-e pipálva a jelolonegyzet

// Hibauzenetek
var ERR_MESSAGES = [];			// Az elemek indexei a lehetseges hibakodok (ua. mint az ellenorzesek kodjai), az elemek pedig lehetnek stringek, vagy tombok.
								// Ha az elem egy string akkor a hibauzenet mindig ugyanaz.
								// Ha az elem egy tomb, es adott a param1, vagy param2 akkor a hibauzenet a tomb elso vagy masodik eleme.
								// A %1, %2 kodok helyere a param1, es param2 ertekei kerulnek.

ERR_MESSAGES[CHK_TEXT]		= "A mező nincs kitöltve";
ERR_MESSAGES[CHK_NUM]		= "A várt érték egy szám";
ERR_MESSAGES[CHK_INT]		= "A várt érték egy egész szám";
ERR_MESSAGES[CHK_EMAIL]		= "A megadott email cím nem megfelelő";
ERR_MESSAGES[CHK_LENGTH]	= ["Legalább %1 karaktert meg kell adni","A szöveg hossza legfeljebb %2 karakter lehet","A szöveg hossza %1 - %2 karakter lehet"];
ERR_MESSAGES[CHK_INTERVAL]	= ["A várt érték %1, vagy nagyobb szám","A megadott érték maximum %2","A várt érték egy %1 és %2 közötti szám"];
ERR_MESSAGES[CHK_NOTSELECT]	= ["%1 választása kötelező","%2 választása kötelező","Elem választása kötelező"];
ERR_MESSAGES[CHK_PWDMATCH]	= "A megadott jelszavak nem egyeznek meg";
ERR_MESSAGES[CHK_FILE]	    = "Fájl feltöltése kötelező";
ERR_MESSAGES[CHK_REQUIRED]  = ["%1 választása kötelező","%2 választása kötelező","Elem választása kötelező"];
ERR_MESSAGES[CHK_RADIO]     = ["%1 választása kötelező","%2 választása kötelező","Elem választása kötelező"];
ERR_MESSAGES[CHK_CHECKED]   = ["%1 bejelölése kötelező","%2 bejelölése kötelező","Elem bejelölése kötelező"];



function isCheckable(element)
{
    if( isVisible(element) )
        return true;

    if( (element) && (element.tagName) && (element.tagName.toUpperCase() == "INPUT") && (element.type.toUpperCase() == "HIDDEN") )
        return true;

    return false;
}

// Eldonti, hogy az input fokuszalhato-e
function isFocusable(input)
{
	if( (input.type && input.type == "hidden") || (input.length) )
		return false;

	if( input.disabled )
		return false;

	return isVisible(input);
}

// Megvizsgalja, hogy a text szoveg ures-e (csak whitespace)
function isEmptyField(text)
{
	return (text.match(/^\s*$/)) ? true:false;
}


// Hibakezelo objektum, amely a hibak kodjat, es a hibauzeneteket tarolja
function ErrorHandler()
{
	this.errors = 0;
	this.messages = [];
}

ErrorHandler.prototype =
{
	// Új hiba hozzaadasa. err = a hiba kodja, param1, param2 a megfelelo parameterek.
	add: function (err,param1,param2)
	{
		this.errors |= err;
		var msg = ERR_MESSAGES[err];

		if( param1 == undefined ) param1 = '';
		if( param2 == undefined ) param2 = '';

		if (typeof(msg) != "string")
		{
			if ((param1 != '') && (param2 != ''))
				this.messages[this.messages.length] = msg[2].replace("%1",param1).replace("%2",param2);
			else if (param1 != '')
				this.messages[this.messages.length] = msg[0].replace("%1",param1);
			else if (param2 != '')
				this.messages[this.messages.length] = msg[1].replace("%2",param2);
		}
		else
		{
			this.messages[this.messages.length] = msg;
		}

	},
	// A hibakodok lekerdezese
	getErrors: function ()
	{
		return this.errors;
	},
	// A hibauzenetek lekerdezese
	getMessages: function ()
	{
		return this.messages.join("!\n") + "!";
	},
	// A hibauzenetek megjelenitese
	displayErrors: function(input,errmsg)
	{
    	if (this.getErrors())						// Hibak kezelese
    	{
    		if (errmsg != undefined)					// Hibauzenet megjelenitese
    		{
    			if( errmsg == "" )
    				errmsg = "%errors%";

    			var msg = errmsg.replace("%errors%", this.getMessages())
    			alert(msg);
    		}
    		if (isFocusable(input))
    			input.focus();

    		return false;
    	}

    	return true;
    }
}

// ha nem ures az errmsg, akkor alert()
// return true v. false
// ellenorizze azt is, hogy az inputra lehet-e fokuszalni (hidden-pl nem), ha lehet, akkor tegye meg :)

//  Beviteli mezo ellenorzese
//  input : A mezo.
//	flags : A szukseges vizsgalatok kodjai.
//	errmsg : A hiba eseten megjelenitendo uzenet, amelyben az %errors% string cserelodik a hibak reszletes leirasara.
//  param1,param2 : Ertekhatarok, a CHK_INTERVAL es a CHK_LENGTH vizsgalatokhoz.

function checkDate(input,errmsg,format)
{
    if( isCheckable(input) )
    {
    	var f = format.replace(".","\.").replace("-","\-").replace("/","\/").replace("[","\[").replace("]","\]");

    	re_date = f.replace(/(yy|mm|dd|hh|ii|ss)/g,"([0-9]{2})");
    	re_date = "^\\s*" + re_date + "\\s*$";

    	if (input.value.match(re_date))
    		return true

    	if (errmsg)					// Hibauzenet megjelenitese
    		alert(errmsg);

    	if (isFocusable(input))
    		input.focus();

    	return false;
    }

    return true;
}

function checkInput(input,flags,errmsg,param1,param2)
{
    if( isCheckable(input) )
    {
    	var v = input.value.replace(/^\s+|\s+$/g, "");
    	var errors = new ErrorHandler();
    	var focusinput = input;

    	if (flags & CHK_TEXT)			// Szoveg ellenorzés
    	{
    		if (isEmptyField(v))
    			errors.add(CHK_TEXT);
    	}

    	if (flags & CHK_LENGTH)			// Szoveghossz ellenorzés
    	{
    		if ((param1 != undefined) && (param1 != "") && (v.length < param1))
    			errors.add(CHK_LENGTH,param1,param2);
    		else if ((param2 != undefined) && (param2 != "") && (v.length > param2))
    			errors.add(CHK_LENGTH,param1,param2);
    	}

    	if (flags & CHK_NUM)			// Altalanos szam ellenorzes
    	{
    	    temp = v.replace(/\s/g,'');
    	    temp = temp.replace(/,/g,'.');
    		if( isEmptyField(temp) || isNaN(Number(temp)) )
    			errors.add(CHK_NUM);
    	}

    	if (flags & CHK_INT)			// Egesz szam ellenorzés
    	{
    	    temp = v.replace(/\s/g,'');
    		if( !isEmptyField(temp) && (isNaN(Number(temp)) || (!temp.match(/^[-+]?[0-9]*$/)) ) )
    			errors.add(CHK_INT);
    	}

    	if (flags & CHK_INTERVAL)		// Szam ertekhatar ellenorzés
    	{
    		if ((param1 != undefined) && (Number(v) < param1))
    			errors.add(CHK_INTERVAL,param1,param2);
    		else if ((param2 != undefined) && (Number(v) > param2))
    			errors.add(CHK_INTERVAL,param1,param2);
    	}

    	if (flags & CHK_EMAIL)			// Email ellenorzes
    	{
    	    if( v != '' )
    		    if (!v.match(/^(.+@.+\.[a-zA-Z0-9]+)([a-zA-Z0-9])$/))
    			    errors.add(CHK_EMAIL);
    	}

    	if (flags & CHK_REQUIRED)
    	{
    	    if( ! v )
        		errors.add(CHK_REQUIRED,param1);
    	}

    	if (flags & CHK_PWDMATCH)
    	{
    	    if( v != '' )
    	    {
    	        vchk = param1.value;
    	        if( v != vchk )
    	        {
        		    errors.add(CHK_PWDMATCH,param1);
        		    focusinput = param1;
        		}
        	}
    	}

    	return errors.displayErrors(focusinput,errmsg);
    }

    return true;
}


// Ket jelszomezo ertekenek osszehasonlitasa
// Ha a mezok valamelyike ures, vagy nem egyeznek false-al ter vissza, es a fokusz az input_pwdchk-ra all.
// input_pwd, input_pwdchk: A ket mezo.
// errmsg : A hibauzenet.
function checkPassword(input_pwd,input_pwdchk,errmsg)
{
    if( isCheckable(input_pwd) && isCheckable(input_pwdchk) )
    {
    	var errors = new ErrorHandler();
    	var v1 = input_pwd.value;
    	var v2 = input_pwdchk.value;

    	if( v1 == v2 )
    		return true;

        errors.add(CHK_PWDMATCH);

    	return errors.displayErrors(input_pwdchk,errmsg);
    }

    return true;
}

// File mezo ellenorzese: false-al ter vissza ha a mezo ures.
// input : A mezo.
// errmsg : A hibauzenet.
function checkFile(input,errmsg)
{
    if( isCheckable(input) )
    {
    	var errors = new ErrorHandler();

    	if (!isEmptyField(input.value))		// Ha a mezo nem ures
    		return true;

        errors.add(CHK_FILE);

    	return errors.displayErrors(input,errmsg);
    }

    return true;
}

// Listbox ellenorzese: false-al ter vissza, ha nincs kivalasztva semmi, vagy ha a kivalasztott elem erteke -1.
// input : A mezo.
// errmsg : A hibauzenet.
function checkSelect(input,errmsg,notselval,title)
{
    if( isCheckable(input) )
    {
    	var errors = new ErrorHandler();

        if( isUndefined(notselval) ) notselval = -1;
    	if( (input.selectedIndex < 0) || (input.options[input.selectedIndex].value == notselval) )		// Ha ki van valasztva egy opcio és annak értéke nem -1
    		errors.add(CHK_NOTSELECT,title);

    	return errors.displayErrors(input,errmsg);
    }

    return true;
}

// Multiselectes Listbox ellenorzese: false-al ter vissza, ha nincs legalabb minsel elem kivalasztva.
// input : A mezo.
// minsel : Hany darab elem legyen legalabb kivalaszva
// errmsg : Hibauzenet.
function checkMultiSelect(input,minsel,errmsg)
{
    if( isCheckable(input) )
    {
    	if (input.selectedIndex != -1)		// Ha ki legalabb egy elem ki van valasztva
    	{
    		var o = input.options;
    		var sel = 0;

    		for (var i = 0; i < o.length; i++)
    			if (o[i].selected) sel++;

    		if (sel >= minsel)				// Ha mefelelo szamu elem ki van jelolve
    			return true;
    	}

    	if (errmsg)						// Hibauzenet megjelenitese
    		alert(errmsg)

    	if (isFocusable(input))			// Fokuszalas, ha lehetsegges
    		input.focus();

    	return false;
    }

    return true;
}

function checkCheckbox(input,errmsg,param1,param2)
{
    if( isCheckable(input) )
    {
    	var errors = new ErrorHandler();

    	if(input.checked)						// Ellenorzes
    		return true;

        errors.add(CHK_CHECKED,param1,param2);
    	return errors.displayErrors(input,errmsg);
    }

    return true;
}

// Radio gombok ellenorzese: false-al ter vissza, ha hincs kijeolve egyetlen opcio sem.
// input : A mezo.
// errmsg : Hibauzenet.
function checkRadio(input,errmsg,param1)
{
    if( isCheckable(input) )
    {
    	var errors = new ErrorHandler();
    	var check = false;

    	if (input.length)				// Ha tobb elemrol van szo
    	{
    		for (var i = 0; i < input.length; i++)
    			if (input[i].checked)
    			{
    				check = true;
    				break;
    			}
    	}
    	else
    		check = input.checked;		// Ha csak egyrol

    	if (check)						// Ellenorzes
    		return true;

        errors.add(CHK_RADIO,param1);

    	return errors.displayErrors(input,errmsg);
    }

    return true;
}


// Ellenoriz egy checkbox listat, vagy annak egy reszet, hogy ki van-e jelolve bizonyos szamu elem.
// nameprefix : milyen nevvel kezdodnek a checkboxok pl: city_1  , city_2 , city_3  => city_
// minIdx : Minimalis index : itt pl: 1
// maxIdx : Maximalis index : itt pl: 3
// minsel : minimalisan kivalasztandó
// errmsg : Hibauzenete.
function checkCBList(nameprefix,minIdx,maxIdx,minsel,errmsg)
{
	var sel = 0;					// Kivalasztott elemen szama

	for (var i = minIdx; i <= maxIdx; i++)
	{
		var cb = document.getElementById(nameprefix + i);
		if	( (cb) && (cb.checked) )
			sel++;
	}

	if (sel >= minsel)				// Kivalasztott elemek szamanak ellenorzese
		return true;

	if (errmsg)						// Hibauzenet megjelenitese
		alert(errmsg)

	return false;
}

// Ellenoriz egy IP cím mezot.
// nameprefix : A mezok ID-inek elotagja.
// errmsg : A hibauzenet.
// acceptJoker : Megadhato-e csillag, mint ervenyes kod.
function checkIPv4(nameprefix,errmsg,acceptJoker)
{
	for (i = 1; i <= 4; i++)
	{
		var field = document.getElementById(nameprefix + i);

		if (!acceptJoker || (field.value != "*"))
			if (!checkInput(field, CHK_INT | CHK_INTERVAL, errmsg, 0, 255))
				return false;
	}

	return true;
}

// Egy checkbox lista, vagy annak reszhalmazanak ertekeibol osszefuz egy stringet, a separator elvalasztoval kozottuk.
// nameprefix : A mezok ID-inek elotagja.
// minIdx : Minimalis index.
// maxIdx : Maximalis index.
// separator : Elvalasztojel ami az ertekek koze kerul.
// onlyChecked : Ha true, akkor csak a kivalasztott elemek ertekei kerulnek osszefuzesre.
function implodeCBListValue(nameprefix,minIdx,maxIdx,separator,onlyChecked)
{
	var res = "";

	for (var i = minIdx; i <= maxIdx; i++)
	{
		var cb = document.getElementById(nameprefix + i);
		if	( (cb && !onlyChecked) || (cb && onlyChecked && cb.checked) )
			res += cb.value + separator;
	}

	if( res != "" )
	    res = res.substr(0,res.length-separator.length);

	return res;
}

// Radio gombok erteket adja vissza, vagy false-ot ha nincs kivalasztva semmi
// input : A mezo.
function getRadioValue(input)
{
	if (input.length)				// Ha tobb elemrol van szo
	{
		for (var i = 0; i < input.length; i++)
			if (input[i].checked)
				return input[i].value;

	}
	else if (input.checked)
		return input.value;		// Ha csak egyrol

	return false;
}

function setRadioValue(input,value)
{
    var radioNode = null;
	if (input.length)				// Ha tobb elemrol van szo
	{
		for (var i = 0; i < input.length; i++)
		{
			input[i].checked = (input[i].value == value);
	        if( input[i].value == value )
	            radioNode = input[i];
		}
	}
	else
	    {
	        input.checked = (input.value == value);
	        if( input.value == value )
	            radioNode = input;
	    }
	    
    return radioNode;
}

var _INPUT_INIT_TEXT = {};
function hideInitText(input)
{
    var hideInitAttrib = input.getAttribute('hiddeninittext');
	if( hideInitAttrib != 'yes' && hideInitAttrib != 'ifnoteq' )
	{
        _INPUT_INIT_TEXT[input.name] = input.value;
		input.value = '';
		input.setAttribute('hiddeninittext','yes');
    }
	else if( hideInitAttrib == 'yes' && input.value == '' )
	{
		input.value = _INPUT_INIT_TEXT[input.name];
		input.setAttribute('hiddeninittext', 'ifnoteq');
	}
	else if( hideInitAttrib == 'ifnoteq' && _INPUT_INIT_TEXT[input.name] && _INPUT_INIT_TEXT[input.name] == input.value )
	{
		input.value = '';
		input.setAttribute('hiddeninittext','yes');
	}
    
}

// Egy checkbox lista, vagy annak reszhalmazanak kijelolese, vagy a kijeloles megszuntetese
// nameprefix : A mezok ID-inek elotagja.
// minIdx : Minimalis index.
// maxIdx : Maximalis index.
// checked : A beallitando ertek;
function selectCBList(nameprefix,minIdx,maxIdx,checked)
{
	for (var i = minIdx; i <= maxIdx; i++)
	{
		var cb = document.getElementById(nameprefix + i);
		if(cb) 
		{
            if( typeof(checked) == "object" )
		        cb.checked = inArray(checked,i);
            else
		        cb.checked = checked;
	    }
	}
}

function enableInput(input,bEnable)
{
    input.disabled = !bEnable;
}

function enableInputFormatNumber(input, decimals)
{
    if( input )
    {
        if( decimals == undefined )
            decimals = 0;
        input.setAttribute('decimals',decimals);
        addEvent(input,"change",null,onInputNumberFormatChange);

        formatNumberField(input, decimals);
    }
}

function formatNumberField(input,decimals)
{
    if( input )
    {
        var value = input.value;
        value = value.replace(/\s/g,"");

        if( value == "" )
            return true;

        value = value.replace(/,/g,".");
        input.value = isNaN(value) ? 0 : formatNumber(value,decimals,"."," ");
        input.value = input.value.replace(/\./g,",");
        return true;
    }
}

function onInputNumberFormatChange(event)
{
    var input = getEventProp(event,"target");
    formatNumberField(input,input.getAttribute('decimals'));
}

function checkElement(element,checkFlags,errmsg,param1,param2)
{
    if( isCheckable(element) )
    {
        if( (element) && (element.tagName) && (element.tagName.toUpperCase() == "INPUT") )
        {
            switch( element.type.toUpperCase() )
            {
                case 'TEXT' :   return checkInput(element,checkFlags,errmsg,param1,param2);
                                break;
                case 'HIDDEN':  return checkInput(element,checkFlags,errmsg,param1,param2);
                                break;
                case 'FILE' :   return checkFile(element,errmsg);
                                break;
                case 'PASSWORD':return checkInput(element,checkFlags,errmsg,param1,param2);
                                break;
                case 'CHECKBOX':return checkCheckbox(element,errmsg,param1,param2);
                                break;
            }
        }

        if( (element) && (element.tagName) && (element.tagName.toUpperCase() == "SELECT") )
        {
            if(checkFlags & CHK_NOTSELECT)
                return checkSelect(element,errmsg,param1,param2);
        }

        if( (element) && (element.tagName) && (element.tagName.toUpperCase() == "TEXTAREA") )
            return checkInput(element,checkFlags,errmsg,param1,param2);
		
		if( (element) && !(element.tagName) && (element.length >= 1) )
		{
			for(var i=0 ; i<element.length ; i++)
			{
				if(element.item(i).checked)
				{
					return true;
				}
			}
			alert(errmsg);
			element.item(0).focus();
			return false;
		}

        if( element == undefined )
            return true;
        else
            alert('Undefined check!');
        return false;
    }

    return true;
}

function checkDateControl(formName,fieldPrefix,requiredDate,requiredTime,errMsgPrefix)
{
    var form = document.forms[formName];
    if( ! form ) { alert('checkdate: Invalid form!'); return false};
    var inpYear  = form.elements[fieldPrefix+'_year'];  if( ! inpYear )  { alert('checkdate: Invalid year field!'); return false};
    var inpMonth = form.elements[fieldPrefix+'_month']; if( ! inpMonth ) { alert('checkdate: Invalid month field!'); return false};
    var inpDay   = form.elements[fieldPrefix+'_day'];   if( ! inpDay )   { alert('checkdate: Invalid day field!'); return false};
    var inpHour  = form.elements[fieldPrefix+'_hour'];   if( ! inpHour )   { alert('checkdate: Invalid hourute field!'); return false};
    var inpMin   = form.elements[fieldPrefix+'_min'];   if( ! inpMin )   { alert('checkdate: Invalid minond field!'); return false};

    var valYear   = listGetSelectedValue(inpYear);
    var valMonth  = listGetSelectedValue(inpMonth);
    var valDay    = listGetSelectedValue(inpDay);
    var valHour   = listGetSelectedValue(inpHour);
    var valMin    = listGetSelectedValue(inpMin);

    if( (requiredDate) || (valYear != "" || valMonth != "" || valDay != "") )
    {
        if(! checkSelect(inpYear, "","",errMsgPrefix) ) return false;
        if(! checkSelect(inpMonth,"","",errMsgPrefix) ) return false;
        if(! checkSelect(inpDay,  "","",errMsgPrefix) ) return false;
    }

    if( (requiredTime) || (valHour != "" || valMin != "") )
    {
        if(! checkSelect(inpHour, "","",errMsgPrefix) ) return false;
        if(! checkSelect(inpMin,"","",errMsgPrefix) ) return false;
    }

    if( valHour != "" && valMin != "" )
        return valYear + "-" + valMonth + "-" + valDay + " " + valHour + ":" + valMin;
    else
        return valYear + "-" + valMonth + "-" + valDay;
}

function checkDateIntersect(date_start,date_end,interval_start,interval_end)
{
    return (    ( date_start >= interval_start && date_start <= interval_end ) ||
                ( date_end >= interval_start && date_end <= interval_end ) ||
                ( date_start <= interval_start && date_end >= interval_end ) ||
                ( date_start >= interval_start && date_end <= interval_end ) );
}

function listAddOption(listElement,value,text)
{
	var index = listElement.length;
	listElement.length++;
	listElement.options[index].value = value;
	listElement.options[index].text = text;
}

function listAddOptionSortByText(listElement,value,text)
{
	var l = listElement.length;
	var e = l;
	var s = 0;
	var option = document.createElement('option');
	option.innerHTML = text;
	option.value = value;

	var index = -1;
	var text = listStrToComparable(text);

	do
	{
		var c = Math.floor((e+s)/2);

		if( (c>0) && (text < listStrToComparable(listElement.options[c-1].text) ) )
			e = c-1;
		else if( (c<l) && (text > listStrToComparable(listElement.options[c].text) ) )
			s = c+2;
		else
			index = ((c==l) || (text < listStrToComparable(listElement.options[c].text) ) ) ?  c : (c+1);

	}
	while( index<0 );

	if( c<l )
		listElement.insertBefore(option, listElement.options[index]);
	else
		listElement.appendChild(option);
}

function listStrToComparable(text)
{
    return text.toString().toLowerCase().replace(/\s+/g,"\x20").replace(/ö|ő/g,'o').replace(/ü|ű|ú/g,'u').replace(/é/g,"e").replace(/á/g,"a").replace(/í/g,"i").replace(/[^a-z0-9\x20]/g,"");
}



function listGetSelectedValue(listElement)
{
    if( listElement.selectedIndex >= 0 )
        return listElement.options[listElement.selectedIndex].value;
    return null;
}

function listGetSelectedText(listElement)
{
    return listElement.options[listElement.selectedIndex].text;
}

function listSelectByValue(listElement,value)
{
    var selected = 0;
    
	for(var index=0;index < listElement.length;index++)
		if(listElement.options[index].value == value)
		{
		    if( listElement.multiple )
			    listElement.options[index].selected = true;
			else
			    listElement.selectedIndex = index;

			selected++;
		}

    return selected;
}

function listIsSelected(listElement)
{
    return (listElement.selectedIndex != -1);
}

function listInList(listElement,onlyselected,value)
{
	var result = false;
	var index = 0;
	while((index < listElement.length) && (!result))
	{
		if( (onlyselected) && (listElement.options[index].selected) )
		{
			if(listElement.options[index].value == value)
				result = true;
		}
		else
			if(listElement.options[index].value == value)
				result = true;

		index++;
	}
	return result;
}

function listGetSelectedCount(listElement)
{
	var result = 0;

	for(var index=0;index < listElement.length;index++)
		if(listElement.options[index].selected)
			result++;

	return result;
}

function listDelOption(listElement,onlySelected)
{
	if(onlySelected)
	{
		var index = listElement.length - 1;
		
		while(index >= 0)
		{
			if(listElement.options[index].selected)
				listElement.options[index] = null;
			
			index--;
		}
	}
	else if(listElement)
	{
		for(var index=0;index < listElement.length;index++)
			listElement.options[index] = null;
		listElement.length = 0;
	}
}

function listSetOptionText(listElement,onlySelected,text)
{
	for(var index=0;index < listElement.length;index++)
	{
		if(onlySelected)
		{
			if(listElement.options[index].selected)
			    listElement.options[index].text = text;
		}
		else
		    listElement.options[index].text = text;
	}
}

function listGetCSV(listElement,onlySelected,separator,part)
{
	var result = "";
	if(separator == undefined)
		separator = ";";
	if(part == undefined)
		part = "value";

	for(var index=0;index < listElement.length;index++)
	{
		if(onlySelected)
		{
			if(listElement.options[index].selected)
				result += ((part == "value") ? listElement.options[index].value : listElement.options[index].text) + separator;
		}
		else
			result += ((part == "value") ? listElement.options[index].value : listElement.options[index].text) + separator;
	}

	if(result != "")
		result = result.substr(0,result.length-separator.length);

	return result;
}

function listGetCSVEx(listElement,onlySelected,sep_value,sep_option)
{
	var result = "";
	if(sep_value == undefined)
	    sep_value = ":";
	if(sep_option == undefined)
		sep_option = ";";

	for(var index=0;index < listElement.length;index++)
	{
		if(onlySelected)
		{
			if(listElement.options[index].selected)
				result += listElement.options[index].value + sep_value + listElement.options[index].text + sep_option;
		}
		else
			result += listElement.options[index].value + sep_value + listElement.options[index].text + sep_option;
	}

	if(result != "")
		result = result.substr(0,result.length-sep_option.length);

	return result;
}

function listMoveOption(listSrcElement,listDestElement,onlySelected,sorting)
{
	if( !listSrcElement ) return false;
	if( !listDestElement ) return false;
	if( isUndefined(sorting) )  sorting = "text";
	
	for( var i=0, opt ; opt = listSrcElement.options[i] ; i++ )
		if(opt.selected || !onlySelected)
		    switch( sorting )
		    {
			    case "text" :   listAddOptionSortByText(listDestElement,opt.value,opt.text);    break;
			    default     :   listAddOption(listDestElement,opt.value,opt.text);    break;
		    }
	
    listDelOption(listSrcElement,onlySelected);
}
