	function OBLogout() {
		window.location.href='https://www.outbrain.com/LoginPage';
	}


	String.prototype.trim = function() {
		return this.replace(/^\s+|\s+$/g,"");
	}
	String.prototype.ltrim = function() {
		return this.replace(/^\s+/,"");
	}
	String.prototype.rtrim = function() {
		return this.replace(/\s+$/,"");
	}





	var defaultRoundSettings = { 	tl: { radius: 10 }, tr: { radius: 10 }, bl: { radius: 10 },
			  			br: { radius: 10 }, antiAlias: true, autoPad: false }


	
	function roundDiv(obj, roundSettings) {
	
		if (roundSettings == null) {
			roundSettings = defaultRoundSettings;
		}
		try {
			var objRound = new curvyCorners(roundSettings, obj);
	    	objRound.applyCornersToAll();
	    }	
	    catch(e) {
	    }			
	
	}

	// add "http://" if missing 
	function fixURLField(field) {
		if (field != null) {
			var newstr = '';	
			var str = field.value;
			if (str.length != 0 ) {
				if ((  str.substr(0,7).toLowerCase() == 'http://') || ( str.substr(0,8).toLowerCase() == 'https://')) {
		
				}
				else {
					field.value = "http://" + str;
				}
			}	
		}	
		
	}
	
		// strip url string of its "http://", if present 
	function simplifyURL(urlstr) {
		var newstr;	
	
		if (  urlstr.substr(0,7).toLowerCase() == 'http://' ){ 
			newstr= urlstr.substr(8,urlstr.length);
		}
		if ( urlstr.substr(0,8).toLowerCase() == 'https://') {
			newstr= urlstr.substr(9,urlstr.length);
		}

		return newstr;
	}
	


	
	/* this functions returns a new XMLHttpRequest object after browser check*/
	function getNewAjaxObject(){
		var xmlHttp;
		try {
	  		// Firefox, Opera 8.0+, Safari
	  		xmlHttp=new XMLHttpRequest();
	  	}
		catch (e) {
	  		// Internet Explorer
	  		try {
	    		xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
	    	}
	  		catch (e) {
	    		try {
	      			xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
	      		}
	    		catch (e) {
	      			alert("Your browser does not support AJAX!");
	      			return false;
	      		}
	   		}
		} // end of ie catch
		return xmlHttp;
	}
	
	
	function makeAjaxCall(url,callBack, errorCallback) {
		var ajax = getNewAjaxObject();
		ajax.onreadystatechange=function() {
			if(ajax.readyState==4) {  // request complete
  				// Get the data from the server's response
				switch(ajax.status){
				  case 401 : OBLogout(); 
				  break;
				  case 500 : var handler = errorCallback;  
					         if(handler == null){
					        	 handler = callBack ; 
					         }
					         eval(handler.replace('$res', escape(ajax.responseText)) )
				  break;
				  case 200 : eval(callBack.replace('$res', escape(ajax.responseText)) ); 
				  break;
				}	
  				
  			}
		}
		ajax.open("GET",url,true);
  		ajax.send(null);
	}
	
	
		function makeXmlAjaxCall(url,callBack) {
		var ajax = getNewAjaxObject();
		ajax.onreadystatechange=function() {
			if(ajax.readyState==4) {  // request complete
  				// Get the data from the server's response		
  				if (ajax.status==200) { // only if OK
					eval(callBack.replace('$resXml','ajax.responseXML').replace('$resHtml',escape(ajax.responseText)) );
				}
				else {		
					if (ajax.status==401) {
						OBLogout();
					}
				}
  			}
		}
		ajax.open("GET",url,true);
  		ajax.send(null);
	}


	function genericCallbackHandler(id,str) {
		var obj = document.getElementById(id);
		if(obj!=null) {
			obj.innerHTML = unescape(str);
		}
	}
	
	function genericCallbackHandlerWithScript(id,xml,html) {
		var doc =  xml.documentElement;
		document.getElementById(id).innerHTML = unescape(html);
		if (typeof(doc) != 'undefined') {
			var scripts = doc.getElementsByTagName('script');
			for (var x=0;x< scripts.length;x++) {
				with(window) {
					try {
						var newName = 'newScript' + x;
						var se = document.createElement("script");
						se.setAttribute('id',newName );
						se.setAttribute('type','text/javascript');
						se.innerHTML = scripts[x].textContent;
						var heads = document.getElementsByTagName("head");
						if( heads.length > 0 ){
							heads[0].insertBefore(se, heads[0].firstChild);
						}
		
					}
					catch(ex) {
						
					}	
				}	
			} 
		} else {
		
		}	
	}
	
	
	
	/* toggles visibility of an object. takes the object's ID. 
		NOTE: uses main CSS file*/
	function toggleShow(id) {
		obj = document.getElementById(id);
		if (obj) {
			obj.className = (obj.className == "expandable") ? "expanded" : "expandable";
		}	
	}
	function toggleVisible(id) {
		obj = document.getElementById(id);
		if (obj) {
			obj.style.display = (obj.style.display == "none") ? "" : "none";
		}	
	}
	
	
	
	/* set item visibility according to bool, using CSS class*/
	function setShow(id,bool) {
		obj = document.getElementById(id);
		obj.className = (bool) ? "expanded" : "expandable";
	}
	
	/* set item visibility according to bool, using CSS style*/
	function setVisible(id,bool) {
		obj = document.getElementById(id);
		if (obj!=null) {
			obj.style.display = (bool) ? '' : 'none';
		}	
	}
	 
	
	


	/* toggle visibility of target according to a checkbox's status.
	   takes target's ID and checkbox OBJECT. 
	   NOTE: logic - if checkbox is checked then SHOW, otherwise HIDE 
	   NOTE: uses main CSS file */
	function toggleShowChk(chkboxobj, targetid) {
		obj = document.getElementById(targetid);
		if (obj && chkboxobj) {
			obj.className= ( chkboxobj.checked ) ? "expanded" : "expandable" ;
		}	
	} 



	/* toggle visibility of target according to a checkbox's status.
	   takes target's ID and checkbox OBJECT. NOTE: reverse logic -
	   if checkbox is checked then HIDE, otherwise SHOW
	   NOTE: uses main CSS file */
	function toggleShowChkR(chkboxobj, targetid) {
		obj = document.getElementById(targetid);
		if (obj && chkboxobj) {
			obj.className= ( chkboxobj.checked ) ?  "expandable":"expanded" ;
		}	
	} 


 	/* toggle a certain CLASS of object, according to a CHECKBOX status.
 		
 	*/
	function toggleClassChk(chkbx,objid,classIfNotChecked,classIfChecked) {
		obj = document.getElementById(objid);
		if (obj && chkbx && classIfChecked && classIfNotChecked ) {
			if (chkbx.checked) {
				obj.className.replace(classIfChecked,classIfNotChecked)
			} 
			else {
				obj.className.replace(classIfNotChecked,classIfChecked)
			}
		}
	}
	

	/* toggle image of textual list (non-UL) "bullet". takes the ID of the "bullet" object,
		the url of the 'CLOSE' image, and the 'OPEN' image.*/
	
	function toggleExpander(id,closeurl,openurl) {
		obj = document.getElementById(id);
		obj.src = (obj.src.match(closeurl)) ? openurl : closeurl; 
	}
	
	
	/* toggle image of proper list (UL) bullet. takes the ID of the <li> object,
		the url of the 'CLOSE' image, and the 'OPEN' image.*/
	function toggleListExpander(id,closeurl,openurl) {
		obj = document.getElementById(id);
		obj.style.listStyleImage = (obj.style.listStyleImage.match(closeurl)) ? 'url('+ openurl+')' : 'url('+closeurl+')'; 
	}	
	
	function obfocus(objid) {
		var obj = document.getElementById(objid);
		if (obj!=null) {
			try {
				obj.focus();
			} catch (e) {
			}	
		}
	}

	
	/* set a checkbox as selected or not, by checkboxID */
	function setChk (chkid,bool) {
		obj = document.getElementById(chkid);
		if (obj) {
			obj.checked = bool;
		}	
	}
	
	
	function replaceClass(element,classOrig,classNew) {

		element.className = element.className.replace(classOrig + " ",classNew + " ");
	
	}
	
	function cleanUrlOfAnchor() {
		var urlStr = document.location.href;
		var cleanURL;
		if (urlStr.indexOf('#') != -1)  {
			 cleanURL = urlStr.slice(0, urlStr.lastIndexOf('#')) +  urlStr.slice(urlStr.lastIndexOf('#')+1, urlStr.length)
		}
		document.location.href = cleanURL;
	}


	function getParameterFromString(urlStr,paramName) {


	  paramName = paramName.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	  var regexS = "[\\?&]"+paramName+"=([^&#]*)";
	  var regex = new RegExp( regexS );
	  var results = regex.exec( urlStr );
	  if( results == null )
	    return "";
	  else
	    return results[1];

	}
	

	function fetchAnchor() {
		var urlStr = document.location.href;
		var anchor = null;
		if (urlStr.indexOf('#') != -1)  {
			 anchor = urlStr.slice(urlStr.lastIndexOf('#')+1, urlStr.length)
		}
		return anchor;
	}

	/* ONLY the helper function */
	function removeUrlParam(url,paramName){
		var keepAnchor = '';
    	if (url.indexOf('?'+paramName+'=') == -1 && url.indexOf('&'+paramName+'=') == -1 ) {
			/* the parameter is not in the URL*/
		}
		else { // the parameter exists in the URL
	        if (url.indexOf('#') != -1)  { // we have an anchor, keep it
	        	keepAnchor = url.slice(url.lastIndexOf('#'), url.length)
	        	url = url.slice(0,url.length - keepAnchor.length);
	        }
			var urlParams = url.slice(url.indexOf('?')+1,url.length);
			urlParams = urlParams.split('&');
            for (i=0;i<urlParams.length;i++){
               if (paramName == urlParams[i].slice(0,urlParams[i].indexOf('='))) {
                   urlParams.splice(i,1);
                   break;
                }    
            }
            if (urlParams.length!=0) {  // still params left
            	var newParams = '?'+urlParams[0];
             	for (j=1;j<urlParams.length;j++) {
                	newParams += '&'+urlParams[j] ;
             	}
             	url = url.slice(0,url.indexOf('?')) + newParams; // replace with updated params
       	    } 
       	    else { // now there are no params
       	    	url = url.slice(0,url.indexOf('?')); // remove all params
       	    }
                        	        
	    }
	    
	    return url + keepAnchor;    

	}

	function addUrlParamHelper(url , paramName, paramValue) {
        var keepAnchor = '';
        if (url.indexOf('#') != -1)  { // we have an anchor, keep it
        	keepAnchor = url.slice(url.lastIndexOf('#'), url.length)
        	url = url.slice(0,url.length - keepAnchor.length);
        }
		if (url.indexOf('?'+paramName+'=') == -1 && url.indexOf('&'+paramName+'=') == -1 ) {
            var prmChar;              
			/* the parameter is not in the URL*/
			prmChar =  (url.lastIndexOf ('?') == -1) ? '?' : '&';
			url+= prmChar+paramName +'=' + paramValue;	             
		}
		else { //the parameter exists, modify
			var urlParams = url.slice(url.indexOf('?')+1,url.length);
			urlParams = urlParams.split('&');
                        for (i=0;i<urlParams.length;i++){
                           if (paramName == urlParams[i].slice(0,urlParams[i].indexOf('='))) {
                               urlParams[i] = paramName+'='+paramValue;
                            }    
                        }
                        var newParams = '?'+urlParams[0];
                        for (j=1;j<urlParams.length;j++) {
                           newParams += '&'+urlParams[j] ;
                        }
                        url = url.slice(0,url.indexOf('?')) + newParams;

		}

           return url + keepAnchor;
	}
	
	
	/* the actual modifier*/
	function addUrlParam(paramName,paramValue) {
		var newURL = addUrlParamHelper(document.location.href,paramName,paramValue)
		window.location.href = newURL;
 
	}
	function removeUrlParamFrc(paramName) {
		var newURL = removeUrlParam(document.location.href,paramName);
		window.location.href = newURL;
	}
	
	
	
	
	function outbrain_$(id){ return document.getElementById(id); }
	
	// return the value of the radio button that is checked
	// return an empty string if none are checked, or
	// there are no radio buttons
	function getCheckedValue(radioObj) {
		if(!radioObj)
			return "";
		var radioLength = radioObj.length;
		if(radioLength == undefined)
			if(radioObj.checked)
				return radioObj.value;
			else
				return "";
		for(var i = 0; i < radioLength; i++) {
			if(radioObj[i].checked) {
				return radioObj[i].value;
			}
		}
		return "";
	}
		
	
	
	/*******************TAKEN FROM HILAN************************************/
		
	//Adds a class name (multiple class names allowed) to the element's class attribute.
	//className should be a valid css className string
	//element should be a DOM element
	//allowDuplicate should be boolean, although if omitted false will be used as a default
	//If allowDuplicate is true, the multiple instances of the same class will be allowed, otherwise the new classes
	//will only be added if none of them already exists within element.className
	//Returns true on success, false otherwise
	function addClass(className,element,allowDuplicate)
	{
		var classes;
		var newClasses;
		if('string'!==typeof className){return false;}
		if(null===element){return false;}
		if('undefined'===typeof element){return false;}
		if('string'!==typeof element.className){return false;}
		if('undefined'===typeof allowDuplicate){allowDuplicate=false;}
		if('boolean'!==typeof allowDuplicate){return false;}
		classes=element.className.split(' ');
		newClasses=className.split(' ');
		for(var i=0;i<newClasses.length;i++)
		{
			if(
				(-1===element.className.indexOf(newClasses[i])) || //No duplicate found
				(allowDuplicate))//Duplicates allowed
			{
				classes.push(newClasses[i]);
			}
			else
			{
				return false;
			}
		}
		classes=classes.join(' ');
		if(' '===classes.charAt(0))
		{
			classes=classes.substr(1);
		}
		element.className=classes;
		return true;
	}
	
	//Removes a class name (multiple class names allowed) from the element's class attribute.
	//className should be a valid css className string
	//element should be a DOM element
	//removeAll should be boolean, although if omitted true will be used as a default
	//If removeAll is true, every instance of every class within className will be removed from the element.className
	//Returns true on success, false otherwise
	function removeClass(className,element,removeAll)
	{
		var classes;
		var existingClasses;
		var idx;
		if('string'!==typeof className){return false;}
		if(null===element){return false;}
		if('undefined'===typeof element){return false;}
		if('string'!==typeof element.className){return false;}
		if('undefined'===typeof removeAll){removeAll=false;}
		if('boolean'!==typeof removeAll){return false;}
		classes=className.split(' ');
		existingClasses=element.className;
		for(var i=0;i<classes.length;i++)
		{
			idx=existingClasses.indexOf(classes[i]);
			while(-1!=idx)
			{
				existingClasses.splice(idx,1);
				if(!removeAll)
				{
					break;
				}
				idx=existingClasses.indexOf(classes[i]);
			}
		}
		/*existingClasses=existingClasses.join(' ');*/
		if(' '===existingClasses.charAt(0))
		{
			existingClasses=existingClasses.substr(1);
		}
		element.className=existingClasses;
		if(''===existingClasses)
		{
			element.removeAttribute('class');
		}
		return true;
	}
	
	//Checks whether the provided class name exists in the elements className attribute (multiple class names allowed)
	//className should be a valid css className string
	//element should be a DOM element
	//Returns true if any of the class names exists in the className attribute of the element, false otherwise
	function hasClass(className,element)
	{
		var classes;
		var existingClasses;
		var idx;
		if('string'!==typeof className){return false;}
		if(null===element){return false;}
		if('undefined'===typeof element){return false;}
		if('string'!==typeof element.className){return false;}
		classes=className.split(' ');
		existingClasses=element.className;
		for(var i=0;i<classes.length;i++)
		{
			if(-1!=existingClasses.indexOf(classes[i]))
			{
				return true;
			}
		}
		return false;
	}