	
	
	function MM_findObj(n, d) { //v4.01
		  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
		    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
		  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
		  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
		  if(!x && d.getElementById) x=d.getElementById(n); return x;
		}

	function isAlien(a) {
	   return isObject(a) && typeof a.constructor != 'function';
	}
	function isArray(a) {
	    return isObject(a) && a.constructor == Array;
	}
	function isBoolean(a) {
	    return typeof a == 'boolean';
	}
	function isEmpty(o) {
	    var i, v;
	    if (isObject(o)) {
	        for (i in o) {
	            v = o[i];
	            if (isUndefined(v) && isFunction(v)) {
	                return false;
	            }
	        }
	    }
	    return true;
	}

	function isFunction(a) {
	    return typeof a == 'function';
	}
	function isNull(a) {
	    return typeof a == 'object' && !a;
	}
	function isNumber(a) {
	    return typeof a == 'number' && isFinite(a);
	}
	function isObject(a) {
	    return (a && typeof a == 'object') || isFunction(a);
	}
	function isString(a) {
	    return typeof a == 'string';
	}
	function isUndefined(a) {
	    return typeof a == 'undefined';
	} 

	
	function echo(message) 
	{
		if (show_echo || debug_mode)
		{
			e = MM_findObj('echo_div'); 
			if (e != undefined) e.innerHTML = message + '<br>'+ e.innerHTML;
		} 
	}
	
   function IF(e,t,f) {if (f == undefined) f = false;if (e) return t; return f;}
	
function ISNUMBER(sText)
{
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;
   for (i = 0; i < sText.length && IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return (IsNumber && (sText.length != 0));
   }

	
	function trim(value) {
		var temp = String(value);
		temp = temp.replace(/^\s+/, '');
		return temp.replace(/\s+$/, '');
	}
	
	function ISNA(v) {return (v=='#N/A');}
	function LEFT(v,i) {s = new String(v); return (s.slice(0,i));}
	function ROUND(number,digits) {return (Math.round(number*Math.pow(10,digits))/Math.pow(10,digits));}
	function ROUNDDOWN(number,digits) {return (Math.floor(number*Math.pow(10,digits))/Math.pow(10,digits));}
	function ROUNDUP(number,digits) {return (Math.ceil(number*Math.pow(10,digits))/Math.pow(10,digits));}
	function ISERROR(v) {return ((",#NULL!,#DIV/0!,#VALUE!,#REF!,#NAME?,#NUM!,#N/A,Infinity,-Infinity,undefined,null,NaN,").indexOf("," + v + ",") != -1);}
	function MOD(a, b) { return a-Math.floor(a/b)*b } 
	
	function CHOOSE(values) 
	{
		n = values.length-1;
		if (n <= 0)return '#VALUE!'; 
	   i = Math.floor(values[0]);
		if (i < 1) return '#VALUE!';
		if (i > n) return '#VALUE!';
		return values[i];
	}
	
   function AND(values) 
	{
	   r = '#VALUE!'; 
      n = values.length;
		if (n == 0) return r; 
		for (i = 0; i < n; i++) {
		   v = values[i];
			if ((v == true) || (v == false)) {
			   if (r == '#VALUE!') r = v
				else r = (r && v);
			}
		}
		if (r == '#VALUE!') return r;
		if (r) return true;
		return false;
	}
	
   function OR(values) 
	{
	   r = '#VALUE!'; 
      n = values.length;
		if (n == 0) return r; 
		for (i = 0; i < n; i++) {
		   v = values[i];
			if ((v == true) || (v == false)) {
			   if (r == '#VALUE!') r = v
				else r = (r || v);
			}
		}
		if (r == '#VALUE!') return r;
		if (r) return true;
		return false;
	}
	
	function CONCATENATE(values) {
	   r = '';
		for (i = 0; i < values.length; i++) r += values[i];
	   return r;
	}
	
	function SUM(values) 
	{
	  if (isArray(values))
	  {
		  for (var result=0,i=0; i<values.length; i++) 
		  {
			   v = values[i];
				if (isArray(v)) {result+=SUM(v);} 
				else if (!isNaN(v)) {result+=Number(values[i]);}
		  }
	  }
	  else
	  {
	     var result = values;
	  }
	  return (result);
	}
	
	function AVERAGE(values) {
	   return (SUM(values)/values.length);
	}
	
	function MAX(values) {
	   result = Number(values[0]);
		for (var result=0,i=0; i<values.length; i++) 
		{  
		   v = Number(values[i]);
		   if(v>result) result = v;
		}
	   return (result);
	}
	
	function MIN(values) {
	   result = Number(values[0]);
		for (var result=0,i=0; i<values.length; i++) 
		{  
		   v = Number(values[i]);
		   if(v<result) result = v;
		}
	   return (result);
	}
	
	function check(name,a,b) 
	{ 
		if (!debug_mode) return 0;
	   if (ISNUMBER(b)) 
		{
		   s = new String(b);
			array = s.split('.');
			if (array.length == 1) a = ROUND(a,0)
			else if (array.length == 2)
			{
			   p = array[1].length;
				if (p > 4) p = 4;
			   a = ROUND(a,p);
				b = ROUND(b,p);
			}
			else echo('unknown sitation #1 in check:'+s);
		}
		if (isString(a)) a = trim(a);
		if (isString(b)) a = trim(b);
	   if (a != b) {echo(name+'-got:'+a+'-expected:'+b); return 1;} else return 0;
	}
	
