/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"




#include <svtools/htmlout.hxx>
#include <svtools/htmlkywd.hxx>
#include <errhdl.hxx>
#include <ndindex.hxx>
#include <fmtftn.hxx>
#include <txtftn.hxx>
#include <ftninfo.hxx>
#include <doc.hxx>
#include <ndtxt.hxx>
#include <charfmt.hxx>


#include "swhtml.hxx"
#include "wrthtml.hxx"

typedef SwTxtFtn *SwTxtFtnPtr;
SV_DECL_PTRARR( SwHTMLTxtFtns, SwTxtFtnPtr, 1, 1 )

struct SwHTMLFootEndNote_Impl
{
	SwHTMLTxtFtns aTxtFtns;
	SvStringsDtor aNames;

	String sName;
	String sContent;			// Infos fuer die letzte Fussnote
	sal_Bool bEndNote;
	sal_Bool bFixed;
};


xub_StrLen lcl_html_getNextPart( String& rPart, const String& rContent,
							 xub_StrLen nPos )
{
	rPart = aEmptyStr;
	xub_StrLen nLen = rContent.Len();
	if( nPos >= nLen )
	{
		nPos = STRING_MAXLEN;
	}
	else
	{
		sal_Bool bQuoted = sal_False, bDone = sal_False;
		for( ; nPos < nLen && !bDone; nPos++ )
		{
			sal_Unicode c = rContent.GetChar( nPos );
			switch( c )
			{
			case '\\':
				if( bQuoted )
					rPart += c;
				bQuoted = !bQuoted;
				break;

			case ';':
				if( bQuoted )
					rPart += c;
				else
					bDone = sal_True;
				bQuoted = sal_False;
				break;

			default:
				rPart += c;
				bQuoted = sal_False;
				break;
			}
		}
	}

	return nPos;
}

xub_StrLen lcl_html_getEndNoteInfo( SwEndNoteInfo& rInfo,
									const String& rContent,
									sal_Bool bEndNote )
{
	xub_StrLen nStrPos = 0;
	for( sal_uInt16 nPart = 0; nPart < 4; nPart++ )
	{
		String aPart;
		if( STRING_MAXLEN != nStrPos )
			nStrPos = lcl_html_getNextPart( aPart, rContent, nStrPos );

		switch( nPart )
		{
		case 0:
            rInfo.aFmt.SetNumberingType( static_cast< sal_Int16 >(bEndNote ? SVX_NUM_ROMAN_LOWER : SVX_NUM_ARABIC));
			if( aPart.Len() )
				rInfo.aFmt.SetNumberingType(SwHTMLParser::GetNumType( aPart,
															 rInfo.aFmt.GetNumberingType() ));
			break;

		case 1:
			rInfo.nFtnOffset = aPart.Len() == 0 ? 0 : (sal_uInt16)aPart.ToInt32();
			break;

		case 2:
			rInfo.SetPrefix( aPart );
			break;

		case 3:
			rInfo.SetSuffix( aPart );
			break;
		}
	}

	return nStrPos;
}

void SwHTMLParser::FillEndNoteInfo( const String& rContent )
{
	SwEndNoteInfo aInfo( pDoc->GetEndNoteInfo() );
	lcl_html_getEndNoteInfo( aInfo, rContent, sal_True );
	pDoc->SetEndNoteInfo( aInfo );
}

void SwHTMLParser::FillFootNoteInfo( const String& rContent )
{
	SwFtnInfo aInfo( pDoc->GetFtnInfo() );

	xub_StrLen nStrPos = lcl_html_getEndNoteInfo( aInfo, rContent, sal_False );

	for( sal_uInt16 nPart = 4; nPart < 8; nPart++ )
	{
		String aPart;
		if( STRING_MAXLEN != nStrPos )
			nStrPos = lcl_html_getNextPart( aPart, rContent, nStrPos );

		switch( nPart )
		{
		case 4:
			aInfo.eNum = FTNNUM_DOC;
			if( aPart.Len() )
			{
				switch( aPart.GetChar(0) )
				{
				case 'D': aInfo.eNum = FTNNUM_DOC; break;
				case 'C': aInfo.eNum = FTNNUM_CHAPTER; break;
				case 'P': aInfo.eNum = FTNNUM_PAGE; break;
				}
			}
			break;

		case 5:
			aInfo.ePos = FTNPOS_PAGE;
			if( aPart.Len() )
			{
				switch( aPart.GetChar(0) )
				{
				case 'C': aInfo.ePos = FTNPOS_CHAPTER; break;
				case 'P': aInfo.ePos = FTNPOS_PAGE; break;
				}
			}
			break;

		case 6:
			aInfo.aQuoVadis = aPart;
			break;

		case 7:
			aInfo.aErgoSum = aPart;
			break;
		}
	}

	pDoc->SetFtnInfo( aInfo );
}

