/*
 
 Автор Дмитрий Мацкевич, http://dcnt.ru
 
 Что еще сделать....
 
	Добавить в расчеты 	Доля, Дб, Скорость
	Добавить ссылку на дополнительные инженерные расчеты для IE
    Решить вопрос с IE
    Добавить еще одну единицу - давление  

Новая версия
 - добавлено удаление пробелов - проверить
 
*/

function ChangeForm() {

		
	
var strVar="";
			
	switch ( document.getElementById("idTypeOfCalc").value )
	{

	  case "L": // Длина
			strVar+="<option value=\"Metr\">метр (m)</option> \n";
			strVar+="<option value=\"Foot\">фут (ft)</option> \n";
			strVar+="<option value=\"Unit\">юнит (U)</option> \n";
			strVar+="<option value=\"In\">дюйм (in)</option> \n";
			strVar+="<option value=\"Santi\">сантиметр (cm)</option> \n";
			strVar+="<option value=\"Milm\">миллиметр (mm)</option> \n";
			strVar+="<option value=\"Mile\">миля US (mi)</option> \n";
			strVar+="<option value=\"Yard\">ярд (yd)</option> \n";
	    break;

	  case "V": //Объем
			strVar+="<option value=\"Metr3\">кубический метр (m3)</option> \n";
			strVar+="<option value=\"Foot3\">кубический фут (ft3)</option> \n";
			strVar+="<option value=\"Litr\">литр (litre)</option> \n";
			strVar+="<option value=\"millitr\">миллилитр (ml)</option> \n";
			strVar+="<option value=\"GallonUK\">галлон (gal) UK</option> \n";
			strVar+="<option value=\"GallonUS\">галлон (gal) US</option> \n";
			strVar+="<option value=\"OzUK\">унция жид.(oz) UK</option> \n";
			strVar+="<option value=\"OzUS\">унция жид.(oz) US</option> \n";
	    break;

	  case "S": //Площадь
			strVar+="<option value=\"Metr2\">кв. метр (m2)</option> ";
			strVar+="<option value=\"Foot2\">кв. фут (ft2)</option>    ";
			strVar+="<option value=\"In2\">кв. дюйм (in2)</option>  ";
			strVar+="<option value=\"Akr\">акр (acre)</option>             ";
			strVar+="<option value=\"Yard2\">кв. ярд (yd2)</option>    ";
			strVar+="<option value=\"Santi2\">кв. сантиметр (sq.sm)</option> ";
	    break;


	  case "W": // Масса
			strVar+="<option value=\"KiloGr\">килограмм (kilogramme)</option> \n";
			strVar+="<option value=\"Funt\">фунт (lb, pound)</option> \n";
			strVar+="<option value=\"Gramm\">грамм (gramme)</option> \n";
			strVar+="<option value=\"Oz\">унция (ounce)</option> \n";
			strVar+="<option value=\"MilGr\">миллиграмм (milligramme)</option> \n";
	    break;

	  case "T": // Температура
			strVar+="<option value=\"Celcia\">градус Цельсия (C)</option> ";
			strVar+="<option value=\"Kelvin\">градус Кельвина (K)</option> ";
			strVar+="<option value=\"Farengeit\">градус Фаренгейта (F)</option> ";
	    break;

	  case "Po": // Мощность
			strVar+="<option value=\"KVt\">киловатт (кВт,kW)</option> ";
			strVar+="<option value=\"BTUonH\">BTU в час (BTU/H)</option> ";
			strVar+="<option value=\"Vatt\">ватт (Вт,Watt)</option> ";
			strVar+="<option value=\"Hourse\">лошадиная сила (HP)</option> ";
      break;

	  case "Wo": // Работа
			strVar+="<option value=\"MJoul\">мега джоуль (Мдж,MJ)</option> ";
			strVar+="<option value=\"BTU\">брит.тепл.един (BTU)</option> ";
			strVar+="<option value=\"KVt*h\">киловатт час (кВт*ч,kW*h)</option> ";
			strVar+="<option value=\"KKal\">килокалория (ккал,kca)</option> ";
			strVar+="<option value=\"Joul\">джоуль (Дж,J)</option> ";
      break;

   	  case "P": // Давление
			strVar+="<option value=\"Pasc\">паскаль (Па,Pa,Н/м2)</option> ";
			strVar+="<option value=\"Bar\">бар (bar,бар)</option> ";
			strVar+="<option value=\"FuntOnIn\">фунт-сила на кв.дюйм (psi)</option> ";
			strVar+="<option value=\"MVodSt\">метр вод. столба (при 4C)</option> ";
			strVar+="<option value=\"MilVodSt\">мм.вод. столба (при 4C)</option> ";
			strVar+="<option value=\"InRtSt\">дюйм.рт. столба</option> ";
			strVar+="<option value=\"MilRtSt\">мм.рт. столба (mmHg,torr)</option> ";
			strVar+="<option value=\"KgsCm2\">кг.с. на кв.см. (кгс/см2)</option> ";
			strVar+="<option value=\"AtmT\">техническая атм. (at,ат)</option> ";
			strVar+="<option value=\"AtmF\">физическая атм. (atm,атм)</option> ";
      break;

   	  case "SV": // Поток объемный
			strVar+="<option value=\"M3Sec\">куб.метр в сек.(м3/сек)</option> ";
			strVar+="<option value=\"M3Min\">куб.метр в мин.(м3/мин)</option> ";
			strVar+="<option value=\"M3Hour\">куб.метр в час (м3/ч)</option> ";
			strVar+="<option value=\"LitrInSec\">литров в сек (л/сек)</option> ";
			strVar+="<option value=\"LitrInMin\">литров в мин (л/мин)</option> ";
			strVar+="<option value=\"LitrInHour\">литров в час (л/ч)</option> ";
			strVar+="<option value=\"FootInSec\">куб.фут в сек (ft3/s)</option> ";
			strVar+="<option value=\"FootInMin\">куб.фут в мин (CFM)</option> ";
			strVar+="<option value=\"FootInHour\">куб.фут в час (ft3/hour)</option> ";
       break;

   	  case "Sp": // Cкорость
			strVar+="<option value=\"MetrInSec\">метров в сек (м/с) </option> ";
			strVar+="<option value=\"KmInHour\">километров в час (км/ч) </option> ";
			strVar+="<option value=\"MileonH\">миль в час (mph) </option> ";
			strVar+="<option value=\"FootonH\">фут в мин</option> ";
      break;

            
	}

     // strVar+="</select><br />";

 
     var browser = navigator.appName;
     if (browser == "Microsoft Internet Explorer"){
    	 Info1();
     }
     else {

    	 
      document.getElementById("idTypeOfValue").innerHTML = strVar ;
      document.getElementById("idTypeOfCalculated").innerHTML =  strVar ;
     
     }
     
     
   calc();

}


