// JavaScript Document

/*
Данный скрипт используется для страниц покупки продукта "Language Extender" для платформ Windows Mobile, Windows Mobile Pocket PC и Windows Mobile Smartphone на всех зеркалах сайта http://penreader.com. 
Обязательные параметры (html элементы) для корректной работы программы: 
1) тэг form с именем "frmNav"
2) в данной форме должно быть 4 тэга input с атрибутом type = "hidden"; 
  a) первый тэг input также содержит обязательный атрибут id = "langValue", а также value = "[название языка данного продукта]";
  б) второй тэг input также содержит обязательный атрибут name = "currency", а также value = "[название валюты (EUR, USD, RUB и т.д.)]";
  в) третий тэг input также содержит обязательный атрибут name = "language", а также value="%include-site-language%", где %include-site-language% сообщает выбранное зеркало сайта (_en, _epocware-en, _de, _blackberry-de и т.д.);
  г) четвёртый тэг input также содержит обязательный атрибут name = "continueURL", а также value="%include-site-name%", где %include-site-name% - конструкция, выводящая название сайта в формате http://www.[название сайта].[доменная зона]/; параметры, указанные в [], изменяются.
3) Элемент "select" с обязательными атрибутами name="device" и onchange="synchronize()". В данном элементе должно быть как минимум два тэга option, один из которых пустой, а второй содержит название платформы для продукта.
4) Ещё один элемент "select" с обязательным атрибутом name="model"; он не содержит элементов option, впоследствии они добавляются автоматически. 
5) элемент div c обязательными атрибутами id="buy_button" style="display:none;". Данный элемент содержит тэг image с обязательными атрибутами style="cursor:pointer;" и 
ссылку на изображение кнопки "Купить" (для разных зеркал перевод кнопки соответствующий).

Основным глобальным источником данных для работы программы является массив "oSet", который содержит всю необходимую информацию о платформах, версиях продукта для этих платформ, id продуктов в интернет магазине Cleverbridge. "oSet" является многомерным массивом и строится в данном случае по следующему принципу: 

[  ["указывается название платформы #1 для данного продукта", ["указывается название версии #1 для платформы #1", ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], [...], [...]],   ["указывается название версии #2 для платформы #1", ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], [...], [...]],   ["указывается название версии #N для платформы #1", ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], [...], [...]]  ],
																																																																																																																																																																																																																																																																								    ["Указывается название платформы #2 для данного продукта", ["указывается название версии #1 для платформы #2", ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], [...], [...]],   ["указывается название версии #2 для платформы #2", ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], [...], [...]],   ["указывается название версии #N для платформы #2", ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], [...], [...]]  ],
   
    ["платформа", ["версия", ["язык", id], [..., ...], ["язык", id]], [..., [...,...], [...,...], [...,...]]],
   
    ["указывается название платформы #N для данного продукта", ["указывается название версии #1 для платформы #N", ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], [...], [...]],   ["указывается название версии #2 для платформы #N", ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], [...], [...]],   ["указывается название версии #N для платформы #N", ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], ["название языка (указывается на английском языке с заглавной буквы)", id данного продукта (данного языка) в магазине Cleverbridge], [...], [...]]  ]
], где N - натуральное число.

Очевидно, что если, предположим, для платформы Windows Mobile Pocket PC 5.0 для версии "Full" существует словарь "Arabic" с определенным id, то эти данные должны отображаться и в массиве "oSet" и в элементе "Select" с атрибутом name="device". Любые добавления либо удаления, либо правки с массивом "oSet" необходимо проводить по принципу построения массива, описанному выше. */


