// ============================================================
var monitor, detContainer, xmldocs = [], actSP, actPack = { pack: null, img: null, qStrPrm: reqQParams }, refProduct = {};
// ============================================================
function $$(id) { return document.getElementById(id); }
// ============================================================

// ============================================================
function toRawList() { return this.join(''); }
// ============================================================
function getImgNextState(imgObj, states) { return (+(imgObj.src.indexOf(states[0]) != -1)); }
// ============================================================
function isLoading(req) {
	var url = req.url.substr(0, req.url.indexOf('?'));
	if (monitor) {
		//monitor.className = "Loading";
		//monitor.innerHTML += '<span style="display:block;" id="monitor_'+req.requestIndex+'">Loading...'+req.url+'</span>';
	}
}
// ============================================================
function addTodocs(req) {
	xmldocs.push(req.responseXML);
	if (monitor) { monitor.className = "Loaded"; }
}
// ============================================================
function loadXML(docLoc) {
	if (typeof (docLoc) == 'string') {
		AjaxRequest.get(
		  {
		  	'url': docLoc,
		  	'onLoading': isLoading,
		  	'onComplete': addTodocs,
		  	'onSuccess': function() { createSPs(xmldocs[0]); }
		  }
		);
	}
}
// ============================================================
function loadDocs(list) {
	//var file;
	for (var f = 0; f < list.length; f++) {
		var file = list[f];
		//loadXML(file);
		setTimeout(function() { loadXML(file) }, 420);
	}
	return null;
}
// ============================================================

