
function HotlistHub(){
	
}
window["_hub"] = new HotlistHub();

//--------------------------------------------------------
_hub["navigate"] = function(strType){

	switch(strType){
		case "up":
		
			if(_data.atIndex != 0){
				_data.atIndex -= 1;
				_page.openAt(_data.atIndex);
			}
		
			break;
		case "down":
		
			if(_ctx.cache("ats", "#divAtList").find("#divAt" + (_data.atIndex + 1)).length > 0){
				_data.atIndex += 1;
				_page.openAt(_data.atIndex);
			}
		
			break;
		default:
			log("unhandled strType (8230800)");
			break;
	}
	
};

//--------------------------------------------------------
_hub["changeCity"] = function(prms){

	test.require(prms.id, "prms.id is required (2258248)");
	test.require(prms.name, "prms.name is required");
	if(test.ok()){
		$.post('/act/add_network/', {'nid': prms.id}, function(data, status) {
				
			_data.city_name = data.name;
			_data.city_lat = data.latitude;
			_data.city_lon = data.longitude;
			_data.city_radius = data.radius;
			crs.lat_set(data.latitude);
			crs.lon_set(data.longitude);
			crs.radius_set(data.radius);
			//_data.radius = data.radius;
			
			//TRACK
			track("hub", "changeCity", _data.city_name, 2378698);
			
			if($('#city_tab').html() != null) {
				$('#city_tab').html(_data.city_name);
				_page.dialog.jqmHide();
	
				log("refresh social feed (5314889)");
				try{
					_feed.changeDate({dt: crs.dt()});
				} catch(err) {
					
				}
			} else {
				window.parent.location.reload();
			}
			
		}, 'json');	
	}

};

//--------------------------------------------------------
_hub["filter"] = function(li){
	
	log("_hub.filter() (7216090)");

	//GET MENU AND VALUE 
	var menu = li.closest("div.menu");
	var value = li.html();

	//NOT FOR MENU BUTTONS
	if(!li.hasClass("btn_container")){

		//SELECT / DESELECT LIs
		menu.find("li").removeClass("selected");
		li.addClass("selected");

		//SHOWHIDE li.default
		if(li.hasClass("default")){
			menu.removeClass("set");
			value = menu.hasClass("who") ? "Who" : "What"; //OVERRIDE THE VALUE THAT WILL BE USED AS THE MENU TITLE
		}
		else{
			menu.addClass("set");
			if(value.length > 15){value = value.substr(0, 12) + "...";}
		}
	
		//MOVE DROP DOWN WAYYYY LEFT, WHICH WILL CLOSE THE MENU SINCE THE USER WON'T BE HOVERING ANYMORE		
		menu.find("div.text").html("&nbsp;&nbsp;" + value + "&nbsp;&nbsp;");
		menu.find("div.drop_down").css("left", "-10000px");
	
		//SET NEW KEY
		if(menu.hasClass("who")){
			var flid = "";
			$(li.attr("class").split(" ")).each(function(i, category){
				if(category.indexOf("flid") != -1){
					flid = category.replace("flid", "");
				}
			});
			_settings.set("hub.who", flid);
			crs.who_set(flid);
		}
		else{
			var cat = "";
			$(li.attr("class").split(" ")).each(function(i, category){
				if(category.indexOf("cat") != -1){
					cat = category.replace("cat", "");
				}
			});
			_settings.set("hub.what", cat);
			crs.what_set(cat);
		}

		//RELOAD DATA
		_feed.changeDate({dt: crs.dt(), callback: function(){
			
			log("feed reloaded from hl.hub.js, crs.page().length ==... (2980948)");
			log(crs.page().length);
			
		}});
		

	}
	else{
		//log("clicked on a button container... (6156615)");
	}
	
};

//--------------------------------------------------------
_hub["setupMapFilters"] = function(){
	
	//HANDLE ITEM SELECTION
	_ctx.cache("mapControls", "#mapControls").find("div.menu")
	.bind("click blur", function(){
		setTimeout(function(){
			_ctx.mapControls.find("div.drop_down").css("left", "0px");
		}, 1000);
	})
	.end().find("ul.menu_items li").click(function(){
		_hub.filter($(this).blur());
	});
					
	//SELECT VALUES STORED IN THE COOKIE
	var fnSetupFilter = function(strFilter, strClassPrefix){

		var bolFound = false;
		var storedValue = _settings.getOrDefault("hub." + strFilter, -1);
		if(storedValue != -1){
			var menu = _ctx.mapControls.find("div." + strFilter);
			menu.find("li").each(function(i, li){
				li = $(li);
				if(li.hasClass(strClassPrefix + storedValue)){
					bolFound = true;
					li.addClass("selected");
					strHTML = li.html();
					if(strHTML.length > 15){
						strHTML = strHTML.substr(0, 12) + "...";
					}
					menu.addClass("set").find("div.text").html("&nbsp;&nbsp;" + strHTML + "&nbsp;&nbsp;");
				}
			});
		}
		if(!bolFound){_settings.set("hub." + strFilter, -1);}
		
	};

	//WHO & WHAT
	fnSetupFilter("who", "flid");
	fnSetupFilter("what", "cat");
	
};

//--------------------------------------------------------


function HotlistPlanner(){
	
	this.isMe = (_fb.viewing_user_id == _fb.user.uid);
	
	this.whatValue = "Add details..."; //this.isMe ? "What do you feel like doing?" : "Invite " + _fb.first_name + " to...";
	this.whatValueFocused = ""; // this.isMe ? "I want to..." :  "Let's...";
	this.shareText = this.isMe ? "Share on Facebook" : "Post on " + _fb.first_name + "'s Wall";
	this.whereText = this.isMe ? "Where are you going?" : "Invite " + _fb.first_name + " to...";
	this.whereTextFocused = this.isMe ? "Where are you going?" : "Where?";
	this.bolNameSet = false;
	this.postParams = {};
	
}
window["_planner"] = new HotlistPlanner();

//--------------------------------------------------------
_planner["setup"] = function(){

	//DEFAULT USERNAME	
	_fb.user.name = "Me";

	//HANDLE EXPANDING "Meet" AREA
	_ctx.cache("planner", "#divMeet", _ctx.page);
	if(isUsable(_ctx.cache("divMap", "#divMap", _ctx.left))){
		_ctx.planner.hover(function(){
			_ctx.divMap.css("z-index", "-1");
		}, function(){
			_ctx.divMap.css("z-index", "0");
		});
	}
	
	//WHERE?
	_planner.setup.where();

	//WHEN?
	_planner.setup.when();

	//WHAT?
	_planner.setup.what();

	//SHARE?
	if(true || !_planner.isMe){

		_ctx.planner.find("div.fb_share").show().click(function(){
			var divCheckbox = $(this).find("div.checkbox").toggleClass("on");
			var bolOn = divCheckbox.hasClass("on");
			_settings.set("plan.share", bolOn);
			//_ctx.planner.find("#hlPost").removeClass("f_post").removeClass("f_email").addClass(bolOn ? "f_post" : "f_email");
			_ctx.planner.find("#hlPost").removeClass("f_post").removeClass("f_disabled").addClass(bolOn ? "f_post" : "f_disabled");
		})
		.find("#divShareText").html("&nbsp;" + _planner.shareText);
		if(!_settings.getOrDefault("plan.share", true)){
			_ctx.planner.find("div.checkbox").removeClass("on");
			_ctx.planner.find("#hlPost").removeClass("f_post").addClass("f_disabled");
		}

	}

	//REQUEST USER INFO AFTER SHORT DELAY
	setTimeout(function(){
		
		//REQUEST USERNAME; IT'S USED WHEN PREVIEWING THE PLANNER
		var gettoUserInfo = {fbids: [_fb.user.uid], callback: function(){
			_fb.user.name = gettoUserInfo.rows[0].name;
			_fb.user.first_name = gettoUserInfo.rows[0].first_name;
			_fb.user.pic_square = gettoUserInfo.rows[0].pic_square;
		}};
		_fb.batchQuery([gettoUserInfo]);
		
	}, 1000);	
	
};