var oSet = [
			   ["Windows Mobile Pocket PC 5.0", ["Full", ["Arabic", 44292], ["Estonian", 44300], ["Greek", 44306], ["Hungarian", 44316], ["Latvian", 44321], ["Lithuanian", 44323], ["Polish", 44326], ["Russian", 44333], ["Turkish", 44341]], ["Lite", ["Arabic", 44293], ["Czech", 44296], ["Farsi", 44302], ["Greek", 44307], ["Hebrew", 44311], ["Hungarian", 44317], ["Lithuanian", 44323], ["Polish", 44327], ["Russian", 44334], ["Turkish", 44342]] ],
			   
			   ["Windows Mobile 6.0 Classic and Professional", ["Full", ["Arabic", 44290], ["English", 44299], ["Greek", 44304], ["Hungarian", 44314], ["Latvian", 44320], ["Turkish", 44339]], ["Lite", ["Arabic", 44291], ["Czech", 44295], ["Greek", 44305], ["Hebrew", 44310], ["Hungarian", 44315], ["Polish", 44325], ["Romanian", 44330], ["Russian", 44332], ["Slovak", 44337], ["Turkish", 44340]] ],
			   
			   ["Windows Mobile Pocket PC 2003SE", ["Full", ["Czech", 44297], ["Greek", 44308], ["Hebrew", 44312], ["Hungarian", 44318], ["Polish", 44328]], ["Lite", ["Arabic", 44294], ["Czech", 44298], ["Estonian", 44301], ["Farsi", 44303], ["Greek", 44309], ["Hebrew", 44313], ["Hungarian", 44319], ["Latvian", 44322], ["Lithuanian", 44324], ["Polish", 44329], ["Romanian", 44331], ["Russian", 44336], ["Slovak", 44338], ["Turkish", 44343]] ],
			   
			   ["Windows Mobile Pocket PC 2003", ["Full", ["Czech", 44297], ["Greek", 44308], ["Hebrew", 44312], ["Hungarian", 44318], ["Polish", 44328], ["Russian", 44335]], ["Lite", ["Arabic", 44294], ["Czech", 44298], ["Estonian", 44301], ["Farsi", 44303], ["Greek", 44309], ["Hebrew", 44313], ["Hungarian", 44319], ["Latvian", 44322], ["Lithuanian", 44324], ["Polish", 44329], ["Romanian", 44331], ["Russian", 44336], ["Slovak", 44338], ["Turkish", 44343]] ]
	   	  ]; // end array;
			  
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

document.getElementById("buy_button").style.display = "none"; // При запуске Javascript - программы пользователь не должен видеть кнопку "Купить" (для каждого зеркала перевод соответствующий); 

