// This file is for objects and functions related to non-static page content.
// -Tom Hirashima

//////////////////////////////////
// New modal popup window class //
//////////////////////////////////
Yelp.popBox = function(){
	this.coords = [];
	this.outerEl = null;
	this.opened = false;
	this.anchor = null;
	this.updaterFunction=null;
	this.extraPostVars=null;
	this.contents = null;
}
Yelp.popBox.prototype.makePop = function(aLink,idStr,popContents,offset,options){	
	if(!offset){var offset=[0,0];}
	this.options = (!options) ? {} : options;
	var cornerColor = (this.options.cornerColor) ? this.options.cornerColor : '';
	this.anchor = aLink;
	this.contents = popContents;
	this.coords = findPosition(aLink);
	this.outerEl = document.createElement('div');
	this.outerEl.setAttribute('id',idStr);
	Element.addClassName(this.outerEl,'autoPop');
	this.outerEl.innerHTML='<p class="roundedTop"><img src="'+imagesPrefix+'gfx/top-lf'+cornerColor+'.gif" class="topLf" /><img src="'+imagesPrefix+'gfx/top-rt'+cornerColor+'.gif" class="topRt" /></'+'p>';
	
	this.innerEl = document.createElement('div');
	Element.addClassName(this.innerEl,'autoPopInner'); // should replace references to this with the below ID
	this.innerEl.setAttribute('id',idStr+'_inner');
	
	if(typeof(popContents)=="string"){
		this.innerEl.innerHTML = this.contents;
	}else if(typeof(popContents=="object")){
		this.innerEl.appendChild(this.contents);
	}else{this.innerEl.innerHTML='<p>Invalid content type!</p>';}
	this.outerEl.appendChild(this.innerEl);
	this.outerEl.innerHTML+='<p class="roundedBtm"><img src="'+imagesPrefix+'gfx/btm-lf'+cornerColor+'.gif" class="btmLf" /><img src="'+imagesPrefix+'gfx/btm-rt'+cornerColor+'.gif" class="btmRt" /></'+'p>';
	
	Element.setStyle(this.outerEl,{position:'absolute',top:(this.coords[1]+offset[1])+'px',left:(this.coords[0]+offset[0])+'px'});
		
	document.body.appendChild(this.outerEl);
	var myHandle = (this.options.handle) ? this.options.handle: false;
	if(typeof(Draggable)=='undefined'){
		Yelp.addScript(jsPrefix+'st_lib/dragdrop.js','effectsJS',[window,'Draggable'],function(){(new Draggable(idStr,{starteffect:null, endeffect:null, handle:myHandle}));});
	}else{
		(new Draggable(idStr,{starteffect:null, endeffect:null, handle:myHandle}));
	}
	this.opened = true;
// conditional IE comments	
/*@cc_on
	/*@if (@_jscript_version <= 5.6)
		this.bgiframe();	
	/*@end
@*/
}
Yelp.popBox.prototype.bgiframe = function(){
	// allows hover over form widgets in IE6.
	var dimentions = Element.getDimensions(this.outerEl.id);
	var html = '<iframe class="bgiframe" frameborder="0" tabindex="-1" src="javascript:false"'+
		               ' style="display:block;position:absolute;z-index:-1;'+
					   'filter:Alpha(Opacity=\'0\');'+
					       'top:0px;'+
					       'left:0px;'+
					       'width:'+dimentions.width+'px;'+
					       'height:'+dimentions.height+'px;'+
					'"/>';
	this.outerEl.innerHTML +=html;
}
Yelp.popBox.prototype.closePop = function(reload){
	if(!reload){var reload=false;}
	document.body.removeChild(this.outerEl);
	this.opened = false;
	// if user is closing bookmarkPop after login/signup, page needs to re reloaded to reflect login
	if(reload){
		window.location.reload(true);
	}
}
Yelp.popBox.prototype.sendForm = function(frm,url){
	$('statusMsg').innerHTML = 'Status: Saving...';
	$('statusMsg').style.color = '#666';
	this.params = Form.serialize(frm);
	if(this.extraPostVars){
		if(this.params){
			this.params+='&'+this.extraPostVars;
		}else{
			this.params=this.extraPostVars;
		}
	}
	Form.disable(frm);
	var sendy = new Ajax.Request(
		url,
		{
			method:'POST',
			postBody:this.params,
			onComplete:function(req){
			var statusMsg = $('statusMsg');
			var request = JSON.parse(req.responseText);
			if(req.status==200&&request){
				if(request.success){						
					statusMsg.innerHTML = 'Status: ' + request.msg;
					statusMsg.style.color = 'green';
					//this.modalScreen(request.msg);
					setTimeout('document.body.removeChild($("'+this.outerEl.id+'"))',1500);
					this.opened = false;
					if(this.updaterFunction){this.updaterFunction(request);}
				}else{
					statusMsg.innerHTML = 'Error!';					
					statusMsg.style.color = 'red';
					if(request.err_flds){
						var fInputs = Form.getInputs(frm,'text',i);
						for(var x=0;x<fInputs.length;x++){
							for(var i in request.err_flds){
								if(fInputs[x].name==i){fInputs[x].style.border = '1px solid red';}
							}
						}
					}
					alert(request.msg.unescapeHTML());
					Form.enable(frm);
				}
			}else{
				statusMsg.innerHTML = 'Server Error! Please try again later.';
				statusMsg.style.color = 'red';
				Form.enable(frm);
			}
			}.bind(this),
			onFailure:function(){serverError();Form.enable(frm);},
			on404:function(){serverNotFound();Form.enable(frm);}
		}
	);
}
Yelp.popBox.prototype.modalScreen = function(msgText){
	var dmnts = [this.outerEl.clientWidth,this.outerEl.clientHeight];
	var layer = document.createElement('div');
	var msg = document.createElement('div');
	Element.setStyle(layer,{position:'absolute',top:'0px',left:'0px',margin:'0px',cssFloat:'none',background:'#fff',zIndex:310,width:dmnts[0]+'px',height:dmnts[1]+'px'});
	Element.setOpacity(layer,.7);	
	Element.setStyle(msg,{margin:(dmnts[1]/2)+'px auto 0px auto',cssFloat:'none',color:'#C41200',fontWeight:'bold',textAlign:'center'});
	msg.innerHTML = msgText;
	layer.appendChild(msg);
	this.outerEl.appendChild(layer);
}