void SwHTMLParser::InsertFootEndNote( const String& rName, sal_Bool bEndNote,
									  sal_Bool bFixed )
{
	if( !pFootEndNoteImpl )
		pFootEndNoteImpl = new SwHTMLFootEndNote_Impl;

	pFootEndNoteImpl->sName = rName;
	if( pFootEndNoteImpl->sName.Len() > 3 )
		pFootEndNoteImpl->sName.Erase( pFootEndNoteImpl->sName.Len() - 3 );
	// TODO: ToUpperAscii???
	pFootEndNoteImpl->sName.ToUpperAscii();

	pFootEndNoteImpl->bEndNote = bEndNote;
	pFootEndNoteImpl->bFixed = bFixed;
	pFootEndNoteImpl->sContent = aEmptyStr;
}

void SwHTMLParser::FinishFootEndNote()
{
	if( !pFootEndNoteImpl )
		return;

	SwFmtFtn aFtn( pFootEndNoteImpl->bEndNote );
	if( pFootEndNoteImpl->bFixed )
		aFtn.SetNumStr( pFootEndNoteImpl->sContent );

    pDoc->InsertPoolItem( *pPam, aFtn, 0 );
    SwTxtFtn * const pTxtFtn = static_cast<SwTxtFtn *>(
        pPam->GetNode()->GetTxtNode()->GetTxtAttrForCharAt(
            pPam->GetPoint()->nContent.GetIndex() - 1, RES_TXTATR_FTN ) );
	// In Kopf- und Fusszeilen duerfen keine Fussnoten eingefuegt werden.
	if( pTxtFtn )
	{
		pFootEndNoteImpl->aTxtFtns.Insert( pTxtFtn,
										   pFootEndNoteImpl->aTxtFtns.Count() );

		pFootEndNoteImpl->aNames.Insert( new String(pFootEndNoteImpl->sName),
										 pFootEndNoteImpl->aNames.Count() );
	}
	pFootEndNoteImpl->sName = aEmptyStr;
	pFootEndNoteImpl->sContent = aEmptyStr;
	pFootEndNoteImpl->bFixed = sal_False;
}

void SwHTMLParser::InsertFootEndNoteText()
{
	if( pFootEndNoteImpl && pFootEndNoteImpl->bFixed )
		pFootEndNoteImpl->sContent += aToken;
}

void SwHTMLParser::DeleteFootEndNoteImpl()
{
	delete pFootEndNoteImpl;
	pFootEndNoteImpl = 0;
}

SwNodeIndex *SwHTMLParser::GetFootEndNoteSection( const String& rName )
{
	SwNodeIndex *pStartNodeIdx = 0;

	if( pFootEndNoteImpl )
	{
		String aName( rName );
		// TODO: ToUpperAscii
		aName.ToUpperAscii();

		sal_uInt16 nCount = pFootEndNoteImpl->aNames.Count();
		for( sal_uInt16 i=0; i<nCount; i++ )
		{
			if( *pFootEndNoteImpl->aNames[i] == aName )
			{
				pStartNodeIdx = pFootEndNoteImpl->aTxtFtns[i]->GetStartNode();
				pFootEndNoteImpl->aNames.DeleteAndDestroy( i, 1 );
				pFootEndNoteImpl->aTxtFtns.Remove( i, 1 );
				if( !pFootEndNoteImpl->aNames.Count() )
				{
					delete pFootEndNoteImpl;
					pFootEndNoteImpl = 0;
				}

				break;
			}
		}
	}

	return pStartNodeIdx;
}

