// Embeded version of zamok instructions
// (all requested processed via ajax)
// $Id: ops_zamokex.js,v 1.82 2010/01/15 13:13:30 andrey Exp $

// версия для проверки в случае чего.
var ops_zamokexVersion = "$Revision: 1.82 $";
var DELITERMITER = " ";

// входящие параметры для скриптов
var zamokNumber = 0;
var zamokTimelimit = 0;
var zCountryIndex = -1;
var zOperatorIndex = -1;
var zUserSuffix = "";
var zUserPrefix = "zam+";
var zPrefixOpts = 0;

var zGG = false; // для pix+
var zVP = false; // для vp
var zPP = false; // для payments

// лимиты: количество, которое возможно к оправке за период
var smsLimitCount = 0;
// лимиты: период
var smsLimitPeriod = 0;

// save last access to out did generator;
var lastRequestTime = 0;

// cache full information
var zvalidCost = 0;
var zCostDelta = 0;
var zCostStrategy = 0;
var zProjectInfo = "";
var zProjectTimelimit = 0;

var dataRequestSheduled = false;
var useCSJ = false;
var timerHandler = null;

function movable_hide(id) {
  var docEl = document.getElementById(id);
  docEl.style.visibility = "hidden";
  docEl.style.display = "none";
}

function movable_show(id) {
  var docEl = document.getElementById(id);
  docEl.style.visibility = "visible";
  docEl.style.display = "block";
}

/**
 * Получить выделенный индекс
 */
function getSelectedIndexById(docId) {
  var docEl = document.getElementById(docId);
  return docEl.selectedIndex;
}

/**
 * Получить значние поля по идентификаторцу объекта
 */
function getValueById(docId) {
  var docEl = document.getElementById(docId);
  return docEl.value;
}

/**
 * Добавить опцию.
 */
function addOption(selectEl, optText, optValue) {
  if (document.createElement) {
    var newEl = document.createElement('OPTION');
    newEl.text = optText;
    newEl.value = optValue;
    (selectEl.options.add) ? selectEl.options.add(newEl) : selectEl.add(newEl, null);
  } else {
    selectEl.options[i] = new Option(optText, optValue, false, false);
  }
}

/**
 */
function makeHTML(htmlId, zamokId, zTimelimit) {
  zamokNumber = zamokId;
  zamokTimelimit = zTimelimit;

  var htmlEl = document.getElementById(htmlId);
  if (htmlEl) {
    movable_show('countrySelectArea');
    movable_hide('providerSelectArea');
    
    var countrySelect = document.getElementById('countrySelect');
    countrySelect.length = 0;
    addOption(countrySelect, strChooseCountry, -1);
    for (i = 0; i < jsonSMS.country.length; i++) {
      var isDisabled = false;
      if (jsonSMS.country[i].Disabled) {
        isDisabled = jsonSMS.country[i].Disabled;
      }

	  if (!isDisabled && countriesPersonal.length > 0) {
		  isDisabled = true;
		  for (n = 0; n < countriesPersonal.length; n++) {
		  	if (jsonSMS.country[i].Id == countriesPersonal[n].country) {
		  		isDisabled = false;
		  		break;	
		  	}
		  }
	  }

      if (!isDisabled) {
        if ((typeof strCountries) != "undefined" &&
            (typeof jsonSMS.country[i].Id) != "undefined" &&
            (typeof strCountries[jsonSMS.country[i].Id]) != "undefined") {
          addOption(countrySelect,
            (strCountries.length > jsonSMS.country[i].Id) ?
              strCountries[jsonSMS.country[i].Id] : jsonSMS.country[i].Name, i);
        } else {
          addOption(countrySelect, jsonSMS.country[i].Name, i);
        }
      }
    }
    showElement(htmlEl);
    return true;
  }
  return false;
}

/** Вывод ошибки, в случае, если что-то не так.
 */
function showError(errorStr, hideAll) {
  var codeField = document.getElementById('codeField');
  if (hideAll) {
    movable_hide('countrySelectArea');
    movable_hide('providerSelectArea');
  }
  codeField.innerHTML = '<b>ERROR: </b> <p>' + errorStr + '</p>';
}

