// http://akelpad.sourceforge.net/en/plugins.php#Scripts
// Version: 1.0
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Text calculator (based on wisgest code).
//
// How to use:
// Select expression and call script.
//
// Constants:
// E       -Euler's constant, the base of natural logarithms. Approximately equal to 2.718.
// LN2     -The natural logarithm of 2. Approximately equal to 0.693.
// LN10    -The natural logarithm of 10. Approximately equal to 2.302.
// LOG2E   -The base-2 logarithm of e, Euler's constant. Approximately equal to 1.442.
// LOG10E  -The base-10 logarithm of e, Euler's constant. Approximately equal to 0.434.
// PI      -The ratio of the circumference of a circle to its diameter. Approximately equal to 3.141592653589793.
// SQRT1_2 -The square root of 0.5, or one divided by the square root of 2. Approximately equal to 0.707.
// SQRT2   -The square root of 2. Approximately equal to 1.414.
//
// Functions:
// abs     -The absolute value of a number.
// acos    -The arccosine of a number.
// asin    -The arcsine of a number.
// atan    -The arctangent of a number.
// atan2   -The angle (in radians) from the X axis to a point (y,x).
// ceil    -The smallest integer greater than or equal to its numeric argument.
// cos     -The cosine of a number.
// exp     -e (the base of natural logarithms) raised to a power.
// floor   -The greatest integer less than or equal to its numeric argument.
// log     -The natural logarithm of a number.
// max     -The greater of zero or more supplied numeric expressions.
// min     -The lesser of zero or more supplied numeric expressions.
// pow     -The value of a base expression taken to a specified power.
// random  -A pseudorandom number between 0 and 1.
// round   -A supplied numeric expression rounded to the nearest integer.
// sin     -The sine of a number.
// sqrt    -The square root of a number.
// tan     -The tangent of a number.
//
// Examples:
// 56 * 13
// Result: 728
//
// sin(PI/2)
// Result: 1
//
// res=0; for (i=1; i<=500; ++i) res=res+i*i;
// Result: 41791750
//
// x=34+56; Trace(x, "Intermediate result:"); x+26;
// Result: 116
//
// Trace(34+56)+26
// Result: 116
//
//
// Description(2052): 文本计算器 (基于 wisgest 的代码)。
//
// 使用方法:
// 选定表达式后调用本脚本。
//
// 常数:
// E       -返回 欧拉常数，自然对数的底。约等于 2.718。
// LN2     -返回 2 的自然对数。约等于 0.693。
// LN10    -返回 10 的自然对数。约等于 2.302。
// LOG2E   -返回 以 2 为底 e（自然对数的底）的对数。约等于 1.442。
// LOG10E  -返回以 10 为底 e（自然对数的底）的对数。约等于 0.434。
// PI      -返回 圆周率，即圆的周长与其直径的比值。约等于 3.141592653589793。
// SQRT1_2 -返回 0.5 的平方根，或说 2 的平方根分之一。约等于 0.707。
// SQRT2   -返回 2 的平方根。约等于 1.414。
//
// 函数:
// abs     -返回数字的绝对值。
// acos    -返回数的反余弦值。
// asin    -返回数的反正弦值。
// atan    -返回数的反正切值。
// atan2   -返回由 X 轴到 (y,x) 点的角度（以弧度为单位）。
// ceil    -返回大于等于其数字参数的最小整数。
// cos     -返回数的余弦值。
// exp     -返回 e (自然对数的底) 的幂。
// floor   -返回小于等于其数值参数的最大整数。
// log     -返回数字的自然对数。
// max     -返回给出的零个或多个数值表达式中较大的值。
// min     -返回给出的零个或多个数值表达式中较小的值。
// pow     -返回底表达式的指定次幂。
// random  -返回介于 0 和 1 之间的伪随机数。
// round   -返回与给出的数值表达式最接近的整数。
// sin     -返回数的正弦值。
// sqrt    -返回数字的平方根。
// tan     -返回数的正切值。
//
// 例:
// 56 * 13
// 结果: 728
//
// sin(PI/2)
// 结果: 1
//
// res=0; for (i=1; i<=500; ++i) res=res+i*i;
// 结果: 41791750
//
// x=34+56; Trace(x, "解答结果:"); x+26;
// 结果: 116
//
// Trace(34+56)+26
// 结果: 116

//变量
var hMainWnd=AkelPad.GetMainWnd();
var pSelText=AkelPad.GetSelText();
var bHex=false;
var nResult=0;
var nError;
var WM_USER=1024;

  if (pSelText)
  {
  pSelText=pSelText.replace(/(\d),(\d)/g, "$1.$2");
  if (pSelText.substr(0, 2) == "0x")
    bHex=true;

  try
  {
    with (Math)
    {
      nResult=eval(pSelText);
    }
  }
  catch (nError)
  {
    AkelPad.MessageBox(hMainWnd, nError.description, WScript.ScriptName, 16 /*MB_ICONERROR*/);
    WScript.Quit();
  }
  Trace(nResult, GetLangString(1));
}
else
{
  AkelPad.MessageBox(hMainWnd, GetLangString(0), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
}


//函数
function Trace(nResult, pLabel)
{
  var nValue;

  if (bHex)
  {
    if (nResult < 0) nResult=(0xFFFFFFFF + 1) + nResult;
    nResult="0x" + nResult.toString(16).toUpperCase();
  }
  if (nValue=AkelPad.InputBox(hMainWnd, WScript.ScriptName, pLabel, nResult))
    return parseInt(nValue);
  return nResult;
}

function GetLangString(nStringID)
{
  var nLangID=AkelPad.GetLangId(1 /*LANGID_PRIMARY*/);

  if (nLangID == 0x4) //LANG_CHINESE
  {
    if (nStringID == 0)
      return "未选定文本。";
    if (nStringID == 1)
      return "最终结果：";
  }
  else
  {
    if (nStringID == 0)
      return "No text selected.";
    if (nStringID == 1)
      return "Final result:";
  }
  return "";
}