function createXMLHttpRequestObject() {

    var browser = navigator.appName;

    if (browser == "Microsoft Internet Explorer"){
        ro = new ActiveXObject("Microsoft.XMLHTTP");
        
        if (!ro)
        	 ro = new ActiveXObject("Msxml2.XMLHTTP");
        
        
    } else {
        ro = new XMLHttpRequest();
    }
    
    return ro;
    
}


function IsNumeric(IntText) {

	var ValidChars = "-0123456789.,ЕеEe +*/()";
	var IsNumber = true;
	var Char;

	for (LoopChar = 0; LoopChar < IntText.length && IsNumber == true; LoopChar++)
	{
		Char = IntText.charAt(LoopChar);

		if (ValidChars.indexOf(Char) == -1) {
			IsNumber = false;
		}

	}

	return IsNumber;
}


var http1 = createXMLHttpRequestObject();

function sendRequest1(targetURL) {
    http1.open('get', targetURL);
    http1.onreadystatechange = handleResponse1;
    http1.send(null);
}

function handleResponse1() {

    if(http1.readyState == 4)
    {	    if (http1.status == 200)
	            document.idFormScsCalculator.idCalculatedValue.value = do_space ( http1.responseText ); 
	    else
	         alert("Код ошибки:" + http1.status);
    }

}

function send_xy(x,y)
{
k=Math.random();
var i = 0;
var str = "/wp-content/plugins/engcalculator/calculator.php?i="+i+"&x="+x+"&y="+y+"&k"+k;
  if (str != '')  sendRequest1(str);
}


