vanilla.namespace('vanilla.html');

vanilla.html.DOM =
{
    toElement : function(e)
    {
	if ( typeof e == 'string' )
	{
	    return document.getElementById(e);
	}

	return e;
    },
	
    getCommonAncestor : function(n1, n2)
    {
	var parents = Array();
	for ( var p = n1.parentNode ; p ; p = p.parentNode )
	{
	    parents.push(p);
	}

	if ( !parents.length )
	{
	    return n1;
	}

	for ( var p = n2.parentNode ; p ; p = p.parentNode )
	{
	    if ( parents.indexOf(p) >= 0 )
	    {
		return p;
	    }
	}

	return null;
    },

    getClassNames : function(element)
    {
	return EL(element).className.split(/\s+/);
    },

    updateClassName : function(element, classNames)
    {
	EL(element).className = classNames.join(' ');
    },

    hasClassName : function(element, className)
    {
	var classes = vanilla.html.DOM.getClassNames(element);
	for ( var i = 0 ; i < classes.length ; i++ )
	{
	    if ( classes[i] == className )
	    {
		return true;
	    }
	}

	return false;
    },

    addClassName : function(element, className, multiply)
    {
	if ( vanilla.html.DOM.hasClassName(element, className) )
	{
	    return;
	}

	var classes = vanilla.html.DOM.getClassNames(element);

	if ( multiply )
	{
	    var l = classes.length;
	    for ( var i = 0 ; i < l ; i++ )
	    {
		classes.push(classes[i] + '-' + className);
	    }
	}

	classes.push(className);
	vanilla.html.DOM.updateClassName(element, classes);
    },

    removeClassName : function(element, className, multiply)
    {
	var classes = vanilla.html.DOM.getClassNames(element);
	var newClasses  = new Array();
	var reg = new RegExp('-?(' + className + '-|' + className + '$)');

	var i, j;
	for ( i = 0, j = 0; i < classes.length ; i++ )
	{
	    if ( !multiply )
	    {
		if ( classes[i] != className )
		{
		    newClasses[j++] = classes[i];
		}
	    }
	    else
	    {
		if ( !reg.test(classes[i]) )
		{
		    newClasses[j++] = classes[i];
		}
	    }
	}

	vanilla.html.DOM.updateClassName(element, newClasses);
    }
};

EL = vanilla.html.DOM.toElement;

vanilla.html.Form =
{
    NOTHING : {},
    
    serialize : function(form)
    {
	form = EL(form);
	
	var serializedCouples = new Array();
	for ( var i = 0 ; i < form.elements.length ; i++ )
	{
	    var field 	= form.elements.item(i);
	    var couple 	= this.serializeField(field);

	    if ( couple != this.NOTHING )
	    {
		serializedCouples.push(couple);
	    }
	}
	
	return serializedCouples.join('&');
    },
    
    serializeField : function(field)
    {
	return this.serializeCouple(field.name, this.getFieldValue(field));
    },
    
    serializeCouple : function(name, value)
    {
	if ( value != this.NOTHING && name != null && name.length )
	{
	    return name + '=' + this.encode(value);
	}
	
	return this.NOTHING;
    },

    encode : function(value)
    {
	if ( !value )
	{
	    return '';
	}

	value = value.replaceAll('%', 	'%25');
	value = value.replaceAll('&', 	'%26');
	value = value.replaceAll('\\?',	'%3F');
	value = value.replaceAll('=', 	'%3D');

	return value;
    },
    
    getFieldValue : function(field)
    {
	field = EL(field);
	switch(field.type)
	{
	    case 'textarea'	: return this._removeCarriageReturn(field.value);
	    case 'password'	: 
	    case 'hidden'	: 
	    case 'text' 	: return field.value;
	    case 'select-one' 	: return vanilla.html.Form.Popup.getSelectedValue(field);
	    case 'submit'	: return (field.value ? field.value : 'Envoyer');
	    case 'radio'	: 
	    case 'checkbox'	: return (field.checked ? field.value : this.NOTHING);
	}
    },

    setFieldValue : function(field, value)
    {
	field = EL(field);
	switch(field.type)
	{
	    case 'textarea'	: 
	    case 'password'	: 
	    case 'hidden'	: 
	    case 'text' 	: field.value = value; break;
	    case 'select-one' 	: vanilla.html.Form.Popup.setSelectedValue(field, value); break;
	    case 'radio'	: 
	    case 'checkbox'	: field.checked = (field.value == value); break;
	}
    },

    _removeCarriageReturn : function(value)
    {
	if ( value ) 
	{
	    value = value.replace(/\r/g, '');
	}

	return value;
    }
};

vanilla.html.Form.Popup =
{
    clear : function(popup, defaultValue, defaultText)
    {
	popup = EL(popup);
	if ( !popup )
	{
	    return;
	}

	while( popup.firstChild )
	{
	    popup.removeChild(popup.firstChild);
	}

	if ( typeof defaultValue != "undefined" )
	{
	    this.addOption(popup, defaultValue, defaultText);
	}
    },

    addOption : function(popup, value, text)
    {
	popup = EL(popup);
	if ( !popup )
	{
	    return;
	}
    
	var o = document.createElement("option");
	o.setAttribute("value", value);
	o.appendChild(document.createTextNode(text));
	popup.appendChild(o);
    },

    getSelectedOption : function(popup)
    {
	popup = EL(popup);
	if ( !popup )
	{
	    return;
	}
    
	if ( popup.selectedIndex < 0 )
	{
	    return null;
	}

	return popup.options[popup.selectedIndex];
    },

    getSelectedValue : function(popup)
    {
	var o = this.getSelectedOption(popup);
	return ( o ? o.value : null );
    },

    getSelectedText : function(popup)
    {
	var o = this.getSelectedOption(popup);
	return ( o ? o.text : null );
    },

    setSelectedValue : function(popup, value)
    {
	popup = EL(popup);
	if ( !popup )
	{
	    return;
	}

	var i = 0;
	for ( var c = popup.firstChild ; c != null ; c = c.nextSibling, i++ )
	{
	    if ( c.value == value )
	    {
		popup.selectedIndex = i;
		break;
	    }
	}
    }
};