function strXML(xmlString) {
	var xmlDoc;
	if (document.implementation.createDocument) {
		var parser = new DOMParser();
		xmlDoc = parser.parseFromString(xmlString, "text/xml");
	}
	else if (window.ActiveXObject) {
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = "false";
		xmlDoc.loadXML(xmlString);
	}
	return xmlDoc;
}
// ============================================================
function createSPs(doc) {
	SPs = {};
	var buffOut = [], buffOutA = [], SPList = $$('SPArea');
	buffOut.toString = toRawList; buffOutA.toString = toRawList;

	//++++++++++++++++++++++++++++++++++++++++++++++++++++++
	var buffProvBlock = ['<table border="0" cellpadding="0" cellspacing="0" id="', 'VODAFONE', '" class="Provider"><tr class="tblHead"><td colspan="' + tblColHeaders.length.toString() + '">', 'Table Header', '</td></tr><tr class="tblColHead"><td class="col0">' + tblColHeaders[0] + '</td><td class="col1">' + tblColHeaders[1] + '</td><td class="col2">' + tblColHeaders[2] + '</td></tr>', 'Packages', '<tr class="tblFoot"><td colspan="' + tblColHeaders.length.toString() + '">', '' + (tblFooterA[0].replace('#image#', '<img src="' + selectImage[0] + '">')) + '', '</td></tr></table>'];
	var buffPackRow = ['<tr class="packageRow" onClick="//showPrg(\'', 'PACKNAME', '\');"><td class="package">', 'PACKNAME', '</td>', 'COLUMNS', '</tr>'];
	var buffPackCol = ['<td class="price" nowrap><img src="' + selectImage[0] + '" border="0" name="" onClick="selectPack(this,0,\'', 'VODAFONE', '\',\'', 'CONNTYPE', '\',\'', 'CODE', '\');showPrg(\'', 'CODE', '\');"> ', 'price', '</td>'];
	var buffPackRows = [], buffPackCols = [];
	buffProvBlock.toString = toRawList;
	buffPackRow.toString = toRawList; buffPackRows.toString = toRawList;
	buffPackCol.toString = toRawList; buffPackCols.toString = toRawList;
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++

	//++++++++++++++++++++++++++++++++++++++++++++++++++++++
	var buffProvBlockA = ['<table border="0" cellpadding="0" cellspacing="0" id="s_', 'VODAFONE', '" class="ProviderA"><tr class="tblHead"><td colspan="' + tblColHeadersA.length.toString() + '" align="center">', 'Table Header', '</td></tr><tr class="tblColHead"><td class="col0">' + tblColHeadersA[0] + '</td><td class="col1">' + tblColHeadersA[1] + '</td></tr>', 'Packages', '<tr class="tblFoot1"><td colspan="' + tblColHeadersA.length.toString() + '">' + tblFooterA[0].replace('#image#', '<img src="' + selectImage[0] + '">') + '</td></tr><tr class="tblFoot2"><td colspan="' + tblColHeadersA.length.toString() + '">' + '<a href="" onClick="showSP(\'', 'VODAFONE', '\',\'', 'CONNTYPE', '\');return false;">' + tblFooterA[1] + '</a></td></tr></table>'];
	var buffPackRowA = ['<tr class="packageRow"><td class="package" nowrap><img src="' + selectImage[0] + '" border="0" name="" alt="' + vvChoose + '" title="' + vvChoose + '" onClick="selectPack(this,0,\'', 'VODAFONE', '\',\'', 'CONNTYPE', '\',\'', 'CODE', '\')"><div>', 'PACKNAME', '</div></td>', 'COLUMNS', '</tr>'];
	var buffPackColA = ['<td class="price" nowrap>', 'price', '</td>'];
	var buffPackRowsA = [], buffPackColsA = [];
	buffProvBlockA.toString = toRawList;
	buffPackRowA.toString = toRawList; buffPackRowsA.toString = toRawList;
	buffPackColA.toString = toRawList; buffPackColsA.toString = toRawList;
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++

	function getProvider(providerName, type, rows, footer) {
		buffProvBlock[1] = providerName + '_' + type;
		buffProvBlock[3] = ('<img src="/images/mobiles/' + providerName.toLowerCase() + '.gif" alt="' + providerName + '">');
		buffProvBlock[5] = rows; //buffProvBlock[7] = (footer || '');
		return buffProvBlock.toString();
	}
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++
	function getProviderA(providerName, type, rows, footer) {
		buffProvBlockA[1] = providerName;
		buffProvBlockA[3] = ('<img src="/images/mobiles/' + providerName.toLowerCase() + '.gif" alt="' + providerName + '">');
		buffProvBlockA[5] = rows; buffProvBlockA[7] = providerName; //(footer || tblFooterA[1] || '');
		buffProvBlockA[9] = type;
		return buffProvBlockA.toString();
	}
	function getRow(title, cols) {
		buffPackRow[1] = buffPackRow[3] = title; buffPackRow[5] = cols;
		return buffPackRow.toString();
	}
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++
	function getRowA(provider, type, title, cols, code) {
		buffPackRowA[1] = provider; buffPackRowA[3] = type;
		buffPackRowA[5] = code; buffPackRowA[7] = title;
		buffPackRowA[9] = cols;
		return buffPackRowA.toString();
	}
	function getCol(provider, type, code, price) {
		buffPackCol[1] = provider; buffPackCol[3] = type;
		buffPackCol[5] = code; buffPackCol[7] = code;
		buffPackCol[9] = price;
		return buffPackCol.toString();
	}
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++
	function getColA(price) {
		buffPackColA[1] = price;
		return buffPackColA.toString();
	}
	//
	function inPromo(code) { return ('|' + promoPacks + '|').indexOf('|' + code + '|') != -1 }
	function getPack(name) { return this.packs[name]; }
	if (doc /*&& typeof(doc.load)*/) {
		var prd = doc.getElementsByTagName("Product")[0];
		refProduct.id = prdID;
		refProduct.price = prdPrice;
		refProduct.img = prdImg;
		refProduct.title = prdTitle; delete prdID; delete prdPrice; delete prdImg;
		var providers = doc.getElementsByTagName("Provider"), txtName = '', provider, pack, packName, payMethod, way, type, code, price;
		var objConn, connections, connection, conntype, promoType;
		for (var p = 0; p < providers.length; p++) {
			provider = providers[p];
			txtName = provider.getAttribute('name');
			SPs[txtName] = {};
			connections = provider.getElementsByTagName("ConnectionType");
			for (var c = 0; c < connections.length; c++) {
				connection = connections[c];
				conntype = connection.getAttribute('name');
				SPs[txtName][conntype] = { packs: [], logoH: txtName.toLowerCase() + '.gif', codes: {}, item: getPack };
				objConn = SPs[txtName][conntype];
				pack = connections[c].getElementsByTagName('PackageDescr');

				for (var e = 0; e < pack.length; e++) {
					promoType = '';
					packName = pack[e].getAttribute('name');
					objConn.packs.push({ name: packName, index: e });
					objConn.packs[packName] = objConn.packs[e];
					payMethod = pack[e].getElementsByTagName('WayOfPayment');
					for (var m = 0; m < payMethod.length; m++) {
						way = payMethod[m];
						type = way.getAttribute('type');
						code = way.getAttribute('Package');
						price = way.getAttribute('PackagePrice');
						objConn.packs[e][type] = { parent: objConn.packs[e], type: type, package: code, price: price };
						objConn.codes[code] = objConn.packs[e][type];
						buffPackCols.push(getCol(txtName, conntype, code, price));
						if (inPromo(code)) { buffPackColsA.push(getColA(price)); promoType = type; }
					}
					buffPackRows.push(getRow(packName, buffPackCols.toString()));
					if (buffPackColsA.length) { buffPackRowsA.push(getRowA(txtName, conntype, packName.replace(noPrefix[p], ''), buffPackColsA.toString(), objConn.packs[e][promoType].package)); }
					buffPackCols.length = 0; buffPackColsA.length = 0;
				}
				buffOut.push(getProvider(txtName, conntype, buffPackRows.toString()));
				buffOutA.push(getProviderA(txtName, conntype, buffPackRowsA.toString()));
				buffPackRows.length = 0; buffPackRowsA.length = 0;
			}
		}
		SPList.innerHTML = '<div id="SP_toolbar" class="toolbar"><a href="" onClick="$$(\'SPArea\').onclick();return false;">'+ vvClose +' X</a></div>';
		SPList.innerHTML += buffOut.toString();
		monitor.innerHTML = buffOutA.toString();
		SPList.innerHTML += '<div id="prgDetails" class="prgDetails"></div>';
		SPList.innerHTML += '<div id="prdPreview" class="prdPreview"><div class="prdTitle">' + refProduct.title + '</div><img src="' + refProduct.img + '" /><div class="prdPriceTxt">' + prdPriceTxt + '<span class="prdPrice">' + refProduct.price + '</span></div></div>';
		detContainer = $$('prgDetails');
	}
	function hideMe() { this.style.display = 'none'; }
	SPList.ondblclick = hideMe;
}
// ============================================================
function showSP(provStr, type) {
	var newSP = $$(provStr + '_' + type);
	if (newSP) {
		$$('SPArea').style.display = 'block';
		if (actSP) { actSP.style.display = 'none'; }
		newSP.style.display = 'block';
		actSP = newSP;
	}
}
// ============================================================
function selectPack(img, req, group, type, code) {
	var states = selectImage, newState, quant, mustUpdate = false, replaceOld;
	newState = getImgNextState(img, states);
	if (req == 0) {
		var itemChecked = actPack.pack;
		if (itemChecked) {
			var imgActive = actPack.img;
			imgActive.src = states[0];
		}
		img.src = states[newState];
		mustUpdate = true, replaceOld = true, quant = 1;
	}
	else if (req == 1) {
		img.src = states[newState];
		mustUpdate = true, replaceOld = false;
	}

	if (mustUpdate) {
		actPack.pack = SPs[group][type].codes[code].parent;
		actPack.img = img;
		actPack.provider = group;
		actPack.conn = type;
		actPack.type = SPs[group][type].codes[code].type;
	}

}
// ============================================================
function showPrg(docLoc) {
	//do the ajax request only if package exist on configuration file, to avoid 404 errors
	var mobpackcodearray = docLoc.split("/");
	var mobpackcode = mobpackcodearray[mobpackcodearray.length - 1];
	docLoc = (progDetPath + docLoc + '.' + progDetExt);
	
	if (typeof (docLoc) == 'string') {
		$.ajax({
			type: "GET",
			url: encodeURI(docLoc),
			cache: false,
			contentType: "application/json; charset=utf-8",
			success: function(msg) { detContainer.innerHTML = unescape(msg) },
			Error: detContainer.innerHTML = progDetDefaultContent
		});

	}
	else {
		detContainer.innerHTML = '';
	}
}
// ============================================================
function connect() {
	if (actPack.pack) {
		var URL = reqUrl + '?';
		URL += reqQParams[0] + '=' + actPack.provider + '&';
		URL += reqQParams[1] + '=' + actPack.conn + '&';
		URL += reqQParams[2] + '=' + actPack.type + '&';
		URL += reqQParams[3] + '=' + refProduct.id + '&';
		URL += reqQParams[4] + '=' + actPack.pack.name + '&';
		URL += reqQParams[5] + '=' + actPack.pack[actPack.type].price;
		document.location.href = URL;
	}
}
// ============================================================
monitor = $$('SPsArea');
createSPs(strXML(inXML));