var complimentsPop = null;
var messagingPop = null;

var dynPop = {
formStateChange:false,
xmlHttpReq : Ajax.getTransport(),
doCompPop:function(myLink, userID, reviewID){
	if(this.xmlHttpReq){
		if(!complimentsPop){
			complimentsPop=new Yelp.popBox;
			Event.observe(window,'unload',function(){complimentsPop = null;});
		}
		complimentsPop.userID = userID; // these two IDs are used in ajaxFormSubmit below.
		complimentsPop.reviewID = reviewID;	
		if(!complimentsPop.opened){
			var coords = findPosition(myLink);
			var pos = [0,-230];
			if((Element.getWidth(document.body) - coords[0])<350){
				pos[0] = -270;
			}
			if(Position.page(myLink)[1] < 230){
				pos[1] = 16;
			}
			if(!complimentsPop.contents){
				complimentsPop.makePop(myLink,'comPop','<div id="loading_message"><img src="'+imagesPrefix+'gfx/burst_loader_ani.gif" class="alignmid" alt="loading"> Loading...</div>', pos);
				var comp_contents = new Yelp.async_fill('comPop_inner',"/pop_fill/compliment",{'onComplete':function(){complimentsPop.contents = $('comPop_inner').innerHTML;}}); //setting complimentsPop.contents so we don't have to re-request the content
				comp_contents.fetch_contents();
				comp_contents=null;
			}else{
				complimentsPop.makePop(myLink,'comPop',complimentsPop.contents, pos);
			}
			dynPop.formStateChange = false;
		}else{
			complimentsPop.closePop();
		}
	}else{
		window.location = myLink.href;
	}	
},
doSendMessPop:function(myLink,userID,userName){
	if(this.xmlHttpReq){
		if(!messagingPop){
			messagingPop=new Yelp.popBox;
			Event.observe(window,'unload',function(){messagingPop = null;});
		}
		var sendMessString = '<h4>Type your message to '+somewhatSanitize(userName)+' below:</h4><form id="compForm" name="compForm">';
		sendMessString += '<div><label for="messSubject" id="messSubject_label">Subject:</label> <input name="messSubject" id="messSubject"></div><textarea id="sendMessage" name="message" maxchar="100"></textarea>';
		sendMessString += '<p id="popFooter"><a href="javascript:Yelp.openSpellChecker(document.compForm.message);" class="spellCheckIcon"><img src="'+imagesPrefix+'ico/spellcheck.gif" alt="spellcheck" /></a> <span id="statusMsg">Status: Ready</span> <a href="javascript:messagingPop.closePop();">Cancel</a> <input type="button" value="Send" id="compSubmitButton" onclick="dynPop.submitMess(\''+userID+'\');"></p></form>';
		if(!messagingPop.opened){
			var coords = findPosition(myLink);
			var pos = [0,-230];
			if((Element.getWidth(document.body) - coords[0])<350){
				pos[0] = -270;
			}
			if(Position.page(myLink)[1] < 230){
				pos[1] = 16;
			}
			messagingPop.makePop(myLink,'comPop',sendMessString,pos);
			dynPop.formStateChange = false;
		}else{
			messagingPop.closePop();
		}
	}else{
		window.location = myLink.href;
	}
},
ajaxFormSubmit:function(){	
	var compText = document.compForm.message.value; 
	var tehButtonz = document.compForm.elements["type"];
	for (var i=0;i<tehButtonz.length;i++)
	{
		if (tehButtonz[i].checked){
			var compType = tehButtonz[i].value;
		}
	}
	
    if (compText != "" || compText.length != 0){
		var compDict = {'action_add2': 1, 'userid':complimentsPop.userID, 'review_id':complimentsPop.reviewID, 'type': compType, 
		'message': compText, 'nocache': (new Date()).getTime()} ;	
		$('statusMsg').innerHTML = "Status: Sending...";
		Form.disable(document.compForm);
		var opt = {
			 method: 'post',
			 postBody: Yelp.encodeQueryComponents(compDict),
			 onSuccess: dynPop.handleCompResponse,
			 on404: serverNotFound,
			 onFailure: serverError
		};
		(new Ajax.Request('/thanx', opt));
		
	} else {
		alert('Please enter some text');
	}
},
submitMess:function(userID){		
	var compText = document.compForm.message.value;
	var compSub = document.compForm.messSubject.value;
	
    if (compText != "" || compText.length != 0){
		var compDict = {'action_create_message': 1,'async':'true', 'dst':userID,  
		'subject':compSub, 'message': compText, 'nocache': (new Date()).getTime()} ;		
		$('statusMsg').innerHTML = "Status: Sending...";
		Form.disable(document.compForm);		
		var opt = {
			 method: 'post',
			 postBody: Yelp.encodeQueryComponents(compDict),
			 onSuccess: dynPop.handleMessResponse,
			 on404: serverNotFound,
			 onFailure: serverError
		};
		(new Ajax.Request('/mail', opt));
	} else {
		alert('Please enter some text');
	}
},
populate:function(msg) {
	var tgt = document.compForm.message;	
	if(dynPop.formStateChange!=true){
		tgt.value = msg;
	}
},
setFormTrue:function(){dynPop.formStateChange=true;},
handleCompResponse:function(req) {
    handleMatrix(req.responseText,
	comPopEmpty,
	function(reply){
	$('statusMsg').innerHTML = "Status: Success! Compliment Sent.";
	$('statusMsg').style.color = "green";
	setTimeout('complimentsPop.closePop();',1900);
	},
	comPopFail);
},
handleMessResponse:function(req) {
    handleMatrix(req.responseText,
	comPopEmpty,
	function(reply){
	$('statusMsg').innerHTML = "Status: Success! Message Sent.";
	$('statusMsg').style.color = "green";
	setTimeout('messagingPop.closePop();',1900);
	},
	comPopFail);
}
}

