<?xml-stylesheet href="xsltforms/xsltforms.xsl" type="text/xsl"?>
<?xsltforms-options debug="yes"?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:xf="http://www.w3.org/2002/xforms"
      xmlns:ev="http://www.w3.org/2001/xml-events">
    <head>
        <title>Calculator</title>
    	<meta name="description" content="XForms calculator."/>
    	<meta name="keywords" content="AJAX, Javascript, Web, XForms, XSLTForms, Exemples, Samples, Calculator"/>
        <style type="text/css">
             div.xforms-field div.xforms-control {
                 margin-left	     : 3em;
             }
        </style>
        <xf:model>
            <xf:instance>
                <equation xmlns="">
                    <screen>0</screen>
                    <screenbuffer>0</screenbuffer>
                    <first>0</first>
                    <second>0</second>
                    <memory>0</memory>
                    <result>0</result>
                </equation>
            </xf:instance>
        </xf:model>
    </head>
    <body>
        <h3>Calculator</h3>
        <table border="1">
            <tr>
                <td align="right" colspan="6"><xf:output ref="screen"/></td>
            </tr>
            <tr>
                <td>
                    <xf:output ref="memory"><xf:label>M:</xf:label></xf:output>
                </td>
                <td colspan="3"></td>
                <td colspan="2">
                    <xf:trigger>
                        <xf:label>Clear</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="first">0</xf:setvalue>
                            <xf:setvalue ref="second">0</xf:setvalue>
                            <xf:setvalue ref="result">0</xf:setvalue>
                            <xf:setvalue ref="screen">0</xf:setvalue>
                            <xf:setvalue ref="screenbuffer">0</xf:setvalue>
                	        <xf:toggle case="add"/>
                        </xf:action>
                    </xf:trigger>
                </td>
            </tr>
            <tr>
                <td>
                    <xf:trigger>
                        <xf:label>MC</xf:label>
                        <xf:setvalue ref="memory" value="0" ev:event="DOMActivate"/>
                    </xf:trigger>
                </td>
                <td>
                    <xf:trigger>
                        <xf:label>7</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="screenbuffer" value=". * 10 + 7"/>
                            <xf:setvalue ref="screen" value="../screenbuffer"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td>
                    <xf:trigger>
                        <xf:label>8</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="screenbuffer" value=". * 10 + 8"/>
                            <xf:setvalue ref="screen" value="../screenbuffer"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td>
                    <xf:trigger>
                        <xf:label>9</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="screenbuffer" value=". * 10 + 9"/>
                            <xf:setvalue ref="screen" value="../screenbuffer"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td>
                    <xf:trigger>
                        <xf:label>/</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="first" value="../screen"/>
                            <xf:setvalue ref="screenbuffer" value="0"/>
                            <xf:toggle case="divide"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td></td>
            </tr>
            <tr>
                <td>
                    <xf:trigger>
                        <xf:label>MR</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="screenbuffer" value="../memory"/>
                            <xf:setvalue ref="screen" value="../memory"/>
                            <xf:setvalue ref="screenbuffer" value="0"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td>
                    <xf:trigger>
                        <xf:label>4</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="screenbuffer" value=". * 10 + 4"/>
                            <xf:setvalue ref="screen" value="../screenbuffer"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td>
                    <xf:trigger>
                        <xf:label>5</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="screenbuffer" value=". * 10 + 5"/>
                            <xf:setvalue ref="screen" value="../screenbuffer"/>
                        </xf:action>
                    </xf:trigger>
                </td>
            	<td>
                    <xf:trigger>
                        <xf:label>6</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="screenbuffer" value=". * 10 + 6"/>
                            <xf:setvalue ref="screen" value="../screenbuffer"/>
                        </xf:action>
                    </xf:trigger>
                </td>
            	<td>
                    <xf:trigger>
                        <xf:label>*</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="first" value="../screen"/>
                            <xf:setvalue ref="screenbuffer" value="0"/>
                            <xf:toggle case="multiply"/>
                        </xf:action>
                    </xf:trigger>
                </td>
            </tr>
            <tr>
                <td>
                    <xf:trigger>
                        <xf:label>MS</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="memory" value="../screen"/>
                            <xf:setvalue ref="screenbuffer" value="0"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td>
                    <xf:trigger>
                        <xf:label>1</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="screenbuffer" value=". * 10 + 1"/>
                            <xf:setvalue ref="screen" value="../screenbuffer"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td>
                    <xf:trigger>
                        <xf:label>2</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="screenbuffer" value=". * 10 + 2"/>
                            <xf:setvalue ref="screen" value="../screenbuffer"/>
                        </xf:action>
                    </xf:trigger>
               </td>
               <td>
                    <xf:trigger>
                        <xf:label>3</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="screenbuffer" value=". * 10 + 3"/>
                            <xf:setvalue ref="screen" value="../screenbuffer"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td>
                    <xf:trigger>
                        <xf:label>-</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="first" value="../screen"/>
                            <xf:setvalue ref="screenbuffer" value="0"/>
                	        <xf:toggle case="subtract"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td>
                    <xf:trigger>
                        <xf:label>1/x</xf:label>
                        <xf:setvalue ref="screen" value="1 div ." ev:event="DOMActivate"/>
                    </xf:trigger>
                </td>
            </tr>
            <tr>
                <td>
                    <xf:trigger>
                        <xf:label>M+</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="memory" value=". + ../screen"/>
                            <xf:setvalue ref="screenbuffer" value="0"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td>
                    <xf:trigger>
                        <xf:label>0</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="screenbuffer" value=". * 10"/>
                            <xf:setvalue ref="screen" value="../screenbuffer"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td colspan="2">
                    <xf:trigger>
                        <xf:label>+/-</xf:label>
                        <xf:setvalue ref="screen" value=". * -1" ev:event="DOMActivate"/>
                    </xf:trigger>
                </td>
                <td>
                    <xf:trigger>
                        <xf:label>+</xf:label>
                        <xf:action ev:event="DOMActivate">
                            <xf:setvalue ref="first" value="../screen"/>
                            <xf:setvalue ref="screenbuffer" value="0"/>
                            <xf:toggle case="add"/>
                        </xf:action>
                    </xf:trigger>
                </td>
                <td>
                    <xf:switch>
                        <xf:case id="add" selected="true">
                            <xf:trigger>
                                <xf:label>=</xf:label>
                                <xf:action ev:event="DOMActivate">
                                    <xf:setvalue ref="second" value="../screen"/>
                                    <xf:setvalue ref="result" value="../first + ../second"/>
                                    <xf:setvalue ref="screen" value="../result"/>
                                    <xf:setvalue ref="screenbuffer" value="0"/>
                                </xf:action>
                            </xf:trigger>
                    	</xf:case>
                        <xf:case id="subtract" selected="false">
                            <xf:trigger>
                                <xf:label>=</xf:label>
                                <xf:action ev:event="DOMActivate">
                                    <xf:setvalue ref="second" value="../screen"/>
                                    <xf:setvalue ref="result" value="../first - ../second"/>
                                    <xf:setvalue ref="screen" value="../result"/>
                                    <xf:setvalue ref="screenbuffer" value="0"/>
                                </xf:action>
                            </xf:trigger>
                    	</xf:case>
                        <xf:case id="multiply" selected="false">
                            <xf:trigger>
                                <xf:label>=</xf:label>
                                <xf:action ev:event="DOMActivate">
                                    <xf:setvalue ref="second" value="../screen"/>
                                    <xf:setvalue ref="result" value="../first * ../second"/>
                                    <xf:setvalue ref="screen" value="../result"/>
                                    <xf:setvalue ref="screenbuffer" value="0"/>
                                </xf:action>
                            </xf:trigger>
                    	</xf:case>
                        <xf:case id="divide" selected="false">
                            <xf:trigger>
                                <xf:label>=</xf:label>
                                <xf:action ev:event="DOMActivate">
                                    <xf:setvalue ref="second" value="../screen"/>
                                    <xf:setvalue ref="result" value="../first div ../second"/>
                                    <xf:setvalue ref="screen" value="../result"/>
                                    <xf:setvalue ref="screenbuffer" value="0"/>
                                </xf:action>
                            </xf:trigger>
                    	</xf:case>
                    </xf:switch>
                </td>
            </tr>
        </table>
    </body>
</html>