//--------------------------------------------------------
_planner.setup["where"] = function(){
	
	_planner.handlers = ["/autocomplete/where", "/autocomplete/where?lat=" + _data.lat + "&long=" + _data.lon];
	_ctx.cache("where", "#tbWhere", _ctx.planner).mouseup(function(e){
        	e.preventDefault(); //THIS PREVENTS THE MOUSEUP EVENT FROM DESELECTING THE TEXT IN WEBKIT
	}).val(_planner.whereText).focus(function(){

		//BEHAVE DIFFERENTLY ON A FRIEND'S PROFILE
		if($(this).val() == _planner.whereText){
			if(_planner.isMe){
				$(this).val("");
			}
			else {
				$(this).val(_planner.whereTextFocused).select();
			}
		}

		//TRACK
		track("planner", "focus", "", 9663863);
		
		//ADD THE "on" CLASS, OPENING THE PLANNER
		_ctx.planner.addClass("on");
		
	}).blur(function(){
		
		//IF THE TEXT HASN'T CHANGED,
		var val = $(this).val();
		if(val == "" || val == _planner.whereText || val == _planner.whereTextFocused){
			$(this).val(_planner.whereText);
		}
		
	}).keypress(function(e){
		if(e.keyCode != 9 && e.keyCode != 13){
			//log("e.keyCode == " + e.keyCode + " (8039869)");
			
			_planner.postParams.where_type = "user";
			_planner.postParams.where = null;
			_planner.postParams.where_data = null;
		}
		else{

			//UPDATE THE MAP PREVIEW
			_planner.updateMapPreview();
			
		}
	})
	.keyup(function(e){
		//NOT IF IT'S AN ARROW KEY, TAB OR ENTER
		if(e.keyCode != 38 && e.keyCode != 40 && e.keyCode != 9 && e.keyCode != 13){
			_planner.updateDisplay({venue: _ctx.where.val()});
		}
	})
	.autocomplete({
		minLength: 1,
		search: function(event, ui){
			_ctx.where.addClass("searching");
			
			//TRACK
			if(!isUsable(_planner.trackedAutocompleteSearch)){
				_planner.trackedAutocompleteSearch = true;
				track("planner", "searching", "", 3295216);
			}
			
		},
		select: function(event, ui){
			
			_planner.postParams.where_type = "google";
			_planner.postParams.where = ui.item.value;
			_planner.postParams.where_data = ui.item.google_local_data;
		
			//UPDATE THE MAP PREVIEW
			_planner.updateMapPreview();

		},
		open: function(event, ui){
			_ctx.where.removeClass("searching");
		},
		focus: function(event, ui){
			_planner.postParams.where_type = "google";
			_planner.postParams.where = ui.item.value;
			_planner.postParams.where_data = ui.item.google_local_data;
		}
	});
	_planner.setAutocompleteHandler();

};

//--------------------------------------------------------
_planner.setup["when"] = function(){
	
	//"When?" DATE
	_ctx.cache("tblOptionsWhen", "#tblOptionsWhen", _ctx.planner);
	_ctx.cache("when_date", "div.when_date", _ctx.tblOptionsWhen).find("li").click(function(){
		_ctx.when_date.find("li").show();
		if ($(this).hasClass("none")) {
			_ctx.when_date.find("li.none").hide();
			_ctx.when_date.find("div.text").html("<span class='gray'>When?</span>"); 
			_planner.closeDropDown(_ctx.when_date);
			_planner.updateDisplay({});
		}
		else if(!$(this).hasClass("datepicker")){
			var strValue = $(this).html();
			_ctx.when_date.find("div.text").html(strValue); //.closest("div.selection").effect("highlight", {}, 1500);
			_planner.closeDropDown(_ctx.when_date);
			if(strValue != "Today"){
				_ctx.when_time.find("li.now").hide();
				if(_ctx.when_time.find("div.text").html() == "Now"){ //IF "Now" WAS SELECTED, CHANGE IT
					_ctx.when_time.find("div.text").html("Anytime"); 
				}
			}
			_planner.updateDisplay({});
		} 

	});
	_ctx.tblOptionsWhen.find("#divWhenDate").datepicker({
		onSelect: function(dateText, inst){
			
			//SET THE DISPLAY TEXT
			_ctx.when_date.find("div.text").html(dateText); //.closest("div.selection").effect("highlight", {}, 1500);
			
			//HACK!! PLANNER CLOSES AFTER SELECTING A DATE; USE AN ALTERNATE CLASS TO KEEP IT OPEN 
			_ctx.planner.addClass("very_on");
			setTimeout(function(){
				_ctx.planner.addClass("on");
				_ctx.planner.removeClass("very_on");
			}, 1000);
			
			//CLOSE THE DROP-DOWN
			_planner.closeDropDown(_ctx.when_date);
			
			//UPDATE DISPLAY
			_planner.updateDisplay({});
			
		}
	});

	//"When?" TIME
	_ctx.cache("when_time", "div.when_time", _ctx.tblOptionsWhen).find("#ulWhenTime > li").click(function(e){ //THIS IS THE OUTER UL (Today, This week, etc.)
		_ctx.when_time.find("li.none").show();
		if ($(this).hasClass("none")) {
			_ctx.when_time.find("li.none").hide();
			_ctx.when_time.find("div.text").html("<span class='gray'>Time?</span>"); 
			_planner.closeDropDown(_ctx.when_time);
			_planner.updateDisplay({});
		}
		else if ($(this).hasClass("timepicker")) { //THIS LI IS PART OF THE TIMEPICKER
			log($(e.target));
		}
		else{ 
			_ctx.when_time.find("div.text").html($(this).html()); 
			_planner.closeDropDown(_ctx.when_time);
			_planner.updateDisplay({});
		}
	});
	_ctx.when_time.find("#ulWhenTime ul li").click(function(){ //THIS IS THE INNER UL (1:15, 9:30, etc.)
	
		var li = $(this);
		var time = {hour: -1, minute: -1, am: false};
		var ulHour = li.closest("#hour");
		var ulMinute = li.closest("#minute");
		var ulAMPM = li.closest("#ampm");
		if(ulHour.length > 0){ulHour.find("li").removeClass("selected");}  //hour
		else if(ulMinute.length > 0){ulMinute.find("li").removeClass("selected"); }  //minute
		else {ulAMPM.find("li").removeClass("selected"); } //ampm
		li.addClass("selected");

		//SHOW INDICATION THAT THE TIME HAS CHANGED
		_ctx.when_time.find("div.selection").effect("highlight", {}, 1500);

		//UPDATE THE DISPLAY
		_planner.updateDisplay({time: true});
		
	});
	//IF THE SCREEN IS TOO SMALL, SCROLL THE TIME PICKER INTO VIEW
	_ctx.when_time.find("li.timepicker").hover(function(){
		if($(window).height() < 720){
			$.scrollTo(_ctx.tblOptionsWhen, 1000);
		}
	}, function(){
		//log("hover out timepicker (7012475)");
	});
	_ctx.when_time.find("#divTimeOK").click(function(){
		
		//UPDATE THE DISPLAY
		_planner.updateDisplay({time: true});

		//CLOSE THE DROP-DOWN
		_planner.closeDropDown(_ctx.when_time);
		
		//SELECT THE "Where" BOX
		_ctx.where.select();
		
	});

};

//--------------------------------------------------------
_planner.setup["what"] = function(){
	
	_ctx.cache("what", "#tbWhat", _ctx.planner).defaultvalue(_planner.whatValue).focus(function(){
		//NOTHING NOW
	})
	.keyup(function(){
		_planner.updateDisplay({what: true});
	})
	.mouseup(function(e){
		e.preventDefault();
	})
	.blur(function(){
		if($(this).val() == _planner.whatValueFocused || $(this).val() == ""){
			$(this).val(_planner.whatValue);
		}
	});
	$("body").click(function(e){ //FOR ANY CLICKS NOT WITHIN THE MEET AREA, COLLAPSE THE NEW MEETING
		var clicked = $(e.target);
		if(		clicked.closest("#divMeet").length == 0 
			&& 	clicked.closest(".ui-datepicker-header").length == 0
			&& 	clicked.closest(".ui-state-default").length == 0
			&& 	clicked.closest(".ui-widget").length == 0
			){
			_ctx.planner.removeClass("on");
		}
	});

};

//--------------------------------------------------------
_planner["initializePreview"] = function(){
	
	//EXPAND THE TEMPLATE
	var preview = {};
	preview.uid = _fb.user.uid;
	preview.username = _fb.user.name;
	preview.what = (_ctx.what.val() != _planner.whatValue) ? _ctx.what.val() : "";
	preview.when = "";
	preview.address = (_ctx.where.val() != _planner.whereText) ? _ctx.where.val() : "";
	preview.map = "/images/clear.gif";
	var template = _tmpl.planner();
	_ctx.previewContainer.html(template.expand(preview));
	
};