//generic response handling
function handleMatrix(reqText,emptyFunction,successFunction,failFunction){
var reply = JSON.parse(reqText);
	if (!reply){ 
		emptyFunction();
	}else if (reply.success){
		successFunction(reply);
	}else{
		failFunction(reply);
	}
}
function comPopEmpty(){
	$('statusMsg').innerHTML = "Error: An undefined error occurred.";
	$('statusMsg').style.color = "red";
	Form.enable(document.compForm);
	dynPop.compFormButton.value = "Send";
}
function comPopFail(reply){
	$('statusMsg').innerHTML = "Status: Error!";
	$('statusMsg').style.color = "red";
	alert(reply.msg);
	Form.enable(document.compForm);
	dynPop.compFormButton.value = "Send";
}
function serverNotFound(){
	alert('404: No response from server.');
} 
function serverError(){
	alert('Request failed! Please try again later.');
}

////////////////////////
// Bookmark functions //
////////////////////////
var bookmark_pop = null;
Yelp.bizBookmarkHelper = function(actionAnchor, action, query_vars){
	// if the popup box is already open, close it
	if(bookmark_pop && bookmark_pop.opened){
		bookmark_pop.closePop();
		return;
	}
	// figure out where to put the box
	var coords = findPosition(actionAnchor);
	var pos = [0,0];
	if((Element.getWidth(document.body) - coords[0]) < 400){
		pos[0] = -280;
	}
	pos[1] = (action=='edit_biz') ? -210:-250; //edit doesn't include extra messaging in popup, so it is shorter
	if(Position.page(actionAnchor)[1] < 200){
		pos[1] = 14;
	}
	// if we've already opened a popup box for this link (that's 
	// the else case), there's no need to re-create it
	if(!bookmark_pop || !bookmark_pop.contents || bookmark_pop.anchor != actionAnchor){
		bookmark_pop = new Yelp.popBox();
		bookmark_pop.makePop(actionAnchor,'bookmarkPop','<div id="loading_message"><img src="'+imagesPrefix+'gfx/burst_loader_ani.gif" class="alignmid" alt="loading"> Loading...</div>',pos);
		// add to query vars
		async_fill_vars = query_vars;
		async_fill_vars['action'] = action;
		async_fill_vars['onComplete'] = function(){ Yelp.styleRefresh('bookmarkPop','autoPop');bookmark_pop.contents = $('bookmarkPop_inner').innerHTML;};
		
		var fill_bookmark_pop = new Yelp.async_fill('bookmarkPop_inner',"/pop_fill/bookmark",async_fill_vars);
		fill_bookmark_pop.fetch_contents();
	}else{
		bookmark_pop.makePop(actionAnchor,'bookmarkPop',bookmark_pop.contents,pos);
	}
};

