382 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			382 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 | |
| <html>
 | |
| <head>
 | |
|   <title></title>
 | |
|   <link href='pages.css' type='text/css' rel='stylesheet' />
 | |
|   <style type='text/css'>
 | |
|   * {
 | |
|     color: #ddd;
 | |
|     font: 12px 'dejavu sans mono';
 | |
|   }
 | |
| 
 | |
|   body {
 | |
|     margin: 0;
 | |
|     padding: 0;
 | |
|     background-color: #000;
 | |
|     overflow: hidden;
 | |
|   }
 | |
| 
 | |
|   div {
 | |
|     float: left;
 | |
|   }
 | |
| 
 | |
|   div.result {
 | |
|     float: none;
 | |
|     width: 100%;
 | |
|   }
 | |
| 
 | |
|   textarea {
 | |
|     float: left;
 | |
|     border: none;
 | |
|     background: none;
 | |
|     padding: 0;
 | |
|     overflow: hidden;
 | |
|   }
 | |
|   </style>
 | |
|   <script type='text/javascript' src='pages.js'></script>
 | |
| 
 | |
|   <script type='text/javascript'>
 | |
|   /* 
 | |
|   This program is free software. It comes without any warranty, to
 | |
|   the extent permitted by applicable law. You can redistribute it
 | |
|   and/or modify it under the terms of the Do What The Fuck You Want
 | |
|   To Public License, Version 2, as published by Sam Hocevar. See
 | |
|   http://sam.zoy.org/wtfpl/COPYING for more details.
 | |
|   */
 | |
