//-----------------------------------------------------------------------------
// Copyright (c) 2013 GarageGames, LLC
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//-----------------------------------------------------------------------------

ConsoleMethodGroupBeginWithDocs(SimXMLDocument, SimObject)

/*! Set this to default state at construction.
    @return No return value
*/
ConsoleMethodWithDocs(SimXMLDocument, reset, ConsoleVoid, 2, 2, ())
{
   object->reset();
}

/*! Load file from given filename.
    @param fileName The name of the desired file
    @return Returns 1 on success and 0 otherwise
*/
ConsoleMethodWithDocs(SimXMLDocument, loadFile, ConsoleInt, 3, 3, (string fileName))
{
   return object->loadFile( argv[2] );
}

/*! Save file to given filename.
    @param fileName A string presenting the filename to save the XML document as
    @return Returns 1 on success, and 0 otherwise
*/
ConsoleMethodWithDocs(SimXMLDocument, saveFile, ConsoleInt, 3, 3, (string fileName))
{
   return object->saveFile( argv[2] );
}

/*! Create document from XML string.
    @param txtXML The text of the XML document
    @return Returns 1 on success
*/
ConsoleMethodWithDocs(SimXMLDocument, parse, ConsoleInt, 3, 3, (string txtXML))
{
   return object->parse( argv[2] );
}

/*! Clear contents of XML document.
    @return No return value
*/
ConsoleMethodWithDocs(SimXMLDocument, clear, ConsoleVoid, 2, 2, ())
{
   object->clear();
}

/*! Get current error description.
    @return Returns a string with the error description
*/
ConsoleMethodWithDocs(SimXMLDocument, getErrorDesc, ConsoleString, 2, 2, ())
{
   // Create Returnable Buffer (duration of error description is unknown).
   char* pBuffer = Con::getReturnBuffer(256);
   // Format Buffer.
   dSprintf(pBuffer, 256, "%s", object->getErrorDesc());
   // Return Velocity.
   return pBuffer;
}

/*! Clear error description.
    @return No return value
*/
ConsoleMethodWithDocs(SimXMLDocument, clearError, ConsoleVoid, 2, 2, ())
{
   object->clearError();
}

/*! Push first child element with given name onto stack.
    @param name The name of the child element
    @return returns true on success, false otherwise.
*/
ConsoleMethodWithDocs(SimXMLDocument, pushFirstChildElement, ConsoleBool, 3, 3, (string name))
{
   return object->pushFirstChildElement( argv[2] );
}

/*! Push the child element at the given index onto stack.
    @param index A nonnegative integer representing the index of the child element
    @return Returns true on success, and false otherwise
*/
ConsoleMethodWithDocs(SimXMLDocument, pushChildElement, ConsoleBool, 3, 3, (int index))
{
   return object->pushChildElement( dAtoi( argv[2] ) );
}

/*! Set top element on stack to next element with given name.
    @param name The name of the element.
    @return Returns true on success, false otherwise
*/
ConsoleMethodWithDocs(SimXMLDocument, nextSiblingElement, ConsoleBool, 3, 3, (string name))
{
   return object->nextSiblingElement( argv[2] );
}

/*! Get element value if it exists.
    @return A string with the desired value, or empty if not found.
*/
ConsoleMethodWithDocs(SimXMLDocument, elementValue, ConsoleString, 2, 2, ())
{
   // Create Returnable Buffer (because duration of value is unknown).
   char* pBuffer = Con::getReturnBuffer(256);
   dSprintf(pBuffer, 256, "%s", object->elementValue());
   return pBuffer;
}

/*! Pop last element off of stack.
    @return No return value
*/
ConsoleMethodWithDocs(SimXMLDocument, popElement, ConsoleVoid, 2, 2, ())
{
   object->popElement();
}

/*! Get attribute value if it exists.
    @param attribute The desired SimXMLDocument attribute
    @return Returns the value of the attribute as a string, or an empty string on failure
*/
ConsoleMethodWithDocs(SimXMLDocument, attribute, ConsoleString, 3, 3, (string attribute))
{
   // Create Returnable Buffer (because duration of attribute is unknown).
   char* pBuffer = Con::getReturnBuffer(256);
   // Format Buffer.
   dSprintf(pBuffer, 256, "%s", object->attribute( argv[2] ));
   // Return Velocity.
   return pBuffer;
}

/*! Get attribute value if it exists.
    @param attribute The desired SimXMLDocument attribute
    @return Returns the value of the attribute converted to 32-bit floating-point value from string
*/
ConsoleMethodWithDocs(SimXMLDocument, attributeF32, ConsoleFloat, 3, 3, (string attribute))
{
   return dAtof( object->attribute( argv[2] ) );
}

/*! Get attribute value if it exists.
    @param attribute The desired SimXMLDocument attribute
    @return Returns the value of the attribute converted to 32-bit integer value from string
*/
ConsoleMethodWithDocs(SimXMLDocument, attributeS32, ConsoleInt, 3, 3, (string attribute))
{
   return dAtoi( object->attribute( argv[2] ) );
}

/*! Get true if named attribute exists.
    @param attribute The desired attribute's name
    @return Returns true if attribute exists and false otherwise
*/
ConsoleMethodWithDocs(SimXMLDocument, attributeExists, ConsoleBool, 3, 3, (string attribute))
{
   return object->attributeExists( argv[2] );
}

