/* This file is part of the KDE project
   Copyright (C) 1998, 1999, 2000 Torben Weis <weis@kde.org>
   Copyright (C) 2004 David Faure <faure@kde.org>

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
*/

#include "KoDocumentInfo.h"
#include "KoDom.h"
#include "KoDocument.h"
#include "kofficeversion.h"
#include "KoApplication.h"

#include <KoStoreDevice.h>
#include <KoXmlWriter.h>

#include <tdeconfig.h>
#include <kdebug.h>
#include <tdeglobal.h>
#include <tdelocale.h>

#include <tqobjectlist.h>
#include <tqdatetime.h>
#include "KoXmlNS.h"

/*****************************************
 *
 * KoDocumentInfo
 *
 *****************************************/

KoDocumentInfo::KoDocumentInfo( TQObject* parent, const char* name )
    : TQObject( parent, name )
{
    (void)new KoDocumentInfoUserMetadata( this );
    (void)new KoDocumentInfoAuthor( this );
    (void)new KoDocumentInfoAbout( this );
}

KoDocumentInfo::~KoDocumentInfo()
{
}

// KOffice-1.3 format
bool KoDocumentInfo::load( const TQDomDocument& doc )
{
    TQStringList lst = pages();
    TQStringList::ConstIterator it = lst.begin();
    for( ; it != lst.end(); ++it )
    {
        KoDocumentInfoPage* p = page( *it );
        Q_ASSERT( p );
        if ( !p->load( doc.documentElement() ) )
            return false;
    }

    return true;
}

bool KoDocumentInfo::loadOasis( const TQDomDocument& metaDoc )
{
    //kdDebug()<<" metaDoc.toString() :"<<metaDoc.toString()<<endl;
    TQStringList lst = pages();
    TQStringList::ConstIterator it = lst.begin();
    for( ; it != lst.end(); ++it )
    {
        KoDocumentInfoPage* p = page( *it );
        Q_ASSERT( p );

        TQDomNode meta   = KoDom::namedItemNS( metaDoc, KoXmlNS::office, "document-meta" );
        TQDomNode office = KoDom::namedItemNS( meta, KoXmlNS::office, "meta" );

        if ( office.isNull() )
            return false;

        if ( !p->loadOasis( office ) )
            return false;
    }
    return true;
}

// KOffice-1.3 format
TQDomDocument KoDocumentInfo::save()
{
    TQDomDocument doc = KoDocument::createDomDocument( "document-info" /*DTD name*/, "document-info" /*tag name*/, "1.1" );
    TQDomElement e = doc.documentElement();

    const TQStringList lst = pages();
    TQStringList::ConstIterator it = lst.begin();
    for( ; it != lst.end(); ++it )
    {
        KoDocumentInfoPage* p = page( *it );
        Q_ASSERT( p );
        TQDomElement s = p->save( doc );
        if ( s.isNull() )
            continue;
        e.appendChild( s );
    }
    if ( e.isNull() )
      return TQDomDocument();

    return doc;
}

bool KoDocumentInfo::saveOasis( KoStore* store )
{
    KoStoreDevice dev( store );
    KoXmlWriter* xmlWriter = KoDocument::createOasisXmlWriter( &dev, "office:document-meta" );
    xmlWriter->startElement( "office:meta" );

    xmlWriter->startElement( "meta:generator");
    xmlWriter->addTextNode( TQString( "KOffice/%1" ).arg( KOFFICE_VERSION_STRING ) );
    xmlWriter->endElement();
    TQStringList lst = pages();
    TQStringList::ConstIterator it = lst.begin();
    for( ; it != lst.end(); ++it )
    {
        KoDocumentInfoPage* p = page( *it );
        Q_ASSERT( p );
        if ( !p->saveOasis( *xmlWriter ) )
            return false;
    }
    xmlWriter->endElement();
    xmlWriter->endElement(); // root element
    xmlWriter->endDocument();
    delete xmlWriter;
    return true;
}

