
extern "C" 
{

//------------------------------------------------------------------------------------
// irr::gui::IGUIElement wrappers
// do not delete a pointer to this
//------------------------------------------------------------------------------------

	bool IrrGUI_IGUIElement_drop(IGUIElement* unk)
	{
		if (unk)
			return unk->drop();
		else return 0;
	}
	
	const c8* IrrGUI_IGUIElement_getDebugName(IGUIElement* unk)
	{
		if (unk)
			return unk->getDebugName();
		else return "";
	}
	
	void IrrGUI_IGUIElement_grab(IGUIElement* unk)
	{
		if (unk)
			unk->grab();
	}

	void IrrGUI_IGUIElement_addChild(IGUIElement* el,IGUIElement* child)
	{
		if (el)
			el->addChild(child);
	}
	
	bool IrrGUI_IGUIElement_bringToFront(IGUIElement* el,IGUIElement* element)
	{
		if (el)
			return el->bringToFront(element);
		else return false;
	}
	
	void IrrGUI_IGUIElement_draw(IGUIElement* el)
	{
		if (el)
			el->draw();
	}
	
	rect<s32>* IrrGUI_IGUIElement_getAbsolutePosition(IGUIElement* el)
	{
		if (el)
			return new rect<s32>(el->getAbsolutePosition());
		else return 0;
	}
	
	IGUIElement* IrrGUI_IGUIElement_getElementFromId(IGUIElement* el,s32 id,bool searchchildren=false)
	{
		if (el)
			return el->getElementFromId(id,searchchildren);
		else return 0;
	}
	
	IGUIElement* IrrGUI_IGUIElement_getElementFromPoint(IGUIElement* el,position2d<s32>* point)
	{
		if (el)
			return el->getElementFromPoint(*point);
		else return 0;
	}
	
	s32 IrrGUI_IGUIElement_getID(IGUIElement* el)
	{
		if (el)
			return el->getID();
		else return -1;
	}
	
	IGUIElement* IrrGUI_IGUIElement_getParent(IGUIElement* el)
	{
		if (el)
			return el->getParent();
		else return 0;
	}
	
	rect<s32>* IrrGUI_IGUIElement_getRelativePosition(IGUIElement* el)
	{
		if (el)
			return new rect<s32>(el->getRelativePosition());
		else return 0;
	}
	
	const wchar_t* IrrGUI_IGUIElement_getText(IGUIElement* el)
	{
		if (el) {
			return el->getText();
		} else return L"";
	}
	
	bool IrrGUI_IGUIElement_isEnabled(IGUIElement* el)
	{
		if (el)
			return el->isEnabled();
		else return false;
	}
	
	bool IrrGUI_IGUIElement_isVisible(IGUIElement* el)
	{
		if (el)
			return el->isVisible();
		else return false;
	}
	
	void IrrGUI_IGUIElement_move(IGUIElement* el,position2d<s32>* absoluteMovement)
	{
		if (el)
			el->move(*absoluteMovement);
	}
	
	void IrrGUI_IGUIElement_remove(IGUIElement* el)
	{
		if (el)
			el->remove();
	}
	
	void IrrGUI_IGUIElement_removeChild(IGUIElement* el,IGUIElement* child)
	{
		if (el)
			el->removeChild(child);
	}
	
	void IrrGUI_IGUIElement_setEnabled(IGUIElement* el,bool enabled)
	{
		if (el)
			el->setEnabled(enabled);
	}
	
	void IrrGUI_IGUIElement_setID(IGUIElement* el,s32 id)
	{
		if (el)
			el->setID(id);
	}
	
	void IrrGUI_IGUIElement_setRelativePosition(IGUIElement* el,rect<s32>* r)
	{
		if (el)
			el->setRelativePosition(*r);
	}
	
	void IrrGUI_IGUIElement_setText(IGUIElement* el,wchar_t* text)
	{
		if (el)
			el->setText(text);
	}
	
	void IrrGUI_IGUIElement_setVisible(IGUIElement* el,bool visible)
	{
		if (el)
			el->setVisible(visible);
	}
	
	void IrrGUI_IGUIElement_updateAbsolutePosition(IGUIElement* el)
	{
		if (el)
			el->updateAbsolutePosition();
	}
	
	s32 IrrGUI_IGUIElement_getChildren(IGUIElement* el,u32** ptr)
	{
		if (el)	{			
			Irr_ptrarray_allocate(ptr,el->getChildren().getSize());

			core::list<IGUIElement*>::ConstIterator it = el->getChildren().begin();
			s32 i=0;
	
			// put the pointers into an array
			for (; it != el->getChildren().end(); ++it)
			{
				((u32*)*ptr)[i]=(u32)(*it);
				i++;
			}		

			return el->getChildren().getSize();
		} else return 0;
	}

	IGUIElement* IrrGUI_IGUIElement_getChild(IGUIElement* el,s32 idx)
	{
		IGUIElement* e = 0;
		s32 cnt=0;
		
		core::list<IGUIElement*>::ConstIterator it = el->getChildren().begin();
		for (; it != el->getChildren().end(); ++it)
		{
			if ((cnt+1)==idx) {
				e=(*it);
				break;
			}
		}

		return e;	
	}
		
	EGUI_ELEMENT_TYPE IrrGUI_IGUIElement_getType(IGUIElement* el)
	{
		if (el)
			return el->getType();
		else return EGUIET_ELEMENT;
	}

	// note, changed to an array for ease of use
	s32 IrrGUI_IGUIElement_getChildCount(IGUIElement* el)
	{
		if (el)
			return el->getChildren().getSize();
		else return 0;
	}	
	
	void IrrGUI_IGUIElement_setRelativePositionProportional(IGUIElement* el,const core::rect<f32>& r)
	{
		if (el)
			el->setRelativePositionProportional(r);
	}

	void IrrGUI_IGUIElement_setRelativePositionFromPos(IGUIElement* el,const core::position2di& position)
	{
		if (el)
			el->setRelativePosition(position);
	}
	
	void IrrGUI_IGUIElement_setNotClipped(IGUIElement* el,bool noClip)
	{
		if (el)
			el->setNotClipped(noClip);
	}
	
	bool IrrGUI_IGUIElement_isNotClipped(IGUIElement* el)
	{
		if (el)
			return el->isNotClipped();
		else return false;
	}
	
	void IrrGUI_IGUIElement_setMaxSize(IGUIElement* el,dimension2di* size)
	{
		if (el)
			el->setMaxSize(dimension2du(*size));
	}
	
	void IrrGUI_IGUIElement_setMinSize(IGUIElement* el,dimension2di* size)
	{
		if (el)
			el->setMinSize(dimension2du(*size));
	}

	void IrrGUI_IGUIElement_setAlignment(IGUIElement* el,EGUI_ALIGNMENT left, EGUI_ALIGNMENT right, EGUI_ALIGNMENT top, EGUI_ALIGNMENT bottom)
	{
		if (el)
			el->setAlignment(left,right,top,bottom);
	}
	
	void IrrGUI_IGUIElement_OnPostRender(IGUIElement* el,u32 timeMs)
	{
		if (el)
			el->OnPostRender(timeMs);
	}
	
	bool IrrGUI_IGUIElement_isSubElement(IGUIElement* el)
	{
		if (el)
			return el->isSubElement();
		else return false;
	}
	
	void IrrGUI_IGUIElement_setSubElement(IGUIElement* el,bool subElement)
	{
		if (el)
			el->setSubElement(subElement);
	}
	
	void IrrGUI_IGUIElement_setToolTipText(IGUIElement* el,wchar_t* text)
	{
		if (el)
			el->setToolTipText(text);
	}
	
	const wchar_t* IrrGUI_IGUIElement_getToolTipText(IGUIElement* el)
	{
		if (el)
			return el->getToolTipText().c_str();
		else return L"";
	}
	
	const c8* IrrGUI_IGUIElement_getTypeName(IGUIElement* el)
	{
		if (el)
			return el->getTypeName();
		else return "";
	}
	
	// must delete
	rect<s32>* IrrGUI_IGUIElement_getAbsoluteClippingRect(IGUIElement* el) 
	{
		if (el)
			return new rect<s32>(el->getAbsoluteClippingRect());
		else return 0;
	}
	
	bool IrrGUI_IGUIElement_isPointInside(IGUIElement* el,position2d<s32>* point)
	{
		if (el)
			return el->isPointInside(*point);
		else return false;
	}
	
	void IrrGUI_IGUIElement_setTabStop(IGUIElement* el,bool enable)
	{
		if (el)
			el->setTabStop(enable);
	}
	
	bool IrrGUI_IGUIElement_isTabStop(IGUIElement* el)
	{
		if (el)
			return el->isTabStop();
		else return false;
	}
	
	void IrrGUI_IGUIElement_setTabOrder(IGUIElement* el,s32 index)
	{
		if (el)
			el->setTabOrder(index);
	}
	
	s32 IrrGUI_IGUIElement_getTabOrder(IGUIElement* el)
	{
		if (el)
			return el->getTabOrder();
		else return -1;
	}
	
	void IrrGUI_IGUIElement_setTabGroup(IGUIElement* el,bool isGroup)
	{
		if (el)
			el->setTabGroup(isGroup);
	}
	
	bool IrrGUI_IGUIElement_isTabGroup(IGUIElement* el)
	{
		if (el)
			return el->isTabGroup();
		else return false;
	}
	
	// do not delete
	IGUIElement* IrrGUI_IGUIElement_getTabGroup(IGUIElement* el)
	{
		if (el)
			return el->getTabGroup();
		else return 0;
	}
	
	bool IrrGUI_IGUIElement_isMyChild(IGUIElement* el,IGUIElement* child) 
	{
		if (el)
			return el->isMyChild(child);
		else return false;
	}
	
	bool IrrGUI_IGUIElement_getNextElement(IGUIElement* el,s32 startOrder, bool reverse, bool group, IGUIElement*& first, IGUIElement*& closest, bool includeInvisible=false)
	{
		if (el)
			return el->getNextElement(startOrder, reverse, group, first, closest, includeInvisible);
		else return false;
	}

	bool IrrGUI_IGUIElement_hasType(IGUIElement* el, EGUI_ELEMENT_TYPE type)
	{
		if (el)
			return el->hasType(type);
		else return false;
	}
	
}
