function scheduler(params){
 	// Set object variables:
	// ---------------------------------------
 	this.base_url	= params.base_url || 'http://www.cartoonnetwork.com';
	this.timezone	= params.timezone || 'EST';
	this.day		= params.day || 1;
	this.url 		= params.url || this.base_url+'/cnschedule/xmlServices/'+this.day+'.'+this.timezone+'.xml';
	this.start		= params.start || 6;
	this.end		= params.end || 24;
	this.data		= {};
	this.time 		= '';
	this.days		= {};
	this.today 		= new Date();
	this.today 		= this.today.getDate(); 
	var t			= this;
	
	// Initialize this instance object:
	// ---------------------------------------
	this.init = function(params,callback){
		if((params != undefined) && params.update != undefined){
			t.url = t.base_url+'/cnschedule/xmlServices/'+t.day+'.'+t.timezone+'.xml'; 
		}
		jQuery('#schedule').html('<img style="margin:100px;" src="'+t.base_url+'/users/tools/img/loader_lg.gif" alt="" />');
		t.get_data({ url: t.url },function(d){
			t.parse_data({ data: d }, function(d){
				t.data = d;
				t.truncate_data({},function(){
					if(typeof callback == 'function'){ c = callback }else{ c = function(){} }
					t.format_data({},c);
				}); 
			});
		}); 
		t.set_times({},function(){
			for(var x in t.days){
				jQuery('#day'+x+'').attr('date',t.days[x].getDate());
				jQuery('.dayTxt',jQuery('#day'+x+'')[0]).text(t.get_day({ day: t.days[x].getDay() }));
				jQuery('.dateTxt',jQuery('#day'+x+'')[0]).text(t.get_month({ month : t.days[x].getMonth() }) + ' ' + t.days[x].getDate());
			}
		});
		t.set_timezone();
	} 
	
	// Show more shows for a show:
	// ---------------------------------------
	this.show_more = function(params,callback){
		params.title 	= t.data[params.key].title;
		params.show 	= t.data[params.key].showId;
		params.name 	= t.data[params.key].title;
		var url 		= t.base_url+'/cnschedule/xmlServices/ScheduleServices?methodName=getAllShowings&showId='+
		params.show+'&title='+params.title+'&name='+params.name+'&timezone='+t.timezone;
		
		if(jQuery(params.thi).attr('direction') == 'down'){
			jQuery('.seeAllTxt',jQuery('#schedule')[0]).attr('direction','down');
			jQuery('#show_more_'+params.key,jQuery('#schedule')[0]).html('Loading..');
			jQuery('.show_more_div',jQuery('#schedule')[0]).html('');
			jQuery('.show_more_div',jQuery('#schedule')[0]).hide();
			jQuery('img',jQuery('.seeAllTxt')).attr('src',t.base_url+'/tools/img/schedule/arrowDown.png');
			t.get_data({url:url},function(d){
				t.parse_more_data({ data:d },function(dt){ 
					t.format_more({ data:dt, key:params.key },function(){
						jQuery(params.thi,jQuery('#schedule')[0]).attr('direction','up');
						jQuery('img',jQuery(params.thi)[0]).attr('src',t.base_url+'/tools/img/schedule/arrowUp.png');
					});
				});
			}); 
		}else{
			jQuery(params.thi,jQuery('#schedule')[0]).attr('direction','down');
			jQuery('img',jQuery(params.thi)[0]).attr('src',t.base_url+'/tools/img/schedule/arrowDown.png');
			jQuery('#show_more_'+params.key,jQuery('#schedule')[0]).html('');
			jQuery('#show_more_'+params.key,jQuery('#schedule')[0]).hide();
		} 		
		
	} 
	
	// Format HTML for dropdowns:
	// ---------------------------------------
	this.format_more = function(params,callback){
		jQuery('.showRevealWrapperOn').remove();
		var html = '<div id="1Reveal" class="showRevealWrapperOn">';
		for(var x in params.data){ 
			if(parseInt(x) == x){
				html += 
				'<div class="revealLine">'+
					'<div class="srDate">'+
						'<span class="srDateTxt">'+params.data[x].date+'</span>'+
					'</div>'+
					'<div class="srTime">'+
						'<span class="srTimeTxt">';
						if(params.data[x].time.substr((params.data[x].time.length - 2)) == 'AM'){
							html += params.data[x].time.substr(0,(params.data[x].time.length - 3))+'a';
						}else{
							html += params.data[x].time.substr(0,(params.data[x].time.length - 3))+'p';
						}  
						html+='</span>'+
					'</div>'+
					'<div class="srEpi">'+
						'<span class="srEpiTxt">'+t.truncate_string({string:params.data[x].episode})+'</span>'+
					'</div>'+
				'</div>';
			}
		}
		html += '</div>';
		jQuery('#show_more_'+params.key).html(html);
		jQuery('#show_more_'+params.key).show();
		callback();
	}
	
	// Change current day tab:
	// ---------------------------------------
	this.change_day = function(params,callback){
		t.day = params.day;
		t.init({ update:true });
		jQuery('.dayWrapperOn').attr('class','dayWrapper');
		jQuery(params.thi).attr('class','dayWrapperOn');
	}
	
	// Change the current time zone:
	// ---------------------------------------
	this.change_timezone = function(params, callback){ 
		t.timezone = params.timezone;
		t.init({ update:true });
	}
	
	// Set timezone settings:
	// ---------------------------------------
	this.set_timezone = function(params,callback){
		if (t.timezone == "HST") {
			if (serverTime.indexOf('EDT') > -1) {
				t.offset = -5;
			} else {
				t.offset = -6;
			}
		} else if (t.timezone == "PST") {
			t.offset = -3;
		} else if (t.timezone == "MST") {
			t.offset = -2;
		} else if (t.timezone == "CST") {
			t.offset = -1;
		} else {
			t.offset = 0;
		}
		var tdate 	= new Date();
		var time 	= tdate.getHours() - Math.abs(t.offset);
		if(time < 10){ time = '0'+time;}
		var hour 	= tdate.getMinutes();
		t.time 		= time+':'+hour;
	}
	
	// Set day tab contents:
	// ---------------------------------------
	this.set_times = function(params,callback){ 
		var todaysDate 	= new Date();
		var dayMScds 	= todaysDate.valueOf();
		var dayLimit 	= todaysDate.getDay();  
		for (i = 1; i < 8; i++){ 
			var nextDay = dayMScds + (86400000 * (i -1)); 
			t.days[i] = new Date(nextDay); 
		}
		callback();
	}
	
	// Strip off some data we dont need:
	// ---------------------------------------
	this.truncate_data = function(params,callback){
		var new_data 	= {};
		var count 		= 0; 
		for(var x in t.data){ 
			if(parseInt(x) == x && typeof t.data[x] != 'function'){
				var exp 	= t.data[x].military.split(':');
				var time 	= exp[0]; 
				var hour	= exp[1];
				if(t.day == t.today){
					var ti 	= t.time.split(':');
					var cur_hr = ti[0];
					var cur_mn = ti[1];
					if(parseInt(cur_mn) > 30){ var hr = '30'; }else{ var hr = '00'; }
					if((time >= cur_hr && time <= t.end)){
						if(time == cur_hr){
							if(hour >= hr){
								new_data[count] = {};
								new_data[count] = t.data[x];
								count++;
							}
						}else{
							new_data[count] = {};
							new_data[count] = t.data[x];
							count++;
						}
					}
				}else if(time >= t.start && time <= t.end){
					new_data[count] = {};
					new_data[count] = t.data[x];
					count++;
				} 
			}
		}
		t.data = new_data; new_data = undefined;
		callback();
	} 
	
	// Format HTML for schedule:
	// ---------------------------------------
	this.format_data = function(params,callback){ 
		var html = '';
		var adult = false;
		for(var x in t.data){
			if(parseInt(x) == x){
				html += 
				'<div class="showWrapper">'+
					'<div class="showOn">';
					if(t.day == t.today && x == 0){
						html += '<img src="'+t.base_url+'/tools/img/schedule/tab_on.png" alt="" />'; 
					}
					if(t.data[x].title == '[AdultSwim]' && adult == false){ 
						html += '<img src="'+t.base_url+'/tools/img/schedule/tab_as.png" alt="" />'
						adult = true; 
					}
					html += '</div>'+
					'<div class="showTime">'+
						'<span class="timeTxt">'+t.get_time({x:x})+'</span>'+
					'</div>'+
					'<div class="showRating">'+
						 t.get_img({x:x})+
					'</div>'+
					'<div class="showTitles" spry:choose="choose">'+
						t.get_title({x:x})+
					'</div>'+
					'<div class="allShowingsBtnUp">';
						if(t.data[x].title != '[AdultSwim]'){
							html += '<span class="seeAllTxt" rel="'+x+'" direction="down">See All Showings <img src="'+t.base_url+'/tools/img/schedule/arrowDown.png" width="10" height="7" alt="" border="0" /></span>';
						}
					html += '</div>'+
				'</div><div id="show_more_'+x+'" class="show_more_div"></div>';
			}
		}
		jQuery('#schedule').html(html);
		//jQuery('#schedule').hide().slideDown(300);
		callback();
	}
	
	// Convert show_more XML to JSON Object:
	// ---------------------------------------
	this.parse_more_data = function(params,callback){
		var data 	= params.data; params.data = '';
		var parsed 	= {};
		var count 	= 0; 
		jQuery(data).find('show').each(function() {
		
			parsed[count] 				= {}; 
			parsed[count].date 			= jQuery(this).attr('date');
			parsed[count].episode 		= jQuery(this).attr('episode');
			parsed[count].time 			= jQuery(this).attr('time'); 
			
			count++;
		}); 
		callback(parsed);
	}
	
	// Convert all the XML to JSON Object:
	// ---------------------------------------
	this.parse_data = function(params,callback){
		var data 	= params.data; params.data = '';
		var parsed 	= {};
		var count 	= 0; 
		jQuery(data).find('show').each(function() {
		
			parsed[count] 				= {}; 
			parsed[count].title 		= jQuery(this).attr('title');
			parsed[count].urlName 		= jQuery(this).attr('urlName');
			parsed[count].time 			= jQuery(this).attr('time');
			parsed[count].path 			= jQuery(this).attr('path');
			parsed[count].showId 		= jQuery(this).attr('showId');
			parsed[count].episodeId 	= jQuery(this).attr('episodeId');
			parsed[count].episodeName 	= jQuery(this).attr('episodeName');
			parsed[count].isFeatured 	= jQuery(this).attr('isFeatured');
			parsed[count].blockName 	= jQuery(this).attr('blockName');
			parsed[count].date 			= jQuery(this).attr('date');
			parsed[count].military 		= jQuery(this).attr('military');
			parsed[count].rating 		= jQuery(this).attr('rating');
			parsed[count].weekday 		= jQuery(this).attr('weekday');
			
			count++;
		}); 
		callback(parsed);
	}
	
	// Format title for HTML:
	// ---------------------------------------
	this.get_title = function(params){
		if(t.data[params.x].path != ''){
			return '<a href="'+t.data[params.x].path+'"><span class="showName">'+t.data[params.x].title+
			'</span> <span class="epiName">'+t.truncate_string({string:t.data[params.x].episodeName})+'</span></a>';
		}else{
			var r = '<span class="showName">'+t.data[params.x].title+'</span> <span class="epiName">';
			if(t.data[params.x].title != '[AdultSwim]'){
				r+= t.truncate_string({string:t.data[params.x].episodeName});
			}
			r += '</span>';
			return r;
		}
	}
	
	// Format time for HTML:
	// ---------------------------------------
	this.get_time = function(params){
		if(t.data[params.x].time.substr((t.data[params.x].time.length - 4)) == 'a.m.'){
			return t.data[params.x].time.substr(0,(t.data[params.x].time.length - 5))+'a';
		}else{
			return t.data[params.x].time.substr(0,(t.data[params.x].time.length - 5))+'p';
		} 
	}
	
	// Format image for HTML:
	// ---------------------------------------
	this.get_img = function(params){
		if(t.data[params.x].rating != ''){
			return '<img src="'+t.base_url+'/tools/img/schedule/ratings/'+
			t.data[params.x].rating+'.gif" width="30" height="30" alt="" border="0">';
		}else{
			return '<img src="http://i.cdn.turner.com/toon/tools/img/pixel.gif" width="30" height="30" alt="" border="0">';
		}
	}
	
	// Truncate a string:
	// ---------------------------------------
	this.truncate_string = function(params){
		var length = params.length || 87;
		if(params.string.length > length){
			return params.string.substr(0,length)+'...';
		}else{
			return params.string;
		}
	}
	
	// Convert number to day:
	// ---------------------------------------
	this.get_day = function(params){ 
		var weekday=new Array(7);
			weekday[0]="Sunday";
			weekday[1]="Monday";
			weekday[2]="Tuesday";
			weekday[3]="Wednesday";
			weekday[4]="Thursday";
			weekday[5]="Friday";
			weekday[6]="Saturday";
		return weekday[params.day];
	}
	
	// Convert number to month:
	// ---------------------------------------
	this.get_month = function(params){
		var month=new Array(12);
			month[0]="January";
			month[1]="February";
			month[2]="March";
			month[3]="April";
			month[4]="May";
			month[5]="June";
			month[6]="July";
			month[7]="August";
			month[8]="September";
			month[9]="October";
			month[10]="November";
			month[11]="December";
		return month[params.month];
	}
	
	// Do an AJAX Call:
	// ---------------------------------------
	this.get_data = function(params,callback){ 
		jQuery.get(params.url,function(d){
			callback(d);
		},'xml'); 
	}

}