KoDocumentInfoPage* KoDocumentInfo::page( const TQString& name ) const
{
    TQObject* obj = const_cast<KoDocumentInfo*>(this)->child( name.latin1() );

    return (KoDocumentInfoPage*)obj;
}

TQStringList KoDocumentInfo::pages() const
{
    TQStringList ret;

    const TQObjectList list = childrenListObject();
    if ( !list.isEmpty() )
    {
        TQObjectListIt it( list );
        TQObject *obj;
        while ( ( obj = it.current() ) )
        {
            ret.prepend( obj->name() );
            ++it;
        }
    }

    return ret;
}

TQString KoDocumentInfo::title() const
{
    KoDocumentInfoAbout * aboutPage = static_cast<KoDocumentInfoAbout *>(page( "about" ));
    if ( !aboutPage ) {
        kdWarning() << "'About' page not found in documentInfo !" << endl;
        return TQString();
    }
    else
        return aboutPage->title();
}

TQString KoDocumentInfo::creator() const
{
    KoDocumentInfoAuthor * authorPage = static_cast<KoDocumentInfoAuthor *>(page( "author" ));
    if ( !authorPage ) {
        kdWarning() << "'Author' page not found in documentInfo !" << endl;
        return TQString();
    }
    else
        return authorPage->fullName();
}

/*****************************************
 *
 * KoDocumentInfoPage
 *
 *****************************************/

KoDocumentInfoPage::KoDocumentInfoPage( TQObject* parent, const char* name )
    : TQObject( parent, name )
{
}

/*****************************************
 *
 * KoDocumentInfoAuthor
 *
 *****************************************/

KoDocumentInfoAuthor::KoDocumentInfoAuthor( KoDocumentInfo* info )
    : KoDocumentInfoPage( info, "author" )
{
    initParameters();
}

KoDocumentInfoAuthor::~KoDocumentInfoAuthor()
{
    delete m_emailCfg;
}
void KoDocumentInfoAuthor::initParameters()
{
    TDEConfig* config = KoGlobal::kofficeConfig();
    if ( config->hasGroup( "Author" ) ) {
        TDEConfigGroupSaver cgs( config, "Author" );
        m_telephoneHome=config->readEntry( "telephone" );
        m_telephoneWork=config->readEntry( "telephone-work" );
        m_fax=config->readEntry( "fax" );
        m_country=config->readEntry( "country" );
        m_postalCode=config->readEntry( "postal-code" );
        m_city=config->readEntry( "city" );
        m_street=config->readEntry( "street" );
    }

  m_emailCfg = new TDEConfig( "emaildefaults", true );
  m_emailCfg->setGroup( "Defaults" );
  TQString group = m_emailCfg->readEntry("Profile","Default");
  m_emailCfg->setGroup(TQString("PROFILE_%1").arg(group));

  if ( m_fullName.isNull() ) // only if null. Empty means the user made it explicitly empty.
  {
    TQString name = m_emailCfg->readEntry( "FullName" );
    if ( !name.isEmpty() )
      m_fullName = name;
  }
  if ( m_company.isNull() )
  {
    TQString name = m_emailCfg->readEntry( "Organization" );
    if ( !name.isEmpty() )
      m_company = name;
  }
}

