/**
 * Misc helper methods for DOM handling
 *
 * Depends: Browser.class
 */

function DOMHelper()
{
	this.className = 'DOMHelper';
}

DOMHelper.prototype.addEventListener = function( obj, type, func )
{
	if( obj.addEventListener )
	{
		obj.addEventListener( type, func, false );
	}
	else if( obj.attachEvent )
	{
		obj["e"+type+func] = func;
		obj[type+func] = function() { obj["e"+type+func]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+func] );
	}
}

DOMHelper.prototype.removeEventListener = function( obj, type, func )
{
	if( obj.removeEventListener )
	{
		obj.removeEventListener( type, func, false );
	}
	else if( obj.detachEvent )
	{
		obj.detachEvent( "on"+type, obj[type+func] );
		obj[type+func] = null;
		obj["e"+type+func] = null;
	}
}

DOMHelper.prototype.getFormData = function( formObj )
{
	var str = '';

	for( var i = 0; i < formObj.elements.length; i++ )
	{
		switch( formObj.elements[i].type )
		{
			case 'text':
			case 'password':
			case 'hidden':
			case 'select-one':
			case 'textarea':
				str += formObj.elements[i].name + '=' + encodeURIComponent(formObj.elements[i].value) + '&';
				break;
			case 'radio':
				if (formObj.elements[i].checked)
				{
					str += formObj.elements[i].name + '=' + encodeURIComponent(formObj.elements[i].value) + '&';
				}
				break;
			case 'checkbox':
				if (formObj.elements[i].checked)
				{
					str += formObj.elements[i].name + '=' + encodeURIComponent(formObj.elements[i].value) + '&';
				}
				else
				{
					str += formObj.elements[i].name + '=0&';
				}
				break;
			case 'select-multiple':
				for( var x=0; x < formObj.elements[i].options.length; x++ )
				{
					if( formObj.elements[i].options[x].selected )
					{
						str += formObj.elements[i].name + '=' + encodeURIComponent( formObj.elements[i].options[x].value ) + '&';
					}
				}
				break;
		}
		
	}
	var fixedStr = str.substr( 0, (str.length - 1) );
	return fixedStr;
}

DOMHelper.prototype.removeChilds = function( object )
{
	while( object.firstChild )
	{
		object.removeChild( object.firstChild );
	}
}

DOMHelper.prototype.addClassName = function( obj, className )
{
	this.removeClassName( obj, className );
	obj.className += ' '+className+' ';
}

DOMHelper.prototype.removeClassName = function( obj, className )
{
	obj.className = obj.className.replace( eval( '/\s*'+className+'\s*/g' ), '' );
}

DOMHelper.prototype.highlightObjById = function( id, mode )
{
	var obj = document.getElementById( id );
	this.highlightObj( obj, mode );
}

DOMHelper.prototype.highlightObj = function( obj, mode )
{
	if( mode || mode=='on' )
	{
		this.removeClassName( obj, 'highlight_off' );
		this.addClassName( obj, 'highlight_on' );
	}
	else
	{
		this.removeClassName( obj, 'highlight_on' );
		this.addClassName( obj, 'highlight_off' );
	}
}

DOMHelper.prototype.selectObjById = function( id, mode )
{
	var obj = document.getElementById( id );
	this.selectObj( obj );
}

DOMHelper.prototype.selectObj = function( obj, mode )
{
	obj.setAttribute( 'selected', mode );
	if( mode )
	{
		this.removeClassName( obj, 'select_off' );
		this.addClassName( obj, 'select_on' );
	}
	else
	{
		this.removeClassName( obj, 'select_on' );
		this.addClassName( obj, 'select_off' );
	}
}

DOMHelper.prototype.toggleObjSelected = function( obj )
{
	if( this.getAttribute( 'selected' ) && this.getAttribute( 'selected' ).toString() == true.toString() ){
		this.selectObj( obj, false );
		return false;
	}
	else
	{
		this.selectObj( obj, true );
		return true;
	}
}

DOMHelper.prototype.isBlank = function( arrayForm )
{
	var msg = "";
	for( var i = 0; i < arrayForm.length; i++ )
	{
		blank = document.getElementById( arrayForm[i] );
		if( blank.value=="" )
		{
	 		msg += "Campo "+blank.name+" vazio.\n";
	 	}
	}
	
	if( msg!="" )
	{
		return msg;
	}
}

// opacity for: CSS3, Firefox(Mozilla), Konqueror(Safari), IE
DOMHelper.prototype.setOpacity = function( obj, value )
{
	obj.style.opacity = value; /* Official CSS3 method */
   	obj.style.MozOpacity = value; /* Firefox, Mozilla */
   	obj.style.KhtmlOpacity = value; /* Konqueror, Safari */
   	
   	/* o value do IE é diferente do Mozilla e etc...aonde seria 0.3 no IE é 30 */
   	var value = value*100;
   	
   	obj.style.filter = "progid:DXImageTransform.Microsoft.Alpha( opacity = "+value+" )";
}

DOMHelper.prototype.getIFrameDocument = function( id )
{
	var rv = null; 
	if( oBrowser.isIE() )
	{
		rv = document.getElementsByTagName( 'iframe' )[id]; 
	}
	else
	{
		rv = document.getElementById( id ).contentDocument; 
	}
	return rv; 
}