//--------------------------------------------------------
_planner["updateDisplay"] = function(prms){ // (1365088)

	//OPEN PLANNER IN CASE IT'S NOT ALREADY
	_ctx.planner.addClass("on");

	//prms.time
	//prms.where
	//prms.who
	var prms = isUsable(prms, {});
	
	//INITIALIZE?
	if(_ctx.cache("previewContainer", "#previewContainer", _ctx.planner).find("#what").length == 0){
		_planner.initializePreview();
	}
	
	//UPDATE USERNAME?
	if(!_planner.bolNameSet && (_fb.user.name != "Me")){
		_ctx.previewContainer.find("#username").html(_fb.user.name);
		_planner.bolNameSet = true;
	}
	
	//UPDATE TIME?
	var strTime = _ctx.when_time.find("div.text").html();
	if(prms.time){
		
		//GET TIME VALUES
		var strHour = _ctx.when_time.find("#hour li.selected").html();
		var strMinute = _ctx.when_time.find("#minute li.selected").html();
		var strAMPM = _ctx.when_time.find("#ampm li.selected").html();
		strTime = strHour + strMinute + " " + strAMPM;
		
		//UPDATE THE TIME DISPLAY
		_ctx.when_time.find("div.text").html(strTime); 
		
	}
	
	//UPDATE MESSAGE
	_planner.updateMessage();
	
	//UPDATE WHAT?
	var strWhatValue = "";
	if(prms.what && (_ctx.what.val() != _planner.whatValue)){
		strWhatValue = _ctx.what.val();
		_ctx.previewContainer.find("#what").html(strWhatValue);
	}
	
	//UPDATE VENUE?
	if(isUsable(prms.venue)){
		$(_ctx.previewContainer.find("#address").html("").end().find("#previewMap img").attr("src", "/images/clear.gif").removeClass("sq90").end().find("span.pl_venue").html(prms.venue)[0]).prepend((prms.venue != "" && strWhatValue != "") ? "at ": "");
	}
	if(isUsable(prms.address)){
		_ctx.previewContainer.find("#address").html("www.thehotlist.com<br/>" + prms.address);
	}

	//UPDATE MAP?
	if(isUsable(prms.map)){
		_ctx.previewContainer.find("#previewMap img").addClass("sq90").attr("src", prms.map);
	}
	
};

//--------------------------------------------------------
_planner["updateMapPreview"] = function(){
	
	//MAKE DISPLAY UPDATE PARAMETERS
	var gdata = _planner.postParams.where_data;
	if(isUsable(gdata)){
		
		var prms = {where: true};
				
		//GET VENUE DETAILS
		prms.venue = isUsable(gdata.name, "");
		prms.address = gdata.street + ", " + gdata.city + ", " + gdata.state;
	
		//MAKE MAP URL
		var host = document.location.toString();
		if(host.indexOf("localhost") > -1){host = "http://www.thehotlist.com";}
		else{var iEnd = host.indexOf(".com") + 4;host = host.substr(0, iEnd);}
		gdata.host = host;
		var template = _tmpl.mapPreviewURL();
		prms.map = template.expand(gdata);
	
		//UPDATE THE DISPLAY
		_planner.updateDisplay(prms);
		
	}
	
};

//--------------------------------------------------------
_planner["closeDropDown"] = function(ctx){
	
	//MOVE DROP DOWN WAYYYY LEFT, WHICH WILL CLOSE THE MENU SINCE THE USER WON'T BE HOVERING ANYMORE		
	var ddl = ctx.find("div.drop_down").css("left", "-10000px");
	setTimeout(function(){
		ddl.css("left", "0");
	}, 1000);
	
};

//--------------------------------------------------------
_planner["post"] = function(fnCallback){
	
	//CHECK SHARING VALUE FIRST
	_planner.postParams.share = _ctx.planner.find("div.checkbox").hasClass("on");
	if(_planner.postParams.share){
		
		//TARGET
		_planner.postParams.target_uid = isUsable(_fb.viewing_user_id) ? _fb.viewing_user_id : _fb.user.uid;
		
		//WHAT
		_planner.postParams.what = _ctx.what.val();
		if(_planner.postParams.what == _planner.whatValue){
			_planner.postParams.what = "";
		}
		
		//WHEN
		_planner.postParams.when_date = _ctx.when_date.find("div.text").stripHTML();
		if(_planner.postParams.when_date.indexOf("?") != -1){
			_planner.postParams.when_date = "";
		}
		else if(_planner.postParams.when_date.indexOf("/") != -1){
			_planner.postParams.when_date = _utils.parseAndFormatDate(_planner.postParams.when_date, "/", "-");
		}
		_planner.postParams.when_time = _ctx.when_time.find("div.text").stripHTML();
		if(_planner.postParams.when_time.indexOf("?") != -1){
			_planner.postParams.when_time = "";
		}
	
		//WHERE	
		if(!isUsable(_planner.postParams.where) && _ctx.planner.find("#tbWhere").val() != _planner.whereText){
			_planner.postParams.where = _ctx.planner.find("#tbWhere").val();
		}
		
		//STRIP HTML FROM MESSAGE
		var msg = _ctx.previewContainer.find("#divMessage").clone();
		msg.find("#username").remove();
		_planner.postParams.msg = msg.stripHTML();
		
		//NOTIFICATION
		var fnSubmitted = function(){
			growl("", "<span class='f16'>Your plans have been updated!</span>");
		};
		
		//DOES THIS USER HAVE PERMISSION TO POST?
		if(_fb.user.perms.publish_stream){
	
			//log("Parameters for _planner.post: (3755845)");
			//log(_planner.postParams);
	
			//SHOW LOADING GRAPHIC & POST
			_planner.loading();
			$.post('/profiles/meetup', _planner.postParams, function(result) {
				
				if(result.status == "success"){
					
					//TRACK
					track("planner", "submitted", "", 2110904);
						
					//RESET
					_planner.reset();
						
					//NOTIFY
					fnSubmitted();
					
					//CALLBACK?
					tryCallback(fnCallback);
					
				}
				else{
					growl("Oops!", "There was a problem posting to Facebook. Please try again.");
					_ctx.planner.find("#loader").hide();
					log("problem posting planner (8987840)");
					log(data);
				}
	
			}, "json");
			
		
		}
		else{
				
			//REQUEST FB PERMISSION
			//growl("Must request FB permission", " (9010516)");
			// call Facebook Login, see http://developers.facebook.com/docs/reference/javascript/FB.login
			FB.login(function(response) {
				log(response);
				if(response.status == "connected"){
					
					log("available permissions: " + response.perms + " (1856171)");
					var perms = response.perms.split(",");
					$.each(perms, function(i, perm){
						_fb.user.perms[perm] = true;
					});
					
					if(_fb.user.perms.publish_stream) { 
					
						// update the server for permission
						$.post('/act/update_permissions', {uid: _fb.user.uid, perm: "publish_stream", value: true}, function(){}, 'json');
		
						//RE-POST
						_planner.post(); 
	
						//NOTIFY
						fnSubmitted();
						
					} else {
						growl("Sorry, I can't send this invite without your permission", "(9010517)");
					}
				} else {
					// user not logged in.
					growl("Sorry, you need to login to send an invite", " (9010517)");
				}
			}, {perms: 'publish_stream'});
		}
		
		
	}
	else{
		
		growl("", "<span class='f16'>You must click 'Share on Facebook' to use this feature.</span>");
		
	}

};

//--------------------------------------------------------
_planner["setAutocompleteHandler"] = function(){
	
	//INCLUDES OR EXCLUDES LAT & LON BASED ON THE PAGE & TAB WE'RE ON
	var iHandlerIndex = 0;
	if(isUsable(_data.lat) && (_settings.getOrDefault("h.tab", "city") == "loc")){
		iHandlerIndex = 1;
	}
	_ctx.planner.find("#tbWhere").autocomplete("option", "source", _planner.handlers[iHandlerIndex]);

};

//--------------------------------------------------------
_planner["loading"] = function(){
	
	_ctx.planner.find("#loader").show();
	
};

//--------------------------------------------------------
_planner["reset"] = function(){

	_ctx.planner.removeClass("on");
	_ctx.planner.find("#loader").hide();
	_ctx.what.val(_planner.whatValue);
	_ctx.when_date.find("div.text").html("Today");
	_ctx.when_time.find("div.text").html("Anytime");
	_ctx.where.val(_planner.whereText);
	_ctx.previewContainer.html("");
	
};