bool KoDocumentInfoAuthor::saveOasis( KoXmlWriter &xmlWriter )
{
    if ( !m_fullName.isEmpty() )
    {
     xmlWriter.startElement( "dc:creator");
     xmlWriter.addTextNode( m_fullName );
     xmlWriter.endElement();
    }
    if ( !m_initial.isEmpty() )
    {
     xmlWriter.startElement( "meta:user-defined");
     xmlWriter.addAttribute( "meta:name", "initial" );
     xmlWriter.addTextNode( m_initial );
     xmlWriter.endElement();
    }
    if ( !m_title.isEmpty() )
    {
     xmlWriter.startElement( "meta:user-defined");
     xmlWriter.addAttribute( "meta:name", "author-title" );
     xmlWriter.addTextNode( m_title );
     xmlWriter.endElement();
    }
    if ( !m_company.isEmpty() )
    {
     xmlWriter.startElement( "meta:user-defined");
     xmlWriter.addAttribute( "meta:name", "company" );
     xmlWriter.addTextNode( m_company );
     xmlWriter.endElement();
    }
    if ( !m_email.isEmpty() )
    {
     xmlWriter.startElement( "meta:user-defined");
     xmlWriter.addAttribute( "meta:name", "email" );
     xmlWriter.addTextNode( m_email );
     xmlWriter.endElement();
    }
    if ( !m_telephoneHome.isEmpty() )
    {
     xmlWriter.startElement( "meta:user-defined");
     xmlWriter.addAttribute( "meta:name", "telephone" );
     xmlWriter.addTextNode( m_telephoneHome );
     xmlWriter.endElement();
    }
    if ( !m_telephoneWork.isEmpty() )
    {
     xmlWriter.startElement( "meta:user-defined");
     xmlWriter.addAttribute( "meta:name", "telephone-work" );
     xmlWriter.addTextNode( m_telephoneWork );
     xmlWriter.endElement();
    }
    if ( !m_fax.isEmpty() )
    {
     xmlWriter.startElement( "meta:user-defined");
     xmlWriter.addAttribute( "meta:name", "fax" );
     xmlWriter.addTextNode( m_fax );
     xmlWriter.endElement();
    }
    if ( !m_country.isEmpty() )
    {
     xmlWriter.startElement( "meta:user-defined");
     xmlWriter.addAttribute( "meta:name", "country" );
     xmlWriter.addTextNode( m_country );
     xmlWriter.endElement();
    }
    if ( !m_postalCode.isEmpty() )
    {
     xmlWriter.startElement( "meta:user-defined");
     xmlWriter.addAttribute( "meta:name", "postal-code" );
     xmlWriter.addTextNode( m_postalCode );
     xmlWriter.endElement();
    }
    if ( !m_city.isEmpty() )
    {
     xmlWriter.startElement( "meta:user-defined");
     xmlWriter.addAttribute( "meta:name", "city" );
     xmlWriter.addTextNode( m_city );
     xmlWriter.endElement();
    }
    if ( !m_street.isEmpty() )
    {
     xmlWriter.startElement( "meta:user-defined");
     xmlWriter.addAttribute( "meta:name", "street" );
     xmlWriter.addTextNode( m_street );
     xmlWriter.endElement();
    }
    if ( !m_position.isEmpty() )
    {
     xmlWriter.startElement( "meta:user-defined");
     xmlWriter.addAttribute( "meta:name", "position" );
     xmlWriter.addTextNode( m_position );
     xmlWriter.endElement();
    }
    return true;
}

bool KoDocumentInfoAuthor::loadOasis( const TQDomNode& metaDoc )
{
    TQDomElement e = KoDom::namedItemNS( metaDoc, KoXmlNS::dc, "creator" );
    if ( !e.isNull() && !e.text().isEmpty() )
        m_fullName = e.text();
    TQDomNode n = metaDoc.firstChild();
    for ( ; !n.isNull(); n = n.nextSibling() )
    {
        if (n.isElement())
        {
            TQDomElement e = n.toElement();
            if ( e.namespaceURI() == KoXmlNS::meta && e.localName() == "user-defined" && !e.text().isEmpty() )
            {
                TQString name = e.attributeNS( KoXmlNS::meta, "name", TQString() );
                if ( name == "initial" )
                    m_initial = e.text();
                else if ( name == "author-title" )
                    m_title = e.text();
                else if ( name == "company" )
                    m_company = e.text();
                else if ( name == "email" )
                    m_email = e.text();
                else if ( name == "telephone" )
                    m_telephoneHome = e.text();
                else if ( name == "telephone-work" )
                    m_telephoneWork = e.text();
                else if ( name == "fax" )
                    m_fax = e.text();
                else if ( name == "country" )
                    m_country = e.text();
                else if ( name == "postal-code" )
                    m_postalCode = e.text();
                else if ( name == "city" )
                    m_city = e.text();
                else if ( name == "street" )
                    m_street = e.text();
                else if ( name == "position" )
                    m_position = e.text();
            }
        }
    }
    return true;
}