function requestProvidersList(countryIndex) {
  if (countryIndex >= 0) {
    zCountryIndex = countryIndex;
    var defaultBrand = ((typeof jsonSMS.country[countryIndex].DefaultBrand) != "undefined") ?
      jsonSMS.country[countryIndex].DefaultBrand : 0;
    if (zvalidCost != 0) {
      if (defaultBrand != 0) {
        var country = jsonSMS.country[countryIndex];
        for (i = 0; i < country.Operators.length; i++) {
          if (country.Operators[i].Id == defaultBrand) {
            zOperatorIndex = i;
            
            if (makeProvidersList(countryIndex) == 0) { 
              showCode(zCountryIndex, zOperatorIndex);
              movable_hide('providerSelectArea');
            } else {
              showError(strErrorNoOperator, false);
              movable_hide('providerSelectArea');
            }
            break;
          }
        }
      } else {
        switch(makeProvidersList(countryIndex)) {
         case 0: showCode(-1, -1); movable_show('providerSelectArea'); break;
         case 1: showError(strErrorNoOperator, false); movable_hide('providerSelectArea'); break;
         case -1: showCode(-1, -1); movable_hide('providerSelectArea'); break;
        }
      }
    } else {
      makeRequest();
      movable_show('providerSelectArea');
      showCode(-1, -1);
    }
  } else {
    movable_hide('providerSelectArea');
    showCode(-1, -1);
  }
}

/**
 */
function makeProvidersList(countryIndex) {
  if (countryIndex >= 0) {
    var providerSelect = document.getElementById('providerSelect');
    var validCounter = 0;
    providerSelect.length = 0;
    addOption(providerSelect, strChooseOperator, -1);    
    for (n = 0; n < countriesPersonal.length; n++) {
    	if (jsonSMS.country[countryIndex].Id == countriesPersonal[n].country) {
    		zvalidCost = countriesPersonal[n].price;
    	}
    }

    var countryCurrencyName = jsonSMS.country[countryIndex].Currency;
    var countryCurrencyRate = currencies[countryCurrencyName];
    zvalidCostLocal = zvalidCost*countryCurrencyRate;
    zCostDeltaLocal = zCostDelta*countryCurrencyRate;
    
    for (i = 0; i < jsonSMS.country[countryIndex].Operators.length; i++) {
      var operator = jsonSMS.country[countryIndex].Operators[i];
      var isValidOption = operator.Numbers.length > 0;
      if (zvalidCostLocal != 0) {
        for (j = 0; j < operator.Numbers.length; j++) {
          var diff = Math.abs(operator.Numbers[j].CostLocal - zvalidCostLocal);
          switch (zCostStrategy) {
          case 0: // constant
            isValidOption = operator.Numbers[j].CostLocal == zvalidCostLocal;
            break;
          case 1: // nearest
            isValidOption = diff <= zCostDeltaLocal;
            break;
          case 2: // greater
            isValidOption = operator.Numbers[j].CostLocal >= zvalidCostLocal && diff <= zCostDeltaLocal;
            break;
          case 3: // smaller
            isValidOption = operator.Numbers[j].CostLocal <= zvalidCostLocal && diff <= zCostDeltaLocal;
            break;
          }
          if (isValidOption) break;
        }
      }
      
      if (isValidOption) {
        addOption(providerSelect, operator.Name, i);
        validCounter++;
      }
    }
    if (validCounter == 0) {
      providerSelect.length = 0;
      addOption(providerSelect, strErrorNoOperator, -1);
    }
    
    return (validCounter != 0) ? 0 : 1;
  }
  return -1;
}

function resultsAvailable2(data) {
  var local = new Function("return " + data) ();
  var errorCode = 0;
  if (local.errorCode) {
    errorCode = local.errorCode;
  }
  fillResults(errorCode, local);
}

function resultsAvailable() {
  /* 0 = uninitialized
     1 = loading
     2 = loaded
     3 = interactive
     4 = complete */
  if (xmlhttp.readyState == 4) {
    if (xmlhttp.status != 404) {
      lastRequestTime = (new Date()).getTime();
      var local = eval('(' + xmlhttp.responseText + ')');
      var errorCode = 0;
      if ((typeof local.errorCode) != "undefined") {
        errorCode = parseInt(local.errorCode);
      }
      
      fillResults(errorCode, local);
    }
  }
}