//--------------------------------------------------------
_planner["updateMessage"] = function(){

	//USE AN ARRAY SO WE CAN EASILY UPDATE WORDS WITHIN THE SENTENCE
	
	var strWhenDate = _ctx.when_date.find("div.text").html().toLowerCase();
	if(strWhenDate.indexOf("when?") != -1){strWhenDate = "when?";}
	var strWhenTime = _ctx.when_time.find("div.text").html().toLowerCase();
	if(strWhenTime.indexOf("time?") != -1){strWhenTime = "time?";}
	if(strWhenDate.indexOf("/") != -1){
		strWhenDate = _utils.parseAndFormatDate(strWhenDate, "/", "DN * m/d");
	}
	
	var html = [];
	
	switch(strWhenDate.toLowerCase()){
		case "when?":
			switch(strWhenTime){
				case "time?":
					//html.push("today.");
					break;
				case "anytime":
					//html.push("anytime today.");
					break;
				case "now":
					//html.push("now.");
					break;
				case "morning":
					//html.push("this morning.");
					break;
				case "afternoon":
					//html.push("this afternoon.");
					break;
				case "evening":
					//html.push("this evening.");
					break;
				case "night":
					//html.push("tonight");
					break;
				default: //A TIME
					//html.push("at " + strWhenTime);
		 			break;
			}
			break;
		case "today":
			switch(strWhenTime){
				case "time?":
					html.push("today.");
					break;
				case "anytime":
					html.push("anytime today.");
					break;
				case "now":
					html.push("now.");
					break;
				case "morning":
					html.push("this morning.");
					break;
				case "afternoon":
					html.push("this afternoon.");
					break;
				case "evening":
					html.push("this evening.");
					break;
				case "night":
					html.push("tonight");
					break;
				default: //A TIME
					html.push("at " + strWhenTime);
		 			break;
			}
			break;
		case "tomorrow":
			switch(strWhenTime){
				case "time?":
					html.push("tomorrow.");
					break;
				case "anytime":
					html.push("anytime tomorrow.");
					break;
				case "morning":
					html.push("tomorrow morning.");
					break;
				case "afternoon":
					html.push("tomorrow afternoon.");
					break;
				case "evening":
					html.push("tomorrow evening.");
					break;
				case "night":
					html.push("tomorrow night.");
					break;
				default: //A TIME
					html.push("tomorrow at " + strWhenTime);
		 			break;
			}
			break;
		case "this week":
			switch(strWhenTime){
				case "time?":
					html.push("this week.");
					break;
				case "anytime":
					html.push("anytime this week.");
					break;
				case "morning":
					html.push("this week in the morning.");
					break;
				case "afternoon":
					html.push("this week in the afternoon.");
					break;
				case "evening":
					html.push("this week in the evening.");
					break;
				case "night":
					html.push("this week at night.");
					break;
				default: //A TIME
					html.push("this week at " + strWhenTime);
		 			break;
			}
			break;
		case "this weekend":
			switch(strWhenTime){
				case "time?":
					html.push("this weekend.");
					break;
				case "anytime":
					html.push("anytime this weekend.");
					break;
				case "morning":
					html.push("this weekend in the morning.");
					break;
				case "afternoon":
					html.push("this weekend in the afternoon.");
					break;
				case "evening":
					html.push("this weekend in the evening.");
					break;
				case "night":
					html.push("this weekend at night.");
					break;
				default: //A TIME
					html.push("this weekend at " + strWhenTime);
		 			break;
			}
			break;
		case "someday...":
			switch(strWhenTime){
				case "time?":
					html.push("someday...");
					break;
				case "anytime":
					html.push("someday, anytime.");
					break;
				case "morning":
					html.push("someday in the morning.");
					break;
				case "afternoon":
					html.push("someday in the afternoon.");
					break;
				case "evening":
					html.push("someday in the evening.");
					break;
				case "night":
					html.push("someday at night.");
					break;
				default: //A TIME
					html.push("someday at " + strWhenTime);
		 			break;
			}
			break;
		default: //ON A DATE
			switch(strWhenTime){
				case "time?":
					html.push("on " + strWhenDate.replace("*", "") + ".");
					break;
				case "anytime":
					html.push("anytime on " + strWhenDate.replace("* ", "") + ".");
					break;
				case "morning":
					html.push("on " + strWhenDate.replace("*", "morning,") + ".");
					break;
				case "afternoon":
					html.push("on " + strWhenDate.replace("*", "afternoon,") + ".");
					break;
				case "evening":
					html.push("on " + strWhenDate.replace("*", "evening,") + ".");
					break;
				case "night":
					html.push("on " + strWhenDate.replace("*", "night,") + ".");
					break;
				default: //A TIME
					html.push("on " + strWhenDate.replace("* ", "") + " at " + strWhenTime);
		 			break;
			}
			break;
	}
	
	//UPDATE THE DISPLAY
	var whenHTML = html.join("");
	if(whenHTML != ""){
		whenHTML = "(" + whenHTML + ")";
	}
	_ctx.previewContainer.find("#when").html(whenHTML);
	
	
};

//--------------------------------------------------------


function HotlistDaypicker(){
	
}
window["_daypicker"] = new HotlistDaypicker();

//--------------------------------------------------------
_daypicker["setup"] = function(){
	
	_ctx.cache("daypicker", "#daypicker");

	//POPULATE DAYS
	_daypicker.populateDays(0);
	
	//HANDLE NAVIGATION BACK TO "Today"
	_ctx.daypicker.find("#hlToday").click(function(){
		$(this).blur();
		crs.dt_set(new Date());
		_daypicker.populateDays(0);
	});
	
	//HANDLE NAVIGATION BY WEEK
	_ctx.daypicker.find("div.cal_day_small_arrow a, div.cal_day_text a.right").click(function(){

		//NAVIGATE LEFT OR RIGHT?
		var bolLeft = $(this).blur().hasClass("left");
		var iDayBasis = bolLeft ? 0 : 6;
		var dtBasis = $(_ctx.cal_days[iDayBasis]).data("date");
		var iDayIncrement = bolLeft ? -7 : 1;
		var newDate = _utils.addDays(dtBasis, iDayIncrement);
		var iDayIndex = bolLeft ? 6 : 0;
		crs.dt_set(newDate);
		_daypicker.populateDays(iDayIndex);
		
	});
	
	//HANDLE NAVIGATION BY DAY
	_ctx.cal_days.click(function(){

		//REMOVE THE "on" CLASS FROM ALL THE DAYS
		_ctx.cal_days.removeClass("on");
		
		//GET THE DATE FROM THIS cal_day
		crs.dt_set(new Date($(this).data("date")));
		
		//ADD 'on' CLASS
		_ctx.cal_days.parent().find("div." + _utils.formatDate(crs.dt(), "dtkey")).addClass("on");

		//SELECT NEW DATE
		_feed.changeDate({dt: crs.dt()});
	
	});
	
};

//--------------------------------------------------------
_daypicker["populateDays"] = function(iDayToSelect){

	//USE LOCAL DATE VARIABLE
	var dt = new Date(crs.dt());
	var dates = [];

	//SETUP EACH OF 7 DAYS	
	var dtToday = new Date();
	_ctx.cache("cal_days", "div.cal_day_small", _ctx.daypicker).each(function(i, cal_day){
		
		dates.push(_utils.formatDate(crs.dt(), "-"));
		
		//CUSTOMIZE THIS CAL_DAY
		var strDatekey = _utils.formatDate(dt, "dtkey");
		var strDay = _utils.isFuzzyDate(dt, dtToday) ? "Today" : _utils.formatDate(dt, "dn");
		var strNumber = dt.getDate();
		$(cal_day).attr("class", "cal_day_small fl").data("date", dt).addClass(strDatekey).find("div.day").html(strDay).parent().find("div.number").html(strNumber);
		
		//INCREMENT THE DATE
		dt = _utils.addDays(dt, 1);
		
	});

	/* -- THIS IS PROBABLY UNNECESSARY AND IT'S MESSING WITH NAVIGATION-BY-ARROW
	//GET THE SELECTED DATE	
	var classes = $(_ctx.cal_days[iDayToSelect]).attr("class").split(" ");
	$.each(classes, function(i, cls){
		if(cls.indexOf("dt") > -1){
			crs.dt_set(_utils.parseDate(cls, "dtkey"));
		}
	});
	*/

	//CHANGE THE PAGE'S DATE
	_feed.changeDate({dt: crs.dt(), callback: function(){
		
		//ADD "on" CLASS
		_ctx.cal_days.parent().find("." + _utils.formatDate(crs.dt(), "dtkey")).addClass("on");
		
	}});
	
};




function HotlistFeed(){

	this.isSetup = false;
	this.twitterDefaults = {username: ["the_hotlist"], avatar_size: 48, count: 10, radius: 3};	
	this.defaultPost = "Post your comment...";
	this.pageIndexes = []; //KEYED BY dtkey, e.g. _feed.pageIndexes["dt20100412"] = 2
	this.pageSize = 10;
	this.posts = []; //TO BE FILLED WITH POSTS FROM Twitter, Yelp, Hotlist, etc.
	this.callbacks = []; //FLAGS TO RECORD WHICH STREAMS HAVE BEEN POPULATED; USED TO SCHEDULE LAZY LOADING FOR FUTURE DATES
	this.preloadSocialFeed = true;
	this.type = ""; // "social", "venues", "events"
	
}
window["_feed"] = new HotlistFeed();