|   window.onload = function() {
 | |
|     var is_firefox
 | |
|     if (navigator.userAgent.indexOf('Firefox') != -1) is_firefox = true
 | |
|     else is_firefox = false
 | |
|     
 | |
|     input_margin_top = 0
 | |
|     input_margin_right = 0
 | |
|     input_margin_bottom = 0
 | |
|     if (is_firefox) input_margin_left = -1
 | |
|     else input_margin_left = 0
 | |
|     
 | |
|     ans = 0
 | |
|     
 | |
|     curr_input_start = document.createElement('div')
 | |
|     curr_input_start.innerHTML = '>'
 | |
|     document.body.appendChild(curr_input_start)
 | |
|     
 | |
|     input_start_width = curr_input_start.scrollWidth
 | |
|     input_start_height = curr_input_start.scrollHeight
 | |
|     
 | |
|     curr_input = document.createElement('textarea')
 | |
|     curr_input.onkeydown = function() {
 | |
|       this.style.height = this.scrollHeight + 'px'
 | |
|     }
 | |
|     curr_input.onkeyup = function() {
 | |
|       this.style.height = this.scrollHeight + 'px'
 | |
|     }
 | |
|     curr_input.style.marginTop = input_margin_top + 'px'
 | |
|     curr_input.style.marginRight = input_margin_right + 'px'
 | |
|     curr_input.style.marginBottom = input_margin_bottom + 'px'
 | |
|     curr_input.style.marginLeft = input_margin_left + 'px'
 | |
|     curr_input.style.width = getw() - input_start_width - input_margin_left - input_margin_right + 'px'
 | |
|     curr_input.style.height = input_start_height + 'px'
 | |
|     document.body.appendChild(curr_input)
 | |
|     curr_input.focus()
 | |
|     
 | |
|     continue_ok = true
 | |
|     
 | |
|     window.onresize = function() {
 | |
|     curr_input.style.width = getw() - input_start_width - input_margin_left - input_margin_right + 'px'
 | |
|     setTimeout("curr_input.style.height = curr_input.scrollHeight + 'px'", 100)
 | |
|     }
 | |
|     
 | |
|     document.onkeydown = function(event) {
 | |
|       if (!continue_ok) return
 | |
|       var code = getcode(event)
 | |
|       if (code == 13) {
 | |
|         var input_value, caltxt, len, oresult, result, result_elem, nl_elem, replace_elem
 | |
|         input_value = curr_input.value
 | |
|         caltxt = process_all(input_value)
 | |
|         
 | |
|         if (caltxt != '') {
 | |
|           try {
 | |
|             oresult = eval(caltxt)
 | |
|             //parent.document.title = caltxt
 | |
|             if (typeof(oresult) == 'number') result = (oresult + '') //.replace(/\./g, ',')
 | |
|             else result = oresult
 | |
|             
 | |
|             if (oresult == 'NaN') result = 'Error: Not a number'
 | |
|             else if (oresult == 'Infinity') result = 'Error: Infinity'
 | |
|             else ans = oresult
 | |
|           }
 | |
|           catch(e) {
 | |
|             result = 'Error'
 | |
|           }
 | |
|           if (result.substr(0, 5) == 'Error') result += '<br />Type "help" for help.'
 | |
|         }
 | |
|         else {
 | |
|           result = ''
 | |
|         }
 | |
|         
 | |
|         
 | |
|         nl_elem = document.createElement('br')
 | |
|         document.body.appendChild(nl_elem)
 | |
|         
 | |
|         if (result != '' && result != 'undefined') {
 | |
|           result_elem = document.createElement('div')
 | |
|           result_elem.className = 'result'
 | |
|           result_elem.innerHTML = '>>>' + result
 | |
|           document.body.appendChild(result_elem)
 | |
|         }
 | |
|         
 | |
|         replace_elem = document.createElement('div')
 | |
|         replace_elem.innerHTML = '>' + input_value
 | |
|         document.body.insertBefore(replace_elem, curr_input)
 | |
|         document.body.removeChild(curr_input_start)
 | |
|         document.body.removeChild(curr_input)
 | |
|         
 | |
|         curr_input_start = document.createElement('div')
 | |
|         curr_input_start.innerHTML = '>'
 | |
|         document.body.appendChild(curr_input_start)
 | |
|         
 | |
|         curr_input = document.createElement('textarea')
 | |
|         curr_input.onkeydown = function() {
 | |
|           this.style.height = this.scrollHeight + 'px'
 | |
|         }
 | |
|         curr_input.onkeyup = function() {
 | |
|           this.style.height = this.scrollHeight + 'px'
 | |
|         }
 | |
|         curr_input.style.marginTop = input_margin_top + 'px'
 | |
|         curr_input.style.marginRight = input_margin_right + 'px'
 | |
|         curr_input.style.marginBottom = input_margin_bottom + 'px'
 | |
|         curr_input.style.marginLeft = input_margin_left + 'px'
 | |
|         curr_input.style.width = getw() - input_start_width - input_margin_left - input_margin_right + 'px'
 | |
|         curr_input.style.height = input_start_height + 'px'
 | |
|         
 | |
|         window.scrollBy(0, 100000)
 | |
|       }
 | |
|       continue_ok = false
 | |
|     }
 | |
|     
 | |
|     document.onkeyup = function(event) {
 | |
|       var code = getcode(event)
 | |
|       if (code == 13) {
 | |
|         document.body.appendChild(curr_input)
 | |
|         curr_input.focus()
 | |
|         curr_input.value = ''
 | |
|       }
 | |
|       continue_ok = true
 | |
|     }
 | |
| 
 | |
|     document.ondblclick = function() {
 | |
|       curr_input.focus()
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function getcode(event) {
 | |
|     var e, code
 | |
|     if (window.event) e = window.event
 | |
|     else e = event
 | |
|     
 | |
|     if (e.which) code = e.which
 | |
|     else if (e.charCode) code = e.charCode
 | |
|     else if (e.keyCode) code = e.keyCode
 | |
|     else code = 0
 | |
|     
 | |
|     return code
 | |
|   }
 | |
| 
 | |
|   function getw() {
 | |
|     var w
 | |
|     if (self.innerHeight)
 | |
|       w = self.innerWidth
 | |
|     else if (document.documentElement && document.documentElement.clientHeight)
 | |
|       w = document.documentElement.clientWidth
 | |
|     else if (document.body)
 | |
|       w = document.body.clientWidth
 | |
|     return w
 | |
|   }
 | |
| 
 | |
|   function process_all(txt) {
 | |
|     var newtxt, txtspl, txtsta, replaces, len, i
 | |
|     newtxt = txt
 | |
|     
 | |
|     if (newtxt.indexOf('=') != -1) {
 | |
|       txtspl = newtxt.split('=')
 | |
|       newtxt = txtspl[1]
 | |
|       txtsta = txtspl[0] + '='
 | |
|     }
 | |
|     else
 | |
|       txtsta = ''
 | |
|     
 | |
|     replaces = [
 | |
|       [/\ /g, ''],
 | |
|       //[/\,/g, '.'], // Uncomment to allow "," as "." (used in some countries)
 | |
|       [/\'/g, ','],
 | |
|       [/\_/g, ','],
 | |
|       [/\*\*/g, '^'],
 | |
|       [/\&pi/gi, 'Math.PI'],
 | |
|       [/\π/gi, 'Math.PI'],
 | |
|       [/\&e/gi, 'Math.E'],
 | |
|       [/log\(/gi, 'log('],
 | |
|       [/ln\(/gi, 'ln('],
 | |
|       [/sqrt\(/gi, 'sqrt('],
 | |
|       [/r\(/gi, 'sqrt('],
 | |
|       [/sin\(/gi, 'sin('],
 | |
|       [/sin\^\(-1\)\(/gi, 'asin('],
 | |
|       [/sin\^-1\(/gi, 'asin('],
 | |
|       [/cos\(/gi, 'cos('],
 | |
|       [/cos\^\(-1\)\(/gi, 'acos('],
 | |
|       [/cos\^-1\(/gi, 'acos('],
 | |
|       [/tan\(/gi, 'tan('],
 | |
|       [/tan\^\(-1\)\(/gi, 'atan('],
 | |
|       [/tan\^-1\(/gi, 'atan(']
 | |
|     ]
 | |
| 
 | |
|     len = replaces.length
 | |
|     for (i = 0; i < len; i++) {
 | |
|       newtxt = newtxt.replace(replaces[i][0], replaces[i][1])
 | |
|     }
 | |
|     
 | |
|     if (newtxt == 'help')
 | |
|       return "'This is a simple calculator. It is able to put a number in the power of a number and supports functions like sin(), asin(), cos(), acos(), tan(), atan(), log() og ln(). To take the power of a number, write \"x^y\" or \"x**y\". To take the squareroot of a number, write \"r(x)\". To take another root of a number, write \"r(x,y)\". Type \"&pi\" for pi and \"&e\" for e. Trigonometric functions use degrees, not radians. The log() function uses 10 as its base, while the ln() function uses e. To use a previous result, type \"ans\".'"
 | |
|     else if (newtxt != '')
 | |
|       return txtsta + process_part(newtxt)
 | |
|     else
 | |
|       return txtsta + newtxt
 | |
|   }
 | |
| 
 | |
|   function process_part(txt) {
 | |
|     var number_parts, operator_parts, bracket_count, len, i, curr, indexOfBracket, special_characters, newtxt, last, add_operator
 | |
|     number_parts = []
 | |
|     number_parts[0] = ''
 | |
|     operator_parts = []
 | |
|     
 | |
|     bracket_count = 0
 | |
|     
 | |
|     len = txt.length
 | |
|     for (i = 0; i < len; i++) {
 | |
|       curr = txt.substr(i, 1)
 | |
|       
 | |
|       if (curr == '(') bracket_count++
 | |
|       else if (curr == ')') bracket_count--
 | |
|       
 | |
|       if ((curr == '+' || curr == '-' || curr == '*' || curr == '/' || curr == '^') && bracket_count == 0) {
 | |
|         number_parts[number_parts.length] = ''
 | |
|         operator_parts[operator_parts.length] = txt.substr(i, 1)
 | |
|       }
 | |
|       else {
 | |
|         number_parts[number_parts.length - 1] += txt.substr(i, 1)
 | |
|       }
 | |
|     }
 | |
|     
 | |
|     len = number_parts.length
 | |
|     if (number_parts[0] == '') number_parts[0] = '0'
 | |
|     if (number_parts[len - 1] == '') number_parts[len - 1] = '0'
 | |
|     for (i = 0; i < bracket_count; i++) {
 | |
|       number_parts[len - 1] += ')'
 | |
|     }
 | |
|     for (i = 0; i < len; i++) {
 | |
|       if (number_parts[i] != '') {
 | |
|         indexOfBracket = number_parts[i].indexOf('(')
 | |
|         if (indexOfBracket != -1) number_parts[i] = number_parts[i].substr(0, indexOfBracket) +  '(' + process_part(number_parts[i].substr(indexOfBracket + 1, number_parts[i].length - indexOfBracket - 2)) + ')'
 | |
|       }
 | |
|     }
 | |
|     
 | |
|     special_characters = '^'
 | |
|     newtxt = ''
 | |
|     
 | |
|     for (i = 0; i < len; i++) {
 | |
|       last = (i == len - 1) ? true : false
 | |
|       add_operator = true
 | |
|       
 | |
|       if (!last && special_characters.indexOf(operator_parts[i]) != -1) {
 | |
|         add_operator = false
 | |
|         
 | |
|         if (operator_parts[i] == '^')
 | |
|           newtxt += 'pow(' + number_parts[i] + ',' + number_parts[i + 1] + ')'
 | |
|       }
 | |
|       else if (special_characters.indexOf(operator_parts[i - 1]) == -1) {
 | |
|         newtxt += number_parts[i]
 | |
|       }
 | |
|       
 | |
|       if (!last && add_operator) newtxt += operator_parts[i]
 | |
|     }
 | |
|     
 | |
|     return newtxt
 | |
|   }
 | |
| 
 | |
| 
 | |
|   function sin(num) {
 | |
|     return Math.sin(num * Math.PI / 180)
 | |
|   }
 | |
| 
 | |
|   function cos(num) {
 | |
|     return Math.cos(num * Math.PI / 180)
 | |
|   }
 | |
| 
 | |
|   function tan(num) {
 | |
|     return Math.tan(num * Math.PI / 180)
 | |
|   }
 | |
| 
 | |
| 
 | |
|   function asin(num) {
 | |
|     return (Math.asin(num) / Math.PI) * 180
 | |
|   }
 | |
| 
 | |
|   function acos(num) {
 | |
|     return (Math.acos(num) / Math.PI) * 180
 | |
|   }
 | |
| 
 | |
|   function atan(num) {
 | |
|     return (Math.atan(num) / Math.PI) * 180
 | |
|   }
 | |
| 
 | |
| 
 | |
|   function sqrt(num1, num2) {
 | |
|     if (num2 == undefined)
 | |
|       return Math.sqrt(num1)
 | |
|     else return pow(num1, 1 / num2)
 | |
|   }
 | |
| 
 | |
|   function pow(num1, num2) {
 | |
|     return Math.pow(num1, num2)
 | |
|   }
 | |
|   
 | |
| 
 | |
|   function log(num) {
 | |
|     return Math.log(num) / Math.log(10)
 | |
|   }
 | |
| 
 | |
|   function ln(num) {
 | |
|     return Math.log(num)
 | |
|   }
 | |
|   
 | |
|   
 | |
|   function max(num1, num2) {
 | |
|     return Math.max(num1, num2)
 | |
|   }
 | |
|   
 | |
|   function min(num1, num2) {
 | |
|     return Math.min(num1, num2)
 | |
|   }
 | |
|   
 | |
|   function round(num) {
 | |
|     return Math.round(num)
 | |
|   }
 | |
|   
 | |
|   function floor(num) {
 | |
|     return Math.floor(num)
 | |
|   }
 | |
|   
 | |
|   function ceil(num) {
 | |
|     return Math.ceil(num)
 | |
|   }
 | |
|   
 | |
|   function rand() {
 | |
|     return Math.random()
 | |
|   }
 | |
|   
 | |
|   function randint(num1, num2) {
 | |
|     return Math.floor(Math.random() * (num2 - num1 + 1)) + num1
 | |
|   }
 | |
|   </script>
 | |
| </head>
 | |
| <body></body>
 | |
| </html> | 