Writer& OutHTML_SwFmtFtn( Writer& rWrt, const SfxPoolItem& rHt )
{
	SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

	SwFmtFtn& rFmtFtn = (SwFmtFtn&)rHt;
	SwTxtFtn *pTxtFtn = rFmtFtn.GetTxtFtn();
	if( !pTxtFtn )
		return rWrt;

	String sFtnName, sClass;
	sal_uInt16 nPos;
	if( rFmtFtn.IsEndNote() )
	{
		nPos = rHTMLWrt.pFootEndNotes ? rHTMLWrt.pFootEndNotes->Count() : 0;
		ASSERT( nPos == rHTMLWrt.nFootNote + rHTMLWrt.nEndNote,
				"OutHTML_SwFmtFtn: Position falsch" );
		sClass.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdendnote_anc );
		sFtnName.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdendnote );
		sFtnName += String::CreateFromInt32( (sal_Int32)(++rHTMLWrt.nEndNote) );
	}
	else
	{
		nPos = rHTMLWrt.nFootNote;
		sClass.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdfootnote_anc );
		sFtnName.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdfootnote);
		sFtnName += String::CreateFromInt32( (sal_Int32)(++rHTMLWrt.nFootNote));
	}

	if( !rHTMLWrt.pFootEndNotes )
		rHTMLWrt.pFootEndNotes = new SwHTMLTxtFtns;
	rHTMLWrt.pFootEndNotes->Insert( pTxtFtn, nPos );

	ByteString sOut( '<' );
	(((sOut += OOO_STRING_SVTOOLS_HTML_anchor) += ' ') += OOO_STRING_SVTOOLS_HTML_O_class) += "=\"";
	rWrt.Strm() << sOut.GetBuffer();
	HTMLOutFuncs::Out_String( rWrt.Strm(), sClass, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
	((sOut = "\" ") += OOO_STRING_SVTOOLS_HTML_O_name) += "=\"";
	rWrt.Strm() << sOut.GetBuffer();
	HTMLOutFuncs::Out_String( rWrt.Strm(), sFtnName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
	(((sOut = OOO_STRING_SVTOOLS_HTML_FTN_anchor) += "\" ") += OOO_STRING_SVTOOLS_HTML_O_href) += "=\"#";
	rWrt.Strm() << sOut.GetBuffer();
	HTMLOutFuncs::Out_String( rWrt.Strm(), sFtnName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
	(sOut = OOO_STRING_SVTOOLS_HTML_FTN_symbol)+= '\"';
	if( rFmtFtn.GetNumStr().Len() )
		(sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_sdfixed;
	sOut += '>';
	rWrt.Strm() << sOut.GetBuffer();
	HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_superscript, sal_True );

	HTMLOutFuncs::Out_String( rWrt.Strm(), rFmtFtn.GetViewNumStr(*rWrt.pDoc),
						   	  rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
	HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_superscript, sal_False );
	HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_anchor, sal_False );

	return rWrt;
}

void SwHTMLWriter::OutFootEndNotes()
{
	ASSERT( pFootEndNotes,
			"SwHTMLWriter::OutFootEndNotes(): unnoetiger Aufruf" );
	if( !pFootEndNotes )
		return;

#ifdef DBG_UTIL
	sal_uInt16 nFtn = nFootNote, nEn = nEndNote;
#endif
	nFootNote = 0, nEndNote = 0;

	for( sal_uInt16 i=0; i<pFootEndNotes->Count(); i++ )
	{
		SwTxtFtn *pTxtFtn = (*pFootEndNotes)[i];
		pFmtFtn = &pTxtFtn->GetFtn();

		String sFtnName, sClass;
		if( pFmtFtn->IsEndNote() )
		{
			sClass.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdendnote );
			sFtnName.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdendnote );
			sFtnName.Append( String::CreateFromInt32((sal_Int32)(++nEndNote)) );
		}
		else
		{
			sClass.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdfootnote );
			sFtnName.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdfootnote );
			sFtnName.Append( String::CreateFromInt32((sal_Int32)(++nFootNote)));
		}

		if( bLFPossible )
			OutNewLine();
		ByteString sOut( '<' );
		(((sOut += OOO_STRING_SVTOOLS_HTML_division) += ' ') += OOO_STRING_SVTOOLS_HTML_O_id) += "=\"";
		Strm() << sOut.GetBuffer();
		HTMLOutFuncs::Out_String( Strm(), sFtnName, eDestEnc, &aNonConvertableCharacters );
		Strm() << "\">";

		bLFPossible = sal_True;
		IncIndentLevel();	// Inhalt von <DIV> einruecken

		ASSERT( pTxtFtn, "SwHTMLWriter::OutFootEndNotes: SwTxtFtn fehlt" );
		SwNodeIndex *pSttNdIdx = pTxtFtn->GetStartNode();
		ASSERT( pSttNdIdx,
				"SwHTMLWriter::OutFootEndNotes: StartNode-Index fehlt" );
		if( pSttNdIdx )
		{
			HTMLSaveData aSaveData( *this, pSttNdIdx->GetIndex()+1,
				pSttNdIdx->GetNode().EndOfSectionIndex(), sal_False );
			Out_SwDoc( pCurPam );
		}

		DecIndentLevel();	// Inhalt von <DIV> einruecken
		if( bLFPossible )
			OutNewLine();
		HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_division, sal_False );
		bLFPossible = sal_True;

		ASSERT( !pFmtFtn,
				"SwHTMLWriter::OutFootEndNotes: Ftn wurde nicht ausgegeben" );
		if( pFmtFtn )
		{
			if( pFmtFtn->IsEndNote() )
				nEndNote++;
			else
				nFootNote++;

			pFmtFtn = 0;
		}
	}