// KOffice-1.3 format
bool KoDocumentInfoAuthor::load( const TQDomElement& e )
{
    TQDomNode n = e.namedItem( "author" ).firstChild();
    for( ; !n.isNull(); n = n.nextSibling() )
    {
        TQDomElement e = n.toElement();
        if ( e.isNull() ) continue;
        if ( e.tagName() == "full-name" )
            m_fullName = e.text();
        else if ( e.tagName() == "initial" )
            m_initial = e.text();
        else if ( e.tagName() == "title" )
            m_title = e.text();
        else if ( e.tagName() == "company" )
            m_company = e.text();
        else if ( e.tagName() == "email" )
            m_email = e.text();
        else if ( e.tagName() == "telephone" )
            m_telephoneHome = e.text();
        else if ( e.tagName() == "telephone-work" )
            m_telephoneWork = e.text();
        else if ( e.tagName() == "fax" )
            m_fax = e.text();
        else if ( e.tagName() == "country" )
            m_country = e.text();
        else if ( e.tagName() == "postal-code" )
            m_postalCode = e.text();
        else if ( e.tagName() == "city" )
            m_city = e.text();
        else if ( e.tagName() == "street" )
            m_street = e.text();
        else if ( e.tagName() == "position" )
            m_position = e.text();
    }
    return true;
}

TQDomElement KoDocumentInfoAuthor::save( TQDomDocument& doc )
{
    TQDomElement e = doc.createElement( "author" );

    TQDomElement t = doc.createElement( "full-name" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_fullName ) );

    t = doc.createElement( "initial" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_initial ) );


    t = doc.createElement( "title" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_title ) );

    t = doc.createElement( "company" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_company ) );

    t = doc.createElement( "email" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_email ) );

    t = doc.createElement( "telephone" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_telephoneHome ) );

    t = doc.createElement( "telephone-work" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_telephoneWork ) );

    t = doc.createElement( "fax" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_fax ) );

    t = doc.createElement( "country" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_country ) );

    t = doc.createElement( "postal-code" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_postalCode ) );

    t = doc.createElement( "city" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_city ) );

    t = doc.createElement( "street" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_street ) );

    t = doc.createElement( "position" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_position ) );

    return e;
}

TQString KoDocumentInfoAuthor::fullName() const
{
    return m_fullName;
}

TQString KoDocumentInfoAuthor::initial() const
{
    return m_initial;
}

TQString KoDocumentInfoAuthor::title() const
{
    return m_title;
}

TQString KoDocumentInfoAuthor::company() const
{
    return m_company;
}

TQString KoDocumentInfoAuthor::email() const
{
    return m_email;
}

TQString KoDocumentInfoAuthor::telephoneHome() const
{
    return m_telephoneHome;
}

TQString KoDocumentInfoAuthor::telephoneWork() const
{
    return m_telephoneWork;
}

TQString KoDocumentInfoAuthor::fax() const
{
    return m_fax;
}

TQString KoDocumentInfoAuthor::country() const
{
    return m_country;
}

TQString KoDocumentInfoAuthor::postalCode() const
{
    return m_postalCode;
}

TQString KoDocumentInfoAuthor::city() const
{
    return m_city;
}

TQString KoDocumentInfoAuthor::street() const
{
    return m_street;
}