Yelp.addBizBookmark = function(actionAnchor, businessID, reviewID, label, note){
	query_vars = {};
	query_vars['biz_id'] = businessID;
	if (reviewID != null){ query_vars['review_id'] = reviewID; }
	if (label != null){ query_vars['label'] = label; }
	if (note != null){ query_vars['note'] = note; }
	
	// call the common method for biz bookmarks
	return Yelp.bizBookmarkHelper(actionAnchor, 'add_biz', query_vars)
};

Yelp.editBizBookmark = function(actionAnchor, bookmarkID, label, note){
	query_vars = {};
	query_vars['bookmark_id'] = bookmarkID;
	if (label != null){ query_vars['label'] = label; }
	if (note != null){ query_vars['note'] = note; }
	
	// call the common method for biz bookmarks
	return Yelp.bizBookmarkHelper(actionAnchor, 'edit_biz', query_vars)
};

Yelp.send_bookmark = function(){
	$('statusMsg').innerHTML = "Status: Sending...";
	var form_data = $(document.bookmark_form).serialize(true);
	form_data['nocache'] = (new Date()).getTime();
	var url = '/bookmark/edit_biz'; //for now we only allow edit from the popup
	var opt = {
		method: 'post',
		postBody: Yelp.encodeQueryComponents(form_data),
		onSuccess: Yelp.handleBookmarkResponse.bind(form_data),
		on404: serverNotFound,
		onFailure: serverError
	};
	(new Ajax.Request(url,opt));
};

Yelp.delete_bookmark = function(aLink, bookmark_id){
	if(window.confirm('Are you sure you want to delete this?')){
		var opt = {
			postBody: $H({'bookmark_id': bookmark_id,'async': true}).toQueryString(),
			onSuccess: Yelp.removeBookmark.bind(aLink),
			on404: serverNotFound,
			onFailure: serverError
		};
		(new Ajax.Request('/bookmark/remove_biz', opt));
	}
};
Yelp.removeBookmark = function(req){
	var reply = JSON.parse(req.responseText);
	if(reply.success){
		var bookmark_row = Element.up(this,'.bookmark_row');
		Effect.BlindUp(bookmark_row, {duration: .5});
		var removeNode = function(){$('bookmarks_main').removeChild(bookmark_row);};
		window.setTimeout(removeNode, 1000);
	}else{
		alert('Error: '+reply.msg);
	}
};