/*
Функция synchronize() используется для отображения версии продукта (Full или Lite), а также для дальнейшего выбора пользователем этой версии.
Функция synchronize() создает опции "Full" и "Lite" автоматически в зависимости от того, имеется ли для данного названия словаря и выбранной пользователем платформы определённая версия. Также стоит отметить, что функция synchronize() является внешней по отношению к topage(), поэтому переменные, определённые в ней, доступны для использования и во внутренней функции при условии, что они не переопределяются. 
*/
function synchronize() {
document.frmNav.model.options.length = 0; //При вызове функции synchronize() обнуляем количество опций, создаваемых динамически, для элемента "Select" с именем "model" 
document.getElementById("buy_button").style.display = "none"; // Кнопка "Купить" также отсутствует.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

var chosen_platform = document.frmNav.device.options[document.frmNav.device.selectedIndex].text; // Платформа, выбранная пользователем;
var language = document.getElementById("langValue").value; // Название языка продукта;

/* Данный цикл ищет соответствие между названием платформы, которую выбрал пользователь для данного продукта, с названиями платформ, содержащихся в массиве "oSet".
Индекс элемента массива, содержащего название платформы, сохраняется в переменной "need_counter".
*/
for(var counter = 0; counter < oSet.length; counter++){
	if(oSet[counter][0] == chosen_platform)
		var need_counter = counter;
}

var version_name = new Array(); // Создаём один раз пустой массив;

/* В следующем цикле рассмотрим массив, нулевой элемент которого содержит название платформы, выбранной пользователем.
Цикл осуществляется по данному массиву, причем начинается с его первого элемента (нулевой содержит название платформы!).
Так как первый и последующий элементы рассматриваемого массива являются также массивами, то второй цикл "for" осуществляет по ним цикл, сохраняя в новом массиве "version_name" названия версий данного продукта. Если для данной платформы и данной версии (Full либо Lite) названием словаря продукта содержится, то эта версия добавляется в новый массив "version_name". Таким образом нам становится известно, сколько опций необходимо создать для элемента "Select" с атрибутом "model". 
*/
for(var counter = 1; counter < oSet[need_counter].length; counter++){
	for(var counter2 = 1; counter2 < oSet[need_counter][counter].length; counter2++){
			if(oSet[need_counter][counter][counter2][0] == language){
				version_name[counter-1] = oSet[need_counter][counter][0];
			} 
	}
}

/* 
Выполняем поиск и удаление значений null и undefined по новому массиву "version_name";  
*/
for(var j = 0; j < version_name.length; j++){
	if(version_name[j] == undefined)
    version_name.shift();
}


document.frmNav.model.options[0] = new Option(" "); // В элементе "Select" с атрибутом "model" создаем одну пустую опцию для того, чтобы в случае одной версии продукта либо Full либо Lite, либо иной другой пользователь все-таки смог вызвать функцию topage() как событие onchange рассматриваемого элемента "Select".

for(var j = 1; j <= version_name.length; j++) // Цикл создаёт необходимое количество опций с названием версии продукта (Full, Lite либо иной другой). 
	{
		document.frmNav.model.options[j] = new Option(version_name[j-1]);	
	}


/*
Назначение функции topage(): при выборе пользователем версии (Full или Lite) продукта отобразить кнопку "Купить" (название кнопки подставляется автоматически для соответствующих языков), затем, если пользователь вызывает событие "onclick" данной кнопки, перенаправить его в магазин Cleverbridge для совершение покупки.   
Также функция topage() формирует ссылку на покупку продукта, для чего находит соответствие "Название языка - id продукта в магазине Cleverbridge" из глобального массива "oSet". Параметры и переменные, являющиеся глобальными по отношению к функции topage(): "chosen_platform" - платформа из массива "oSet", уже выбранная пользователем; "language" - название языка из массива "oSet". 
*/	
	function topage() {
     	var version = document.frmNav.model.options[document.frmNav.model.selectedIndex].text;	// Определяем версию продукта, которую выбрал пользователь (Full или Lite);	
		    // Данный цикл определяет, какую доступную платформу для данного продукта из массива "oSet" выбрал пользователь;
			// Затем индекс элемента массива, содержащий данную платформу, сохраняется в переменной "need_counter";
		    for(var counter = 0; counter < oSet.length; counter++)    
			{
				if(oSet[counter][0] == chosen_platform)
				var need_counter = counter;
			}
			
			// Данный цикл определяет, какую версию продукта (Full или Lite) предпочитает пользователь. 
			// Затем индекс элемента массива, содержащий данную версию, сохраняется в переменной "need_counter2";			
			for(var counter = 1; counter < oSet[need_counter].length; counter++)
			{
				if(oSet[need_counter][counter][0] == version)
				var need_counter2 = counter;
			}
			
			// Данный цикл определяет название языка словаря и его id - номер в онлайн магазине Cleverbridge.
			// При этом данные, полученные в предыдущих циклах, используются для соответствия Платформы - Версии - Названия языка и id-Cleverbridge.
			// В переменной "product_id_link" сохраняется полученный id продукта, который затем используется в ссылке на прокупку. 
			for(var counter = 1; counter < oSet[need_counter][need_counter2].length; counter++)
			{
				if(oSet[need_counter][need_counter2][counter][0] == language)
				var product_id_link = oSet[need_counter][need_counter2][counter][1];
			}
			
			
/* 
Данный комментарий описывает переменные, составляющие ссылку на покупку словаря в Cleverbridge и определённые ниже.
Переменная сurrency содержит значение валюты (RUB, EUR, USD и т.д.) в зависимости от выбора зеркала сайта;
Переменная include_site_language содержит название зеркала сайта (en, de, epocware-de, epocware-ru, blackberry-ru и т.д.) в зависимости от сайта;
Переменная continueURL содержит название сайта, с которого пользователь перешёл в онлайн магазин для покупки данного продукта;
Переменная cfg содержит то же название сайта, что и continueURL. Но используется для автоматического отображения "рубашки" онлайн магазина Cleverbridge в зависимости от сайта, с которого пользователь совершает покупку.
Переменная url содержит регулярное выражение, описывающее шаблон ссылки типа http://www.(название сайта).com, где "www." - необязательная часть данного выражения, вместо "com" может использоваться любая другая доменная зона.
Далее ищем совпадение в строке "cfg" с шаблоном url, при этом результат заносится в массив "cfg_array", нулевой элемент которого содержит полное совпадение строки "cfg" с шаблоном "url". Последний элемент массива "cfg_array" содержит то самое "название сайта", которое в дальнейшем перезаписывается в переменную "cfg".   
*/
			var currency = document.frmNav.currency.value; 
			var include_site_language = document.frmNav.language.value.slice(1);
			var continueURL = document.frmNav.continueURL.value;
			var cfg = continueURL;
			var url = /http:\/\/([w]{3}.)?([a-zA-Z]+).[a-zA-Z]{2,}/; 
			var cfg_array = cfg.match(url);
			cfg = cfg_array[cfg_array.length-1];
/*
Значения, полученные ранее, далее подставляются в переменную "buy_path", которая представляет из себя скрытый атрибут "href" ссылки на покупку. 
*/			
			var buy_path = "https://www.cleverbridge.com/400/?scope=cart&cart=" + product_id_link + "&continueurl=" + continueURL + "&currency=" + currency + "&language=" + include_site_language + "&cfg=" + cfg + "&cb_ident=d27f2503&cookie=true&enablecoupon=force";

			document.getElementById("buy_button").style.display = "block";
			document.getElementById("buy_button").onclick = function() {window.location = buy_path;}
	} // end topage();
	
document.frmNav.model.onchange = topage; // По событию "onchange" элемента "Select" с атрибутом "name = model" вызывается функция topage(); 
} // end synchronize();