//--------------------------------------------------------
_feed["setup"] = function(){
	
	//SETUP A jQuery CONTEXT
	test.require(_ctx.right, "_ctx.right must be defined (3092580)");
	if(test.ok()){
		_ctx.cache("feed", "#divFeed", _ctx.right);
		_ctx.cache("posts", "ul.posts", _ctx.feed);
	}
	
	//HANDLE ROUNDED CORNER WHEN HOVERING THE Friends TAB
	_ctx.feed.find("#hlTabFriends").hover(function(){
		_ctx.feed.find("div.feed").addClass("friend_corner");
	}, function(){
		_ctx.feed.find("div.feed").removeClass("friend_corner");
	});

	//HANDLE THE EXPANDING POST AREA
	_ctx.feed.find("#taPost").defaultvalue(_feed.defaultPost)
	.focus(function(){
		_ctx.feed.find("div.post").addClass("on");
	});
	$("body").click(function(e){ //FOR ANY CLICKS NOT WITHIN THE FEED AREA, COLLAPSE THE NEW POST
		if($(e.target).closest("div.feed").length == 0){
			_ctx.feed.find("div.post").removeClass("on");
		}
	});

	//ADD "SHOW" CLASSES BASED ON COOKIE SETTINGS
	if(_settings.getOrDefault("feed.t", true)){_ctx.posts.addClass("show_twitter");}
	if(_settings.getOrDefault("feed.y", true)){_ctx.posts.addClass("show_yelp");}
	if(_settings.getOrDefault("feed.h", true)){_ctx.posts.addClass("show_hotlist");}

	//SETUP RATING WIDGET
	var ratingInputs = _ctx.feed.find("#divRate").find("input.rating").rating({
		callback:function(value, link) {
			_feed.rate({type: "venue", rating: value});
		}	
	}).end().find("a").html(""); //REMOVE THE LINK TEXT 'CAUSE IT WAS OBSCURING THE IMAGES

	//IF THEY'VE RATED IT, SELECT THE RATING
	if(_data.user_rating > 0){ 
		ratingInputs.rating("select", _data.user_rating - 1);
	}

	//HANDLE TAB CLICKS
	_ctx.feed.find("div.tabs a").click(function(){
		switch($(this).blur().attr("id")){
			case "hlTabEveryone":
				_feed.selectTab("everyone");
				break;
			case "hlTabFriends":
				_feed.selectTab("friends");
				break;
			default:
				log("invalid tab id (6770247)");
				break;
		}
	});
	
	//RESTORES THE FEED'S VIEW BASED ON VALUES IN ckySettings
	_feed.selectTab(_settings.getOrDefault("feedTab", "everyone"));
	_ctx.posts.show();
	
	//LISTEN FOR COMMENTERS BEING RETURNED FROM FACEBOOK
	bind("fb.commenters", function(){
		_feed.setupCommenters();
	});
	
	//SET ICON AND LINK FOR FEED POST-ER
	if(_fb.user.uid == -1){
		_ctx.feed.find("#imgUser").attr("src", "/images/clear.gif");
	}
	else{
		_ctx.feed.find("#imgUser").attr("src", "http://graph.facebook.com/" + _fb.user.uid + "/picture?type=square").parent().attr("href", "/profiles/" + _fb.user.uid); 
	}
	
	//FEED IS SET UP
	_feed.isSetup = true;
	trigger("feed.setup");
	
};

//--------------------------------------------------------
_feed["setupCalendar"] = function(){
	
	//SETUP A jQuery CONTEXT
	test.require(_ctx.right, "_ctx.right must be defined (3092580)");
	if(test.ok()){
		_ctx.cache("feed", "#divFeed", _ctx.right);
		_ctx.cache("posts", "ul.posts", _ctx.feed);
	}

	//GET CALENDAR ITEMS (OR PASS THROUGH)
	var strUID = isUsable(_fb.viewing_user_id) ? _fb.viewing_user_id : "";
	_data.getCalendar(strUID, function(){

		//ARE THERE ANY ITEMS?
		var strResultKey = "getCalendar_result_" + strUID;
		if(isUsable(_data[strResultKey])){

			if(_data[strResultKey].length > 0){
					
				//BUILD HTML FROM THESE ITEMS
				var eventTemplate = _tmpl.feedItem("event");
				var venueTemplate = _tmpl.feedItem("venue");
				var html = [];
					
				$.each(_data[strResultKey], function(i, item){
								
					if(item.type == "event"){
						html.push(eventTemplate.expand(item));
					}
					else if(item.type == "venue"){
						html.push(venueTemplate.expand(item));
					}
					else{log("unrecognized type (9184925)");}
								
				});
					
				//SET FEED HTML
				_ctx.posts.html(html.join("")).find("li").show();
					
			}
			else{ //NO CALENDAR ITEMS RETURNED
				_ctx.posts.find("li.default div").html(_fb.first_name + " has no RSVPs!");
			}
			
		}
		else{
			_ctx.posts.find("li.default div").html(_fb.first_name + " has no RSVPs!");
		}
		
	});
	
};

//--------------------------------------------------------
_feed["setupCommenters"] = function(){
	
	if(_data.commenters.length > 0 && _fb.user.uid != -1){

		//ADD "Has" CLASS
		_feed.addHas("hotlist");
		
		//FOR EACH COMMENTER, UPDATE THEIR POST'S IMAGE AND USERNAME
		$.each(_data.commenters, function(i, commenter){
			_ctx.posts.find("img.user_" + commenter.uid).attr("src", commenter.pic_square).parent().attr("title", commenter.name);
		});

	}
	
};

//--------------------------------------------------------
_feed["setupVenuesFeed"] = function(fnCallback){

	//SETUP FEED TABS	
	_ctx.cache("feed_tabs", "div.feed_tabs a", _ctx.right).click(function(){
		_ctx.feed_tabs.removeClass("on");
		var strFeedClass = ($(this).blur().addClass("on").hasClass("tab_popular") ? "pop" : "rated");
		_ctx.divFeedItems.removeClass().addClass(strFeedClass);
		_settings.set("venfeed", strFeedClass);
	});
	var strFeedClassStored = _settings.getOrDefault("venfeed", "pop");
	_ctx.cache("divFeedItems", "#divFeedItems", _ctx.right).addClass(strFeedClassStored);
	_ctx.feed_tabs.parent().find("a.tab_" + strFeedClassStored).addClass("on");

	//SETUP DAYPICKER
	_daypicker.setup();
		
	//CALLBACK?
	tryCallback(fnCallback);
	
};

//--------------------------------------------------------
_feed["setupEventsFeed"] = function(fnCallback){

	//SETUP FEED TABS	
	_ctx.cache("feed_tabs", "div.feed_tabs a", _ctx.right).click(function(){
		_ctx.feed_tabs.removeClass("on");
		var strFeedClass = ($(this).blur().addClass("on").hasClass("tab_popular") ? "pop" : "rated");
		_ctx.divFeedItems.removeClass().addClass(strFeedClass);
		_settings.set("evtfeed", strFeedClass);
	});
	var strFeedClassStored = _settings.getOrDefault("evtfeed", "pop");
	_ctx.cache("divFeedItems", "#divFeedItems", _ctx.right).addClass(strFeedClassStored);
	_ctx.feed_tabs.parent().find("a.tab_" + strFeedClassStored).addClass("on");

	//SETUP DAYPICKER
	_daypicker.setup();
		
	//CALLBACK?
	tryCallback(fnCallback);
	
};

//--------------------------------------------------------
_feed["setupSocialFeed"] = function(fnCallback){

	//SETUP FEED TABS	
	_ctx.cache("feed_tabs", "div.feed_tabs a", _ctx.right).click(function(){
		_ctx.feed_tabs.removeClass("on");
		var strFeedClass = ($(this).blur().addClass("on").hasClass("tab_plans") ? "plans" : "live");
		_ctx.divFeedItems.removeClass().addClass(strFeedClass);
		_settings.set("socfeed", strFeedClass);
	});
	var strFeedClassStored = _settings.getOrDefault("socfeed", "live");
	_ctx.cache("divFeedItems", "#divFeedItems", _ctx.right).addClass(strFeedClassStored);
	_ctx.feed_tabs.parent().find("a.tab_" + strFeedClassStored).addClass("on");

	//SETUP DAYPICKER
	_daypicker.setup();

	//CALLBACK?
	tryCallback(fnCallback);
	
};

//--------------------------------------------------------
_feed["changeDate"] = function(prms){

	//.dt
	//[.callback]

	test.require(prms.dt, "prms.dt is required (3908351)");
	if(test.ok()){
		
		log("_feed.changeDate to " + _utils.formatDate(prms.dt, "-") + " (3146074)");
		//growl(" (9649709)", "change date to " + _utils.formatDate(prms.dt, "-"), {life: 5000});

		//SET CURSOR
		crs.dt_set(prms.dt);
		crs.pageIndex_set(0);

		//FADE OUT
		_page.loading(true);

		//GET DATA IF NECESSARY
		_data.getFeed({dt: prms.dt, feed: "social", callback: function(){

			//FADE IN
			_page.loading(false);

			//POPULATE FEED WITH THE FETCHED ITEMS
			_feed.listSocialFeedItems(crs.page(), function(){

				//OPEN THE FIRST ONE
				_feed.openItem(crs.pageIndex() * _feed.pageSize);
				
				//PRELOAD MORE DATES
				_data.getFeed.preload(prms.dt);
	
				//TRACK
				var bolFuture = (prms.dt.getTime() - (new Date()).getTime()) > 0;
				var strTrack = (bolFuture ? "+" : "-") + (_utils.dateDiff(prms.dt, new Date()) / 86400) + " days";
				track("feed", "changeDate", strTrack, 6377722);

				//CALLBACK?		
				tryCallback(prms.callback);
				
			});
			
		}});
		
	}

};