TQString KoDocumentInfoAuthor::position() const
{
    return m_position;
}

void KoDocumentInfoAuthor::setFullName( const TQString& n )
{
    m_fullName = n;
}

void KoDocumentInfoAuthor::setInitial( const TQString& n )
{
    m_initial = n;
}

void KoDocumentInfoAuthor::setTitle( const TQString& n )
{
    m_title = n;
}

void KoDocumentInfoAuthor::setCompany( const TQString& n )
{
    m_company = n;
}

void KoDocumentInfoAuthor::setEmail( const TQString& n )
{
    m_email = n;
}

void KoDocumentInfoAuthor::setTelephoneHome( const TQString& n )
{
    m_telephoneHome = n;
}

void KoDocumentInfoAuthor::setTelephoneWork( const TQString& n )
{
    m_telephoneWork = n;
}

void KoDocumentInfoAuthor::setFax( const TQString& n )
{
    m_fax = n;
}

void KoDocumentInfoAuthor::setCountry( const TQString& n )
{
    m_country = n;
}

void KoDocumentInfoAuthor::setPostalCode( const TQString& n )
{
    m_postalCode = n;
}

void KoDocumentInfoAuthor::setCity( const TQString& n )
{
    m_city = n;
}

void KoDocumentInfoAuthor::setStreet( const TQString& n )
{
    m_street = n;
}

void KoDocumentInfoAuthor::setPosition( const TQString& n )
{
    m_position = n;
}


/*****************************************
 *
 * KoDocumentInfoAbout
 *
 *****************************************/

KoDocumentInfoAbout::KoDocumentInfoAbout( KoDocumentInfo* info )
    : KoDocumentInfoPage( info, "about" )
{
    m_firstSave = true;
    m_docInfo = info;
    m_editingCycles = 0;
    m_initialCreator = m_docInfo->creator();
    m_creationDate = TQDateTime::currentDateTime();
}

void KoDocumentInfoAbout::saveParameters()
{
    KoDocument* doc = dynamic_cast< KoDocument* >( m_docInfo->parent() );
    if ( m_firstSave && doc && !doc->isAutosaving() )
       m_editingCycles++;
    m_modificationDate = TQDateTime::currentDateTime();
    m_firstSave = false;
}

bool KoDocumentInfoAbout::saveOasis( KoXmlWriter &xmlWriter )
{
    saveParameters();
    if ( !m_title.isEmpty() )
    {
     xmlWriter.startElement( "dc:title" );
     xmlWriter.addTextNode( m_title );
     xmlWriter.endElement();
    }
    if ( !m_abstract.isEmpty() )
    {
     xmlWriter.startElement( "dc:description" );
     xmlWriter.addTextNode( m_abstract );
     xmlWriter.endElement();
    }
    if ( !m_keywords.isEmpty() )
    {
     xmlWriter.startElement( "meta:keyword" );
     xmlWriter.addTextNode( m_keywords );
     xmlWriter.endElement();
    }
    if ( !m_subject.isEmpty() )
    {
     xmlWriter.startElement( "dc:subject" );
     xmlWriter.addTextNode( m_subject );
     xmlWriter.endElement();
    }
    if ( !m_initialCreator.isEmpty() )
    {
     xmlWriter.startElement( "meta:initial-creator" );
     xmlWriter.addTextNode( m_initialCreator );
     xmlWriter.endElement();
    }

    xmlWriter.startElement( "meta:editing-cycles" );
    xmlWriter.addTextNode( TQString::number( m_editingCycles ) );
    xmlWriter.endElement();

    if ( m_creationDate.isValid() )
    {
        xmlWriter.startElement( "meta:creation-date" );
        xmlWriter.addTextNode( m_creationDate.toString( TQt::ISODate ) );
        xmlWriter.endElement();
    }

    if ( m_modificationDate.isValid() )
    {
        xmlWriter.startElement( "dc:date" );
        xmlWriter.addTextNode( m_modificationDate.toString( TQt::ISODate ) );
        xmlWriter.endElement();
    }
    return true;
}

