var InfoxCtx14103 = {
	loaded: false,
	tID: null,
	toElem: null,
	checkScroll: true,
	renderCallback: null,
	horizontalScroll: false,
	verticalScroll: 0,
	refreshBlock: false,
	zeroPixel: null,
	trackIds: null,
	newTrackIds: null,
	nItems: 0,
	stopTrack: false,
	
	ie10Arr:  null/*IE10ARR*/,   // don't change no one symbol !!!

	sendRequest : function(url, callback) {
		var xmlhttp;
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (E) {
				xmlhttp = false;
			}
		}
		if (!xmlhttp) {
			var XHR = window.XDomainRequest || window.XMLHttpRequest;
			xmlhttp = new XHR();
		}
		if ("withCredentials" in xmlhttp) {
			xmlhttp.withCredentials = true;
		}
		if (/iPad|iPhone|iPod/.test(navigator.platform)) {
			var myStorage = window.localStorage;
			var uuid = myStorage.getItem('_AUID_');
			if  (!uuid) {
				uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
				    var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
				    return v.toString(16);
				});
				myStorage.setItem('_AUID_', uuid);
			}
			if (url.indexOf('?') < 0) {
				url += '?';
			} else {
				url += '&';
			}
			url += '_AUID_=' + uuid;
		}
		xmlhttp.open('GET', url, true);
		xmlhttp.onreadystatechange = function() {
			if (xmlhttp.readyState == 4) {
				callback(xmlhttp);
			}
		};
		xmlhttp.send();
	},

	loadJS : function(url, handler, location) {
	    var scriptTag = document.createElement('script');
	    scriptTag.src = url;
	
	    scriptTag.onload = handler;
	    scriptTag.onerror = handler;
	
	    location.appendChild(scriptTag);
	},
	checkABlock: function(handler) {
		if (window.rbInfoxAdBlock == false) {
			handler(false);
		} else {
			this.loadJS('https://rb.infox.sg/js/ads.js', function() {
				handler(window.rbInfoxAdBlock != false);
			}, document.body); 
		}
	},
	loadNow: function() {
		if (this.loaded)
			return false;
		
		this.loaded = true;
    	window.removeEventListener("scroll", this);
    	
    	if (this.ie10Arr != null) {
    		this.writeItems(this.ie10Arr);
    	} else {
    		var self = this;
	    	self.checkABlock(function(adblock) {
	    		if (window['infoxContextAsyncIdx']===undefined) {
	    			window['infoxContextAsyncIdx'] = 0;
	    		}
	    		var asyncIdx = window['infoxContextAsyncIdx'];
	    		window['infoxContextAsyncIdx'] += 10;
	 			self.sendRequest('https://rb.infox.sg/json?id=14103&adblock=' + adblock + "&o=" + asyncIdx, function(req) {
					var myArr = JSON.parse(req.responseText);
					self.writeItems(myArr);
	 			});
			});
    	}
		return true;
	},
	
	writeItems: function(arr) {
		if (arr.length > 0) {
			var self = this;
			if (arr.length == 1 && arr[0].code != null) {
				this.toElem.innerHTML = arr[0].code;
				
				var arr = this.toElem.getElementsByTagName('script');
				for (var n = 0; n < arr.length; n++)
				    eval(arr[n].innerHTML);
			} else {
				var html = "<style type='text/css'>    @font-face {        font-family: 'Roboto';        font-style: normal;        font-weight: 400;        src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v15/mUdRVCMHGKUBOACHGTH1g-vvDin1pK8aKteLpeZ5c0A.woff) format('woff');    }        .adf_sg_vstv {            position: relative;            width: 100%;            margin: 0 auto;            padding-top: 5px;            min-width: 255px;        }        .adf_sg_vstv a img {            border: none;        }        .adf_sg_vstv .asg2_row div {            float: left;            position: relative;            width: 100%;        }        .adf_sg_vstv .asg2_row {            overflow: hidden;            position: relative;                margin: 0 0 7px 0;        }        .adf_sg_vstv .asg2_l {                display: block;        position: relative;        }        .adf_sg_vstv .asg2_row a:first-child {            display: block;            overflow: hidden;            position: relative;            width: 150px;            height: 100px;            float: left;            margin-right: 5px;        }        .adf_sg_vstv .asg2_row img {            border: 1px solid #ccc;            width: 100%;            height: auto;            /*max-width: 102px;            max-height: 102px;*/            box-sizing: border-box;        }        .adf_sg_vstv .asg2_row a[title] {            position: relative;            display: block;            font-weight: normal;        font-size: 15px;    min-height:100px;        line-height: 18px;        font-style: normal;        text-decoration: none;        color: #000000;        font-family: Roboto;        }        .adf_sg_vstv .asg2_row a[title]:hover {            color: #7f7f7f;        }    </style>    <div class='adf_sg_vstv'>        <div class='adf_sg_vstv_inner'>    ";
				if (this.horizontalScroll) {
					html += "<style>#rb14103scc{overflow-x: scroll;overflow-y:hidden;width: auto;white-space:nowrap;}#rb14103scc>*{display: inline-block;white-space:normal;}</style><div id='rb14103scc'>";
				}
				for (var i = 0; i < arr.length; i++) {
					var item = arr[i];
					html += this.buildItem(item, i);
					this.nItems++;
				}
				if (this.horizontalScroll) {
					html += "</div>";
				}
				html += "        </div>    </div>";
				html += "";
				this.toElem.innerHTML = html;
				if (this.horizontalScroll) {
					var scont = document.getElementById("rb14103scc");
					this.trackIds = [];
					var checkItems = function() {
						var from = scont.scrollLeft;
						var to = scont.clientWidth + from;
						var childs = scont.childNodes;
						var x = 0;
						self.newTrackIds = [];
						for (var i in childs) {
							var child = childs[i];
							if (typeof child.hasAttribute === 'function' && child.hasAttribute("rbid")) {
								var x2 = x + child.offsetWidth;
								if ((from <= x && to >= x) || (from <= x2 && to >= x2)) {
									var id = child.getAttribute("rbid");
									if (self.trackIds.indexOf(id) < 0) {
										self.trackIds.push(id);
										self.newTrackIds.push(id);
									}
								}
								x = x2;
							}							
						}
						return self.newTrackIds.length > 0;
					}
					scont.addEventListener("scroll", function(evt) {
						if (checkItems()) {
							self.trackOnScroll();
						}
					}); 
					checkItems();
				}
				if (this.ie10Arr == null) {
					this.toElem.addEventListener("click", function(e) {
						var element = self.findItem(e.target);
						if (!element) return;
						self.refreshElements(element.parentNode, new Array(element));
					});
					if (this.refreshBlock) {
						var onchange = function() {
							if (document.visibilityState != "hidden") {
								var container = self.findContainer(self.toElem);
								self.refreshElements(container, container.childNodes);
							}
						};
						var hidden = "hidden";
						// Standards:
						if (hidden in document)
						    document.addEventListener("visibilitychange", onchange);
						else if ((hidden = "mozHidden") in document)
						    document.addEventListener("mozvisibilitychange", onchange);
						else if ((hidden = "webkitHidden") in document)
						    document.addEventListener("webkitvisibilitychange", onchange);
						else if ((hidden = "msHidden") in document)
						    document.addEventListener("msvisibilitychange", onchange);
						// IE 9 and lower:
						else if ("onfocusin" in document)
						    document.onfocusin = document.onfocusout = onchange;
						// All others:
						else
						    window.onpageshow = window.onpagehide = window.onfocus = window.onblur = onchange;
					}
				}
			}
			if (this.checkScroll) {
				window.addEventListener("scroll", this); 
			}
			if (this.zeroPixel) {
				var img = document.createElement("img");
				img.setAttribute("src", this.zeroPixel);
				img.setAttribute("width", "1");
				img.setAttribute("height", "1");
				img.setAttribute("style", "display: none");
				document.getElementsByTagName('body')[0].appendChild(img);
			}
			this.trackOnScroll();
			if (self.renderCallback) self.renderCallback(); 
		}
	},
	
	refreshElements: function(parent, elements) {
		var self = this;
		var ids = "";
		var childs = parent.childNodes;
		for (var i in childs) {
			var child = childs[i];
			if (typeof child.hasAttribute === 'function' && child.hasAttribute("rbid")) {
				if (ids.length>0) ids += ",";
				ids += child.getAttribute("rbid");
			}
		}
		self.sendRequest('https://rb.infox.sg/json?id=14103&n=' + elements.length + '&exclude=' + ids, function(req) {
			var myArr = JSON.parse(req.responseText);
			var ei = 0
			for (var i in myArr) {
				var element = null;
				while (ei < elements.length) {
					element = elements[ei++];
					if (typeof element.hasAttribute === 'function' && element.hasAttribute("rbid")) {
						break;
					}
				}
				var item = self.buildItem(myArr[i], element ? element.getAttribute("rbpos") : "0");
				if (element) {
					element.insertAdjacentHTML('afterend', item);
					element.parentNode.removeChild(element);
				} else {
					parent.append(item);
				}
			}
			if (myArr.length > 0) {
				self.trackOnScroll();
				if (self.renderCallback) self.renderCallback(); 
			}
		});
	},
	
	buildItem: function(item, i) {
		var str = "<div class='asg2_row'>    <a href='{url}' target='_blank'>    <img src='{img}'>    </a>    <a href='{url}' title='' target='_blank'>    {title}    </a>    </div>";
		str = str.replace(/\{url\}/g, item.url)
				.replace(/\{img\}/g, item.img)
				.replace(/\{width\}/g, item.width)
				.replace(/\{height\}/g, item.height)
				.replace(/\{title\}/g, item.title)
				.replace(/\{category\}/g, item.category)
				.replace(/\{body\}/g, item.body || '')
				.replace(/\{source\}/g, item.source || '')
				.replace(/\{bg_rgb\}/g, item.bg_rgb || '')
				.replace(/\{bg_hex\}/g, item.bg_hex || '')
				.replace(/\{text_color\}/g, item.text_color || '')
				.replace(/\{n\}/g, i);
		str = this.fixLinkTarget(item.linkTarget, str);
		var idx = str.indexOf('>');
		if (idx > 0) {
			str = str.substr(0, idx) + " rbn='" + i + "'" + " rbid='" + item.id + "'" + str.substr(idx);
		}
		return str;
	},
	
	findItem: function(elem) {
		if (elem.hasAttribute("rbid")) {
			return elem;
		}
		if (elem.parentNode) {
			return this.findItem(elem.parentNode);
		}
		return null;
	},

	findContainer: function(element) {
		var childs = element.childNodes;
		for (var i in childs) {
			var child = childs[i];
			if (typeof child.hasAttribute === 'function' && child.hasAttribute("rbid")) {
				return element;
			}
			var container = this.findContainer(child);
			if (container) {
				return container;
			}
		}
		return null;
	},

	fixLinkTarget: function(linkTarget, str) {
		if (linkTarget != 'byDefault') {
			str = str.replace(/target=["'][^'"]*["']/g, '');

			if (linkTarget == 'blank')
				str = str.replace(/href=/g, ' target="_blank" href=');
		}
		return str;
	},
	
	shuffle : function(array) {
		var currentIndex = array.length, temporaryValue, randomIndex;

		// While there remain elements to shuffle...
		while (0 !== currentIndex) {

			// Pick a remaining element...
			randomIndex = Math.floor(Math.random() * currentIndex);
			currentIndex -= 1;

			// And swap it with the current element.
			temporaryValue = array[currentIndex];
			array[currentIndex] = array[randomIndex];
			array[randomIndex] = temporaryValue;
		}

		return array;
	},

	positions: function() {
    	var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
		var scrollHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
	    var box = this.toElem.getBoundingClientRect();
	    var clientTop = this.toElem.clientTop || 0;
	    var top  = box.top +  scrollTop - clientTop;
	    var h = this.toElem.offsetHeight;
	    
	    return {
	    	isLoadPosition: function() { return scrollTop + scrollHeight > top; },
	    	isTrackPosition: function() {return scrollTop + scrollHeight > top + h / 2 && top + h > scrollTop; }
	    }
	},
	
    loadOnScroll : function() {
    	if (this.loaded)
    		return true;
    	
    	var pos = this.positions();
		if (pos.isLoadPosition()) {
			this.loadNow();
			return true;
		}
		return false;
	},
	
	trackOnScroll: function() {
		var pos = this.positions();
		if (pos.isTrackPosition() || !this.checkScroll) {
			var self = this;
			if (!this.stopTrack && ! this.tId) {
				this.tId = setTimeout(function() {
					if (self) {
						if (self.loaded) {
							window.removeEventListener("scroll", self); 
						}
						self.stopTrack = true;
						self.sendRequest('https://rb.infox.sg/track' + (self.newTrackIds !== null && self.newTrackIds.length > 0 ? "?ids=" + self.newTrackIds.toString() : ""), function(req) {
							self.stopTrack = false;
						});
						if (self.newTrackIds) {
							self.newTrackIds = [];
						}
					}
				}, 1000);
			}
			if (this.loaded && this.verticalScroll > this.nItems) {
	    		var div = document.createElement('div');
	    		this.toElem.append(div);
	    		this.loaded = false;
	    		this.init(div);
			}
		} 
		else if (this.tId) {
			clearTimeout(this.tId);
			this.tId = null;
		}
		return;
	},

	handleEvent: function (event) { 
		if (this.loaded) {
			this.trackOnScroll();
		} else {
			this.loadOnScroll();
		}
	},
	
	init: function(toElem) {
		this.toElem = toElem;
		if (this.checkScroll) {
			if (!this.loadOnScroll()) {
				window.addEventListener("scroll", this);
			}
		}
		else
	    	this.loadNow();
	}
}
var INFOX14103 = {
	
	renderTo : function(divId) {
		var toElem = document.getElementById(divId);
		if (! toElem ) 
			return;
		var ctx = Object.create(InfoxCtx14103);
		ctx.init(toElem);
	},
	
	init : function() {
		var blocks = window['infoxContextAsyncCallbacks14103'];
		if (blocks) {
			while (true) {
				var block = blocks.pop();
				if (block) {
					block();
				} else {
					break;
				}
			}
		}
	}
};
INFOX14103.init();