Yelp.handleBookmarkResponse = function(req){
	var reply = JSON.parse(req.responseText);
	if (!reply){ 
		alert('Error: No Response from server! Please try again later');
	}else if (reply.success){
		$('statusMsg').innerHTML = "Status: "+reply.msg;
		bookmark_pop.contents = null;
		if(this.action == 'add_biz'){
			window.setTimeout("bookmark_pop.closePop();",1500);
		}else if(this.action == 'edit_biz'){
		
		if(this.from_bookLogPop!='true'){
			var bookmark_row = Element.up(bookmark_pop.anchor,'.bookmark_row');
			var note_node = bookmark_row.getElementsByClassName('bookmark_note').first();
			var label_node = bookmark_row.getElementsByClassName('bookmark_label').first();
			if(reply.bookmark.note){
				if(!note_node.visible()){
					Yelp.toggleVisible(note_node);
				}
				var note_text = reply.bookmark.note.escapeHTML().gsub('\n','<br>');
				note_node.innerHTML = '<strong>Note:</strong> ' + note_text;
			}else{
				if(note_node.visible()){
					Yelp.toggleVisible(note_node);
				}
			}
			if(reply.bookmark.label){
				var label_text = (reply.bookmark.label=='To Review') ? reply.bookmark.label.escapeHTML() + ' (<a href="/biz/'+reply.bookmark.business_id+'">Write a Review</a>)': reply.bookmark.label;
				label_node.innerHTML = 'Label: ' + label_text;
			}else{
				label_node.innerHTML = '&nbsp;';
			}
			bookmark_pop.anchor.setAttribute('onclick','');
			if(Yelp.eventCache == undefined){Yelp.eventCache = $A();}
			Yelp.eventCache.each(function(ci){
				if(ci.anchor == bookmark_pop.anchor){
					Element.stopObserving(ci.anchor,'click',ci.handler);
					Yelp.eventCache = Yelp.eventCache.without(ci);
				}
			});
			var handler = function(e){ Event.stop(e); Yelp.editBizBookmark(findEventTarget(e), reply.bookmark.id, reply.bookmark.label, reply.bookmark.note);};
			Element.observe(bookmark_pop.anchor,'click',handler);
			Yelp.eventCache.push({'anchor':bookmark_pop.anchor, 'handler': handler});
			window.setTimeout("bookmark_pop.closePop();",1500);
		}else{
			window.setTimeout("bookmark_pop.closePop(true);",1500);
		}
		}
	}else{
		alert('Error: '+reply.msg);
	}
};


function FavModify(user_name, user_id, div_id) {
	this.user_id = user_id;
	this.div_id = div_id;
	this.user_name = user_name;

	this.getbox = function() { return $(this.div_id); }
	this.notfound = function(tx) { this.drawError() }  
	
	this.ok = function(tx) {
		try {
			var reply = JSON.parse(tx.responseText);
			if (!reply) { throw "Empty Reply";  }
			if (reply.error != false) { throw "Undefined Error";}
			this.drawSuccess(); 
					
		}			
		catch (e) { 	
			this.drawError() ;
		}	

	}
	this.remove_ok = function(tx) {
		try {
			var reply = JSON.parse(tx.responseText);
			if (!reply) throw "Empty Reply"
			if (reply.error != false) throw "Undefined Error";
			this.drawSuccess();
					
		}			
		catch (e) { 
			alert(e);	
			this.drawError() ;
		}	
		
	 }

	this.srverror = function(tx) { this.drawError(); }; 
	this.add =  function() {
		var o = this;
		var opt = {
			 method: 'post',
			 postBody: 'dst_user_id=' + encodeURIComponent(this.user_id),
			 onSuccess: function (tx) {o.ok(tx);},
			 on404: function (tx) { o.notfound(tx); },
			 onFailure: function (tx) { o.srverror(tx);}
		};
		(new Ajax.Request('/favorite_user/addjs', opt));
		this.getbox().innerHTML = "Saving...";
		
	}
	this.drawSuccess = function() {
		this.getbox().innerHTML = '<a href="/user_details_reviews_favorites" style="color:green;">Saved to Favorites</a>';
		
	}

	this.drawError = function() { 
		this.getbox().innerHTML = "There was an error submitting that.  Try refreshing the page.";
		
	}
	
	this.remove = function () { 
		var o = this;
		var opt = {
			 method: 'post',
			 postBody: 'dst_user_id=' + encodeURIComponent(this.user_id),
			 onSuccess: function (tx) {o.remove_ok(tx);},
			 on404: function (tx) { o.notfound(tx); },
			 onFailure: function (tx) { o.srverror(tx);}
		};
		(new Ajax.Request('/favorite_user/removejs', opt));
		this.getbox().innerHTML = "Saving...";
	}; 
	
}