function fillResults(errorCode, local) {
  switch (errorCode) {
  case -1001: break; // not ready
  case 0: // ready
    zdid = local.zdid;
    zvalidTime = local.zvalidTime;
    if (zvalidCost == 0) {
      zvalidCost = local.zvalidCost;
      zprojectName = local.zprojectName;
      zprojectTimelimit = local.zprojectTimelimit;
      
      if (local.zgg) zGG = true;
      if (local.zvp) zVP = true;
      if (local.zpp) zPP = true;
      if ((typeof local.zprojectPrefix) != "undefined") zUserPrefix = local.zprojectPrefix;
      if ((typeof local.smsLimitCount) != "undefined") smsLimitCount = parseInt(local.smsLimitCount);
      if ((typeof local.smsLimitPeriod) != "undefined") smsLimitPeriod = parseInt(local.smsLimitPeriod);
      if ((typeof local.zCostStrategy) != "undefined") zCostStrategy = parseInt(local.zCostStrategy);
      if ((typeof local.zCostDelta) != "undefined") zCostDelta = parseInt(local.zCostDelta);
      if ((typeof local.prefixOpts) != "undefined") zPrefixOpts = parseInt(local.prefixOpts);
      
      requestProvidersList(zCountryIndex);
    }
      
    if (dataRequestSheduled) {
      dataRequestSheduled = false;
      showCode(zCountryIndex, zOperatorIndex);
    }
    break;
  case 1:
    showError(strErrorProjectNotActive, true);
    break;
  case 2:
    showError(strErrorProjectBlocked, true);
    break;
  default:
    showError(strErrorUnknown, true);
  }
}

/**
 */
function makeRequest() {
  var needValidCost =  (zvalidCost == 0) ? "1" : "0";
  var advParams = '&extra=' + needValidCost;
  if (zCountryIndex >= 0 && (typeof jsonSMS.country[zCountryIndex].Id) != "undefined") advParams += '&cid=' + jsonSMS.country[zCountryIndex].Id;
  
  if (useCSJ) {
    var src = 'http://tmpface.smszamok.ru/client/dynrequest.php?type=jsoncs&pid=' + zamokNumber + advParams;
    var xjr = com.bigllc.xjr.RequestDispatcher;
    xjr.setResponseHandler(resultsAvailable2);
    xjr.get(src);
  } else {
    var src = '/client/dynrequest.php?type=json&pid=' + zamokNumber + advParams;
    xmlhttp.open("GET", src, true);
    xmlhttp.onreadystatechange = resultsAvailable;
    xmlhttp.send(null);
  }
}

function getCachedProjectInfo() {
  return zProjectInfo;
}

function getCachedTimelimit() {
  return zvalidTime;
}

function updateTimer(timeSince) {
  var timeBox = document.getElementById('timeleft');
  if (timeBox) {
    if (zVP) {
      timeBox.innerHTML = strTimeAlways;
    } else {
      var newDate = new Date();
      var timeleft = zvalidTime * 60 * 1000 + timeSince - newDate.getTime();
      // var timeleft = 5000 + timeSince - newDate.getTime();
      var timeleftSec = Math.round(timeleft/1000) % 60;
      var timeleftMin = Math.round((timeleft/1000 - timeleftSec)/60);
      if (timeleft > 0) {
        timeString = ((timeleftMin > 9) ? timeleftMin : '0' + timeleftMin) + ':' +
          ((timeleftSec > 9) ? timeleftSec : '0' + timeleftSec);
        timeBox.innerHTML = strCodeFormat.replace(/%s/i, timeString);
        if (timerHandler != null) clearTimeout(timerHandler);
        timerHandler = setTimeout("updateTimer(" + timeSince + ")", 1000);
      } else {
        timeBox.innerHTML = '<b>' + strTimeOver + ' (' + timeleft + ')</b>';
      
        var codeField = document.getElementById('codeField');
        codeField.innerHTML = strUpdating;
      
        dataRequestSheduled = true;
        makeRequest();
      }
    }
  }
}

/** Вывод информации об отправке кода.
 */
