
(function(w,d){
	"use strict"
	if(w.UpAds){
		if ('undefined' != typeof console && 'function' == typeof console.log) {
			//throw Error('A duplicate Lead5 Ads script has been detected on the page! This can cause errors, and should be avoided.');
		}
		return;
	}
	/* add the config here */
	var UpConfig = {
		"adsUrl" : "//l5srv.net/AdServer/synSearch2.ads",
		"cssUrl" : "//l5srv.net/AdServer/sa.css",
		"defaultImage" : "//l5srv.net/AdServer/default_logo.png"
	};
	if (!Array.prototype.forEach) {
		Array.prototype.forEach = function(fun) {
			if (this === void 0 || this === null) {
				throw new TypeError();
			}
			var t = Object(this);
			var len = t.length >>> 0;
			if (typeof fun !== "function")
			throw new TypeError();
			var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
			for (var i = 0; i < len; i++) {
				if (i in t)
				fun.call(thisArg, t[i], i, t);
			}
		};
	}
	if (!Array.prototype.indexOf) {
		Array.prototype.indexOf = function(searchElement, fromIndex) {
			var i, pivot = (fromIndex) ? fromIndex : 0,
			length;
			if (!this) {
				throw new TypeError();
			}
			length = this.length;
			if (length === 0 || pivot >= length) {
				return -1;
			}
			if (pivot < 0) {
				pivot = length - Math.abs(pivot);
			}
			for (i = pivot; i < length; i++) {
				if (this[i] === searchElement) {
					return i;
				}
			}
			return -1;
		};
	}
	if( !Array.prototype.contains ){
		Array.prototype.contains = function(v) {
			for(var i = 0; i < this.length; i++) {
				if(this[i] === v) return true;
			}
			return false;
		};
	}
	if( !Array.prototype.unique ){
		Array.prototype.unique = function() {
			var arr = [];
			for(var i = 0; i < this.length; i++) {
				if(!arr.contains(this[i])) {
					arr.push(this[i]);
				}
			}
			return arr;
		};
	}
	if ('function' == typeof Node && !Node.prototype.contains) {
		Node.prototype.contains = function(otherNode) {
			var childNodeIndex, nodesToCheck = [],
			currentNode;

			function addChildNodesToQueue(node) {
				for (childNodeIndex = node.childNodes.length - 1; 0 <= childNodeIndex; --childNodeIndex) {
					nodesToCheck.push(node.childNodes[childNodeIndex]);
				}
			}
			addChildNodesToQueue(this);
			while (nodesToCheck.length) {
				currentNode = nodesToCheck.pop();
				if (currentNode === otherNode) {
					return true;
				} else {
					addChildNodesToQueue(currentNode);
				}
			}
			return false;
		};
	}
	if (!String.prototype.trim) {
		String.prototype.trim = function() { return this.replace(/^\s+|\s+$/gm, ''); }
	}

	var UpAds = (function(){
		var obj = {};
		var slotMgr, useKeywords = false, keywordHolder = [], loadStyles = false, showAds = true;
		var cName = 'l5srv_sid';
		var CID = '', SID = '', OID = '2869', job = '', location = '';
		var getCID = function(){ return CID; }
		var setCID = function(c){ CID = c; }
		obj.getCID = getCID;
		var getCname = function(){ return cName; }
		obj.getCname = getCname;
		var getJob = function(){ return job; }
		var setJob = function(j){ job = j; }
		obj.getJob = getJob;
		var getOID = function(){ return OID; }
		var getLocation = function(){ return location; }
		var setLocation = function(l){ location = l; }
		obj.getLocation = getLocation;
		var getSID = function(){ return SID; }
		var setSID = function(s){ SID = s; }
		obj.getSID = getSID;
		var getStyles = function(){ return loadStyles; }
		var setStyles = function(s){ loadStyles = s; }
		obj.getStyles = getStyles;
		var getUseKeywords = function(){ return useKeywords; }
		var setUseKeywords = function(s){ useKeywords = s; }
		var getKeywordHolder = function(){ return keywordHolder; }
		var setKeywordHolder = function(s){
			if( UpAds.util.isString(s) ){
				var holder = [];
				var classes = s.split("|");
				classes = classes.unique();
				for( var x = 0; x < classes.length; x++ ){
					var temp = UpAds.selector(classes[x]);
					if( temp && temp.length ){
						for( var y = 0; y < temp.length; y++ ){
							holder.push( temp[y] );
						}
					}
				}
				if( holder && holder.length ){
					keywordHolder = holder;
				} else {
					keywordHolder = [];
				}
			} else if( UpAds.util.isElement(s) ) {
				keywordHolder = s;
			} else {
				keywordHolder = [];
			}
		}
		var checkCIDs = function(){
			var adSlots = slotMgr.getSlots();
			var CIDs = [];
			for( var i = 0; i < adSlots.length ; i++ ){
				var slot = adSlots[i];
				var cid = slot.getEle().getAttribute('data-cid');
				if( CIDs.indexOf( cid ) == -1 ){
					CIDs.push(cid);
				}
			}
			if( CIDs.length == 1 && CIDs[0] != '' && CIDs[0] != 'null' && CIDs[0] != null ){
				setCID( CIDs[0] );
				showAds = true;
			} else {
				showAds = false;
			}
		}
		var loadJob = function( str ){
			var job = '';
			var c = str.split("|");
			for( var i = 0 ; i < c.length ; i++ ){
				var x = c[i];
				if( x.indexOf('#') == 0 || x.indexOf('.') == 0 ){
					var ele = UpAds.selector(x);
					if( ele && ele.length ){
						for( var j = 0 ; j < ele.length; j++ ){
							if( UpAds.util.isElement( ele[j] ) )
							job += UpAds.util.getText( ele[j] ).trim() + " ";
						}
					}
				} else {
					job = job +" "+ x;
				}
			}
			setJob( job );
		}
		var loadLocation = function(str){
			var location = '';
			var c = str.split("|");
			for( var i = 0 ; i < c.length ; i++ ){
				var x = c[i];
				if( x.indexOf('#') == 0 || x.indexOf('.') == 0 ){
					var ele = UpAds.selector(x);
					if( ele && ele.length ){
						for( var j = 0 ; j < ele.length; j++ ){
							if( UpAds.util.isElement( ele[j] ) )
							location += UpAds.util.getText( ele[j] ).trim() + " ";
						}
					}
				} else {
					location = location +" "+ x;
				}
			}
			setLocation( location );
		}
		var loadMetaData = function(){
			var useKeywords = false;
			var keywordHolder = [];
			var job = [], location = [];
			var adSlots = slotMgr.getSlots();
			if( adSlots && adSlots.length ){
				for( var i = 0; i < adSlots.length; i++ ){
					var el = adSlots[i].getEle();
					job.push(el.getAttribute('data-job'));
					location.push(el.getAttribute('data-location'));
					useKeywords = el.getAttribute('data-use-keywords') == "true" && useKeywords;
					keywordHolder.push(el.getAttribute('data-keyword-holder'));
				}
			}
			job = job.unique();
			location = location.unique();
			loadJob( job.join("|") );
			loadLocation( location.join("|") );
			setUseKeywords( useKeywords );
			setKeywordHolder( keywordHolder.join("|") );
		}
		var renderAds = function( data ){
			slotMgr.loadAds(data);
		}
		var loadJsonpAds = function( data ){
			slotMgr.loadAds(UpAds.util.JSON.parse(data));
		}
		var loadAds = function(){
			var requestObj = {};
			requestObj.url = window.location.protocol + UpConfig.adsUrl;
			requestObj.method = "GET";
			requestObj.json = true;
			var parser = UpAds.util.KeywordParser;
			parser.setEle( getKeywordHolder() );
			var adSlots = slotMgr.getSlots();
			var slotIds = [];
			if( adSlots.length )
			for( var i = 0; i < adSlots.length; i++ ){
				slotIds.push( adSlots[i].getSlotId() );
			}
			var host = w.location.origin || w.location.protocol + "//"+ w.location.hostname;
			requestObj.data = {
				CID : getCID(),
				SID : getSID(),
				OID : getOID(),
				u : slotIds,
				t : getJob(),
				l : getLocation(),
				cl : parser.getKeywords(),
				hs : host
			};
			var aj = obj.util.ajax.request(requestObj);
			aj.done( renderAds );
			aj = null;
			if( getStyles() ){
				var loadCss = obj.util.loadCss.request( requestObj );
			}
		}
		var setCookie = function(){
			var sesId = '7FD9EB8CD6634A1C8134D63721A110E2';
			var cm = obj.util.CookieManager
			cm.set(cName, sesId, 1);
		}
		obj.setCookie = setCookie;
		obj.init = function(){
			if(w.L5Ads){
				w.L5Ads = {};
			}
			setCookie();
			slotMgr = obj.AdSlotManager;
			slotMgr.init();
			setStyles( true );
			loadMetaData();
			checkCIDs();
			if( showAds ){ loadAds(); } else { slotMgr.collapseAllSlots(); }
		}
		obj.getUseKeywords = getUseKeywords;
		obj.setUseKeywords = setUseKeywords;
		obj.getKeywordHolder = getKeywordHolder;
		obj.setKeywordHolder = setKeywordHolder;
		obj.loadJsonpAds = loadJsonpAds;
		return obj;
	})();
	(function(base){
		var Util = function(){
			var util = {};
			util.isDefined = function(val) { return 'undefined' != typeof val; };
			util.isArray = function(val) { return util.isType('[object Array]', val); };
			util.isFunc = function(val) { return 'function' == typeof val; };
			util.isString = function(val) { return 'string' == typeof val; };
			util.isNum = function(val) { return 'number' == typeof val; };
			util.isBool = function(val) { return 'boolean' == typeof val; };
			util.isPrimitive = function(val) { return util.isString(val) || util.isNum(val) || util.isBool(val); };
			util.isObject = function(val) { return 'object' == typeof val && null !== val; };
			util.isNull = function(val) { return null === val; };
			util.isType = function(type, val) { return type == Object.prototype.toString.call(val); };
			util.inFrame = function() { return !(w.self === w.top); }
			util.getText = function(element) {
				if( element.tagName && ( element.tagName.toLowerCase() == 'textarea' || ( element.tagName.toLowerCase() == 'input' && element.type.toLowerCase() == 'text' ) ) ){
					return element.value;
				} else {
					return element.innerText || element.textContent;
				}
			}
			util.isNode = function(o){ return (
				typeof Node === "object" ? o instanceof Node :
				o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName==="string"
				);
			}
			util.isElement = function(o){ return (
				typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
				o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName==="string"
				);
			}
			util.inArray = function(value, obj) {
				if (Array.prototype.indexOf) {
					return -1 != obj.indexOf(value);
				} else {
					for (var index = obj.length - 1; 0 <= index; --index) {
						if (obj[index] == value) {
							return true;
						}
					}
					return false;
				}
			};
			util.inObject = function(key, obj) {
				for (i in obj) {
					if (key == obj[i]) {
						return true;
					}
				}
				return false;
			}
			util.isEmpty = function(val) {
				var undef, index, emptyVals = [undef, null, false, 0, ''];
				for (index = emptyVals.length - 1; index >= 0; --index) {
					if (emptyVals[index] === val) {
						return true;
					}
				}
				if (util.isObject(val)) {
					if (util.isArray(val) && 0 == val.length) {
						return true;
					}
					for (index in val) {
						return false;
					}
					return true;
				}
				return false;
			}
			util.nodeListToArray = (function() {
				var func = function(list) {
					return Array.prototype.slice.call(list);
				};
				try {
					Array.prototype.slice.call(d);
				} catch (e) {
					func = function(list) {
						var arr = [];
						for (var i = list.length; i--; arr.unshift(list[i]));
						return arr;
					};
				}
				return func;
			})();
			var loadJs;
			var loadCssFile;
			(function(){
				loadJs = function(url,id){
					var baseUrl = url.match(/^.+?(?=\?|$)/)[0],
                        extension = baseUrl ? baseUrl.substr(baseUrl.lastIndexOf('.')) : false,
                        allScripts, script;
                    if ('.js' != extension) {
                        throw new Error('Extension has to be of javascript file');
                    }
                    allScripts = document.getElementsByTagName('script');
                    for (var i = 0; i < allScripts.length ; i++ ) {
                        if (0 == allScripts[i].src.indexOf(baseUrl)) {
                            allScripts[i].parentNode.removeChild(allScripts[i]);
                            break;
                        }
                    }
                    script = document.createElement('scr' + 'ipt');
                    if (id) {
                        script.setAttribute('id', id);
                    }
                    script.setAttribute('type', 'text/javascript');
                    script.setAttribute('src', url);
                    document.body.appendChild(script);
				}
				loadCssFile = function(url,id){
					var baseUrl = url.match(/^.+?(?=\?|$)/)[0],
                        extension = baseUrl ? baseUrl.substr(baseUrl.lastIndexOf('.')) : false,
						allCss = [], css;
					if( '.css' != extension ){
						throw new Error('Extension has to be of stylesheet file');
					}
					var allStyles = document.getElementsByTagName("link");
					for( var i = 0; i < allStyles.length; i++ ){
						var cur = allStyles[i];
						if( ( cur.getAttribute('rel') && cur.getAttribute('rel').toLowerCase() == 'stylesheet' ) || ( cur.getAttribute('type') && cur.getAttribute('type').toLowerCase() == 'text/css' ) ){
							allCss.push( cur );
						}
					}
					for (var i = 0; i < allCss.length ; i++ ) {
                        if (0 == allCss[i].getAttribute('href').indexOf(baseUrl)) {
                            allCss[i].parentNode.removeChild(allCss[i]);
                            break;
                        }
                    }
					css = document.createElement('link');
					css.setAttribute("rel", "stylesheet")
                    css.setAttribute("type", "text/css")
                    css.setAttribute("href", url);
					if( id )
						css.setAttribute("id", id);
					document.getElementsByTagName('head')[0].appendChild( css );
				}
			})();
			var KeywordParser = function(){
				if( KeywordParser.inst ){ return KeywordParser.inst; }
				if( ! this instanceof KeywordParser ){ return new KeywordParser(); }
				var inst = this;
				var parser = {}, minLength = 2;
				parser.inst = inst;
				var ele = null;
				var getEle = function(){ return ele; }
				var setEle = function(s){ ele = s; }
				var getAllText = function(){
					var ele = getEle();
					var str = '';
					if( ele && ele.length ){
						for( var i = 0 ; i < ele.length; i++ ){
							if( UpAds.util.isElement( ele[i] ) )
							str += UpAds.util.getText( ele[i] ).trim() + " ";
						}
					}
					return str;
				}
				var getKeywordArray = function(){
					var strArr = getAllText().replace(/[^\w\s]/gi, ' ').split(' ');
					var finArr = [];
					var word = '';
					for( var i =0; i < strArr.length; i++ ){
						word = strArr[i];
						if( word.length > minLength ){
							finArr.push( word );
						}
					}
					return finArr;
				}
				var getKeywords = function(){
					if( !UpAds.getUseKeywords() ) return [];
					var keywords = getKeywordArray();
					return keywords.join(" ");
				}
				parser.getEle = getEle;
				parser.setEle = setEle;
				parser.getKeywords = getKeywords;
				return parser;
			}
			var CookieManager = function(){
				var cookieManager = {}, cookies = [];
				function set(name, value, days) {
					var expDate, expString, val, str;
					if (!days) {
						expString = '';
					} else {
						expDate = new Date();
						expDate.setTime(expDate.getTime() + (days * 60 * 60 * 1000));
						expString = '; expires=' + expDate.toGMTString();
					}
					val = escape(value);
					str = name + '=' + val + expString + ';';
					str += 'path=/';
					d.cookie = str;
					if (!util.inArray(name, cookies)) {
						cookies.push(name);
					}
				}
				function get(name) {
					var cName, cValue, cArray = d.cookie.split(';');
					for (var index = 0; index < cArray.length; ++index) {
						cName = cArray[index].substr(0, cArray[index].indexOf('=')).trim();
						cValue = cArray[index].substr(cArray[index].indexOf('=') + 1);
						if (cName == name) {
							return unescape(cValue);
						}
					}
				}
				function clear(name) {
					var cIndex = cookies.indexOf(name);
					set(name, '', -1);
					if (-1 != cIndex) {
						cookies.splice(cIndex, 1);
					}
				}

				function clearAll() {
					for (var i = 0; i < cookies.length ; i++ ) {
						clear(cookies[i]);
					}
				}
				cookieManager.get = get;
				cookieManager.set = set;
				cookieManager.clear = clear;
				cookieManager.clearAll = clearAll;
				return cookieManager;
			}
			util.KeywordParser = new KeywordParser();
			util.CookieManager = new CookieManager();
			util.loadJs = loadJs;
			util.loadCssFile = loadCssFile;
			return util;
		}
		base.util = new Util();
	})(UpAds);
	(function(base){
		var Selector = function( ele, root ){
			root = root || d.documentElement;
			var cleanName = function(str){
				if( str.indexOf('#') == 0 ){
					str = str.substr(1)
				}
				if( str.indexOf(".") == 0 ){
					str = str.substr(1)
				}
				return str;
			}
			var getEleById = function( str ){
				return document.getElementById( cleanName(str) );
			}
			var getEleByClass = function(str){
				if( root.getElementsByClassName ){
					return base.util.nodeListToArray( root.getElementsByClassName( cleanName(str) ) );
				} else {
					var eles = [];
					str = cleanName(str);
					var elems = root.getElementsByTagName('*'), i;
					for (i in elems) {
						if((' ' + elems[i].className + ' ').indexOf(' ' + str + ' ')
								> -1) {
							eles.push( elems[i] );
						}
					}
					return eles;
				}
			}
			function getElement(str){
				if( !str.trim() ){
					return [];
				}
				if( root.querySelectorAll ){
					return base.util.nodeListToArray( root.querySelectorAll( str ) );
				} else if( str.indexOf("#") == 0 ){
					return [getEleById(str)];
				} else if( str.indexOf(".") == 0 ){
					return getEleByClass( str );
				} else {
					return [];
				}
			}
			var getParent = function(ele){
				return ele.parentNode;
			}
			var getParents = function(name,ele){
				if( name && ele && base.util.isString(name) ){
					var x = ele;
					while( x ) {
						if( x.nodeName.toUpperCase() == name.toUpperCase() ){
							return x;
						}
						x = x.parentNode;
					}
				}
				return [];
			}
			if( typeof ele == "string" )
			return getElement(ele);
			else
			return [];
		}
		base.selector = Selector;
	})(UpAds);
	(function(base,util){
		var baseAjax;
		var BaseAjax = function(){
			this.name = "BaseAjax";
			this.READY_UNSENT = 0;
			this.READY_OPENED = 1;
			this.READY_HEADERS_RECEIVED = 2;
			this.READY_LOADING = 3;
			this.READY_DONE = 4;
			this.readyState = this.READY_UNSENT;
			this.xhr = {};
			this.host = {};
			this.failCallBack = function(){};
			this.doneCallback = function(){};
			this.alwaysCallback = function(){};
			var ops = {};
			this.getOps = function(){ return ops; }
			this.setOps = function(o){ ops = o; }
			this.getParams = function(data, url) {
				var arr = [], str;
				for(var name in data) {
					if( util.isArray( data[name] ) && data[name].length ){
						var x = data[name];
						for( var i = 0 ; i < x.length; i++ ){
							arr.push(name + "=" + encodeURIComponent(x[i]));
						}
					} else {
						arr.push(name + '=' + encodeURIComponent(data[name]));
					}
				}
				str = arr.join('&');
				if(str != '') {
					return url ? (url.indexOf('?') < 0 ? '?' + str : '&' + str) : str;
				}
				return '';
			}
			this.reqError = function(exception,url,data,callback){
				data = data || {};
				data.exception = exception || 'Ajax exception';
				data.errorUrl = url || w.location;
				this.failCallback && this.failCallback.apply(this.host, [this.xhr]);
				//util.doErrorCall( data,callback );
			}
			this._doRequest = function(){
				var self = this;
				try {
					setTimeout(function() {
						ops.method == 'get' ? self.xhr.send() : self.xhr.send(self.getParams(ops.data));
					}, 3);
				} catch (e){
					throw new Error('Ajax is having problems with ' + this.constructor.name );
				}
			}
			this.makeRequest = function(){
				try {
					this._doRequest();
				} catch ( e ){
					this.reqError( e,url,data,callback);
				}
			}
			this.setCredentials = function(){
				if( "withCredentials" in this.xhr ){
					this.xhr.withCredentials = true;
				}
			}
			this.open = function(ops){
				this.setOps(ops);
				if(ops.headers && typeof ops.headers == 'object') {
					this.setHeaders(ops.headers);
				}
				try {
					if(this.getOps().method == 'get' || this.name == 'XDomainRequest') {
						this.xhr.open("GET", this.getOps().url + this.getParams(this.getOps().data, this.getOps().url), true);
					} else {
						this.xhr.open(this.getOps().method.toUpperCase(), this.getOps().url, true);
					}
				} catch ( e ) {

				}
				this.setCredentials();
			}
			this.setHeaders = function(headers) {
				for(var name in headers) {
					this.xhr && this.name == 'XMLHttpRequest' && this.xhr.setRequestHeader(name, headers[name]);
				}
			}
		}
		var baseAjax = new BaseAjax();
		var XMLHttp = function(){
			if (!w.XMLHttpRequest) {
				throw new Error('XMLHttpRequest is not supported');
			}
			var reqObj = {};
			reqObj = new XMLHttpRequest() || new ActiveXObject('MSXML2.XMLHTTP.3.0');
			this.name = w.XMLHttpRequest ? 'XMLHttpRequest' : 'ActiveXObject';
			var self = this;
			reqObj.onreadystatechange = function() {
				if(self.xhr.readyState == self.READY_DONE && self.xhr.status == 200) {
					var result = self.xhr.responseText;
					if(self.getOps().json === true ) {
						result = base.util.JSON.parse(result);
					}
					self.doneCallback && self.doneCallback.apply(self.host, [result, self.xhr]);
				} else if(self.xhr.readyState == 4) {
					self.onerror;
				}
				self.alwaysCallback && self.alwaysCallback.apply(self.host, [self.xhr]);
			}
			this.xhr = reqObj;
		}
		XMLHttp.prototype = baseAjax;
		var XDomain = function(){
			if (!w.XDomainRequest) {
				throw new Error('XDomainRequest is not supported');
			}
			var reqObj = {};
			reqObj = new XDomainRequest();
			this.name = 'XDomainRequest';
			var self = this;
			reqObj.onprogress = reqObj.ontimeout = function(){};
			reqObj.onerror = this.reqError;
			reqObj.readyState = this.READY_DONE;
			reqObj.onload = function(){
				var result = self.xhr.responseText;
				if(self.getOps().json === true ) {
					result = base.util.JSON.parse(result);
				}
				self.doneCallback && self.doneCallback.apply(self.host, [result, self.xhr]);
				self.alwaysCallback && self.alwaysCallback.apply(self.host, [self.xhr]);
			}
			this.xhr = reqObj;
		}
		XDomain.prototype = baseAjax;
		var FallBackAjax = function(){
			var reqObj = {};
			this.name = 'JSONPRequest';
			var self = this;
			this.doneCallback = function(){};
			this.alwaysCallback = function(){};
			this.failCallback = function(){};
			this.open = function(ops){
				this.setOps(ops);
			}
			this.makeRequest = function(){
				var url = this.getOps().url;
				if( url.indexOf('.js') == -1 ){
					url = url+'.js';
				}
				var queryString = this.getParams( this.getOps().data , url );
				url = url + queryString;
				util.loadJs(url,'UpLoadAds');
			}
		}
		FallBackAjax.prototype = baseAjax;
		var CssLoad = function(){
			var reqObj = {};
			this.name = 'CSSRequest';
			var self = this;
			this.doneCallback = function(){};
			this.alwaysCallback = function(){};
			this.failCallback = function(){};
			this.open = function(ops){
				this.setOps(ops);
			}
			this.makeRequest = function(){
				var url = this.getOps().url;
				if( url.indexOf('.css') == -1 ){
					url = url+'.css';
				}
				var queryString = this.getParams( this.getOps().data , url );
				url = url + queryString;
				util.loadCssFile(url,'UpAdsStyle');
			}
		}
		CssLoad.prototype = baseAjax;
		var Ajax = {
			request : function(ops) {
				if( util.isString(ops) ) ops = { url: ops };
				ops.url = ops.url || '';
				var cm = util.CookieManager;
				var sesId = cm.get( base.getCname() );
				ops.method = ops.method.toLowerCase() || 'get'
				ops.data = ops.data || {};
				var api = {
					host: {},
					process: function(ops) {
						var reqObj = {};
						if( w.XDomainRequest ) {
							reqObj = new XDomain()
						} else if( (w.XMLHttpRequest || w.ActiveXObject) && ("withCredentials" in new w.XMLHttpRequest() ) ) {
							reqObj = new XMLHttp();
						} else {
							try {
								reqObj = new FallBackAjax();
							} catch ( e ){
								throw new Error("Ajax calls not supported by browser!");
							}
						}
						if( ! ("withCredentials" in reqObj) ){
							ops.url = ops.url + ';jsessionid='+sesId
						}
						reqObj.open(ops);
						reqObj.setHeaders({
							'Content-type': 'application/x-www-form-urlencoded'
							//"X-Requested-With" : "XMLHttpRequest"
						});
						this.requestObj = reqObj;
						reqObj.makeRequest();
						return this;
					},
					done: function(callback) {
						this.requestObj.doneCallback = callback;
						return this;
					},
					fail: function(callback) {
						this.requestObj.failCallback = callback;
						return this;
					},
					always: function(callback) {
						this.requestObj.alwaysCallback = callback;
						return this;
					}
				}
				return api.process(ops);
			}
		}
		var LoadCss = {
			request : function(ops){
				if( util.isString(ops) ) ops = { url: ops };
				ops.url = window.location.protocol + UpConfig.cssUrl;
				var api = {
					process : function( ops ){
						var reqObj = new CssLoad();
						reqObj.open(ops);
						this.requestObj = reqObj;
						reqObj.makeRequest();
						return this;
					}
				}
				return api.process(ops);
			}
		}
		var doApiCall = function(url,data,callback){
			var d = {};
			d.url = url;
			d.method = data.method ? data.method : 'post';
			d.data = data;
			var aj = Ajax.request( d );
			if( callBack && typeof calback == 'function' ){
				aj.done( callback );
			}
			aj.fail = function(xhr){
				throw Error("Api call was unsuccessful!");
			}
			aj = null;
		}
		var doErrorCall = function(data,callback){
			var url = 'ERROR_URL'; //////'http://www.lead5.net/lead_fusion/misc/occupationjson.jsp';///////
			data.method = 'get';
			doApiCall( url, data, callback );
		}

		var LogExceptions = function(error, method){
			try {
				var errorString;
				if(!base.getCID()) {
					return;
				}
				if (typeof error == "string") {
					errorString = error;
				} else {
					errorString = error.message;
					if (error.stack) {
						errorString += '>>' + error.stack;
					}
				}
				var errorReport = {
					'errorMessage': errorString,
					'CID': base.getCID(),
					'methodCalled': method
				};
				doErrorCall(errorReport);
			} catch (e) {}
		}
		var jSon = (function(){
			if( w.JSON ) return w.JSON;
			var JSON = {};
			if (typeof Date.prototype.toJSON !== 'function') {
				Date.prototype.toJSON = function (key) {
					return isFinite(this.valueOf())
					? this.getUTCFullYear()     + '-' +
					f(this.getUTCMonth() + 1) + '-' +
					f(this.getUTCDate())      + 'T' +
					f(this.getUTCHours())     + ':' +
					f(this.getUTCMinutes())   + ':' +
					f(this.getUTCSeconds())   + 'Z'
					: null;
				};
				String.prototype.toJSON =
				Number.prototype.toJSON  =
				Boolean.prototype.toJSON = function (key) {
					return this.valueOf();
				};
			}
			function f(n) { return n < 10 ? '0' + n : n; }
			var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
			escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
			gap, indent, meta = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' }, rep;
			function quote(string) {
				escapable.lastIndex = 0;
				return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
					var c = meta[a];
					return typeof c === 'string'
						? c
						: '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
				}) + '"' : '"' + string + '"';
			}
			function str(key, holder) {
				var i, k, v, length, mind = gap, partial, value = holder[key];
				if (value && typeof value === 'object' &&
					typeof value.toJSON === 'function') {
					value = value.toJSON(key);
				}
				if (typeof rep === 'function') {
					value = rep.call(holder, key, value);
				}
				switch (typeof value) {
					case 'string':
						return quote(value);
					case 'number':
						return isFinite(value) ? String(value) : 'null';
					case 'boolean':
					case 'null':
						return String(value);
					case 'object':
						if (!value) {
							return 'null';
						}
						gap += indent;
						partial = [];
						if (Object.prototype.toString.apply(value) === '[object Array]') {
							length = value.length;
							for (i = 0; i < length; i += 1) {
								partial[i] = str(i, value) || 'null';
							}
							v = partial.length === 0  ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']';
							gap = mind;
							return v;
						}
						if (rep && typeof rep === 'object') {
							length = rep.length;
							for (i = 0; i < length; i += 1) {
								if (typeof rep[i] === 'string') {
									k = rep[i];
									v = str(k, value);
									if (v) {
										partial.push(quote(k) + (gap ? ': ' : ':') + v);
									}
								}
							}
						} else {
							for (k in value) {
								if (Object.prototype.hasOwnProperty.call(value, k)) {
									v = str(k, value);
									if (v) {
										partial.push(quote(k) + (gap ? ': ' : ':') + v);
									}
								}
							}
						}
						v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}';
						gap = mind;
						return v;
					}
				}
			JSON.stringify = function (value, replacer, space) {
				var i, gap = '',indent = '';
				if (typeof space === 'number') {
					for (i = 0; i < space; i += 1) {
						indent += ' ';
					}
				} else if (typeof space === 'string') {
						indent = space;
				}
				rep = replacer;
				if (replacer && typeof replacer !== 'function' &&
					(typeof replacer !== 'object' ||
					typeof replacer.length !== 'number')) {
					throw new Error('JSON.stringify');
				}
					return str('', {'': value});
			};
			JSON.parse = function (text, reviver) {
				var j;
				function walk(holder, key) {
					var k, v, value = holder[key];
					if (value && typeof value === 'object') {
						for (k in value) {
							if (Object.prototype.hasOwnProperty.call(value, k)) {
								v = walk(value, k);
								if (v !== undefined) {
									value[k] = v;
								} else {
									delete value[k];
								}
							}
						}
					}
					return reviver.call(holder, key, value);
				}
				text = String(text);
				cx.lastIndex = 0;
				if (cx.test(text)) {
					text = text.replace(cx, function (a) {
						return '\\u' +
							('0000' + a.charCodeAt(0).toString(16)).slice(-4);
					});
				}
				if (/^[\],:{}\s]*$/
					.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
			.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
					.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
				j = eval('(' + text + ')');
				return typeof reviver === 'function'
					? walk({'': j}, '')
					: j;
				}
				throw new SyntaxError('JSON.parse');
			};
			return JSON;
		})();

		var getCurrentTime = function () {
			return (new Date()).getTime();
		}
		var getStyle = function(element, property) {
			if (w.getComputedStyle) {
				var style = w.getComputedStyle(element, null);
				if (style) {
					return style.getPropertyValue(property);
				} else {
					return null;
				}
			} else if (element.currentStyle) {
				property = property.replace(/\-(\w)/g, function(strMatch, p1) {
					return p1.toUpperCase();
				});
				return element.currentStyle[property];
			}
			return null;
		};
		function clone(obj) {
			if (util.isNull(obj) || !util.isObject(obj)) {
				return obj;
			}
			var temp = obj.constructor();
			for (var prop in obj) {
				if (obj.hasOwnProperty(prop)) {
					temp[prop] = clone(obj[prop]);
				}
			}
			return temp;
		}
		var LinkOutClick = function(event){
			var target = event.target ? event.target : event.srcElement;
			if( target.nodeName.toLowerCase() !== 'a' ){
				while( target.nodeName.toLowerCase() !== 'a' ){
					target = target.parentNode;
				}
			}
			var href = target.getAttribute('href');
			if( href.indexOf('TR=on') == -1 ) {
				href = href + '&TR=on';
			}
			target.setAttribute("href", href);
			try{ util.Events.fire(document,'UpwardAdClick'); } catch( e ){ }
		}
		util.LinkOutClick = LinkOutClick;
		util.ajax = Ajax;
		util.loadCss = LoadCss;
		util.doApiCall = doApiCall;
		util.doErrorCall = doErrorCall;
		util.LogExceptions = LogExceptions;
		util.JSON = jSon;
		util.getCurrentTime = getCurrentTime;
		util.getStyle = getStyle;
		util.clone = clone;
	})(UpAds,UpAds.util);
	(function(base,util){
		var Event = (function (name, context) {
			name = name || 'bean';
			context = context || this;
			var domLoaded = (function() {
				var flag = (document.readyState === 'complete');
				function onload() { flag = true; }
				if (! flag) {
					if (window.addEventListener) {
						window.addEventListener('DOMContentLoaded', onload, false);
					} else if (window.attachEvent) {
						window.attachEvent('onload', onload);
					}
				}
				return function() {
					return flag;
				};
			}());
			var win = window, old = context[name], namespaceRegex = /[^\.]*(?=\..*)\.|.*/, nameRegex = /\..*/,
			addEvent = 'addEventListener', removeEvent = 'removeEventListener', doc = document || {}, root = doc.documentElement || {},
			W3C_MODEL = root[addEvent], eventSupport = W3C_MODEL ? addEvent : 'attachEvent', ONE = {},
			slice = Array.prototype.slice, str2arr = function (s, d) { return s.split(d || ' ') },
			isString = function (o) { return typeof o == 'string' }, isFunction = function (o) { return typeof o == 'function' },
			standardNativeEvents = 'click dblclick mouseup mousedown contextmenu mousewheel mousemultiwheel DOMMouseScroll mouseover mouseout mousemove selectstart selectend keydown keypress keyup orientationchange focus blur change reset select submit load unload beforeunload resize move DOMContentLoaded readystatechange message error abort scroll ',
			w3cNativeEvents = 'show input invalid touchstart touchmove touchend touchcancel gesturestart gesturechange gestureend textinput readystatechange pageshow pagehide popstate hashchange offline online afterprint beforeprint dragstart dragenter dragover dragleave drag drop dragend loadstart progress suspend emptied stalled loadmetadata loadeddata canplay canplaythrough playing waiting seeking seeked ended durationchange timeupdate play pause ratechange volumechange cuechange checking noupdate downloading cached updateready obsolete ',
			nativeEvents = (function (hash, events, i) {
				for (i = 0; i < events.length; i++) events[i] && (hash[events[i]] = 1)
				return hash
			}({}, str2arr(standardNativeEvents + (W3C_MODEL ? w3cNativeEvents : '')))),
			customEvents = (function () {
				var isAncestor = 'compareDocumentPosition' in root
					? function (element, container) {
						return container.compareDocumentPosition && (container.compareDocumentPosition(element) & 16) === 16
					}
					: 'contains' in root
						? function (element, container) {
							container = container.nodeType === 9 || container === window ? root : container
							return container !== element && container.contains(element)
						}
						: function (element, container) {
							while (element = element.parentNode) if (element === container) return 1
							return 0
						},
				check = function (event) {
					var related = event.relatedTarget
						return !related
							? related == null
							: (related !== this && related.prefix !== 'xul' && !/document/.test(this.toString())
							&& !isAncestor(related, this))
						}
				return {
					mouseenter: { base: 'mouseover', condition: check }, mouseleave: { base: 'mouseout', condition: check } , mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' }
				}
			}()),
			Event = (function () {
				var commonProps  = str2arr('altKey attrChange attrName bubbles cancelable ctrlKey currentTarget detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey srcElement target timeStamp type view which propertyName'),
				mouseProps = commonProps.concat(str2arr('button buttons clientX clientY dataTransfer fromElement offsetX offsetY pageX pageY screenX screenY toElement')),
				mouseWheelProps = mouseProps.concat(str2arr('wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ axis')),
				keyProps = commonProps.concat(str2arr('char charCode key keyCode keyIdentifier keyLocation location')),
				textProps = commonProps.concat(str2arr('data')),
				touchProps = commonProps.concat(str2arr('touches targetTouches changedTouches scale rotation')),
				messageProps = commonProps.concat(str2arr('data origin source')),
				stateProps   = commonProps.concat(str2arr('state')),
				overOutRegex = /over|out/,
				typeFixers   = [{ reg: /key/i, fix: function (event, newEvent) { newEvent.keyCode = event.keyCode || event.which; return keyProps } },
								{ reg: /click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i , fix: function (event, newEvent, type) {
									newEvent.rightClick = event.which === 3 || event.button === 2;
									newEvent.pos = { x: 0, y: 0 };
									if (event.pageX || event.pageY) {
										newEvent.clientX = event.pageX;
										newEvent.clientY = event.pageY;
									} else if (event.clientX || event.clientY) {
										newEvent.clientX = event.clientX + doc.body.scrollLeft + root.scrollLeft;
										newEvent.clientY = event.clientY + doc.body.scrollTop + root.scrollTop;
									}
									if (overOutRegex.test(type)) {
										newEvent.relatedTarget = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'];
									}
									return mouseProps;
								} },
								{ reg: /mouse.*(wheel|scroll)/i , fix: function () { return mouseWheelProps } },
								{ reg: /^text/i, fix: function () { return textProps } },
								{ reg: /^touch|^gesture/i, fix: function () { return touchProps } },
								{ reg: /^message$/i, fix: function () { return messageProps } },
								{ reg: /^popstate$/i, fix: function () { return stateProps } },
								{ reg: /.*/, fix: function () { return commonProps } }],
				typeFixerMap = {} ,
				Event = function (event, element, isNative) {
					if (!arguments.length) return
					event = event || ((element.ownerDocument || element.document || element).parentWindow || win).event
					this.originalEvent = event
					this.isNative       = isNative
					this.isBean         = true
					if (!event) return
					var type   = event.type
						, target = event.target || event.srcElement
						, i, l, p, props, fixer
					this.target = target && target.nodeType === 3 ? target.parentNode : target
					if (isNative) { // we only need basic augmentation on custom events, the rest expensive & pointless
						fixer = typeFixerMap[type]
						if (!fixer) { // haven't encountered this event type before, map a fixer function for it
						for (i = 0, l = typeFixers.length; i < l; i++) {
							if (typeFixers[i].reg.test(type)) { // guaranteed to match at least one, last is .*
							typeFixerMap[type] = fixer = typeFixers[i].fix
							break
							}
						}
						}
						props = fixer(event, this, type)
						for (i = props.length; i--;) {
						if (!((p = props[i]) in this) && p in event) this[p] = event[p]
						}
					}
					}
				Event.prototype.preventDefault = function () {
				if (this.originalEvent.preventDefault) this.originalEvent.preventDefault()
				else this.originalEvent.returnValue = false
				}
				Event.prototype.stopPropagation = function () {
				if (this.originalEvent.stopPropagation) this.originalEvent.stopPropagation()
				else this.originalEvent.cancelBubble = true
				}
				Event.prototype.stop = function () {
				this.preventDefault()
				this.stopPropagation()
				this.stopped = true
				}
				Event.prototype.stopImmediatePropagation = function () {
				if (this.originalEvent.stopImmediatePropagation) this.originalEvent.stopImmediatePropagation()
				this.isImmediatePropagationStopped = function () { return true }
				}
				Event.prototype.isImmediatePropagationStopped = function () {
				return this.originalEvent.isImmediatePropagationStopped && this.originalEvent.isImmediatePropagationStopped()
				}
				Event.prototype.clone = function (currentTarget) {
				var ne = new Event(this, this.element, this.isNative)
				ne.currentTarget = currentTarget
				return ne
				}
				return Event
			}()),
				targetElement = function (element, isNative) {
					return !W3C_MODEL && !isNative && (element === doc || element === win) ? root : element
				},
			RegEntry = (function () {
				var wrappedHandler = function (element, fn, condition, args) {
					var call = function (event, eargs) {
						return fn.apply(element, args ? slice.call(eargs, event ? 0 : 1).concat(args) : eargs)
						}
					, findTarget = function (event, eventElement) {
						return fn.__beanDel ? fn.__beanDel.ft(event.target, element) : eventElement
						}
					, handler = condition
						? function (event) {
							var target = findTarget(event, this) // deleated event
							if (condition.apply(target, arguments)) {
								if (event) event.currentTarget = target
								return call(event, arguments)
							}
							}
						: function (event) {
							if (fn.__beanDel) event = event.clone(findTarget(event)) // delegated event, fix the fix
							return call(event, arguments)
							}
					handler.__beanDel = fn.__beanDel
					return handler
				}
			, RegEntry = function (element, type, handler, original, namespaces, args, root) {
					var customType     = customEvents[type]
					, isNative
					if (type == 'unload') {
					// self clean-up
					handler = once(removeListener, element, type, handler, original)
					}
					if (customType) {
					if (customType.condition) {
						handler = wrappedHandler(element, handler, customType.condition, args)
					}
					type = customType.base || type
					}
					this.isNative      = isNative = nativeEvents[type] && !!element[eventSupport]
					this.customType    = !W3C_MODEL && !isNative && type
					this.element       = element
					this.type          = type
					this.original      = original
					this.namespaces    = namespaces
					this.eventType     = W3C_MODEL || isNative ? type : 'propertychange'
					this.target        = targetElement(element, isNative)
					this[eventSupport] = !!this.target[eventSupport]
					this.root          = root
					this.handler       = wrappedHandler(element, handler, null, args)
				}
				RegEntry.prototype.inNamespaces = function (checkNamespaces) {
				var i, j, c = 0
				if (!checkNamespaces) return true
				if (!this.namespaces) return false
				for (i = checkNamespaces.length; i--;) {
					for (j = this.namespaces.length; j--;) {
					if (checkNamespaces[i] == this.namespaces[j]) c++
					}
				}
				return checkNamespaces.length === c
				}
				RegEntry.prototype.matches = function (checkElement, checkOriginal, checkHandler) {
				return this.element === checkElement &&
					(!checkOriginal || this.original === checkOriginal) &&
					(!checkHandler || this.handler === checkHandler)
				}
				return RegEntry
			}())
			, registry = (function () {
				var map = {}, forAll = function (element, type, original, handler, root, fn) {
					var pfx = root ? 'r' : '$'
					if (!type || type == '*') {
						for (var t in map) {
						if (t.charAt(0) == pfx) {
							forAll(element, t.substr(1), original, handler, root, fn)
						}
						}
					} else {
						var i = 0, l, list = map[pfx + type], all = element == '*'
						if (!list) return
						for (l = list.length; i < l; i++) {
						if ((all || list[i].matches(element, original, handler)) && !fn(list[i], list, i, type)) return
						}
					}
					}
				, has = function (element, type, original, root) {
					var i, list = map[(root ? 'r' : '$') + type]
					if (list) {
						for (i = list.length; i--;) {
						if (!list[i].root && list[i].matches(element, original, null)) return true
						}
					}
					return false
					}
				, get = function (element, type, original, root) {
					var entries = []
					forAll(element, type, original, null, root, function (entry) {
						return entries.push(entry)
					})
					return entries
					}
				, put = function (entry) {
					var has = !entry.root && !this.has(entry.element, entry.type, null, false)
						, key = (entry.root ? 'r' : '$') + entry.type
					;(map[key] || (map[key] = [])).push(entry)
					return has
					}
				, del = function (entry) {
					forAll(entry.element, entry.type, null, entry.handler, entry.root, function (entry, list, i) {
						list.splice(i, 1)
						entry.removed = true
						if (list.length === 0) delete map[(entry.root ? 'r' : '$') + entry.type]
						return false
					})
					}
				, entries = function () {
					var t, entries = []
					for (t in map) {
						if (t.charAt(0) == '$') entries = entries.concat(map[t])
					}
					return entries
					}
				return { has: has, get: get, put: put, del: del, entries: entries }
			}())
			, selectorEngine
			, setSelectorEngine = function (e) {
				if (!arguments.length) {
				selectorEngine = doc.querySelectorAll
					? function (s, r) {
						return r.querySelectorAll(s)
					}
					: function () {
						throw new Error('Bean: No selector engine installed') // eeek
					}
				} else {
				selectorEngine = e
				}
			}
			, rootListener = function (event, type) {
				if (!W3C_MODEL && type && event && event.propertyName != '_on' + type) return
				var listeners = registry.get(this, type || event.type, null, false)
				, l = listeners.length
				, i = 0
				event = new Event(event, this, true)
				if (type) event.type = type
				for (; i < l && !event.isImmediatePropagationStopped(); i++) {
				if (!listeners[i].removed) listeners[i].handler.call(this, event)
				}
			}
			, listener = W3C_MODEL
				? function (element, type, add) {
					element[add ? addEvent : removeEvent](type, rootListener, false)
				}
				: function (element, type, add, custom) {
					var entry
					if (add) {
					registry.put(entry = new RegEntry(
						element
						, custom || type
						, function (event) {
							rootListener.call(element, event, custom)
						}
						, rootListener
						, null
						, null
						, true
					))
					if (custom && element['_on' + custom] == null) element['_on' + custom] = 0
					entry.target.attachEvent('on' + entry.eventType, entry.handler)
					} else {
					entry = registry.get(element, custom || type, rootListener, true)[0]
					if (entry) {
						entry.target.detachEvent('on' + entry.eventType, entry.handler)
						registry.del(entry)
					}
					}
				}
			, once = function (rm, element, type, fn, originalFn) {
				return function () {
				fn.apply(this, arguments)
				rm(element, type, originalFn)
				}
			}
			, removeListener = function (element, orgType, handler, namespaces) {
				var type     = orgType && orgType.replace(nameRegex, '')
				, handlers = registry.get(element, type, null, false)
				, removed  = {}
				, i, l
				for (i = 0, l = handlers.length; i < l; i++) {
				if ((!handler || handlers[i].original === handler) && handlers[i].inNamespaces(namespaces)) {
					registry.del(handlers[i])
					if (!removed[handlers[i].eventType] && handlers[i][eventSupport])
					removed[handlers[i].eventType] = { t: handlers[i].eventType, c: handlers[i].type }
				}
				}
				for (i in removed) {
				if (!registry.has(element, removed[i].t, null, false)) {
					listener(element, removed[i].t, false, removed[i].c)
				}
				}
			}
			, delegate = function (selector, fn) {
				var findTarget = function (target, root) {
					var i, array = isString(selector) ? selectorEngine(selector, root) : selector
					for (; target && target !== root; target = target.parentNode) {
						for (i = array.length; i--;) {
						if (array[i] === target) return target
						}
					}
					}
				, handler = function (e) {
					var match = findTarget(e.target, this)
					if (match) fn.apply(match, arguments)
					}
				handler.__beanDel = {
					ft       : findTarget
				, selector : selector
				}
				return handler
			}
			, fireListener = W3C_MODEL ? function (isNative, type, element) {
				var evt = doc.createEvent(isNative ? 'HTMLEvents' : 'UIEvents')
				evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, win, 1)
				element.dispatchEvent(evt)
			} : function (isNative, type, element) {
				element = targetElement(element, isNative)
				isNative ? element.fireEvent('on' + type, doc.createEventObject()) : element['_on' + type]++
			}
			, off = function (element, typeSpec, fn) {
				var isTypeStr = isString(typeSpec)
				, k, type, namespaces, i
				if (isTypeStr && typeSpec.indexOf(' ') > 0) {
				typeSpec = str2arr(typeSpec)
				for (i = typeSpec.length; i--;)
					off(element, typeSpec[i], fn)
				return element
				}
				type = isTypeStr && typeSpec.replace(nameRegex, '')
				if (type && customEvents[type]) type = customEvents[type].base
				if (!typeSpec || isTypeStr) {
				if (namespaces = isTypeStr && typeSpec.replace(namespaceRegex, '')) namespaces = str2arr(namespaces, '.')
				removeListener(element, type, fn, namespaces)
				} else if (isFunction(typeSpec)) {
				removeListener(element, null, typeSpec)
				} else {
				for (k in typeSpec) {
					if (typeSpec.hasOwnProperty(k)) off(element, k, typeSpec[k])
				}
				}

				return element
			}
			, on = function(element, events, selector, fn) {
				var originalFn, type, types, i, args, entry, first
				if (selector === undefined && typeof events == 'object') {
				for (type in events) {
					if (events.hasOwnProperty(type)) {
					on.call(this, element, type, events[type])
					}
				}
				return
				}
				if (!isFunction(selector)) {
				originalFn = fn
				args       = slice.call(arguments, 4)
				fn         = delegate(selector, originalFn, selectorEngine)
				} else {
				args       = slice.call(arguments, 3)
				fn         = originalFn = selector
				}
				types = str2arr(events)
				if (this === ONE) {
				fn = once(off, element, events, fn, originalFn)
				}
				for (i = types.length; i--;) {
				first = registry.put(entry = new RegEntry(
					element
					, types[i].replace(nameRegex, '') // event type
					, fn
					, originalFn
					, str2arr(types[i].replace(namespaceRegex, ''), '.') // namespaces
					, args
					, false // not root
				))
				if (entry[eventSupport] && first) {
					listener(element, entry.eventType, true, entry.customType)
				}
				}
				return element
			}
			, add = function (element, events, fn, delfn) {
				return on.apply(
					null
				, !isString(fn)
					? slice.call(arguments)
					: [ element, fn, events, delfn ].concat(arguments.length > 3 ? slice.call(arguments, 5) : [])
				)
			}
			, one = function () {
				return on.apply(ONE, arguments)
			}
			, fire = function (element, type, args) {
				var types = str2arr(type)
				, i, j, l, names, handlers
				for (i = types.length; i--;) {
				type = types[i].replace(nameRegex, '')
				if (names = types[i].replace(namespaceRegex, '')) names = str2arr(names, '.')
				if (!names && !args && element[eventSupport]) {
					fireListener(nativeEvents[type], type, element)
				} else {
					handlers = registry.get(element, type, null, false)
					args = [false].concat(args)
					for (j = 0, l = handlers.length; j < l; j++) {
					if (handlers[j].inNamespaces(names)) {
						handlers[j].handler.apply(element, args)
					}
					}
				}
				}
				return element
			}
			, clone = function (element, from, type) {
				var handlers = registry.get(from, type, null, false)
				, l = handlers.length
				, i = 0
				, args, beanDel
				for (; i < l; i++) {
				if (handlers[i].original) {
					args = [ element, handlers[i].type ]
					if (beanDel = handlers[i].handler.__beanDel) args.push(beanDel.selector)
					args.push(handlers[i].original)
					on.apply(null, args)
				}
				}
				return element
			}
			,ready = (function() {
				var queue = [], bound = false, interval = 0;
				var run = function(){
					var x, isReady = true;
					for( x = 0; x < queue.length; x++ ){
						queue[x]();
					}
					queue = [];
				}
				return function(func) {
					if (domLoaded()) {
						func();
					} else {
						queue.push(func);
						clearInterval( interval );
						interval = setInterval( function(){ if(domLoaded()){ run(); clearInterval( interval ); }; } , 50 );
					}
				};
			}())
			, bean = {
				'on'                : on
				, 'add'               : add
				, 'one'               : one
				, 'off'               : off
				, 'remove'            : off
				, 'clone'             : clone
				, 'fire'              : fire
				, 'Event'             : Event
				, 'setSelectorEngine' : setSelectorEngine
				, 'ready' 			  : ready
				, 'noConflict'        : function () {
					context[name] = old
					return this
				}
			}
		if (win.attachEvent) {
			var cleanup = function () {
			var i, entries = registry.entries()
			for (i in entries) {
				if (entries[i].type && entries[i].type !== 'unload') off(entries[i].element, entries[i].type)
			}
			win.detachEvent('onunload', cleanup)
			win.CollectGarbage && win.CollectGarbage()
			}
			win.attachEvent('onunload', cleanup)
		}
		setSelectorEngine()
		return bean
		})('Event',base);
		Event.setSelectorEngine( base.selector );
		util.Events = Event;
	})(UpAds,UpAds.util);
	(function(base){
		var Ad = function(data){
			var ad = {}, logoProps={}, sizes={"t":60,"d":80,"l":35};
			var fs = {'small':{'title':'12px','url':'10px','copy':'10px'},'medium':{'title':'14px','url':'12px','copy':'12px'},'large':{'title':'16px','url':'14px','copy':'14px'}};
			var title = data && data.t ? data.t.length > sizes.t ? data.t.substr(0,sizes.t) : data.t : '';
			var description = data && data.l1 ? data.l1.length>sizes.d ? data.l1.substr(0,sizes.d) : data.l1 : '';
			var displayLink = data && data.dl ? data.dl.length>sizes.l ? data.dl.substr(0,sizes.l) : data.dl : '';
			var link = data && data.lu ? data.lu : '';
			var img = data && data.ln ? data.ln : UpConfig.defaultImage;
			var styles = {};
			var getTitle = function(){ return title; };
			var getDescription = function(){ return description; };
			var getLink = function(){ return link; };
			var getDisplayLink = function(){ return displayLink; }
			var setStyles = function(s){ styles = s; }
			var getImage = function(){ return img; }
			var setLogoProps = function(hasLogo,roundLogo){
				logoProps['hasLogo'] = hasLogo;
				logoProps['roundLogo'] = roundLogo;
			}
			var getStyles = function(str){
				if( base.util.isObject( styles ) && base.util.isString(str) && styles[str] ){
					return styles[str];
				} else {
					return '';
				}
			}
			var getFinalStyleString = function(str){
				if( str.indexOf('!important') == -1 ){
					str = str + ' !important';
				}
				return str;
			}
			var getLogoSize = function(){
				return styles['logoSize'];
			}
			var getStyleString = function(str){
				var styles = [];
				switch(str){
					case 'title':
						if( getStyles('titleColor') ) styles.push( 'color:'+getFinalStyleString( getStyles('titleColor') ) );
						if( getStyles('titleMisc') ) styles.push( getStyles('titleMisc') );
						if( getStyles('fontSize') ) styles.push( 'font-size:'+getFinalStyleString( fs[getStyles('fontSize')]['title'] ) );
						break;
					case 'url':
						if( getStyles('urlColor') ) styles.push( 'color:'+getFinalStyleString( getStyles('urlColor') ) );
						if( getStyles('urlMisc') ) styles.push( getStyles('urlMisc') );
						if( getStyles('fontSize') ) styles.push( 'font-size:'+getFinalStyleString( fs[getStyles('fontSize')]['url'] ) );
						break;
					case 'copy' :
						if( getStyles('copyColor') ) styles.push( 'color:'+getFinalStyleString( getStyles('copyColor') ) );
						if( getStyles('copyMisc') ) styles.push( getStyles('copyMisc') );
						if( getStyles('fontSize') ) styles.push( 'font-size:'+getFinalStyleString( fs[getStyles('fontSize')]['copy'] ) );
						break;
					case 'img':
						if( getStyles('imgMisc') ) styles.push( getStyles('imgMisc') );
						break;
				}
				if( getStyles('fontFamily') ) styles.push( 'font-family:'+getFinalStyleString( getStyles('fontFamily') ) );
				var styleStr = styles.join(";");
				return styleStr;
			}
			var render = function(){
				var div = d.createElement('div');
				if( !getTitle() || getTitle().length < 2 ){
					return div;
				}
				var a = d.createElement('a');
				a.href = getLink();
				a.setAttribute('target', '_blank');
				base.util.Events.on( a,"click",base.util.LinkOutClick );
				var ts = getStyleString('title');
				var us = getStyleString('url');
				var cs = getStyleString('copy');
				var img = getImage();
				var imgStr = "";
				if( logoProps.hasLogo ){
					div.setAttribute("class","hasAdvLogo");
					a.style.paddingLeft = (parseInt(getLogoSize())+16)+'px';
					imgStr += '<div class="advUnitLogo"><div style="display:table !important;height:100% !important;"><div style="display:table-cell !important;vertical-align:middle !important;text-align:center !important;">';
					imgStr += '<img class="advLogo" style="width:'+getLogoSize()+'px;height:'+getLogoSize()+'px;'+(logoProps.roundLogo?'border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%':'')+getStyleString('img')+'" src="'+img+'" alt="">';
					imgStr += '</div></div></div>';
					a.innerHTML += imgStr;
				}
				a.innerHTML +=  '<div class="advUnitTitle" '+(ts ? ' style="'+ts+'" ' : '' )+'>' + getTitle() + '</div>';
				a.innerHTML += '<div class="advUnitCompany" '+(us ? ' style="'+us+'" ' : '' )+'>' + getDisplayLink() + '</div>';
				a.innerHTML += '<div class="advUnitDesc" '+(cs ? ' style="'+cs+'" ' : '' )+'>' + getDescription() + '</div>';
				div.appendChild( a );
				return div;
			}
			ad.getTitle = getTitle;
			ad.getDescription = getDescription;
			ad.getDisplayLink = getDisplayLink;
			ad.setStyles = setStyles;
			ad.getLink = getLink;
			ad.setLogoProps = setLogoProps;
			ad.render = render;
			return ad;
		}
		var AdSlot = function(){
			var adSlot = {},id,height,width,ads = [],bgColor,border,slotId,ele,hasImg=false,logoRound=false;
			var style = {};
			var styleMapper = {"titleColor":'tc',"titleMisc":'mt',"copyColor":'cc',"copyMisc":'mc',"urlColor":'uc',"urlMisc":'mu',"linkMisc":'ml',"fontFamily":'ff','fontSize':'fs','imgMisc':'mlogo','logoSize':'ls'};
			function getEle(){ return ele;}
			function setEle(e){ ele = e;}
			function getSlotId(){ return slotId; }
			function setSlotId(s){ slotId = s; }
			function loadEle(e){
				ele = e || null;
				slotId = ele ? ele.getAttribute('data-slot-id') || null : null;
				id = slotId;
			}
			function getBorder(){ return border; }
			function setBorder(s){ border = s; }
			function getBgColor(){ return bgColor; }
			function setBgColor(s){ bgColor = s; }
			function getId(){ return id; }
			function setId(i){ id = i; }
			function getStyle(){ return style; }
			function hasImage(){ return hasImg; }
			function roundLogo(){ return logoRound; }
			function loadStyles(data){
				if( !data || !base.util.isObject(data) ){
					return
				}
				for( var x in styleMapper ){
					style[x] = data[styleMapper[x]];
				}
				if( data['bc'] ){
					setBgColor( data['bc'] );
				}
				if( data['b'] ){
					setBorder( data['b'] );
				}
				if( data['il'] && data['il'] == 'y' ){
					hasImg = true;
				}
				if( data['lr'] && data['lr'] == 'y' ){
					logoRound = true;
				}
			}
			function getStyles(){
				var obj = {};
			}
			function loadAds(d){
				if( !d.length ) return;
				for( var i = 0; i < d.length; i++ ){
					var ad = new Ad( d[i] );
					ad.setStyles( getStyle() );
					ad.setLogoProps( hasImage(), roundLogo() );
					ads.push( ad );
				}
			}
			function adsLoaded(flag){
				var ele = getEle();
				if( flag ){
					ele.setAttribute('data-ads-loaded','true');
				} else {
					ele.setAttribute('data-ads-loaded','true');
				}
			}
			function adsAlreadyLoaded(){
				var ele = getEle();
				return ele.getAttribute('data-ads-loaded') === 'true'
			}
			function render(){
				var ads = getAds();
				if( !ads.length ){ return; }
				var el = getEle();
				var div = document.createElement('div');
				div.setAttribute( 'id','advUnit'+getSlotId() );
				div.setAttribute( 'class','advUnit' );
				var styleStr = '';
				if( getBorder() ) styleStr += 'border:'+getBorder() +' !important;';
				if( getBgColor() ) styleStr += 'background:'+getBgColor() +' !important;';
				if( styleStr && styleStr != '' ) {
					div.style.cssText = styleStr ;
				}
				div.innerHTML = '<div class="advUnitSpon">Sponsored</div>';
				for( var i = 0; i < ads.length; i++ ){
					div.appendChild( ads[i].render() );
					//el.appendChild( ads[i].render() );
				}
				if( !adsAlreadyLoaded() ) {
					el.appendChild( div );
				}
				adsLoaded(true);
				return true;
			}
			function getAds(){ return ads; }
			function setAds(s){ ads = s; }
			adSlot.getEle = getEle;
			adSlot.setEle = setEle;
			adSlot.getSlotId = getSlotId;
			adSlot.setSlotId = setSlotId;
			adSlot.loadEle = loadEle;
			adSlot.loadStyles = loadStyles;
			adSlot.loadAds = loadAds;
			adSlot.getAds = getAds;
			adSlot.setAds = setAds;
			adSlot.render = render;
			return adSlot;
		}
		var AdSlotManager = function(){
			if( AdSlotManager.inst ){ return AdSlotManager.inst; }
			if( !this instanceof AdSlotManager ){ return new AdSlotManager(); }
			AdSlotManager.inst = this;
			var slots = [], elems;
			this.init = function(){
				elems = base.selector(".l5ads");
				elems = elems.concat( base.selector('.upads') );
				if( elems.length ){
					for( var i = 0; i < elems.length; i++ ){
						var adSlot = new AdSlot();
						adSlot.loadEle( elems[i] );
						slots.push( adSlot );
					}
				} else {
					throw Error("No Elements to show ads.");
				}
			}
			this.getElements = function(){ return elems };
			this.getSlots = function(){ return slots; }
			this.setSlots = function(s){ slots = s; }
			this.resetSlots = function(){ slots = [] };
			this.addSlot = function(a){
				if( a instanceof AdSlot ){
					slots.push(a);
				} else {
					slots.push( new AdSlot(a) );
				}
			}
			this.getAdSlotWithId = function( slotId ){
				var s = this.getSlots();
				var slot = null;
				if( s ){
					for( var i = 0; i < s.length; i++ ){
						if( s[i].getSlotId() == slotId ){
							slot = s[i];
							break;
						}
					}
				}
				return slot;
			}
			this.collapseSlot = function( slot ){
				var ele;
				ele = slot.getEle();
				ele.style.height = 0;
				ele.style.display = 'none';
			}
			this.collapseAllSlots = function(){
				var s = this.getSlots();
				for( var i = 0; i < s.length; i++ ){
					this.collapseSlot( s[i] );
				}
			}
			this.loadAds = function( data ){
				var ads = data;
				var mgr = this;
				for( var i = 0; i < ads.length; i ++ ){
					var ad = ads[i];
					var slot = mgr.getAdSlotWithId( ad['u'] );
					if( slot ){
						slot.loadStyles( ad['cs'] || {} );
						if( ad['cr'].length ){
							slot.loadAds( ad['cr'] );
						} else {
							this.collapseSlot( slot );
						}
					}
				}
				this.render();
			}
			this.render = function(){
				var slots = this.getSlots();
				for( var i = 0 ; i < slots.length; i++ ){
					slots[i].render();
				}
				base.util.Events.fire(d,'adsLoaded');
			}
		}
		base.AdSlotManager = new AdSlotManager();
	})(UpAds);
	w.UpAds = UpAds;
	var bindClick = function(event){
	}
	var adsLoaded = function(event){
	}
	var loadReady = function(){
		UpAds.init();
		UpAds.util.Events.on(document,'adsLoaded',adsLoaded);
	}
	if( document.readyState == 'complete' || document.readyState == 'loaded' || document.readyState == 'interactive' ){
		loadReady();
	} else {
		UpAds.util.Events.ready(loadReady);
	}
})(window,document);
