function _callbacks() {
	var self = this;
	var _int = Number(0);
	var _calls = new Object();
	var __generateId = function() {
		_int++;
		return _int;
	}
	var __freeMem = function() {
		var t = self.unixtime();
		for (var i in _calls) {
			if (_calls[i]['unixtime'] && _calls[i]['timeout'] && (t - _calls[i]['unixtime']) > _calls[i]['timeout']) {
				delete _calls[i];
				break;
			}
		}
		setTimeout(function() { if (typeof(__freeMem) == 'function') { __freeMem(); }; },1000);
	}
	this.unixtime = function() { return Math.round(new Date().getTime()/1000); }
	this.register = function(func,timeout) {
		if (!timeout) { var timeout = 0; }
		if (typeof(func) == 'function') {
			var id = __generateId();
			_calls[id] = {
				'function': func,
				'unixtime': self.unixtime(),
				'timeout': timeout
			};
			return id;
		}
		return false;
	}
	this.drop = function(id) {
		if (id && _calls[id]) {
			delete _calls[id];
			return true;
		}
		return false;
	}
	this.evaluate = function(id,params) {
		if (id && _calls[id] && _calls[id]['function']) {
			_calls[id]['function'](params);
			delete _calls[id];
			return true;
		}
		return false;
	}
	setTimeout(function() { if (typeof(__freeMem) == 'function') { __freeMem(); }; },1000);
}
function _httpRequests() {
	var self = this;
	var callbacks = new _callbacks;
	var _connections = new Object();
	var __checkUrl = function(url) {
		if (!url) { return ''; }
		if (url.substr(0,4) != 'http') {
			if (url.substr(0,1) != '/') { url = '/'+url; }
			if (window.location.href.indexOf('https') != -1) { url = 'https://'+document.domain+url; }
			else { url = 'http://'+document.domain+url; }
		}
		return url;
	}
	var __create = function(mime) {
		var mime = (!mime)?'text/javascript':mime;
		var http_request=false;
		if (window.XMLHttpRequest) {
			http_request = new XMLHttpRequest();
			if (http_request.overrideMimeType) { http_request.overrideMimeType(mime); }
		}
		else if (window.ActiveXObject) {
			try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); }
			catch (e) {
				try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); }
				catch (e) { return false; }
			}
		}
		return http_request;
	}
	var __readData = function(httpReq) {
		if (httpReq.readyState == 4) {
			try { return [httpReq.status, httpReq.responseText]; }
			catch(e) { return [httpReq.status, e]; }
		}
		else { return undefined; }
	}
	var __proceedData = function(call_id) {
		if (_connections[call_id]) {
			var rData = __readData(_connections[call_id]);
			if (typeof(rData) == 'object') {
				delete _connections[call_id];
				callbacks.evaluate(call_id, {'call_id': call_id, 'status': rData[0], 'data': rData[1]});
				return true;
			}
		}
		else { return false; }
	}
	this.makeRequest = function(url, data, method, async, proto, callback) {
		if (typeof(url) != 'string') { return false; }
		if (typeof(callback) != 'function' && async) { return false; }
		if (typeof(data) != 'string') { var data = ''; }
		if (typeof(method) != 'string') { var method = 'GET'; }
		if (typeof(proto) != 'string') { var proto = 'text/javascript'; }
		url = __checkUrl(url);
		var httpReq = __create(proto);
		if (httpReq) {
			if (async) {
				call_id = callbacks.register(callback);
				_connections[call_id] = httpReq;
				httpReq.onreadystatechange = function() { __proceedData(call_id); }
			}
			httpReq.open(method, url, async);
			if (method=='POST') { httpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); }
			httpReq.send(data);
			if (!async) {
				var rData = __readData(httpReq);
				if (typeof(rData) == 'object') { return {'call_id': null, 'status': rData[0], 'data': rData[1]}; }
			}
			else { return call_id; }
		}
		else {
			if (!async) {
				return { 'call_id': false, 'status': 0, 'data': '' };
			}
			else { return false; }
		}
	}
	this.abort = function(call_id) {
		if (_connections[call_id]) {
			try {
				_connections[call_id].abort();
				delete _connections[call_id];
				return true;
			}
			catch(e) { return false; }
		}
		else { return false; }
	}
}
var httpReq = new _httpRequests
function _shoppingCart() {
	var self = this;
	var _scart = new Object();
	var _translates = {};
	this.appendTranslate = function(k, t) {
		_translates[k] = t;
	}
	this.append = function(i, a, n, s, p) {
		_scart[i] = { 'articule_id':a, 'name':n, 'size':s, 'price': p };
	}
	this.buy = function(articule_id, n, s, p) {
		httpReq.makeRequest('index/cart/append.php?articule_id='+articule_id+'&name='+self.urlencode(n)+'&size='+s+'&price='+p,'','GET',true,'text/plain',function(d) { __receiveBuy(articule_id, n, s, p, d); });
	}
	var __receiveBuy = function(a, n, s, p, d) {
		if (d['data']) {
			if (d['data'] != 'ERROR') {
				self.append(d['data'], a, n, s, p);
				self.update();
			}
		}
	}
	this.remove = function(i) {
		httpReq.makeRequest('index/cart/remove.php?id='+i,'','GET',true,'text/plain',function(d) { __receiveRemove(i, d); });
	}
	var __receiveRemove = function(i, d) {
		if (d['data']) {
			if (d['data'] != 'ERROR') {
				delete _scart[i];
				self.update();
			}
		}
	}
	this.update = function() {
		document.getElementById('basket').innerHTML = '';
		var len = 0;
		for (var i in _scart) { len++; }
		var elm = document.createElement('H5');
		elm.appendChild(document.createTextNode(_translates['inmybasket']+': ('+len+')'));
		document.getElementById('basket').appendChild(elm);
		var t = document.createElement('TABLE');
		for (var i in _scart) {
			var r = t.insertRow(0);
			var d = r.insertCell(0);
			var rem = document.createElement('IMG');
			rem.setAttribute('scart_id',i);
			rem.onclick = function() { self.remove(this.getAttribute('scart_id')); }
			rem.src = 'index/img/item-remove.png';
			d.setAttribute('width','20px');
			d.appendChild(rem);
			var dN = r.insertCell(1);
			dN.appendChild(document.createTextNode(_scart[i]['name']));
			var dN = r.insertCell(2);
			dN.setAttribute('width','80px');
			dN.appendChild(document.createTextNode(_scart[i]['price']));
		}
		if (len) {
			var p = 0;
			for (var i in _scart) {
				if (_scart[i]['price']) { p += Number(_scart[i]['price']); }
			}
			var r = t.insertRow(t.rows.length);
			var d = r.insertCell(0);
			var d = r.insertCell(1);
			d.appendChild(document.createTextNode(_translates['total']+':'));
			var d = r.insertCell(2);
			d.appendChild(document.createTextNode(p));

			var r = t.insertRow(t.rows.length);
			var d = r.insertCell(0);
			var d = r.insertCell(1);
			var b = document.createElement('BUTTON');
			b.onclick = function() { window.location.href = 'index.php?page=payment'; }
			b.appendChild(document.createTextNode('Buy articules'));
			d.appendChild(b);
			var d = r.insertCell(2);
			t.className = 'basket-items';
			document.getElementById('basket').appendChild(t);
		}
	}
	this.urldecode = function(str) {
		str = (typeof(str) == 'undefined')?'':str;
		str = str.replace(/\+/g, '%20');
		str = decodeURIComponent(str);
		return str.toString();
	}
	this.urlencode = function(str) {
		str = (typeof(str) == 'undefined')?'':str;
		str = str.toString();
		str = encodeURIComponent(str);
		str = str.replace(/%20/g, '+');
		return str;
	}
}
var cart = new _shoppingCart();