function showCode(countryIndex, operatorIndex) {
  // TODO: прибрать тут.
  var codeField = document.getElementById('codeField');
  var operator = null;
  var countryTax = 0;
  var countryCurrency = ' $';
  var codeNumber = "<NaN>";
  var codeStr = "<NaN>";
  var codeCost = 0;
  var codeCostLocal = 0;
  var limitStr = '';
  var bestIndex = -1;
  var prefix = zUserPrefix;
  zOperatorIndex = operatorIndex;
  if (countryIndex >= 0 && operatorIndex >= 0) {
    if (document.getElementById('subscriptionSelectArea')) {
  		show('subscriptionSelectArea');
  	}
    for (n = 0; n < countriesPersonal.length; n++) {
    	if (jsonSMS.country[countryIndex].Id == countriesPersonal[n].country) {
    		zvalidCost = countriesPersonal[n].price;
    	}
    }
    
    var countryCurrencyName = jsonSMS.country[countryIndex].Currency;
    var countryCurrencyRate = currencies[countryCurrencyName];
    zvalidCostLocal = zvalidCost*countryCurrencyRate;
    zCostDeltaLocal = zCostDelta*countryCurrencyRate;
    
    operator = jsonSMS.country[countryIndex].Operators[operatorIndex];
    // Налог может быть указан дополнительно, либо включён в сумму
    countryTax = (typeof jsonSMS.country[countryIndex].Tax) != "undefined" ? jsonSMS.country[countryIndex].Tax : 0;
    // Для страны может быть указан свой префикс
    if ((typeof jsonSMS.country[countryIndex].ForcePrefix) != "undefined") prefix = jsonSMS.country[countryIndex].ForcePrefix;
    // код определения оптимального варианта стоимости
    // исходя из стратегии
    var bestDiff = 99999999999;
    for (i = 0; i < operator.Numbers.length; i++) {
      var diff = 9999999;
      switch (zCostStrategy) {
      case 0: // constant
        if((diff = (operator.Numbers[i].CostLocal - zvalidCostLocal)) == 0 && diff <= zCostDeltaLocal) {
          bestDiff = diff;
          bestIndex = i;
        }
        break;
      case 1: // nearest
        if ((diff = Math.abs(operator.Numbers[i].CostLocal - zvalidCostLocal)) <= bestDiff && diff <= zCostDeltaLocal) {
          bestDiff = diff;
          bestIndex = i;
        }
        break;
      case 2: // greater
      case 3: // smaller
        diff = (zCostStrategy == 2) ? (operator.Numbers[i].CostLocal - zvalidCostLocal) : (zvalidCostLocal - operator.Numbers[i].CostLocal);
        if (diff >= 0 && diff <= bestDiff && diff <= zCostDeltaLocal) {
          bestDiff = diff;
          bestIndex = i;
        }
        break;
      }
    }
    
    // для номера так же может быть задан свой префикс
    // 21751 - Plastim
    // 20570 - kroogi
    // 19493, 20669, 20670 - Crabiza
    // 22388, 22557, 22558 - s4y
    // 22455 - hotjob
    // 22248 - -minus
    // 22652 - club
    // 23993, 24370, 24369 - ava
    if ((zamokNumber!=23239 &&
		 zamokNumber!=22652 &&
		 zamokNumber!=22248 &&
		 zamokNumber!=22935 &&
		 zamokNumber!=22455 &&
 		 zamokNumber!=20570 && 
    	 zamokNumber!=22859 && 
         zamokNumber!=22195 && 
         zamokNumber!=22117 && 
         zamokNumber!=5769 && 
         // zamokNumber!=21751 && 
         zamokNumber!=19114 && 
         zamokNumber!=19493 && zamokNumber!=20669 && zamokNumber!=20670 && 
         zamokNumber!=22388 && zamokNumber!=22557 && zamokNumber!=22558 &&
         zamokNumber!=21888/* &&
         zamokNumber!=23993 &&
         zamokNumber!=24370 &&
         zamokNumber!=24369*/) && 
         (typeof operator.Numbers[bestIndex].ForcePrefix) != "undefined") prefix = operator.Numbers[bestIndex].ForcePrefix;
    
    switch (zPrefixOpts) {
      case 0:
        codeStr = (zVP) ? prefix + zamokNumber + zUserSuffix : prefix + zamokNumber + DELITERMITER + zdid + zUserSuffix;
        break;
      case 1: 
        codeStr = (zVP) ? prefix + zUserSuffix : prefix + DELITERMITER + zdid + zUserSuffix;
        break;
    }
    if (document.getElementById('subscriptionSelect')) {
    	codeStr += ' ' + getValueById('subscriptionSelect');
   	}
    
    codeNumber = operator.Numbers[bestIndex].Number;
    codeCost = operator.Numbers[bestIndex].Cost;
    if ((typeof operator.Numbers[bestIndex].CostLocal) != "undefined") {
      // только в случае выставленной локальной цены показываем локальную валюту
      codeCostLocal = operator.Numbers[bestIndex].CostLocal;
      countryCurrency = jsonSMS.country[countryIndex].Currency;
    }
    
    if ((typeof smsLimitCount) != "undefined" && smsLimitCount > 0 && smsLimitPeriod > 0) {
     limitsStr = strZamokLimits.replace(/%d/i, smsLimitCount);
     limitsStr = limitsStr.replace(/%s/i, smsLimitPeriod < 1440 ? smsLimitPeriod + ' ' + strTimePeriodMinute : strTimePeriodDay);
    }
    
    var zamokTax = '';
    if (countryTax != 0) {
     zamokTax = strZamokTax.replace(/%cost/i, Math.round(
       ((codeCostLocal) ? codeCostLocal : codeCost) * countryTax)/100);
     zamokTax = zamokTax.replace(/%currency/i, '&nbsp;' + countryCurrency);
    }
    
    // подстановки значений в трансляции
    var zamokCost = strZamokCost;
    if (jsonSMS.country[countryIndex].Id == 1 && jsonSMS.country[countryIndex].Operators[operatorIndex].Id == 4) {
   	 zamokCost = '<small>Стоимость сообщения: <span class="instruct">' + (codeCostLocal/100 + Math.round(codeCostLocal*countryTax)/100)+ '&nbsp;руб&nbsp;с&nbsp;учетом&nbsp;НДС</span><br />Точную стоимость sms сообщения уточните у своего оператора сотовой связи.</small>';
    } else if (jsonSMS.country[countryIndex].Id == 2) {
   	 zamokCost = '<small>Стоимость сообщения: <span class="instruct">' + (codeCostLocal/100 + Math.round(codeCostLocal*countryTax)/100)+ '&nbsp;грн.<br />(Тариф в гривнах с учетом НДС. Дополнительно удерживается сбор в пенсионный фонд в размере 7,5% от стоимости услуги без учета НДС)</span><br />Точную стоимость sms сообщения уточните у своего оператора сотовой связи.</small>';
   	 if (jsonSMS.country[countryIndex].Operators[operatorIndex].Id == 18) {
   		zamokCost += '<br><p>Ограничение на отправку смс по оператору составляет 188 гривен в сутки с одного номера телефона.</p>';
   	 }
    } else {
   	 zamokCost = zamokCost.replace(/%cost/i, (codeCostLocal) ? codeCostLocal/100 : codeCost/100);
   	 zamokCost = zamokCost.replace(/%currency/i, '&nbsp;' + countryCurrency);
   	 zamokCost = zamokCost.replace(/%tax/i, zamokTax);
    }
    var resultString = (zVP) ? strHintFormatVIP.replace(/%d/i, codeNumber) : strHintFormat.replace(/%d/i, codeNumber);
    resultString = resultString.replace(/%s/i, codeStr);
    resultString = resultString.replace(/%s/i, zamokCost);
    resultString = resultString.replace(/%prefix/i, (prefix.indexOf('+') > 0) ? prefix.substring(0, prefix.length - 1) : prefix);
    resultString = resultString.replace(/%timelimit/i, zamokTimelimit);
    
    codeField.innerHTML = resultString + limitsStr + ((zGG) ? '' : strZamokFooter);
    
    updateTimer(((lastRequestTime > 0) ? lastRequestTime : (new Date()).getTime()));
  } else {
    codeField.innerHTML = '';
  }
}

function changeSubscriptionTheme() {
	showCode(getValueById('countrySelect'), getValueById('providerSelect'));
}