#ifdef DBG_UTIL
	ASSERT( nFtn == nFootNote,
			"SwHTMLWriter::OutFootEndNotes: Anzahl Fussnoten stimmt nicht" );
	ASSERT( nEn == nEndNote,
			"SwHTMLWriter::OutFootEndNotes: Anzahl Endnoten stimmt nicht" );
#endif

	delete pFootEndNotes;
	pFootEndNotes = 0;
	nFootNote = nEndNote = 0;
}

String SwHTMLWriter::GetFootEndNoteSym( const SwFmtFtn& rFmtFtn )
{
	const SwEndNoteInfo * pInfo = 0;
	if( rFmtFtn.GetNumStr().Len() == 0 )
		pInfo = rFmtFtn.IsEndNote() ? &pDoc->GetEndNoteInfo()
									: &pDoc->GetFtnInfo();

	String sRet;
	if( pInfo )
		sRet = pInfo->GetPrefix();
	sRet += rFmtFtn.GetViewNumStr( *pDoc );
	if( pInfo )
		sRet += pInfo->GetSuffix();

	return sRet;
}

void SwHTMLWriter::OutFootEndNoteSym( const SwFmtFtn& rFmtFtn,
								   	  const String& rNum,
								   	  sal_uInt16 nScript )
{
	const SwEndNoteInfo *pInfo;

	String sFtnName, sClass, sPrefix, sSuffix;
	if( rFmtFtn.IsEndNote() )
	{
		sClass.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdendnote_sym );
		sFtnName.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdendnote );
		sFtnName.Append( String::CreateFromInt32((sal_Int32)nEndNote) );
		pInfo = &pDoc->GetEndNoteInfo();
	}
	else
	{
		sClass.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdfootnote_sym );
		sFtnName.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdfootnote );
		sFtnName.Append( String::CreateFromInt32((sal_Int32)nFootNote));
		pInfo = &pDoc->GetFtnInfo();
	}

	const SwCharFmt *pSymCharFmt = pInfo->GetCharFmt( *pDoc );
	if( pSymCharFmt && aScriptTextStyles.Seek_Entry( (String *)&pSymCharFmt->GetName() ) )
	{
		switch( nScript )
		{
		case CSS1_OUTMODE_WESTERN:
			sClass.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-western") );
			break;
		case CSS1_OUTMODE_CJK:
			sClass.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-cjk") );
			break;
		case CSS1_OUTMODE_CTL:
			sClass.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-ctl") );
			break;
		}
	}

	ByteString sOut( '<' );
	(((sOut += OOO_STRING_SVTOOLS_HTML_anchor) +=  ' ') += OOO_STRING_SVTOOLS_HTML_O_class) += "=\"";
	Strm() << sOut.GetBuffer();
	HTMLOutFuncs::Out_String( Strm(), sClass, eDestEnc, &aNonConvertableCharacters );
	((sOut = "\" ") += OOO_STRING_SVTOOLS_HTML_O_name) += "=\"";
	Strm() << sOut.GetBuffer();
	HTMLOutFuncs::Out_String( Strm(), sFtnName, eDestEnc, &aNonConvertableCharacters );
	(((sOut = OOO_STRING_SVTOOLS_HTML_FTN_symbol) +="\" ") += OOO_STRING_SVTOOLS_HTML_O_href) += "=\"#";
	Strm() << sOut.GetBuffer();
	HTMLOutFuncs::Out_String( Strm(), sFtnName, eDestEnc, &aNonConvertableCharacters );
	(sOut = OOO_STRING_SVTOOLS_HTML_FTN_anchor) += "\">";
	Strm() << sOut.GetBuffer();

	HTMLOutFuncs::Out_String( Strm(), rNum, eDestEnc, &aNonConvertableCharacters );
	HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_anchor, sal_False );
}