//--------------------------------------------------------
_feed["updateURL"] = function(){

	var strTab = (_ctx.page_tabs.parent().find("div.on").attr("id") == "divTabCity") ? "city" : "loc";
	_utils.updateURL("tab=" + strTab + "&dt=" + _utils.formatDate(crs.dt(), "-") + "&page=" + crs.pageIndex() + "&lat=" + crs.lat() + "&lon=" + crs.lon());
	
};

//--------------------------------------------------------
_feed["openItem"] = function(indexInDataset){

	//ADD "on" CLASS TO THIS ITEM
	var indexInPage = indexInDataset % _feed.pageSize;
	$(".feed_items").find(".feed_item").removeClass("on").parent().find(".item_" + indexInDataset).addClass("on");
	
	//UPDATE THE URL
	_feed.updateURL();
	
	//ENSURE THIS POINT EXISTS
	if(isUsable(crs.page()[indexInPage])){
		
		_ctx.right.find("#divNoResults").hide();

		try{
			
			//STORE THIS IN THE CURSOR
			crs.pt = crs.page()[indexInPage];
			
			//SETUP CAROUSEL
			_fb.setupCarousel({points: crs.page(), indexInDataset: indexInDataset, indexInPage: indexInPage, visible: _page.carouselItemCount, 'class': "hub", containers: $(".feed_item"), callback: function(){
				//log("_fb.setupCarousel callback from _feed.openItem (4607238)");
			}});
				
			//TRIGGER EVENT ON ANY IFRAMED MAPS	
			trigger("google.goToMarker", indexInPage);
			
			//TRACK
			track("feed", "openItem", "indexInDataset: " + indexInDataset, 4127543);
				
		}
		catch(e){
		
			log("----------------------------> error! (2668747)");
			log(e);
			//log(jsonParams);
				
		}
	
	}
	else{
		
		_ctx.right.find("#divNoResults").show();
		
		log("NO SUCH POINT!! (6018688)");
	}
	
};

//--------------------------------------------------------
_feed["pageButton"] = function(iPageNumber){
	crs.pageIndex_set(iPageNumber - 1);
	_feed.page(0);
};

//--------------------------------------------------------
_feed["page"] = function(i){

	//SET CURSOR PAGE & OFFSET
	crs.pageIndex_set(crs.pageIndex() + i);
	var iOffset = crs.pageIndex() * _feed.pageSize;
	
	//SHOWHIDE THE PREVIOUS ARROW
	if(crs.pageIndex() == 0){_ctx.divFeedItems.find("li.more").removeClass("prev");}
	else{_ctx.divFeedItems.find("li.more").addClass("prev");}
	
	//SCROLL INTO POSITION IF WE'RE FARTHER DOWN THE PAGE
	if($(window).scrollTop() > 145){
		$.scrollTo(_ctx.right, 500);
	}
		
	//IF THIS PAGE HASN'T BEEN DOWNLOADED,
	if(crs.page().length == 0){
		
		//FADE OUT
		_page.loading(true);

		//GET DATA IF NECESSARY
		_data.getFeed({dt: crs.dt(), offset: iOffset, callback: function(newItems){
				
			//FADE IN
			_page.loading(false);
	
			//POPULATE FEED WITH THE FETCHED ITEMS
			if(crs.page().length == 0){
				log("crs details: (3639687)");
				log(crs.dt());
				log(crs.items());
				log(crs.items().length);
				log(crs.pageIndex());
			}
			_feed.listSocialFeedItems(crs.page(), function(){
					
				//TRACK
				track("feed", "page", "i: " + i, 4507952);

				//OPEN THE FIRST ONE
				_feed.openItem(iOffset);
					
			});
				
		}});
			
	}
	else{
			
		//POPULATE FEED WITH THE (PREVIOUSLY-FETCHED) ITEMS
		_feed.listSocialFeedItems(crs.page(), function(){
				
			//OPEN THE FIRST ONE
			_feed.openItem(iOffset);
				
		});
			
	}
	
};

//--------------------------------------------------------
_feed["listSocialFeedItems"] = function(items, fnCallback){

	var html = [];
	var eventTemplate = _tmpl.feedItem("hub_event");
	var venueTemplate = _tmpl.feedItem("hub_venue");

	//ANY ITEMS?
	if(items.length > 0){
		
		//SHOW ulFeed, HIDE divNoResults
		_ctx.divFeedItems.find("#divNoResults").hide().parent().find("#ulFeed").show();

		//CLEAR THE FEED
		_ctx.divFeedItems.find("#ulFeed").html("");
		
		//ADD PAGING ARROWS
		html.push(_feed.makePager(true));
	
		//GENERATE HTML FOR THESE ITEMS
		$.each(items, function(i, point){
	
			//CLEAR THE CAROUSEL (IN CASE IT WAS CREATED BEFORE)
			point.carousel = null;
	
			//EXPAND THE TEMPLATE
			switch(point.type){
				case "event":
					html.push(eventTemplate.expand(point));
					break;
				case "venue":
					html.push(venueTemplate.expand(point));
					break;
				default:
					log("unrecognized point.type: " + point.type + " (8883175)");
					break;
			}
			
		});
	
		//ADD PAGING ARROWS
		html.push(_feed.makePager(false));
	
		_ctx.divFeedItems.find("ul").html(html.join(""));
		
	}
	else{
		
		//SHOW divNoResults, HIDE ulFeed
		_ctx.divFeedItems.find("#divNoResults").show().parent().find("#ulFeed").hide();
										
		//CENTER MAP (AND HIDE MARKERS)
		_google.centerMap();	
										
	}

	//CALLBACK
	tryCallback(fnCallback);
	
};

//--------------------------------------------------------
_feed["makePager"] = function(bolTop){
	
	//SETUP PARAMETERS
	var prms = {};
	prms.hide_top = (bolTop && crs.pageIndex() == 0) ? true : null;
	prms.show_pb = (crs.pageIndex() != 0);
	if(crs.pageIndex() < 3){
		prms.page_start = 1;
	}
	else{
		prms.page_start = crs.pageIndex() - 1;
	} 
	prms.current_page = 1;
	if(crs.pageIndex() == 1){
		prms.current_page = 2;
	}
	else if(crs.pageIndex() > 1){
		prms.current_page = 3;
	}

	//MAKES A TABLE WITH OPTIONAL PAGE BUTTONS
	var strPager = "";
	test.require(prms.show_pb, "prms.show_pb is required (7512656)");
	test.require(prms.page_start, "prms.page_start is required (6098629)");
	test.require(prms.current_page, "prms.current_page is required (7754893)");
	if(test.ok()){
		
		var template = _tmpl.feedPager();
		for(var i = 0; i < 5; i++){
			prms["B" + (i + 1)] = prms.page_start + i;
		}
		strPager = template.expand(prms);
		
	}
	
	return strPager;
	
};

//--------------------------------------------------------
_feed["showFriends"] = function(point, strItemType, hl){
	
	log("Show friends... (2786883)");

	//"Please wait..."
	hl.hide().after("<span class='wait gray'>Please wait...</span>");
			
	//OPEN DIALOG
	var strGroup = hl.hasClass("grp_friends") ? "friends" : "crowd";
	_dialog.stat({item: strItemType, group: strGroup, point: point, callback: function(){
				
		//RESTORE LINK
		hl.parent().parent().find("span.wait").remove();
		hl.show();
			
	}}); 
	
	
};

//--------------------------------------------------------
_feed["rsvp"] = function(strAction, strSrc, iEventID, hl){

	//USED TO CALL page.rsvp() SINCE JSON PARAMETERS CAN'T BE USED WITH JSON-TEMPLATE
	var bolShare = $(hl).parent().find("div.checkbox").hasClass("on");
	_page.rsvp({action: strAction, src: strSrc, id: iEventID, share: bolShare});

};

//--------------------------------------------------------
_feed["checkin"] = function(hl, status){

	//CHANGE CSS CLASS FOR THE BUTTONS
	hl = $(hl).blur();
	hl.parent().find(".btn").removeClass("on");
	hl.addClass("on");
	
	//USED TO CALL _venue.checkin() SINCE JSON PARAMETERS CAN'T BE USED WITH JSON-TEMPLATE
	_venue.checkin({point: crs.pt, status: status});
	
};