bool KoDocumentInfoAbout::loadOasis( const TQDomNode& metaDoc )
{
    TQDomElement e  = KoDom::namedItemNS( metaDoc, KoXmlNS::dc, "title" );
    if ( !e.isNull() && !e.text().isEmpty() )
    {
        m_title = e.text();
    }
    e  = KoDom::namedItemNS( metaDoc, KoXmlNS::dc, "description" );
    if ( !e.isNull() && !e.text().isEmpty() )
    {
        m_abstract = e.text();
    }
    e  = KoDom::namedItemNS( metaDoc, KoXmlNS::dc, "subject" );
    if ( !e.isNull() && !e.text().isEmpty() )
    {
        m_subject = e.text();
    }
    e  = KoDom::namedItemNS( metaDoc, KoXmlNS::meta, "keyword" );
    if ( !e.isNull() && !e.text().isEmpty() )
    {
        m_keywords = e.text();
    }
    e = KoDom::namedItemNS( metaDoc, KoXmlNS::meta, "initial-creator" );
    if ( !e.isNull() && !e.text().isEmpty() )
        m_initialCreator = e.text();
    else
	m_initialCreator = i18n( "Unknown" );

    e = KoDom::namedItemNS( metaDoc, KoXmlNS::meta, "editing-cycles" );
    if ( !e.isNull() && !e.text().isEmpty() )
        m_editingCycles = e.text().toInt();

    e  = KoDom::namedItemNS( metaDoc, KoXmlNS::meta, "creation-date" );
    if ( !e.isNull() && !e.text().isEmpty() )
        m_creationDate = TQDateTime::fromString( e.text(), TQt::ISODate );
    else
        m_creationDate = TQDateTime();

    e  = KoDom::namedItemNS( metaDoc, KoXmlNS::dc, "date"  );
    if ( !e.isNull() && !e.text().isEmpty() )
        m_modificationDate = TQDateTime::fromString( e.text(), TQt::ISODate );
    return true;
}

// KOffice-1.3 format
bool KoDocumentInfoAbout::load( const TQDomElement& e )
{
    TQDomNode n = e.namedItem( "about" ).firstChild();
    for( ; !n.isNull(); n = n.nextSibling()  )
    {
        TQDomElement e = n.toElement();
        if ( e.isNull() ) continue;
        if ( e.tagName() == "abstract" )
            m_abstract = e.text();
        else if ( e.tagName() == "title" )
            m_title = e.text();
        else if ( e.tagName() == "subject" )
            m_subject = e.text();
        else if ( e.tagName() == "keyword" )
            m_keywords = e.text();
        else if ( e.tagName() == "initial-creator" )
            m_initialCreator = e.text();
        else if ( e.tagName() == "editing-cycles" )
            m_editingCycles = e.text().toInt();
        else if ( e.tagName() == "creation-date" )
            m_creationDate = TQDateTime::fromString( e.text(), TQt::ISODate );
        else if ( e.tagName() == "date" )
            m_modificationDate = TQDateTime::fromString( e.text(), TQt::ISODate );
    }

    return true;
}

// KOffice-1.3 format
TQDomElement KoDocumentInfoAbout::save( TQDomDocument& doc )
{
    saveParameters();
    TQDomElement e = doc.createElement( "about" );

    TQDomElement t = doc.createElement( "abstract" );
    e.appendChild( t );
    t.appendChild( doc.createCDATASection( m_abstract ) );

    t = doc.createElement( "title" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_title ) );

    t = doc.createElement( "keyword" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_keywords ) );

    t = doc.createElement( "subject" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_subject ) );

    t = doc.createElement( "initial-creator" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_initialCreator ) );

    t = doc.createElement( "editing-cycles" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( TQString::number( m_editingCycles ) ) );

    t = doc.createElement( "creation-date" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_creationDate.toString( TQt::ISODate ) ) );

    t = doc.createElement( "date" );
    e.appendChild( t );
    t.appendChild( doc.createTextNode( m_modificationDate.toString( TQt::ISODate ) ) );
    return e;
}