sal_uInt16 lcl_html_fillEndNoteInfo( const SwEndNoteInfo& rInfo,
								 String *pParts,
								 sal_Bool bEndNote	)
{
	sal_uInt16 nParts = 0;
	sal_Int16 eFmt = rInfo.aFmt.GetNumberingType();
	if( (bEndNote ? SVX_NUM_ROMAN_LOWER : SVX_NUM_ARABIC) != eFmt )
	{
		const sal_Char *pStr = SwHTMLWriter::GetNumFormat( eFmt );
		if( pStr )
		{
			pParts[0] = String::CreateFromAscii( pStr );
			nParts = 1;
		}
	}
	if( rInfo.nFtnOffset > 0 )
	{
		pParts[1] =	String::CreateFromInt32( (sal_Int32)rInfo.nFtnOffset );
		nParts = 2;
	}
	if( rInfo.GetPrefix().Len() > 0 )
	{
		pParts[2] =	rInfo.GetPrefix();
		nParts = 3;
	}
	if( rInfo.GetSuffix().Len() > 0 )
	{
		pParts[3] =	rInfo.GetSuffix();
		nParts = 4;
	}

	return nParts;
}

void lcl_html_outFootEndNoteInfo( Writer& rWrt, String *pParts,
								  sal_uInt16 nParts, const sal_Char *pName )
{
	SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

	String aContent;
	for( sal_uInt16 i=0; i<nParts; i++ )
	{
		xub_StrLen nPos = 0;
		String aTmp( pParts[i] );
		String aRep( String::CreateFromAscii("\\\\") );
		while( STRING_NOTFOUND != (nPos = aTmp.SearchAndReplaceAscii( "\\",
													 aRep, nPos ) ) )
			nPos += 2;
		nPos = 0;
		aRep.AssignAscii( "\\;" );
		while( STRING_NOTFOUND != (nPos = aTmp.SearchAndReplaceAscii( ";",
													 aRep, nPos ) ) )
			nPos += 2;
		if( i > 0 )
			aContent += ';';
		aContent += aTmp;
	}

	rHTMLWrt.OutNewLine();
	ByteString sOut( '<' );
	(((((((sOut += OOO_STRING_SVTOOLS_HTML_meta) +=  ' ')
		+= OOO_STRING_SVTOOLS_HTML_O_name) += "=\"") += pName) += "\" ")
		+= OOO_STRING_SVTOOLS_HTML_O_content) += "=\"";
	rWrt.Strm() << sOut.GetBuffer();
	HTMLOutFuncs::Out_String( rWrt.Strm(), aContent, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
	rWrt.Strm() << "\">";
}

void SwHTMLWriter::OutFootEndNoteInfo()
{
	// Nummerntyp (1 bzw. i)
	// Offset (0)
	// Davor
	// Dahinter
	// Dok/Seite/Kap (D)
	// Position (S)
	// Folgeseite
	// Beginn

	{
		const SwFtnInfo& rInfo = pDoc->GetFtnInfo();
		String aParts[8];
		sal_uInt16 nParts = lcl_html_fillEndNoteInfo( rInfo, aParts, sal_False );
		if( rInfo.eNum != FTNNUM_DOC )
		{
			aParts[4] = rInfo.eNum == FTNNUM_CHAPTER ? 'C' : 'P';
			nParts = 5;
		}
		if( rInfo.ePos != FTNPOS_PAGE)
		{
			aParts[5] = 'C';
			nParts = 6;
		}
		if( rInfo.aQuoVadis.Len() > 0 )
		{
			aParts[6] =	rInfo.aQuoVadis;
			nParts = 7;
		}
		if( rInfo.aErgoSum.Len() > 0 )
		{
			aParts[7] =	rInfo.aErgoSum;
			nParts = 8;
		}
		if( nParts > 0 )
			lcl_html_outFootEndNoteInfo( *this, aParts, nParts,
										 OOO_STRING_SVTOOLS_HTML_META_sdfootnote );
	}

	{
		const SwEndNoteInfo& rInfo = pDoc->GetEndNoteInfo();
		String aParts[4];
		sal_uInt16 nParts = lcl_html_fillEndNoteInfo( rInfo, aParts, sal_True );
		if( nParts > 0 )
			lcl_html_outFootEndNoteInfo( *this, aParts, nParts,
										 OOO_STRING_SVTOOLS_HTML_META_sdendnote );
	}
}