//--------------------------------------------------------
_feed["selectTab"] = function(strTab){
	
	switch(strTab){
		case "everyone":

			_ctx.feed.find("#hlTabEveryone").addClass("on");
			_ctx.feed.find("#hlTabFriends").removeClass("on");
			_ctx.feed.find("div.feed").removeClass("friends");
			_settings.set("feedTab", "everyone");
			
			break;
		case "friends":

			$(this).addClass("on");
			_ctx.posts.addClass("show_hotlist");
			_ctx.feed.find("#hlTabFriends").addClass("on");
			_ctx.feed.find("#hlTabEveryone").removeClass("on");
			_ctx.feed.find("div.feed").addClass("friends");
			_settings.set("feedTab", "friends");

			break;
		default:
			log("invalid strTab (5268134)");
			break;
	}	

	//TRACK
	track("feed", "selectTab", strTab, 4792971);
	
};

//--------------------------------------------------------
_feed["rate"] = function(prms, iRating){

	//SETUP PARAMETERS
	prms.venue_id = _data.defaultPoint.venue_id;
	prms.latitude = _data.defaultPoint.lat;
	prms.longitude = _data.defaultPoint.long;
	prms.rate = isUsable(prms.rating, iRating);

	//LOGGED-IN?
	if(_fb.user.uid != -1){
		
		prms.uid = _fb.user.uid;

		//SUBMIT VIA AJAX
		$.post("/places/rate", prms, function(result){
				
			//if(result.status == "success"){}
	
			//ADD TO LIST OF POSTS
			_feed.addClientSidePost({text: _fb.first_name + " rated " + _data.defaultPoint.name + " a " + prms.rate + ((prms.rate > 2) ? "!" : ".")});
					
			//TRACK
			track("feed", "rate", "venue_id: " + prms.venue_id, 4923577);
	
		}, "json");
		
	}
	else{

		//SET FLOWSTATE		
		_settings.set("flowstate", "feed.rate");
		_settings.set("flowstate.rating", prms.rate);

		//LOG IN
		_fb.loginAndReload();
		
	}
	
};

//--------------------------------------------------------
_feed["post"] = function(){

	//LOGGED-IN?
	if (_fb.user.uid != -1) {
	
		//GET VALUE FROM TEXTBOX
		var strPost = _ctx.cache("taPost", "#taPost", _ctx.feed).val();
		if(strPost != _feed.defaultPost){
	
			//CHANGE THE BUTTON
			bind("feed.post", function(){
				_ctx.feed.find("#hlPost").removeClass("bg_gray").addClass("bg_sea").html("&nbsp; Share &nbsp;");
			});
			_ctx.feed.find("#hlPost").removeClass("bg_sea").addClass("bg_gray").html("&nbsp; Please wait... &nbsp;");
	
			//SUBMIT VIA AJAX
			var point = crs.pt;
			var prms = {};
			prms.venue_id = point.venue_id;
			prms.uid = _fb.user.uid;
			prms.latitude = point.lat;
			prms.longitude = point.long;
			prms.review = strPost;
			$.post("/places/comment", prms, function(result){
				
				if(result.status == "success"){
					
					//CLEAR FORM
					_ctx.taPost.val("").end().find("div.post").removeClass("on");
					
					//ADD TO LIST OF POSTS
					_feed.addClientSidePost({text: strPost});
					
				}
				else{
					growl("Oops!", "There was an error posting your comment; please try again.");
				}
				
				//RESET THE BUTTON
				trigger("feed.post");
				
				//TRACK
				track("feed", "post", "venue_id: " + prms.venue_id, 9388086);
	
			}, "json");
			
		}
		
	}
	else{
		
		//SET FLOWSTATE		
		_settings.set("flowstate", "feed.post");
		_settings.set("flowstate.post", _ctx.cache("taPost", "#taPost", _ctx.feed).val());

		//LOG IN
		_fb.loginAndReload();
		
	}
	
};

//--------------------------------------------------------
_feed["addClientSidePost"] = function(prms){
	
	test.require(prms.text, "prms.text is required (3700268)");
	if(test.ok()){
		
		//CREATE POST
		var post = {};
		post.id = -1;
		post.uid = _fb.user.uid;
		post.type = "hotlist";
		post.user = isUsable(_fb.name) ? _fb.name : "";
		post.img = isUsable(_fb.pic_square) ? _fb.pic_square : "";
		post.text = prms.text;
		post.time = _utils.formatDate(new Date(), "dn m/d");
		
		//EXPAND TEMPLATE
		var template = _tmpl.feedItem("hotlist");
		post.html = template.expand(post);
		
		//ADD "Has" CLASS
		_feed.addHas("hotlist");
		
		//SHOW THIS POST (AND STORE SETTING IN COOKIE)
		_feed.togglePosts("hotlist", true);
		
		//ADD THIS POST TO THE LIST				
		_ctx.posts.find("li.controls").after(post.html);
		
	}
	
};

//--------------------------------------------------------
_feed["appendPosts"] = function(prms){
	
	test.require(prms.type, "prms.type (Twitter, Hotlist, Yelp) is required (4690464)");
	if(test.ok()){
		
		//GET THE JSON TEMPLATE TO USE
		var template = null;
		switch(prms.type){
			case "twitter":
				template = _tmpl.feedItem("twitter");
				break;
			case "hotlist":
				template = _tmpl.feedItem("hotlist");
				break;
			case "yelp":
				template = _tmpl.feedItem("yelp");
				break;
			default:
				log("invalid prms.type (9296239)");
				break;
		}

		//EXPAND EACH POST OF THIS TYPE AND ADD TO THE UL
		var html = [];		
		$.each(_feed.posts, function(i, post){
			if(post.type == prms.type){
				html.push(template.expand(post));
			}
		});
		
		//TRY TO APPEND THESE POSTS (OR WAIT UNTIL THE FEED IS SET UP)
		var strPosts = html.join("");
		if (isUsable(_ctx.feed)){
			_ctx.posts.find("li.controls").after(strPosts);
			if(strPosts != ""){
				_feed.addHas(prms.type);
			}
		}
		else{
			bind("feed.setup", function(){
				_feed.appendPosts(prms);
			});
		}
		
	}
	
};

//--------------------------------------------------------
_feed["addHas"] = function(strType){
	
	//ADD "Has" CLASS
	_ctx.posts.addClass("has_" + strType);

	//UPDATE "Has" COUNT			
	var iHasCount = _ctx.posts.hasClass("has_twitter") ? 1 : 0;
	iHasCount += (_ctx.posts.hasClass("has_yelp") ? 1 : 0);
	iHasCount += (_ctx.posts.hasClass("has_hotlist") ? 1 : 0);
	_ctx.posts.removeClass("has_1").removeClass("has_2").removeClass("has_3").addClass("has_" + iHasCount);

	//SHOW TOGGLE CONTROLS & FADE OUT DEFAULT
	_ctx.posts.find("li.controls").show().parent().find("li.default").fadeOut();
	
};

//--------------------------------------------------------
_feed["togglePosts"] = function(strType, bolForce){

	_ctx.posts.find("a.ctrl").blur();
	
	//IS THIS ALREADY ON?
	if(isUsable(bolForce)){
		var bolOn = bolForce;
	}
	else{
		var bolOn = !_ctx.posts.hasClass("show_" + strType);
	}
	_settings.set("feed." + strType.substr(0, 1), bolOn);
	
	//TOGGLE THIS CLASS
	if(bolOn){
		_ctx.posts.addClass("show_" + strType);
	}
	else{
		_ctx.posts.removeClass("show_" + strType);
	}
	
};

//--------------------------------------------------------
//ALL YELP FUNCTIONS....
_feed["yelp"] = {

	//........................................................
	"getReview": function(prms){
		
		//log("feed.yelp.getReview (6701475)");

		test.assert(isUsable(prms.name), "prms.name missing (1666046)");
		test.assert(isUsable(prms.location), "prms.location missing (6733519)");
		if(test.ok()){
			
			//CONSTRUCT URL
			var url = [];
			url.push("http://api.yelp.com/business_review_search?term=");
			url.push(prms.name);
			url.push("&location=");
			url.push(prms.location);
			url.push("&limit=1");
			url.push("&ywsid=" + _page.yelpKey);
			url.push("&callback=?");
			var strURL = encodeURI(url.join(""));
			try{
				
				$.getJSON(strURL, {}, function(data){
					
					//log("returned from Yelp: (1972935)");
					//log(data);
						
					//IF THE MESSAGE IS OK,
					if(data.message.text == "OK" && data.businesses.length > 0){
						
						//GET THE AVERAGE RATING & REVIEW COUNT
						var biz = data.businesses[0];
						var iAvgRating = biz.avg_rating;
						var strAvgRating = iAvgRating * 10;
						if(iAvgRating % 1 == 0){
							strAvgRating = iAvgRating + "0";
						}
		
						//GENERATE THE HTML
						var html = [];
						html.push(" &nbsp; ");
						html.push("<div class='yelp r" + strAvgRating + " fl vm'>&nbsp;</div> ");
						html.push("<a title='View this venue at Yelp.com' class='text vm tdn gray' href='" + biz.url + "' target='_blank'>Based on " + biz.review_count + " reviews</a> &nbsp; ");
						html.push("<a href='" + biz.url + "' title='View this venue at Yelp.com' target='_blank'><img src='http://static4.px.yelpcdn.com/static/20091130159295510/i/map/miniMapLogo.png' class='vm'/></a>");
						
						//UPDATE THE PAGE
						_ctx.right.find("#divRated").html(html.join("")).fadeIn();
						
						//ADD REVIEWS AS "posts" FOR THE FEED
						$.each(biz.reviews, function(i, review){
							
								var post = {};
								
								post.type = "yelp";
								post.id = review.id;
								post.user = review.user_name;
								post.img = review.user_photo_url_small;
								post.user_url = review.user_url;
	
								post.text = review.text_excerpt;
								post.rating = review.rating_img_url_small;
								post.url = review.url;
								post.time = review.date;
								post.timestamp = review.date;
			
								_feed.posts.push(post);
							
						});
						
						//STORE DATA
						_data.yelp = biz;
						
						//STORE RATING ON SERVER
						var iRating = parseInt(parseInt(strAvgRating, 10) / 10, 10);
						log("TODO: store rating on server (1891164)");
						
						//CALLBACK?
						tryCallback(prms.callback);
						
					}
					else{
						//DO NOTHING
						log("No results returned from Yelp (3128899)");
					}
					
				});
	
			}
			catch(e){
				log(e + " (3859043)");
			}
	
		}
		
	}
	
};