DOMHelper.prototype.toggleObjDisplayById = function(id)
{
	var obj = document.getElementById( id );
	this.toggleObjDisplay( obj );
}

DOMHelper.prototype.toggleObjDisplay = function( obj )
{
	if( obj.style.display == "none" )
	{
		this.restoreObjDisplay( obj );
	}
	else
	{
		obj.style.display = "none";
	}
}

DOMHelper.prototype.restoreObjDisplay = function( obj )
{
	// TODO: is there a way to find the default display setting of an object? so we don't have to recur to this hack...
	switch( obj.tagName.toUpperCase() )
	{
		case 'TABLE':
		case 'DIV':
		case 'P':
			obj.style.display = 'block';
			break;
		case 'IMG':
		case 'FONT':
		case 'SPAN':
			obj.style.display = 'inline';
			break;
		case 'TBODY':
			if(oBrowser.isIE()){
				obj.style.display = 'block';
			} else {
				obj.style.display = 'table-row-group';
			}
			break;
		case 'THEAD':
			if(oBrowser.isIE()){
				obj.style.display = 'block';
			} else {
				obj.style.display = 'table-header-group';
			}
			break;
		case 'TFOOT':
			if(oBrowser.isIE()){
				obj.style.display = 'block';
			} else {
				obj.style.display = 'table-footer-group';
			}
			break;
		case 'TR':
			if(oBrowser.isIE()){
				obj.style.display = 'block';
			} else {
				obj.style.display = 'table-row';
			}
			break;
		case 'TD':
			if(oBrowser.isIE()){
				obj.style.display = 'block';
			} else {
				obj.style.display = 'table-cell';
			}
			break;
		case 'LI':
			obj.style.display = 'list-item';
			break;
		default:
			obj.style.display = '';
	}
}

DOMHelper.prototype.extractMessage = function( xmlDocument )
{
	var response = xmlDocument.getElementsByTagName( 'response' )[0];

	var messages = response.getElementsByTagName( 'message' );
	var message = messages[0].firstChild.nodeValue;
	
	var errors = response.getElementsByTagName( 'error' );
	var error = errors[0].firstChild.nodeValue;
	
	if( error == '1' )
	{
		return 'Error: '+message;
	}
	else
	{
		return message;
	}
}

// TODO: implement something better, like a message DIV or something...
DOMHelper.prototype.successMessage = function( message )
{
	alert( message );
}

DOMHelper.prototype.errorMessage = function( message )
{
	alert( 'Erro: '+message );
}

DOMHelper.prototype.createFieldForWithOptions = function(id, type, size, className)
{
	var obj = document.getElementById(id);
	var obj_txt = document.createElement('input');
	obj_txt.className = className;
	obj_txt.setAttribute('type', type);
	obj_txt.setAttribute('size', size);
	obj_txt.setAttribute('name', obj.getAttribute('id')+'_txt');
	obj_txt.setAttribute('id', obj.getAttribute('id')+'_txt');	
	if (obj.firstChild && obj.firstChild.nodeName == '#text')
	{
		obj_txt.setAttribute('value', obj.firstChild.nodeValue);
	}
	this.removeChilds(obj);
	obj.appendChild(obj_txt);	
}

DOMHelper.prototype.removeFieldFor = function(id)
{
	var obj = document.getElementById(id);
	var fieldObj = document.getElementById(id+'_txt');
	var fieldValue = fieldObj.value;
	obj.appendChild(document.createTextNode(fieldValue));
	obj.removeChild(fieldObj);
}

DOMHelper.prototype.showHideJQuery = function(id, type)
{
	var element = document.getElementById(id);
	
	switch(type)
	{
		case 'fade':
			if(element.style.display=="none")
			{
				$(document).ready(function()
				{
					$("#"+id).fadeIn("slow");
				});
			}
			else if(element.style.display=="" || element.style.display=="block")
			{
				$(document).ready(function()
				{
					$("#"+id).fadeOut("slow");
				});
			}
		break;
		
		case 'slide':
			if(element.style.display=="none")
			{
				$(document).ready(function()
				{
					$("#"+id).slideDown("slow");
				});
			}
			else if(element.style.display=="" || element.style.display=="block")
			{
				$(document).ready(function()
				{
					$("#"+id).slideUp("slow");
				});
			}
		break;
		
		default:
			
		break;
	}
	
}

DOMHelper.prototype.createSelectableItem = function(itemName, optionsArray, selectedValue)
{
	var select = document.createElement('select');
	select.setAttribute('id', itemName);
	select.setAttribute('name', itemName);
	
	for (i = 0; i < optionsArray.length; i++)
	{
		var option = document.createElement('option');
		option.setAttribute('id', optionsArray[i][2]);
		option.setAttribute('value', optionsArray[i][0]);
		if (optionsArray[i][0] == selectedValue)
		{
			option.setAttribute('selected', 'selected');
		}
		option.innerHTML = optionsArray[i][1];
		select.appendChild(option);
	}
	return select;
}

DOMHelper.prototype.confirmDelete = function(address, message) 
{	
	if(confirm(message)==true)
	{
		var address = new String(address);
		window.location.href = address;
	}
}

oDOMHelper = new DOMHelper();