/*! Obtain the name of the current element's first attribute.
    @return A string with the name of the first attribute
*/
ConsoleMethodWithDocs(SimXMLDocument, firstAttribute, ConsoleString, 2, 2, ())
{
   const char* name = object->firstAttribute();

   // Create Returnable Buffer (because duration of attribute is unknown).
   char* pBuffer = Con::getReturnBuffer(dStrlen(name)+1);
   dStrcpy(pBuffer, name);
   return pBuffer;
}

/*! Obtain the name of the current element's last attribute.
    @return A string with the name of the last attribute
*/
ConsoleMethodWithDocs(SimXMLDocument, lastAttribute, ConsoleString, 2, 2, ())
{
   const char* name = object->lastAttribute();

   // Create Returnable Buffer (because duration of attribute is unknown).
   char* pBuffer = Con::getReturnBuffer(dStrlen(name)+1);
   dStrcpy(pBuffer, name);
   return pBuffer;
}

/*! Get the name of the next attribute for the current element after a call to firstAttribute().
    @return A string with the name of the next attribute
*/
ConsoleMethodWithDocs(SimXMLDocument, nextAttribute, ConsoleString, 2, 2, ())
{
   const char* name = object->nextAttribute();

   // Create Returnable Buffer (because duration of attribute is unknown).
   char* pBuffer = Con::getReturnBuffer(dStrlen(name)+1);
   dStrcpy(pBuffer, name);
   return pBuffer;
}

/*! Get the name of the previous attribute for the current element after a call to lastAttribute().
    @return A string with the name of the previous attribute
*/
ConsoleMethodWithDocs(SimXMLDocument, prevAttribute, ConsoleString, 2, 2, ())
{
   const char* name = object->prevAttribute();

   // Create Returnable Buffer (because duration of attribute is unknown).
   char* pBuffer = Con::getReturnBuffer(dStrlen(name)+1);
   dStrcpy(pBuffer, name);
   return pBuffer;
}

/*! Set attribute of top stack element to given value.
    @param attributeName The name of the attribute of the element you wish to set
    @param attributeValue The value you wish to set the given attribute to
    @return No return value.
*/
ConsoleMethodWithDocs(SimXMLDocument, setAttribute, ConsoleVoid, 4, 4, (string attributeName, string attributeValue))
{
   object->setAttribute(argv[2], argv[3]);
}

/*! Set attribute of top stack element to given value.
    @param attributeValue The value you wish to set the given attribute to
    @return No return value.
*/
ConsoleMethodWithDocs(SimXMLDocument, setObjectAttributes, ConsoleVoid, 3, 3, (string attributeValue))
{
   object->setObjectAttributes(argv[2]);
}

/*! Create new element as child of current stack element 
    and push new element on to stack.
    @param name The anme of the new element
    @return No return value
*/
ConsoleMethodWithDocs(SimXMLDocument, pushNewElement, ConsoleVoid, 3, 3, (string name))
{
   object->pushNewElement( argv[2] );
}

/*! Create new element as child of current stack element 
    and push new element on to stack.
    @param name The anme of the new element
    @return No return value
*/
ConsoleMethodWithDocs(SimXMLDocument, addNewElement, ConsoleVoid, 3, 3, (string name))
{
   object->addNewElement( argv[2] );
}

/*! Add XML header to document.
    @return No return value.
*/
ConsoleMethodWithDocs(SimXMLDocument, addHeader, ConsoleVoid, 2, 2, ())
{
   object->addHeader();
}

/*! Add the given comment as a child of current stack element.
    @param comment The desired comment to add
    @return No return value.
*/
ConsoleMethodWithDocs(SimXMLDocument, addComment, ConsoleVoid, 3, 3, (string comment))
{
   object->addComment(argv[2]);
}

/*! Returns the comment at the specified index.
    @param index The index of the desired comment as a nonnegative integer value
    @return The comment as a string
*/
ConsoleMethodWithDocs(SimXMLDocument, readComment, ConsoleString, 3, 3, (S32 index))
{
   return object->readComment( dAtoi( argv[2] ) );
}

/*! Add the given text as a child of current stack element.
    @param text The desired text to add
    @return No return value.
*/
ConsoleMethodWithDocs(SimXMLDocument, addText, ConsoleVoid, 3, 3, (string text))
{
   object->addText(argv[2]);
}

/*! Gets the text from the current stack element.
    @return Returns the desired text, or empty string on failure
*/
ConsoleMethodWithDocs(SimXMLDocument, getText, ConsoleString, 2, 2, ())
{
   const char* text = object->getText();
   if( !text )
      return "";

   char* pBuffer = Con::getReturnBuffer(dStrlen( text ) + 1);
   dStrcpy( pBuffer, text );
   return pBuffer;
}

/*! Remove any text on the current stack element.
    @return No return value
*/
ConsoleMethodWithDocs(SimXMLDocument, removeText, ConsoleVoid, 2, 2, ())
{
   object->removeText();
}

/*! Add the given text as a child of current stack element.
    @param The desired text to add
    @return No return value
*/
ConsoleMethodWithDocs(SimXMLDocument, addData, ConsoleVoid, 3, 3, (string text))
{
   object->addData(argv[2]);
}

/*! Gets the text from the current stack element.
    @return Returns the desired text or empty string if failed (no text)
*/
ConsoleMethodWithDocs(SimXMLDocument, getData, ConsoleString, 2, 2, ())
{
   const char* text = object->getData();
   if( !text )
      return "";

   char* pBuffer = Con::getReturnBuffer(dStrlen( text ) + 1);
   dStrcpy( pBuffer, text );
   return pBuffer;
}

ConsoleMethodGroupEndWithDocs(SimXMLDocument)