//--------------------------------------------------------
//ALL TWITTER FUNCTIONS....
_feed["twitter"] = {
	
	//........................................................
	"getTweets": function(prms){
		
		//OVERRIDE DEFAULTS
		prms = $.extend(_feed.twitterDefaults, prms);
	
		test.require(prms.query, "prms.query is required (7166838)");
		test.require(prms.lat, "prms.lat is required (7294119)");
		test.require(prms.long, "prms.long is required (6290068)");
		if(test.ok()){
		
			var url = _feed.twitter.build_url(prms);
			if(url != ""){
				
				//log("twitter url: " + url + " (4159513)");
				$.getJSON(url, function(data, status){
					var tweets = (data.results || data);
					
					var logMessage = "Twitter response = '" + status + "', " + tweets.length + " results (7139879)";
					log(logMessage);
					//log(data);
					
					//ADD VISIBLE LOG?
					if(isUsable(_data.twitter_log) && _data.twitter_log){
						$("body").append("<div class='highlight p10 mtb10 f16 ac'><a href='" + url + "' style='color: #505050; ' target='_blank'>" + url + "</a><br/><br/>" + logMessage + "</div>");
					}
					
					var html = [];
					if(tweets.length > 0){
						
						$.each(tweets, function(i, tweet){
							
							if(tweet.text.indexOf("CDATA") == -1){ //REMOVE MIS-FORMATTED TWEETS
							
								var post = {};
								
								post.type = "twitter";
								post.id = tweet.id;
								post.user = tweet.from_user || tweet.user.screen_name;
								post.img = tweet.profile_image_url || tweet.user.profile_image_url;
								post.text = _feed.twitter.processText(tweet.text, prms);
								post.time = _feed.twitter.relative_time(tweet.created_at);
								post.timestamp = tweet.created_at;
			
								_feed.posts.push(post);
								
							}
			
						});
			
					}
					else{
						//log("no Tweets returned (2667631)");
					}
	
					//CALLBACK?
					tryCallback(prms.callback);
					
				});
		
				
			}
			else{
				log("invalid Twitter URL (8602312)");
			}

		}
		
	},

	//........................................................
	"processText": function(str, prms){

		//LINK URLs
        var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi; 
        str = str.replace(regexp,"<a href='$1' target='_blank'>$1</a>");
		
		//LINK USERS
        regexp = /[\@]+([A-Za-z0-9-_]+)/gi; 
		str = str.replace(regexp, "<a href='http://twitter.com/$1\' target='_blank'>@$1</a>");
		
		//LINK HASHTAGS
        regexp = / [\#]+([A-Za-z0-9-_]+)/gi;
		str = str.replace(regexp, "<a href='http://search.twitter.com/search?q=&tag=$1&lang=all&from=" + prms.username + "' target='_blank'>#$1</a>");
		
		//MAKE HEARTS
		str = str.replace(/(&lt;)+[3]/gi, "<tt class='heart' target='_blank'>&#x2665;</tt>");

		//RETURN
		return str;		
		
	},
	
	//........................................................
	"build_url": function(prms){
		var url = "";
		//REMOVE STOP WORDS
		prms.query = prms.query.replace(/ on | the | of | for | in | at | out | when | over | by /gi, "");
		//log("Twitter build_url (4518377)");
		//log(prms);
		var proto = ('https:' == document.location.protocol ? 'https:' : 'http:');
		if (prms.list) {
			url = proto + "//api.twitter.com/1/" + prms.username[0] + "/lists/" + prms.list + "/statuses.json?per_page=" + prms.count + "&callback=?";
		} else if (prms.query == null && prms.username.length == 1) {
			url = proto + '//api.twitter.com/1/statuses/user_timeline.json?screen_name=' + prms.username[0] + '&count=' + prms.count + '&callback=?';
		} else {
			var query = (prms.query || 'from:' + prms.username.join(' OR from:'));
			url = proto + '//search.twitter.com/search.json?&q=' + escape(prms.query) + '&rpp=' + prms.count + '&geocode=' + prms.lat + '%2C' + prms.long + '%2C' + prms.radius + 'km&callback=?';
      	}
		return url;
	},

	//........................................................
	"parse_date": function(str){
		return Date.parse(str.replace(/^([a-z]{3})( [a-z]{3} \d\d?)(.*)( \d{4})$/i, '$1,$2$4$3'));
	},

	//........................................................
	"relative_time": function(time_value){
		var result = "";
		var parsed_date = _feed.twitter.parse_date(time_value);
		var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
		var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
		var pluralize = function (singular, n) {
			return '' + n + ' ' + singular + (n == 1 ? '' : 's');
		};
		if(delta < 60) {
			result = 'less than a minute ago';
		} else if(delta < (60*60)) {
			result = 'about ' + pluralize("minute", parseInt(delta / 60)) + ' ago';
		} else if(delta < (24*60*60)) {
			result = 'about ' + pluralize("hour", parseInt(delta / 3600)) + ' ago';
		} else {
			result = 'about ' + pluralize("day", parseInt(delta / 86400)) + ' ago';
		}
		return result;
	},

	//........................................................
	"test": function(){log("test (9776710)");}
	
};

//--------------------------------------------------------




$(function(){
	
	//HACK! OVERRIDE THE "Page size" VARIABLE
	_page.atListPageSize = 100000000000000000;
	
	//SHOW FB PROFILE PIC
	_ctx.page.find("#imgUser").attr("src", "http://graph.facebook.com/" + _fb.user.uid + "/picture?type=square");
	
	//SETUP TABS
	var iTabIndex = (_settings.getOrDefault("h.tab", "city") == "city") ? 0 : 1;
	$(_ctx.cache("page_tabs", "div.page_tab")[iTabIndex]).addClass("on");
	crs.lat_set((iTabIndex == 0) ? _data.city_lat : _data.lat);
	crs.lon_set((iTabIndex == 0) ? _data.city_lon : _data.lon);
	crs.radius_set((iTabIndex == 0) ? _data.city_radius : _data.radius);
	_ctx.page_tabs.click(function(e){
								
		//STORE THE SELECTED TAB IN THE COOKIE
		var strTab = ($(e.target).closest("div.page_tab").attr("id") == "divTabCity") ? "city" : "loc";
		_settings.set("h.tab", strTab);
								
		//UPDATE THE CURSOR		
		var bolCity = (strTab == "city");
		crs.lat_set(bolCity ? _data.city_lat : _data.lat);
		crs.lon_set(bolCity ? _data.city_lon : _data.lon);
		crs.radius_set(bolCity? _data.city_radius: _data.radius);
								
		//POP UP THE SELECTED TAB		
		_ctx.page_tabs.removeClass("on");
		$(this).addClass("on");
		_planner.setAutocompleteHandler(); //SINCE THE HANDLER MAY HAVE CHANGED
						
		//UPDATE THE FEED; THIS WILL DOWNLOAD NEW DATA IF THE LOCATION HAS BEEN CHANGED
		_feed.changeDate({dt: crs.dt()});
						
	});

	//PAGE SETUP
	_page.setup({type: "hub", page: "home", callback: function(){
	
		//ADD GMAP 
		bind("google.loaded", function(){

			//SETUP PLANNER WIDGET
			_planner.setup();
			
			//SETUP "Social Feed"
			_feed.setupSocialFeed(function(){

				//PRELOAD MORE DATES
				_data.getFeed.preload(crs.dt());
	
			});
			
		});
		_page.addGMap({page: "home", width: 550, height: 650});
	
	}});
							
});

//--------------------------------------------------------
