<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" />
<head itemscope itemtype="http://schema.org/Article">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta itemprop="name" content="Document Freedom Day">
  <meta itemprop="description" content="Join with us as we celebrate Document Freedom Day">
  <meta itemprop="image" content="http://www.openoffice.org/social/images/aoo-logo-100x100.png">
  <meta property="og:title" content="Join with us as we celebrate Document Freedom Day" /> 
  <meta property="og:description" content="Join with us as we celebrate Document Freedom Day" />  
  <meta property="og:image" content="http://www.openoffice.org/social/images/aoo-logo-100x100.png" />
  <title>Document Freedom Day</title>

  <script>
    function shareFacebook() {
      // _gaq.push(['_trackEvent','social', 'dfd', 'facebook']); 
      window.open('https://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Fwww.openoffice.org%2Fsocial%2Fdfd.html%2F','_blank','toolbar=0,status=0,width=580,height=325');	
    }
    function shareTwitter(){
      // _gaq.push(['_trackEvent','social', 'dfd', 'twitter']); 
      window.open('https://twitter.com/intent/tweet?url=http%3A%2F%2Fwww.openoffice.org%2Fsocial%2Fdfd.html%2F&text=Join+the+OpenOffice+revolution%2C+the+free+office+productivity+suite+with+over+100+million+trusted+downloads.','_blank','toolbar=0,status=0,width=580,height=325');
    }
    function shareGooglePlus(){
      // _gaq.push(['_trackEvent','social', 'dfd', 'google+']); 
      window.open('https://plus.google.com/share?url=http%3A%2F%2Fwww.openoffice.org%2Fsocial%2Fdfd.html%2F','_blank','toolbar=0,status=0,width=580,height=325');
    }
  </script>
</head>

<body>
<h1>Document Freedom Day</h1>

<p>February 27th is Document Freedom Day, a celebration of Open Standards, especially those related to your electronic documents.  The Apache OpenOffice project
enthusiastically supports Document Freedom Day and offers the folowing thoughts for you to read and share with your friends</p>

<h2>What are Open Standards?</h2>

<p>There are many different nuanced definitions promoted by various authories, but in general Open Standards are standards that are developed in an open, consensus-based process, 
are freely available for anyone to use, and do not require royalty payments to implement.</p>

<h2>Why are Open Standards important?</h2>

<ul>
    <li>Use of open standards makes your software less expensive, since the authors of the code did not need to pay royalties.  Free software, including open source
        software, would be nearly impossible to create without open standards.</li>
    <li>Open standards promote widespread adoption and interoperability.</li>
    <li>Open standards encourage a market where vendors compete based on features and quality, rather than rely on vendor lock-in.</li>
    <li>Open standards put <b>you</b> in control of your documents and your data.</li>
</ul>


<h2>What are some important Open Standards?</h2>


<ul>
    <li>Open Document Format (ODF) is the ISO-approved standard for office documents, the default format for Apache OpenOffice.</li>
    <li>Scalable Vector Graphics (SVG) is the W3C standard for vector graphics, suported on the web and in Apache OpenOffice.</li>
    <li>Portable Document Format (PDF) is the ISO-approved standard for fixed-layout document representations, supported in many applications including Apache OpenOffice.</li>
    <li>Mathematical Markup Language (MathML) is the W3C standard for representing mathematical equations, supported on the web and in Apache OpenOffice.</li>
</ul>

<h2>What can I do to help promote open standards</h2>

<ol>
    <li>Use open standards wherever your application supports them.</li>
    <li>If your favorite applications don't support open standards like ODF, write to your vendor and request that.</li>
    <li>When you publish documents on the web, do so in open formats.</li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>

</ol>

<h2>Please tell your friends about Document Freedom Day</h2>
	
    <p>
    You can share this page via the following links:
    <a href="javascript:shareFacebook();"><img src='images/logo-facebook-32.png'/></a>
    <a href="javascript:shareTwitter();"><img src='images/logo-twitter-32.png'/></a>
    <a href="javascript:shareGooglePlus();"><img src='images/logo-googleplus-32.png' /></a>	 
    </p>
</body>
</html>