function calc()
{

	if (document.getElementById("idValue").value == "" ) {
			document.getElementById("idCalculatedValue").value ="";
		return;
	}


  var strChoise = document.getElementById("idTypeOfValue").value +
				  document.getElementById("idTypeOfCalculated").value;

	SourceValueCheck = IsNumeric(document.getElementById("idValue").value);


	if (SourceValueCheck == false ) {
			document.getElementById("idCalculatedValue").value ="ошибка ввода";
		return;
	}

var Value ="";

    Value = document.idFormScsCalculator.idValue.value;
           
    Value = replace_string(Value,'е','e') ;
    Value = replace_string(Value,'Е','e') ;
    Value = replace_string(Value,',','.') ;
    Value = replace_string(Value,' ','') ;

    Value = stripBad(Value);
	eval('Value = parseFloat(' + Value + ');');

    
    if (isNaN(Value)) {
		return; 
	}
    


    send_xy(Value, strChoise);

    
}


function do_space (num)
{
	num = num + '';

	// exit if scientific notation
	if (num.indexOf('e') > -1){ return num; }

	var dec = num.indexOf('.');

	var left, right = '';
	if (dec >= 0)
	{
		left = num.substring(0, dec);
		right = num.substring(dec + 1);
	}
	else
		left = num;

	var new_left = '', new_right = '';
	for (var i = 0; i < right.length; i++)
	{
		new_right += right.charAt(i);
		if (i % 3 == 2 && i != right.length - 1)
			new_right += ' ';
	}
	for (var i = left.length - 1; i >= 0; i--)
	{
		new_left = left.charAt(i) + new_left;
		if ((left.length - 1 - i) % 3 == 2 && i != 0)
			new_left = ' ' + new_left;
	}

	return (dec >= 0) ? new_left + '.' + new_right : new_left;
}

function helpOut(){
	var myMessage = '';
	myMessage = "- Как вводить данные в ячейку -\n\n\n";
	myMessage += "Пример ввода нецелых чисел \n";
	myMessage += "1.987\n1,987\n\n";
	myMessage += "Пример ввода дробных чисел\n3/4\n5/8\n\n";
	myMessage += "Ввод формул \n1.04+37+9,9\n3.3 * 56 + (100-23) * 17\n93*56-13/4\n\n";
	myMessage += "Использование пробелов для выделения разряда\n";
	myMessage += "0, 000 003\n\n";
	myMessage += "1 000 000\n\n";
	myMessage += "Ввод числа с десятичной степенью\n";
	myMessage += "1,033e-15\n9.3478Е+23\n1.0Е+18 \n\n";
	myMessage += "Извините, не работает под браузером MS Explorer\n\n";
	myMessage += "Скачать браузер бесплатно можно здесь http://www.google.com/chrome";
	

	alert(myMessage);
	return;
}

function Info1(){

	var myMessage = '';
	myMessage = "- Системное сообщение -\n\n\n";
	myMessage += "Извините, но программа не работает под браузером MS Explorer\n";
	myMessage += "Для смены расчета используйте другой браузер\n";
	myMessage += "Скачать браузер бесплатно можно здесь http://www.google.com/chrome";
	
	
	alert(myMessage);
	return;
}