TQString KoDocumentInfoAbout::title() const
{
    return m_title;
}

TQString KoDocumentInfoAbout::abstract() const
{
    return m_abstract;
}

TQString KoDocumentInfoAbout::initialCreator() const
{
    return m_initialCreator;
}

TQString KoDocumentInfoAbout::editingCycles() const
{
    return TQString::number( m_editingCycles );
}

TQString KoDocumentInfoAbout::creationDate() const
{
    if ( m_creationDate.isValid() )
        return TDEGlobal::locale()->formatDateTime( m_creationDate );
    else
        return TQString();
}

TQString KoDocumentInfoAbout::modificationDate() const
{
    if ( m_modificationDate.isValid() )
        return TDEGlobal::locale()->formatDateTime( m_modificationDate );
    else
        return TQString();
}

void KoDocumentInfoAbout::setTitle( const TQString& n )
{
    m_title = n;
}

void KoDocumentInfoAbout::setAbstract( const TQString& n )
{
    m_abstract = n;
}

TQString KoDocumentInfoAbout::keywords() const
{
    return m_keywords;
}

TQString KoDocumentInfoAbout::subject() const
{
    return m_subject;
}

void KoDocumentInfoAbout::setKeywords( const TQString& n )
{
    m_keywords = n;
}

void KoDocumentInfoAbout::setSubject( const TQString& n )
{
    m_subject = n;
}

void KoDocumentInfoAbout::resetMetaData()
{
    m_editingCycles = 0;
    m_initialCreator = m_docInfo->creator();
    m_creationDate = TQDateTime::currentDateTime();
    m_modificationDate = TQDateTime();
}

/*****************************************
 *
 * KoDocumentInfoUserMetadata
 *
 *****************************************/

KoDocumentInfoUserMetadata::KoDocumentInfoUserMetadata( KoDocumentInfo* info )
    : KoDocumentInfoPage( info, "user_metadata" )
{
    m_reserved << "initial" << "author-title" << "company" << "email" << "telephone"
    << "telephone-work" << "fax" << "country" << "postal-code" << "city" << "street"
    << "position";
}

bool KoDocumentInfoUserMetadata::saveOasis( KoXmlWriter &xmlWriter )
{
  TQMap<TQString, TQString>::iterator it;
  for ( it = m_metaList.begin(); it != m_metaList.end(); ++it )
  {
    xmlWriter.startElement( "meta:user-defined");
    xmlWriter.addAttribute( "meta:name", it.key() );
    xmlWriter.addTextNode( it.data() );
    xmlWriter.endElement();
  }
  return true;
}

bool KoDocumentInfoUserMetadata::loadOasis( const TQDomNode& metaDoc )
{
    TQDomNode n = metaDoc.firstChild();
    for ( ; !n.isNull(); n = n.nextSibling() )
    {
        if (n.isElement())
        {
            TQDomElement e = n.toElement();
            if ( e.namespaceURI() == KoXmlNS::meta && e.localName() == "user-defined" && !e.text().isEmpty() )
            {
                TQString name = e.attributeNS( KoXmlNS::meta, "name", TQString() );
                if ( !m_reserved.contains( name ) )
                    m_metaList[ name ] = e.text();
            }
        }
    }
    return true;
}

// KOffice-1.3 format
bool KoDocumentInfoUserMetadata::load( const TQDomElement& )
{
    return true;
}

// KOffice-1.3 format
TQDomElement KoDocumentInfoUserMetadata::save( TQDomDocument& )
{
    return TQDomElement();
}

#include <KoDocumentInfo.moc>
