CH.ns(function() {with(CH) {
	
	/********************************************************************/
	/************************* INITIALIZATION ***************************/
	/********************************************************************/
    initialize = function() {
    	linkswapTracker();
    	
//    	likeIt.addEvents();
    	isHuman();
    	
    	//** NOTHING UNDER HERE! **//
    	initialize = Prototype.emptyFunction;
    };
    
    
    
    /********************************************************************/
	/*************************** FUNCTIONS ******************************/
	/********************************************************************/
	
	// LINKSWAP TRACKER - internally called, no external access
	function linkswapTracker() {
		if(document.location.hash.match('#ls:') != null) {
			var ls_id = parseInt(document.location.hash.replace(/#ls:/, ''));
			
			if(typeof(ls_id) == 'number' && isFinite(ls_id) && ls_id != NaN) {
				var ls_track_pixel = document.createElement('img');
				ls_track_pixel.src = 'http://track.collegehumor.com/linkswap/'+Base64.encode('direction=in&partner_id='+ls_id)+'?'+Math.floor(Math.random() * 100);
				ls_track_pixel.width = 0;
				ls_track_pixel.height = 0;
				ls_track_pixel.style.display = 'none';
				
				document.body.appendChild(ls_track_pixel);
			}
		}
	};
	
	// Sets a cookie to determine if a a browser is human or not
	function isHuman() {
		ih = readCookie('ih');

		if(ih != 'true') {
			createCookie('ih', true);
		}
	}
	
	
	function expandCommentInContext() {
        if(document.location.hash.match('#comment_link_') != null) {
			var comment_id = parseInt(document.location.hash.replace(/#comment_link_/, ''));

            if(typeof(comment_id) == 'number' && isFinite(comment_id) && comment_id != NaN) {
                if($('comment_link_' + comment_id) == undefined) {
                    // we need to get the parent id;
                    new Req.ajax({url: "/ajax/comment/expand_parent_thread", options: {parameters: "comment_id="+comment_id}});
                }
            }

            return false;

		}
    }
	
	
	
	/********************************************************************/
	/**************************** CLASSES *******************************/
	/********************************************************************/

	/************************************/
	// LIKE IT CLASS
	/************************************/
    likeIt = function() {
		var likeContainerClass = ".observeLikes";
		var likeContainerID = "likeContainer_";
		var likeCountWrap = "likesCount_";

    	function addEvents() {
    		$$(likeContainerClass).each(function(element) {
    			var nodeId = element.getId();

    			var actionLink = element.getElementsBySelector('a')[0];
    			var checkbox = actionLink.getElementsBySelector('input[type=checkbox]');
    			
    			if (!checkbox.isEmpty()) {
    				actionLink = checkbox[0];
    			} else {
    				actionLink.href = 'javascript:void(0)';
    			}
    			
    			actionLink.onclick = function() {
					this.toggleLike(nodeId);			
    			}.bind(this);
    		}.bind(this));
    		
    	}
		
		function likeStatus(nodeIds) {
			$A(nodeIds).each(function(nodeId) {

				//var likeContainer = $(likeContainerID + nodeId);

				//Element.removeClassName(likeContainer, "not_liked");
				//Element.addClassName(likeContainer, "liked");
				
				var likeElements = $$('.'+likeContainerID + nodeId);

				likeElements.invoke('removeClassName', 'not_liked').invoke('addClassName', 'liked');
			}.bind(this));
		}

		function setLikeCount(nodeIds) {
			for(key in nodeIds){
				var likeCount = $(likeCountWrap + key);
				if (likeCount)
					likeCount.update(nodeIds[key]);
			}
		}
    	
    	function toggleLike(nodeId) {
    		// Check for DIGG
			var checkbox;
			if(checkbox = $('checkbox_'+nodeId)) {
				
				if(Vars.logged_in == false) {
				     checkbox.checked = false;
				}
     
				if(checkbox.checked) {
					Element.addClassName($$('.action_bar')[0], 'likedit');
					Effect.Appear('liked-bar');
				}
				
				var liked = 0;
				if (checkbox.checked == true)
					liked = 1;
			}
			else
				liked = 'check';
			
			// User isnt logged in, show the login screen
			if(Vars.logged_in == false) { 
				Login.show('like', Base64.encode(location.href));
				return;
			}
    				
			//$(likeContainerID + nodeId).addClassName('working');
			var likeElements = $$('.'+likeContainerID + nodeId);
			likeElements.invoke('addClassName', 'working');
			
			new Req.ajax({url: "/ajax/media/toggle_like/", options: {parameters: "node_id="+nodeId+'&liked='+liked}});
    	}
    	
    	return {
    		addEvents: addEvents,
			likeStatus: likeStatus,
			setLikeCount: setLikeCount,
    		toggleLike: toggleLike
    				
    	}
    }(); //** END LIKE IT CLASS

	/************************************/
	// DIGG BUTTON CLASS
	/************************************

	homePageDigg = function() {
		var diggContainerClass = ".diggContainer";
		var diggContainerID = "diggContainer_";

		function addDiggButtons() {

			$$(diggContainerClass).each(function(element) {

				var src_container = element.getElementsByTagName('span')[0];
				var iframe_src = src_container.innerHTML;
				var src = iframe_src.replace(/&amp;/g, "&");
//				console.log(src);

				var iframe = new Element('iframe', { 'src': src, 'scrolling': 'no', 'frameborder': '0', 'width': '120', 'height': '18' });
//				Element.remove(src_container);
				element.appendChild(iframe);

			}.bind(this));

		}
		
		return { addDiggButtons: addDiggButtons }
	}(); //** END DIGG BUTTON CLASS
    

	/************************************/
	// AD SKIN
	/************************************/
    ad_skin = {
				
		ad_container: 'skin',
		header_container: 'ad-banner',
		widescreen_wrap: 'flash_player_wrap',
		body1: 'skin-body',
		loaded: false,
		color_threshold: 10066329,	// #999999
	
		load: function(bg_ad_image, redirect_url, color, widescreen) {

			Element.addClassName($$('body')[0], 'has-skin');
	
			if(typeof(this.onclick) == 'function') {
				this.stopObserver();
			}
			
			this.loaded = true;
			Element.setStyle(this.ad_container, { background: color + ' url('+bg_ad_image+') top center no-repeat', cursor: 'pointer' });

			this.switch_footer_palette(color);

			if($('banner_ad_header')) {
				Element.setStyle('banner_ad_header', { display: 'none' });
			}
	
			if (widescreen) Element.addClassName(this.ad_container, 'widescreen_ad');
			
			this.onclick = function(e) {
				if (e.target) {
					targ = e.target;
				} else if(e.srcElement) {
					targ = e.srcElement;
				}
								
				if(targ.id == this.ad_container || targ.id == this.header_container) {
					window.open(redirect_url);
				}
				
				if(widescreen && targ.id == this.widescreen_wrap) {
					window.open(redirect_url);
				}
			}.bind(this);
			
			if (redirect_url!='') {
				Event.observe(this.ad_container, 'click', this.onclick ); 
			} else {
				$(this.ad_container).style.cursor = 'default';	
			}
		},
	
		body: function(body_image, color, repeat ) {
			
			if(body_image!=''){
				Element.setStyle(this.body1, {background: color+' url('+body_image+') top center '+(repeat ? repeat : 'repeat-x') });
			} else {
				Element.setStyle(this.body1, {background: color});
			}

			this.switch_footer_palette(color);

		},
		
		stopObserver: function() {
			Event.stopObserving(this.ad_container, 'click', this.onclick);
		},
		
		channel_logo: function(logo_img_src, redirect_url) {

			var logo_link = new Element('a', { href: redirect_url, target: '_blank', 'class': 'branded_header_logo' });

			if(redirect_url == '')
				Element.addClassName(logo_link, 'nolink');
	
			FastInit.addOnLoad(function() {

				var logo = new Element('img', { src: logo_img_src });

				logo_link.appendChild(logo);
				
				var rss = $$('#mediaHeader .rss')[0];

				Element.insert(rss, { after: logo_link });
	
			}.bind(this));
		
		},
		
		hide_billboard: function() {
		
			FastInit.addOnLoad(function() {

				Element.hide($$('.boxAd')[0]);

			}.bind(this));
		
		},
		
		hide_leaderboard: function() {
		
			FastInit.addOnLoad(function() {

				Element.hide('banner_ad_header');
			
			}.bind(this));
		
		},

		switch_footer_palette: function(color) {

			var bg_dec = parseInt(color.replace('#', ''), 16);

			if(bg_dec >= this.color_threshold){

				FastInit.addOnLoad(function(){

					Element.addClassName('footer_wrap', 'dark');

				}.bind(this));

			}
		},
		
		reset: function() {
			try {
				if(typeof(this.onclick) == 'function') {
					this.stopObserver();
				}
								
				Element.setStyle(this.ad_container, {background: 'none', cursor: 'default' });
				Element.setStyle(this.header_container, {cursor: 'default'});
				
				Element.setStyle(this.body1, {background: "#000000 url('/artwork/bg-blue-gradient.jpg') repeat-x top center"});
				
			} catch(err) {
				
			}
		}
	}; //** END AD SKIN

	ad_playlist = {

		header_container: 'continuousContainer',
		header_logo: 'gallery_hdr',
		default_color: '#000000',
		default_repeat: 'repeat-x',

		header: function(bg_image, bg_color, bg_repeat)
		{
			var repeat = (bg_repeat != undefined) ? bg_repeat : this.default_repeat;
			var color = (bg_color != undefined) ? bg_color : this.default_color;

			Element.hide(this.header_logo);

			Element.setStyle(this.header_container, { background: color + ' url(' + bg_image + ') ' + repeat });

		},

		logo: function(image_src, link_url)
		{
			var header_logo_link = $(this.header_logo);

			Element.addClassName(header_logo_link, 'ad_logo');


			if(link_url != undefined && link_url != '%%CLICKURL%%'){

				var link = link_url;
				header_logo_link.target = '_blank';

			} else {
			
				var link = 'javascript:void(0);';

			}

			header_logo_link.href = link;

			var logo_image = header_logo_link.select('img')[0];

			logo_image.src = image_src;
			logo_image.alt = '';

			Element.show(this.header_logo);

		}

	}; //** END AD PLAYLIST

	ad_navtab = {

		/*	SAMPLE CODE

			<script type="text/javascript">
			ad_navtab.load('/clients/nbc/img-nbc-community-NAVTAB.jpg', '%%CLICKURL%%');
			</script>
			<img src="" alt="" />
		*/

		navtab_container: 'nav-top',
		navtab_class: 'ad-sales-tab',

		load: function(image, url)
		{
			var tabdiv = new Element('div', { 'class': this.navtab_class });
			var tablink = new Element('a', { href: url });
			var navtab = new Element('img', { 'src': image, 'alt': '' });

			Element.insert(tablink, navtab);
			Element.insert(tabdiv, tablink);
			Element.insert(this.navtab_container, tabdiv, { position: 'bottom' });
		}

	}; //** END AD NAVTAB
	
	ads = {
			
		requestNewPageId: true,
		pageId: 0,
		
		reload: function(units) {
			
			if(readCookie('jument_hideads') == '1') {
		 		return;
		 	}
		 	
			// create the ad exec space if it doesnt already exist
			if($('ad_exec')) {
				$('ad_exec').update('');
			} else {
				var div = document.createElement('div');
				div.id = 'ad_exec';
				div.style.height = 0;
				div.style.overflow = 'hidden';
				
				document.body.appendChild(div);
			}
			
			if(this.requestNewPageId == true) {
				this.pageId = Math.round(Math.random() * 1000000);
			}
			
			units.each(function(unit) {

				var adFrame = document.createElement('iframe');
				adFrame.src = '/etc/load_ad.php?page_id=' + this.pageId  + '&unit=' + unit[1] + '&ad_query=' + escape(adQuery);
				
				// get the unit size and div container
				if(unit[0] == '') {
					width = 100;
					height = 100;
					
					divName = 'ad_exec';
				} else {
					var size = unit[1].split('_');
					size = size[0].split('x');
					
					width = size[0];
					height = size[1];

					divName = unit[0];
					div = $(divName);
					
					if(div) {
						div.update('');
					} else {
						return;
					}
				}
				
				adFrame.width = width;
				adFrame.height = height;
				adFrame.scrolling = 'no';
				adFrame.frameBorder = 0;
				adFrame.marginHeight = 0;
				adFrame.marginWidth = 0;
				
				$(divName).appendChild(adFrame);
			}.bind(this));
		},
		
		setRequestNewPageId: function(bool) {
			this.requestNewPageId = bool;
		}
	};
}});



/********************************************************************/
/*************************** FUNCTIONS ******************************/
/********************************************************************/

//reload a given ad on the page
function reloadAd(divName, adWidth, adHeight)
{
	//	cant we just do this?:
	//	var adFrame = $(divName).select('iframe')[0];
	//	adFrame.src = 'http://iacas.adbureau.net/hserver/site=collegehumor.com/pageid='+Math.round(Math.random() * 1000000)+'/random='+Math.round(Math.random() * 1000000)+'/'+adQuery+'/aamsz='+adWidth+'x'+adHeight;

	if($(divName)){
								
		var adFrame = document.createElement('iframe');
		// TO-DO: adQuery is breaking this somehow
		//adFrame.src = 'http://iacas.adbureau.net/hserver/site=collegehumor.com/pageid='+Math.round(Math.random() * 1000000)+'/random='+Math.round(Math.random() * 1000000)+'/'+adQuery+'/aamsz='+adWidth+'x'+adHeight;
		adFrame.width = adWidth;
		adFrame.height = adHeight;
		adFrame.scrolling = 'no';
		adFrame.frameBorder = 0;
		adFrame.marginHeight = 0;
		adFrame.marginWidth = 0;
		
		$(divName).update('');
		$(divName).appendChild(adFrame);
	
	}
	
}

function reloadAds(units) {
	// create the ad exec space if it doesnt already exist
	if($('ad_exec')) {
		$('ad_exec').update('');
	} else {
		var div = document.createElement('div');
		div.id = 'ad_exec';
		div.style.height = 0;
		div.style.overflow = 'hidden';
		
		document.body.appendChild(div);
	}
	
	var pageId = Math.round(Math.random() * 1000000);
	
	units.each(function(unit) {

		var adFrame = document.createElement('iframe');
		adFrame.src = '/etc/load_ad.php?page_id=' + pageId + '&unit=' + unit[1] + '&ad_query=' + escape(adQuery);
		
		// get the unit size and div container
		if(unit[0] == '') {
			width = 100;
			height = 100;
			
			divName = 'ad_exec';
		} else {
			var split = unit[1].split('x');
			width = split[0];
			height = split[1];
			
			divName = unit[0];
			$(divName).update('');
		}
		
		adFrame.width = width;
		adFrame.height = height;
		adFrame.scrolling = 'no';
		adFrame.frameBorder = 0;
		adFrame.marginHeight = 0;
		adFrame.marginWidth = 0;
		
		$(divName).appendChild(adFrame);
	});
}

// Facebook share
function fbs_click() {
	u = location.href;
	t = document.title;
	void(window.open('http://www.facebook.com/sharer.php?u='+encodeURIComponent(u)+'&t='+encodeURIComponent(t),'sharer','toolbar=no,width=626,height=436'));
	return false;
};

function share_email_toggle()
{
	Element.addClassName('share_embed_expand', 'hide');
	Element.toggleClassName('share_email_expand', 'hide');
}

function share_embed_toggle()
{
	Element.addClassName('share_email_expand', 'hide');
	Element.toggleClassName('share_embed_expand', 'hide');
}

function share_email_to_friend(div_to_update) {
	var share_to = $F('share_to');
	var share_from = $F('share_from');
	
	var validator = new email_validator(share_from, ',');
	if (!validator.check()) {
		var msg = 'Your email address is invalid.';
		$('email_to_friend_error').style.display = 'block';
		$('email_to_friend_error').innerHTML = msg;
			
		return false;
	}
	
	validator = new email_validator(share_to, ',');
	
	if (!validator.check()) {
		var msg = 'The following email addresses that you entered are not correctly formatted:<br />';
		
		while (validator.invalid.length)
			msg += ' - ' + validator.invalid.pop() + '<br />';
		
		$('email_to_friend_error').style.display = 'block';
		$('email_to_friend_error').innerHTML = msg;
			
		return false;
	}
	
	new Req.ajax({
		url: "/ajax/media/email_friend/",
		div: div_to_update,
		options: {
			parameters: Form.serialize('email_to_friend_form')
		}
	});
}

// POLL - Save vote
function save_vote(poll_frm) {	
	var frm = $(poll_frm);
	
	var pars = Form.serialize(poll_frm);

	new Req.ajax({
		url: '/ajax/poll/save_vote',
		options: {
			parameters: pars,
			onFailure: function() {
				alert('There was an error saving your vote. Please try again,');
			},
			onComplete: function() {
				commentButton.disabled = false;
				commentButton.value = defaultButtonValue;
			}
		}
	});

}

// Goto page
function goToPage(url){
	document.location.href = "http://" + document.location.hostname  + url;
}


// ENTER CONTEXT
function enter_context(context) {
	createCookie('context', context);
}


// SET VIEW IN CONTEXT
function set_view_in_context(node_id, parent_id, comment_id){
	createCookie('focus_user_comment',true);
	createCookie('user_comment_id', comment_id);
	createCookie('parent_comment_id', parent_id);
	createCookie('comment_node_id', node_id);	
}

// Submit Survey
function submit_survey(form_obj) {
	var post_values = Form.serialize(form_obj);

	new Req.ajax({url: '/ajax/survey/submit', options: {parameters: post_values}});
}
	
// PopUp
function popUp(URL, theWidth, theHeight) {
	day = new Date();
	id = day.getTime();
	var left = (screen.width - theWidth) / 2;
	var top = (screen.height - theHeight) / 2;
	eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+theWidth+",height="+theHeight+",left="+left+",top="+top+"');");
}


// Load AD
function load_ad(name, width, height, rating, div) {
	$(div).innerHTML = '<iframe src="/ad/' + rating + '/' + width + '/' + height + '/' + name + '" width=' + width + ' height=' + height + ' scrolling=no frameborder=0 marginwidth=0 marginheight=0></iframe>';
}


// Load 2
function load_ad2(div, width, height, ad_id) {
	$(div).innerHTML = '<iframe src="/ad:'+ad_id+'" width="'+width+'" height="'+height+'" scrolling=no frameborder=0 marginwidth=0 marginheight=0></iframe>';
}



function dToggle(whichOne) { //* DEPRICATED - use Element.toggle
	Element.toggle(whichOne);
}


function altToggle() {
	$(arguments[0]).style.display = '';
	
	for(i=1; i<arguments.length; i++) {
		$(arguments[i]).style.display = 'none';
	}
}


function altSelect(selectID, unselect_array) {
	$(selectID).addClassName('selected');
	for(var i=0; i < unselect_array.length; i++){
		$(unselect_array[i]).removeClassName('selected');
	}
}


function dSelect(element, className) {
	element = $(element);
	
	element.hasClassName(className) ? element.removeClassName(className) : element.addClassName(className);
}


function altSelectThumb(selectID, unselect_array) {
	$(selectID).addClassName('selectedthumb');
	for(var i=0; i < unselect_array.length; i++){
		$(unselect_array[i]).removeClassName('selectedthumb');
	}
}


function createCookie(name, value, days) {

  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
    }
  else var expires = "";
  document.cookie = name+"="+value+expires+"; path=/; domain=" + Vars.cookie_domain;
}


function readCookie(name) {
  var ca = document.cookie.split(';');
  var nameEQ = name + "=";
  for(var i=0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1, c.length); //delete spaces
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
  return null;
}


function checkAll(frm, field, option) {
		
	value = option.checked? true:false;

	for (var i=0;i<frm.elements[field].length;i++) {
		if(value == true) {
			frm.elements[field][i].checked = true
		} else {
			frm.elements[field][i].checked = false
		}
	}
}

function autoTab(inp, count)
{
	if(inp.value.length == count){
		var i = 0;
		var found = false;
		while(i < inp.form.length && found == false){
			if(inp.form[i] == inp) {
				found = i;
			} else {
				i++;
			}
		}
		if(inp.value * 1 == inp.value)
			inp.form[found+1].focus();
	}
}


function traverseBFF(current_key, partner_count){
		
	this.current_key = current_key;
	this.partner_count = partner_count;
	
	this.move = function(direction) {
		if(direction=="next"){
		
			$('bff_partner_'+this.current_key).style.display="none";
			
			if (this.current_key == this.partner_count-1){
				$('bff_partner_0').style.display="block";
				this.current_key = 0;
			} else {
				$('bff_partner_'+(this.current_key+1)).style.display="block";
				this.current_key++;
			}
		
		} else if(direction == "previous"){	
		
			$('bff_partner_'+this.current_key).style.display="none";
			
			if (this.current_key == 0){
				$('bff_partner_'+(this.partner_count-1)).style.display="block";
				this.current_key = this.partner_count-1;
			} else {
				$('bff_partner_'+(this.current_key-1)).style.display="block";
				this.current_key--;
			}
		
		}
	}
	
}


/************************************/
// Email validator
/************************************/ 

/* This javascript class is partnered with the backened php version
   located in ch6.class.email_validator.php.
   First, correct the String object by adding the trim method.
   I found this fix here: http://www.crockford.com/javascript/remedial.html. */

function email_validator(addresses, sep){
	this.sep = sep;								// the seperator to use in string lists of email addresses
	this.addresses = addresses;		// input text
	this.invalid = new Array();		// holds invalid addresses
	this.filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
}

email_validator.prototype.check = function(){
	
	if (typeof this.addresses == 'object') {
			while (this.addresses.length) {
				tmp = this.addresses.pop();
				if (!this.is_valid_email_address(tmp)) {
					this.invalid.push(tmp);
				}
			}
		
	}
	else if (typeof this.addresses == 'string') {
			tmp = this.addresses.split(this.sep);
			if(tmp.length) {
				this.addresses = tmp;
				this.check();
			}
			else {
				return this.is_valid_email_address(this.addresses.trim());
			}
	}
	return (this.invalid.length) ? false : true;
};

email_validator.prototype.is_valid_email_address = function(x) {
	return this.filter.test(x.trim());
};


function chTracker(track)
{
	if(typeof(urchinTracker)=="function")
		return urchinTracker(track);		
}

function gTrack(track)
{
	return chTracker('_gTrack/' + track);
}

function navTrack(track)
{
	return chTracker('_gTrack/NAV8/' + track);
}

function activate_continuous_mode() {
	$('non_continuous_play_controls').innerHTML = 'continuous player is loading...';
	createCookie('continuous', true);
	window.location.reload();
}


function twitterBitlyShare(node_id, a)
{
	if(a.href=='javascript:void(0);'){

		var link_id = Element.identify(a);

		new Req.ajax({
			url: '/ajax/module/twitter_bitly_share',
			options: {
				parameters: 'node_id=' + node_id + '&link_id=' + link_id,
				onComplete: function() {
					void(window.open(a.href, 'sharer'));
				}
			}
		});

		return false;

	} else {

		return true;

	}
}

function footer_newsletter_signup()
{
	var form = $('footnewsform');

	var email = form.select('input')[0];
	var message = form.select('p')[0];
	var msg_id = Element.identify(message);
	var input_id = Element.identify(email);
		
	new Req.ajax({
		url: "/ajax/static/newsletter",
		options: {
			parameters: 'email=' + $F(email) + '&msg_id=' + msg_id + '&input_id=' + input_id
		}
	});
}

var timer;
function interval_reload_ads(interval) {
	var reload_units = new Array();
	reload_units = [['billboardAd', '300x250'], ['banner_header', '728x90']];
	
	// Install timer
	timer = setInterval(function() { ads.reload(reload_units); }, interval*1000);
}

function chmediabar(site) {
	if(!$('chmedia-links')) {
		var iframe = new Element('iframe', { src: 'http://www.collegehumor.com/chmediabar/?site=' + site, scrolling: 'no', 'frameborder': '0', id: 'chmedia-links' });
		Element.insert('body', { top: iframe });
	}
}