function stripBad(string) {
// If a space is next to two numbers, change to a + sign, for fractions
// But only if number also contains a / character
	if (string.match(/\//)){
	  while (string.match(/(\d) (\d)/)){
		string = string.replace(/(\d) (\d)/, "$1\+$2");
	  }
	}

 for (var i=0, output='', valid="eE+/*-0123456789.()"; i<string.length; i++) 
 {	 

	 if (valid.indexOf(string.charAt(i)) != -1){
       output += string.charAt(i);       
	 };

 };
	 
 return output;

}


/*converts 1e-16 to 1.0e-16 format */
function FormatOutPut(number)
{
	var strInput = number.toString();

	//if no exponent part found, then return the input.
	var indexOfe = strInput.indexOf('e');
	if (indexOfe == -1) return number;
	
	//find if . is present before the exponent part. if found then return the input as it is in proper format.
	var indexOfDot = strInput.substr(0, indexOfe).indexOf('.');
	if (indexOfDot > -1) return number;
	
	//include a . and 0 before the exponent part.
	var result = strInput.substr(0, indexOfe) + '.0' + strInput.substr(indexOfe, strInput.length);
	return result;	
}

function replace_string(in_str,cut_str,paste_str){ 
	var f=0;
		
	NewStr = in_str;
	f=NewStr.indexOf(cut_str);
	
	while (f!=-1){ 
		//цикл для вырезания всех имеющихся подстрок 
		
		if (f>0){
			NewStr = NewStr.substr(0,f) + paste_str + NewStr.substr(f+cut_str.length);
		};
		
		f=NewStr.indexOf(cut_str);

	};
	
	return NewStr;

}

function addOption (oListbox, text, value, isDefaultSelected, isSelected)
{
  var oOption = document.createElement("option");
  oOption.appendChild(document.createTextNode(text));
  oOption.setAttribute("value", value);

  if (isDefaultSelected) oOption.defaultSelected = true;
  else if (isSelected) oOption.selected = true;

  oListbox.appendChild(oOption);
}

function clearSelect(oListbox)
{
  for (var i=oListbox.options.length-1; i >= 0; i--)
  {
      oListbox.remove(i);
  }
};

function syncList(){} //Определяем функцию конструктор

//Определяем методы

//Метод sync() - принимает список из значений атрибутов id элементов SELECT, образующих связанный список и запускает их синхронизацию
syncList.prototype.sync = function()
{
	//Перебираем аргументы (id элементов SELECT) и назначаем событиям onChange селектов, с соответствующими id, функцию-обработчик. 
	//В качестве обработчика выступает второй метод объекта syncList - _sync (напрямую его вызывать не нужно) 
	//Обработчик назначается всем элементам SELECT кроме последнего в списке аргументов, т.к. последний не влияет ни на какой другой элемент SELECT и с ним не нужно синхронизироваться.
	for (var i=0; i < arguments.length-1; i++)	document.getElementById(arguments[i]).onchange = (function (o,id1,id2){return function(){o._sync(id1,id2);};})(this, arguments[i], arguments[i+1]);
	document.getElementById(arguments[0]).onchange();//запускаем обработчик onchange первого селекта, чтобы при загрузке страницы заполнить дочерние селекты значениями.
}
//служебный метод _sync - срабатывает при смене выбранного элемента в текущем (старшем) элементе SELECT (по его событию onChange) и изменяет содержимое зависимого селекта на основании значения выбранного в старшем селекте.
syncList.prototype._sync = function (firstSelectId, secondSelectId)
{
	var firstSelect = document.getElementById(firstSelectId);
	var secondSelect = document.getElementById(secondSelectId);

	secondSelect.length = 0; //обнуляем второй (подчиненный) SELECT
	
	if (firstSelect.length>0)//если первый (старший) SELECT не пуст
	{
		//из свойства dataList, с данными для заполнения подчиненных селектов, берем ту часть данных, которая соответствует именно значению элемента, 
		//выбранного в первом селекте, и определяет содержимое подчиненного элемента SELECT.
		var optionData = this.dataList[ firstSelect.options[firstSelect.selectedIndex==-1 ? 0 : firstSelect.selectedIndex].value ];
		//заполняем второй (подчиненный) селект значениями (создаем элементы option)
		for (var key in optionData || null) secondSelect.options[secondSelect.length] = new Option(optionData[key], key);
		
		//если в старшем SELECT-е нет выделенного пункта, выделяем первый
		if (firstSelect.selectedIndex == -1) setTimeout( function(){ firstSelect.options[0].selected = true;}, 1 );
		//если во втором списке нет выделенного пункта, выделяем первый его пункт
		if (secondSelect.length>0) setTimeout( function(){ secondSelect.options[0].selected = true;}, 1 );
	}
	//если второй (подчиненный) селект имеет в свою очередь свои подчиненные селекты (те, для которых он главный), 
	//то запускаем его обработчик onchange, чтобы изменить его подчиненные селекты
	secondSelect.onchange && secondSelect.onchange();
};
