// References .listcolumns and .listtables data, which is created in
//     request.cfm

var agencyfieldlist = [
	{ xml: "agencyname", dom: "ai_agencyname" },
	{ xml: "address1", dom: "ai_address1" },
	{ xml: "address2", dom: "ai_address2" },
	{ xml: "city", dom: "ai_city" },
	{ xml: "state", dom: "ai_state" },
	{ xml: "zip", dom: "ai_zip" },
	{ xml: "phone", dom: "ai_phone" },
	{ xml: "email", dom: "ai_email" },
	{ xml: "startdate", dom: "ai_startdate" },
	{ xml: "totalbooking", dom: "ai_totalbooking" },
	{ xml: "rating", dom: "ai_acrate" },
	{ xml: "agentname", dom: "ai_agentname" },
	{ xml: "agentdesc", dom: "ai_atdesc" },
	{ xml: "agencydesc", dom: "ai_acdesc" }
];


modules.requests = {
	querycrit: "",
	views: {
		quote:		{ title: "Quote Requests", headers: "normal" },
		quoteall:		{ title: "Quote Requests", headers: "normal" },
		user:			{ title: "User Requests", headers: "user" },
		special:		{ title: "Special Requests", headers: "special" },
		oldquotes:	{ title: "All Existing Quotes", headers: "quote" },
		oldmyquotes:	{ title: "My Existing Quotes", headers: "quote" }
	},

	init: function() {
		$.ajax( { type: "GET",
			url:"managerequest.cfc?method=status",
			cache: false,
			complete: modules.requests.statusloaded} );
		//load specials
		modules.requests.showrequests("special", '', 'speciallistrequestgrid');
		lfjs.keypress.installhandler(function(in_key) { return modules.requests.listkeyhandler(in_key, 'speciallistrequestgrid')});
		
		//add scrollarea class to tab contents container
		$($("#requestdetailtabs")[0].tabset.mainContentEl).addClass("scrollarea");
		
	},
	
	statusloaded: function(req) {
		var status= $(req.responseXML).find("status").text();
		$("#req_status").text(status);
	},

	getfilterstr: function(){
		var filterstr = "";
		if ($("#startdate").val() != ""){
			filterstr = filterstr + "reqdetail1.detailval>'"+$("#startdate").val()+"'"; 
		}
		if ($("#rooms").val() != ""){
			if (filterstr != "")
			filterstr = filterstr + " AND reqdetail21.detailval="+$("#rooms").val();
			else
			filterstr = filterstr + "reqdetail21.detailval="+$("#rooms").val();
		}
		if ($("#f_targetname").val() !=""){
			if (filterstr != "")
			filterstr = filterstr + " AND target.name like '%"+$("#f_targetname").val()+"%'";
			else
			filterstr = filterstr + "target.name like'%"+$("#f_targetname").val()+"%'";
		}

		modules.requests.showrequests('quote',filterstr);
	},
	
	sortgrid: function(id, index, colname, thobj, griddiv) {
		
		var view = griddiv.currview.toString();
		griddiv.setData([]);
		var url = griddiv.lasturl.toString();
		var sortfield = id;
		if(griddiv.lastsort) {
			if(griddiv.lastsort.indexOf(sortfield) == 0 && !/desc$/i.test(griddiv.lastsort))
				sortfield += " desc";
		} 
		url += "&orderby=" + sortfield;
		griddiv.lastsort = sortfield;
		//modules.requests.showrequests(view, "", griddiv.id, url);
		modules.requests.loadlist(view, 0, "", griddiv.id, url);
	},
	ignorerequest: function(requestkey){
		if(!requestkey)
			requestkey = $("#requestkey").val();
		if ($("#listrequestscreen").hasClass("activescreen"))
			requestkey = $("#listrequestgrid")[0].getSelectedId();
		$.get("managerequest.cfc", {"method":"ignore","requestkey":requestkey}, function(data)
		{
			var reqdetailscreen = document.getElementById("requestdetail");
			if($(reqdetailscreen).hasClass("activescreen"))
				reqdetailscreen.deactivate();
			$("#listrequestgrid")[0].removeRow(requestkey);
		});
	},
	showignored: function(){
		var griddiv = $("#listrequestgrid")[0];
		if(griddiv.currview != "quote")
			return;
		var url = "listrequests.cfc?method=list&type=quoteall&start=0&filter=DATE(request.enterdate)%3D%253Etoday%252D5";
		modules.requests.loadlist("quoteall", 0, "", null, url);
	},
	showrequests: function(which,filter,el, url) {
		if(typeof el == "undefined" || !el.length)
			var workel = '#listrequestgrid';
		else if(typeof el == "string")
			var workel = '#' + el;
		else 
			var workel = null;
		if (which != "quote") {
			$("#requestignore").hide();
			$("#requestlistignore").hide();
		}
		else {
			$("#requestignore").show();
			$("#requestlistignore").show();
		}
		var reqlist = $(workel)[0];
		reqlist.empty();
		reqlist.currview = which;
		var setheaders = new Array();
		var setwidths = new Array();
		var headers = modules.requests.listcolumns[
					modules.requests.views[which].headers];
		for (var i=0; i < headers.length; i++) {
			var title = "Click to sort by " + headers[i].label
			setheaders[i] = { name: headers[i].label, id: headers[i].alias, onclick: modules.requests.sortgrid, title: title };
			if(headers[i].width)
				setwidths[i] = headers[i].width;
			else
				setwidths[i] = "";
		}
		reqlist.setHeaders(setheaders);
		reqlist.setColWidths(setwidths);
		
		modules.requests.loadlist(which, 0, filter, el, url);
		
	},

	listkeyhandler: function(in_key, el) {
		if(typeof el == "undefined" || el == null)
			var workel = '#listrequestgrid';
		else if(typeof el == "string")
			var workel = '#' + el;
		else 
			var workel = null;
		
		var gridobj = $(workel)[0];
		switch (in_key.toUpperCase()) {
			case "ESC":
			case "CTRL+ENTER":
				
				$('#listrequestscreen')[0].deactivate();
				$('#listrequestgrid')[0].currview = "";
				$('#listrequestgrid')[0].lasturl = "";
				$('#listrequestscreen')[0].isopen = false;
				return false;
			case "UP":
				gridobj.selectNext(-1);
				return false;
			case "DOWN":
				gridobj.selectNext();
				return false;
			case "ENTER":
				if(typeof inputhasfocus == "undefined")
					inputhasfocus = false;
				if($(workel)[0].getSelectedId() && !inputhasfocus) {
					$.ajax( {
						type: "GET",
						url: "managerequest.cfc?method=get&requestkey="+$(workel)[0].getSelectedId(),
						async: true,
						cache: false,
						complete: function(req) { $('#requestdetail')[0].grid = gridobj; modules.requests.showdetail(req) }
					   });
					return false;
				} else {
					return true;
				}
		/*	case 'I':
				if (workel == "#listrequestgrid")
					modules.requests.ignorerequest($(workel)[0].getSelectedId());
				return false;	*/
			case "CTRL+F":
				if(workel != "#speciallistrequestgrid") {
					modules.requests.filter();
					return false;
				}	
			case "CTRL+R":
				if(workel != "#speciallistrequestgrid") {
					modules.requests.refresh();
					return false;
				}
		}
		return true;
	},
	loadlist: function(which, start, filter, el, url) {
		//if el, then don't activate window, assume that will be done externally
		var showwin = false;
		if(typeof el == "undefined" || el == null) {
			var workel = '#listrequestgrid';
			showwin = true;
		} else if(typeof el == "string")
			var workel = '#' + el;
		else 
			var workel = null;
		
		if(!url) {
			var url = "listrequests.cfc?method=list&type=" + which + "&start=" + start + "&filter="+filter
			//cache the url for use in sorting
			$(workel)[0].lasturl = url
			$("#listrequestmessage").html("");
		}
		$(workel)[0].currview = which;
		var view = which;
		//cancel any existing load threads
		$(workel)[0].setData([]);
		$("#listrequestmessage").html("Loading...").show();
		//$(workel)[0].addRow("Loading", ["Loading..."], 
		//		{ fastadd: true
		//		} );
		
		var count = 0;
		if (view == "user") {
			var title = modules.requests.views[which].title + " - "+filter;
			$("#filterlink").hide();
			var users = [];
		} else {
			var title = modules.requests.views[which].title;
			$("#filterlink").show();
		}
		if(showwin && !$('#listrequestscreen')[0].isopen) {
			$('#listrequestscreen')[0].activate({title:title, 
				keyhandler: modules.requests.listkeyhandler });
			$('#listrequestscreen')[0].isopen = true;
		}
		
		$(workel)[0].setData([],
					{ fetchurl: url,
					fetchdisplay: "request",
					  insfunc: function(grid, objs, which) {
					  		count ++;
							if(view == "user") {
								var curr = $(objs[which]).find("username:first").text(); 
								if(jQuery.inArray(curr, users) == -1)
									users[users.length] = curr;
									
							}
					  		modules.requests.listloadadd(grid, objs, which, view) 
					    },
					  donefunc: function(grid) { 
							var msg = count + " Requests Found";
							if(count == 1)
								msg = "1 Request Found";
							if(view == "user" && users && users.length) {
								msg += " for " + users.join(", ");
							}
							$("#listrequestmessage").html("<b>" + msg + "</b>").show("normal");
					  		modules.requests.listloaddone(grid);
					    }
					});
		
	},

	listloading: function(req) {
		var xml = $(req.responseXML);
		if (which == "user")
			var title = modules.requests.views[which].title + username;
		else
			var title = modules.requests.views[which].title;
		
		$('#listrequestscreen')[0].activate({title:modules.requests.views[which].title, 
			keyhandler: modules.requests.listkeyhandler });
		
		$('#listrequestgrid')[0].setData(xml.find("request"),
				{ append: true, insfunc: modules.requests.listloadadd,
					donefunc: modules.requests.listloaddone });
	},

	listloadadd: function(grid, rows, which, view) {
		var grid = grid;
		var data = [];
		var fields = modules.requests.listcolumns[modules.requests.views[view].headers];
		for(var i=0; i < fields.length; i++) {
			if($(rows[which]).find(fields[i].alias).length) {
				var val = $(rows[which]).find(fields[i].alias + ":first").text();
				if(fields[i].fieldtype == "date") {
					val = lfjs.displayDate(new Date(val));
				} else if(fields[i].fieldtype == "datenotime") {
					val = lfjs.displayDate(new Date(val), "notime");
				} else if(fields[i].fieldtype == "boolean") {
					if(val == "" || val == 0)
						val = "No";
					else
						val = "Yes";
				} else if(fields[i].fieldtype == "stringmultiple" && fields[i].nodes) {
					
					var tmp = "|";
				
					var res = $(rows[which]).children().filter(function() {
						var test = new RegExp(fields[i].nodes, "gi").test(this.nodeName);
						if(test) {
							if(tmp.indexOf("|" + $(this).text() + "|") == -1)
								tmp += $(this).text() + "|";
							return "";
						}
						return false;
					});
					val = tmp.replace(/^\|/,"").replace(/\|$/,"");
					if(val.split("|").length > 1) {
						if(fields[i].value && fields[i].value.length)
							val = fields[i].value;
						else
							val = "Multiple Sellers";
					}
				}
				data[data.length] = val;
			}
		}
		
		var currRow = grid.addRow($(rows[which]).find("requestkey:first").text(), data, 
				{ fastadd: true,
				  ondblclick : function(id, trobj) {
					  	$('#requestdetail')[0].grid = grid.div;
						modules.requests.loaddetail(id);
					},
					onclick: function(id, trobj){
						if (trobj && trobj.isspecial) {
							$("#requestlistignore").hide();
							$("#requestignore").hide();
						}
						else {
							$("#requestlistignore").show();
							$("#requestignore").show();
						}
					}
				
				} );
		currRow.isspecial = false;
		if($(rows[which]).find("speckey").text() != 0)
			currRow.isspecial = true;
	},

	listloaddone: function(grid) {
	},
	loaddetail: function(requestkey) {
		$.ajax( {
			type: "GET",
			url: "managerequest.cfc?method=get&requestkey="+requestkey,
			cache: false,
			async: true,
			complete: modules.requests.showdetail
			} );
	},
	/*
	loaddetail: function(requestkey) {
		
		$.ajax( {
			type: "GET",
			url: "managerequest.cfc?method=get&requestkey="+requestkey,
			async: true,
			cache: false,
			complete: modules.requests.showdetail
		   });
	},
	*/
	showdetail : function(o){
		var start1 = new Date().valueOf();
		var grid = $('#requestdetail')[0].grid;
		$("#reqdetailerror").hide();
		if(typeof reqdetailgroups != "undefined")
			reqdetailgroups = {};
			
		$('#requestdetail')[0].dbform =
					new lfjs.dbForm(reqdetailfieldlist, $(o.responseXML).find("reqdetail")[0]);
		
		var reqtype = $(o.responseXML).find("reqtype").text();
		var variants = new Array();
		$(o.responseXML).find("variant").each(
			function(i) {
				variants.push({
					variantname : $(this).find("name").text(),	
					variantkey : $(this).find("variantkey").text(),
					lowquote : $(this).find("lowquote").text()
				})
			});
		var details = new Array();	
		$(o.responseXML).find("detail").each(
			function(i) {
				details.push({
					detailname : $(this).find("detailname").text(),	
					detailval : $(this).find("detailval").text(),	
					detailkey : $(this).find("detailkey").text()
				})
			});
		var noquotevariants = $("#noquotevariants").get(0);
		$("#reqdetailerror").html("").hide();
		var people = $(o.responseXML).find("people").text();

		/*if (comments != ""){
			commentstr = '<tr><td align="right" class="detaillabel">Comments:</td><td class="detailcontent">'+comments;
		}*/
		
		var detailstr = "";
		var variantstr = "";
		var lowquotetabstr = "";
		if (variants.length > 1){
			variantstr = '<tr><td colspan="2" class="detaillabel">Please enter your quote for each variant:</td><tr>';
			for (i=0; i<variants.length; i++){
				if (variants[i].lowquote != "") {
					var lowquotestr = "<span align='right'>&nbsp;&nbsp;&nbsp; Low: " + variants[i].lowquote + "</span>";
					lowquotetabstr += "<tr><td>" + variants[i].variantname + "</td><td style='padding-left:5px;' align='right'>" + "$" + variants[i].lowquote + "</td></tr>";
				}
				else 
					var lowquotestr = "<span></span>";
				variantstr = variantstr + '<tr><td colspan="2" class="detailcontent"><div '+
						'id="label'+variants[i].variantkey+'">'+variants[i].variantname+'</div><input type="text" '+
						'class="textfield tf_sm" name="quote'+variants[i].variantkey+'">'+
						'<BR><input type="checkbox" class="nqcheckbox" name="checkbox'+
						variants[i].variantkey+'"><label for="checkbox'+variants[i].variantkey+'">'+
						'No Quote</label>'+lowquotestr+'<hr></td></tr>';
			}
		}else{
			variantstr = '<tr><td colspan="2" class="detaillabel">Please enter your quote:</td><tr>';
			if (variants[0].lowquote != "") {
				var lowquotestr = "<span align='right'>&nbsp;&nbsp;&nbsp; Low: " + variants[0].lowquote + "</span>";
				lowquotetabstr += "<tr><td>" + variants[0].variantname + "</td><td style='padding-left:5px;' align='right'>" + "$" + variants[0].lowquote + "</td></tr>";
			}
			else 
				var lowquotestr = "<span></span>";
			var name = variants[0].variantname;
			variantstr = variantstr + '<tr><td colspan="2" class="detailcontent"><div '+
					'id="label'+variants[0].variantkey+'">'+name+'</div><input type="text" class="textfield tf_sm" '+
					'name="quote'+variants[0].variantkey+'"><BR><input type="checkbox" class="nqcheckbox" '+
					'name="checkbox'+variants[0].variantkey+'"><label for="checkbox'+variants[0].variantkey+
					'">No Quote</label>'+lowquotestr+'<hr></td></tr>';
		}
		for (i=0; i<details.length; i++){
			var detailid = details[i].detailname.toLowerCase().replace(/ /g, "_") + details[i].detailkey;
			detailstr = detailstr + '<tr><td align="right" class="detaillabel" id="detaillabel' + detailid + '">'+details[i].detailname+':</td><td class="detailcontent" id="detailval'+detailid+'">'+details[i].detailval + '</td></tr>';
		}
		if($(o.responseXML).find("lastviewed").text().length)
			detailstr += '<tr><td align="right" class="detaillabel" id="detaillabel_lastviewed">Last Viewed By User:</td><td class="detailcontent" id="detailval_lastviewed">' + lfjs.displayDate(new Date($(o.responseXML).find("lastviewed").text())) + '</td></tr>';
		else
			detailstr += '<tr><td align="right" class="detaillabel" id="detaillabel_lastviewed">Last Viewed By User:</td><td class="detailcontent" id="detailval_lastviewed">Not Viewed</td></tr>';
		$("#q_detail").empty().append('<tr><td align="right" id="detaillabelpeople" class="detaillabel">People:</td><td id="detailvalpeople" class="detailcontent">'+people+'</td></tr>'+detailstr);
		$("#q_quotevariant").empty().append(variantstr);
		$(".nqcheckbox").click(function(){
			if ($(this).siblings(".textfield").css("display") == "none") {
				$(this).siblings(".nqselect").remove();
				$(this).siblings(".textfield").val(this.textfieldVal).show();
			}
			else {
				this.textfieldVal = $(this).siblings(".textfield").val();
				$(this).siblings(".textfield").hide().val("");
				var sel = noquotevariants.cloneNode(true);
				sel.name = "noquote" + this.name.substring(this.name.indexOf("checkbox")+8);
				$(this).siblings("br").before(sel);
			}
		})
		$("#q_quotevariant .textfield");
		var targetkey = $(o.responseXML).find("targetkey:first").text();
		var targetdetail = $(o.responseXML).find("targetdetail:first").text().replace(/\n/g, "<br />");
		
		var targeturl = "/";
		if(application && application.instancename)
			targeturl += application.instancename.toLowerCase() + "/?" + application.instancename.toLowerCase() + "=" + targetkey;
		else
			targeturl += "/target/?target=" + targetkey;
		targetdetail += '<p><input type="button" value="More Info" onclick="window.open(\'' + targeturl + '\', \'targetdetails\',\'\');"></p>'
		
		var tabs = $("#requestdetailtabs")[0].getTabs();
		//keep the first 2 tabs (User comments and details), remove the rest
		if(tabs.length > 2) {
			for(var i=2; i < tabs.length; i++)
				tabs[i].remove(true);
		}
			
		var commentstr = "";
		if($(o.responseXML).find("reqdetail > comments").length) {
			commentstr = $(o.responseXML).find("reqdetail > comments").text().replace(/\n/g, "<br>");
				
		}
		
		$(tabs[0].contents).html(commentstr);
		$(tabs[1].contents).html(targetdetail);
		tabs[0].contents.scrollTop = tabs[1].contents.scrollTop = 0;
		tabs[0].show();

		
		var end1 = new Date().valueOf();
		
		//console.log("Exec 1 in: " + (end1 - start1) + " ms");
		var start2 = new Date().valueOf();

		var reqcontactdata = $(o.responseXML).find("reqcontact")
		if (reqcontactdata.length) {
			modules.requests.dispcontactinfo(reqcontactdata[0]);
		}
		
		if($(o.responseXML).find("special").length) {
			var spec = document.createElement("div");
			$(spec).attr("id", "reqtabspecial");
			$("#requestdetailtabs")[0].addTab("Special Text", { contents: spec });
			var specnode = $(o.responseXML).find("special:first");
			
			var startdate = lfjs.displayDate(new Date(specnode.children("startdate").text()), "%Y-%m-%d");
			var enddate = lfjs.displayDate(new Date(specnode.children("enddate").text()), "%Y-%m-%d");
			
			var specstr = "<b>" + specnode.children("title").text() + "</b>";
			specstr += '<table><tr><th class="detaillabel">Description:</th>';
			specstr += '<td class="detailconent">' + specnode.children("description").text() + '</td></tr>';
			specstr += '<tr><th class="detaillabel">Run Date:</th>';
			specstr += '<td class="detailconent">' + startdate + ' to ' + enddate + '</td></tr>';
			specstr += '<tr><th class="detaillabel">Cost:</th>';
			specstr += '<td class="detailconent">' + specnode.children("cost").text() + '</td></tr>';
			specstr += '<tr><th class="detaillabel">Brochure Cost:</th>';
			specstr += '<td class="detailconent">' + specnode.children("brochurecost").text() + '</td></tr>';
			specstr += '<tr><th class="detaillabel">Category:</th>';
			specstr += '<td class="detailconent">' + specnode.children("category").text() + '</td></tr>';
			
			if(specnode.children("details").length && specnode.children("details").children().length) {
				specnode.children("details").children().each(function(i) {
					var value = $(this).text();
					var tmp = value.split("|");
					if(tmp.length == 2)
						value = tmp[0] + " to " + tmp[1];
					specstr += '<tr><th class="detaillabel">' + $(this).attr("label") + '</th>';
					specstr += '<td>' + value + '</td></tr>';	  
				});
			}
			specstr += '</table>';
			$(spec).html(specstr);
			spec = specnode = null;
		}
		if (lowquotetabstr != "") {
			$("#requestdetailtabs")[0].tabset.addTab("Low Quotes", {
				id: "lowquotestab",
				contents: $("<div></div>").html("<table><tr><th style='text-align:left'>Variant</th><th style='padding-left:5px;'>Lowest Quote</th></tr>" +
				lowquotetabstr + "</table>").get()
			});
		}
		var hasquotes = false;
		if($(o.responseXML).find("quotes").length && $(o.responseXML).find("quotes").children().length) {
			hasquotes = true;
			$(o.responseXML).find("quotes").children().each(function(i) {
				var quote = $("#quotetablesrc").clone(true);
				quote.attr("id", "reqtabquote" + i);
				var label = "Quote " + lfjs.displayDate(new Date($(this).children("createdate").text()));
				
				$("#requestdetailtabs")[0].addTab(label, { contents: quote[0] });
				
				if($(this).find("notes:first").length && $(this).find("notes:first").text() != "") {
					quote.find("tr:first").before('<tr><td colspan="2"><b>Notes:</b> ' + 
						$(this).find("notes:first").text().replace(/\n/g, "<br>") + '<hr></td></tr>');
				}
				var agentnode = $(this).children("agent:first");
				quote.find("#quoteseller").html(agentnode.children("name").text() + ', ' + agentnode.children("agency").text());
				var contactstr = agentnode.children("email").text();
				if(agentnode.children("phone").length && agentnode.children("phone").text() != "")
					contactstr += ', ' + agentnode.children("phone").text();
				if(contactstr == "")
					contactstr = "No Contact Details Available.";
				
				//set the Ratings link onclick
				var agentkey = $(this).find("agent:first > agentkey").text();
				quote.find("#quoteratingslink").click(function() { modules.requests.agencyinfo(agentkey);return false; });
				
				quote.find("#quotecontact").html(contactstr);
				
				var createdate = lfjs.displayDate(new Date($(this).children("createdate").text()), "%Y-%m-%d");
				quote.find("#quotecreatedate").html(createdate);
				
				quote.find("#quotebenefits").html($(this).children("benefits").text().replace(/\n/g, "<br>"));
				
				quote.find("#quotecomments").html($(this).children("comments").text().replace(/\n/g, "<br>"));
				
				if($(this).children("variants").length && $(this).children("variants").children().length) {
					$(this).children("variants").children().each(function(i) {
						var appendstr = "";
						var label = $(this).attr("label");
						if(label.toLowerCase() == "no variant")
							label = "Quote";
						appendstr += '<tr><th class="detaillabel">' + label + ':</th>';
						var quoteval = $(this).text();
						if (parseInt(quoteval) == 0) {
							if($(this).find("noquote").text() != "")
								quoteval = "<div style='height:50px;overflow-y:auto;border:1px solid black;'>" + $(this).find("noquote").text().replace(/</g, "&lt;").replace(/\n|\r/g, " <br />") + "</div>";
							else 
								quoteval = "<div style='height:50px;overflow-y:auto;border:1px solid black;'>No Quote.</div>";
						}
						else 
							quoteval = "<div style='height:50px;overflow-y:auto;border:1px solid black;'>$" + quoteval + "</div>";
						appendstr += '<td>' + quoteval + '</td></tr>';	  
						quote.find("tbody").append(appendstr);
					});
				}
				
				quote = null;
			});
		}
		
		var reqid = $(o.responseXML).find("reqdetail").attr("requestkey");
		var title = "Quote Requests: " + $(o.responseXML).find("username").text() + "-" + reqid;
		$("input#requestkey").val(reqid);
		if($(o.responseXML).find("bookkey").length) {
			var bookkeys = [];
			$(o.responseXML).find("bookkey").each(function() {
				bookkeys[bookkeys.length] = $(this).text();	
			});
			$("#requestdetail input#reqbookkey").val(bookkeys.join(","));
			
			$("#modifybooking").show();
		} else {
			$("#requestdetail input#reqbookkey").val("");
			$("#modifybooking").hide();
		}
		
		var closed = false;
		if ($(o.responseXML).find("status").text() == "closed"){
			closed = true;
		}
		if (closed){
			$("#q_quotevariant, #q_quote, #requestsave").hide();
			$("#requestdetail :input[type!='button']").attr("disabled", true);
			$(".quoterequest").attr("disabled",true);
			$("#q_requeststatus").text("This request is closed.  Quotes cannot be changed.");
			$("input#requestsave, input#requestaddquote").hide();
			$("input#requestcancel").val("Close Window");
			$("#requestignore").hide();
			$("#requestlistignore").hide();
		}else{
			if (reqtype == 'Anonymous') {
				$("#requestdetail :input[type!='button']").attr("disabled", false);
				$(".quoterequest").attr("disabled",false);
				$("#q_requeststatus").text("");
				$("input#requestsave").show();
				$("input#requestcancel").val("Discard Changes");
				if(hasquotes) {
					$("#q_quotevariant, #q_quote, #requestsave").hide();
					$("#requestaddquote").show().val("Add a New Quote");;
					$("#requestcancel").val("Close Window");
				} else {
					$("#q_quotevariant, #q_quote, #requestsave").show();
					$("#requestaddquote").hide();
					$("#requestcancel").val("Discard Changes");
				}
			}
			else {
				$("#requestdetail :input[type!='button']").attr("disabled", true);
				$(".quoterequest").attr("disabled",true);
				$("#q_requeststatus").text("");
				$("#q_quotevariant, #q_quote, #requestsave").hide();
				$("#requestcancel").val("Close Window");
				if(!$('#contactinfo').length) {
					$("#requestaddquote").show().val("Get Contact Information");;
				}
			}
		}
		
		$('#requestdetail')[0].activate({
			title:title, 
			keyhandler: modules.requests.manage_request_keyhandler
		});
		$('#requestdetail')[0].isopen = true;
		$("#requestdetailtabs")[0].tabset.displayTabNav();
		
		var end2 = new Date().valueOf();
		
		//console.log("Exec 2 in: " + (end2 - start2) + " ms");
	},
	
	manage_request_keyhandler: function(in_key) {
		switch (in_key.toLowerCase()) {
			case 'pgdn':
			case 'pgup':
				//savequote();	
				$('#requestdetail')[0].deactivate();
				$('#requestdetail')[0].isopen = false;
				if (in_key.toLowerCase() == 'pgdn') {
					$('#requestdetail')[0].grid.selectNext();
				} else {
					$('#requestdetail')[0].grid.selectNext(-1);
				}
				lfjs.keypress.stuff('ENTER');
				return false;
			case 'ctrl+enter':
				modules.requests.confirmquote();
				//$('#requestdetail')[0].deactivate();
				return false;
			case 'esc':
				$('#requestdetail')[0].deactivate();
				$('#requestdetail')[0].isopen = false;
				return false;
		}
		return true;
	},
	
	addbooking: function(){
		var bookinfo = {
			targetname: $("#q_targetname").text(),
			requestid: $("#username").text()+"-"+$("input#requestkey").val(),
			requestkey: $("input#requestkey").val(),
			targetkey: $("input#targetkey").val(),
			quotekey: ""
		}
		if(bookdefpopulate && bookdefpopulate.length) {
			var custom = {};
			for(var i=0; i < bookdefpopulate.length; i++) {
				var curr = bookdefpopulate[i];
				var val = "";
				var dom = $(".detailcontent[id^='detailval" + curr.src + "']");
				if(dom.length) {
					switch (dom[0].nodeName.toLowerCase()) {
						case "select":
						case "input":
						case "textarea":
							val = dom[0].value;
							break;
						default:
							val = dom.text();
					}
				}
				custom[curr.dest] = val;
			}
			bookinfo["customfields"] = custom;
		}
		
		modules.bookings.manage_booking('','Add New Booking',bookinfo);
	},
	
	modifybooking: function(){
		var bookkeys = $("#requestdetail input#reqbookkey").val();
		var keys = bookkeys.split(",");
		
		if(keys.length > 1) {
			//launch the book picker select grid
			modules.bookings.showbooking(keys, "selbooking")
		} else if (keys.length == 1) {
			modules.bookings.manage_booking(keys[0],'Modify Booking');
		}
	},
	closedetailwin: function(){
		$('#requestdetail')[0].deactivate();
		$('#requestdetail')[0].isopen = false;
	},

	filter: function(){
		//MakeQuery.makeQuery("", "", modules.requests.listtables);
		//$("#queryEdit")[0].activate({title: "Query Editor"});	
		var critwin = $('#requestcritwin')[0];
		if (!critwin.fs) {
			critwin.fs = new FocusSearch(modules.requests.requestcritlist, $("#requestcritfs")[0]);
			critwin.fs.draw();
			var optArray = modules.requests.predefinedfilters;
			var selectList = $("#requestcritselect")[0];
			//for(var i=0;i<optArray.length;i++){
			//	selectList.options[i] = new Option(optArray[i].label, i, false);
			//}
			/*
			selectList.onchange = function() {
				if(this.value == "")
					return;
					
				for(var field in critwin.fs.critFields) {
					critwin.fs.critFields[field].value = "";
					critwin.fs.critFields[field].plugin.input.value = "";
				}
				for(elem in modules.requests.predefinedfilters[this.value]) {
					if(elem == "label")
						continue;
					var field = modules.requests.filterdetails[elem].field;
					critwin.fs.critFields[field].value = modules.requests.predefinedfilters[this.value][elem];
					critwin.fs.critFields[field].plugin.input.value = modules.requests.predefinedfilters[this.value][elem];
				}
			};
			*/
		} else {
			critwin.fs.resetHelper();	
		}
		$('#requestcritwin')[0].activate({title: "Filter",
			keyhandler: modules.requests.requestcritwin_keypress });
		$('#requestcritwin').find("input")[0].focus();
	},
	refresh: function() {
		//modules.requests.showrequests(view, "", griddiv.id, url);
		var griddiv = $("#listrequestgrid")[0];
		var view = griddiv.currview;
		var url = null;
		if(griddiv.lasturl) {
			url = griddiv.lasturl;
			if(griddiv.lastsort) {
				url += "&orderby=" + griddiv.lastsort;
			}
		}
		modules.requests.loadlist(view, 0, "", null, url);
	},
	requestcritwin_keypress: function(in_key) {
		switch (in_key.toLowerCase()) {
			case "esc":
				$('#requestcritwin')[0].deactivate();
				return false;
			case "ctrl+enter":
				$('#requestcritwin').find("input")[0].focus();
				$('#requestcritwin').find("input")[0].blur();
				$('#requestcritwin')[0].deactivate();
				modules.requests.querycrit = "";
				var val;
				for (var i=0; i < modules.requests.requestcritlist.length; i++) {
					var curr = modules.requests.requestcritlist[i];
					if (curr.mapfunc)
						val = curr.mapfunc(curr.value);
					else if (curr.mapvalue)
						val = curr.mapvalue;
					else
						val = curr.value;
					if (val && val.length > 0) {
						modules.requests.querycrit += "&" + curr.field + "=" +
							encodeURIComponent(val);
					}
				}
				modules.requests.loadlist($('#listrequestgrid')[0].currview,
						0, encodeURIComponent(modules.requests.querycrit.substr(1)),
						"listrequestgrid");
				return false;
		}
		return true;
	},

	reqcontactinfo: function() {
		$("#reqdetailerror").html("").hide();
		$("#reqcontactinfo")[0].activate({title:"Get Contact Information", 
						keyhandler: modules.requests.reqcontactinfokeyhandler });
	},

	reqcontactinfokeyhandler: function(in_key) {
		switch (in_key.toLowerCase()) {
			case 'ctrl+enter':
				modules.requests.getcontactinfo();
			case 'esc':
				modules.requests.cancelcontactinforeq();
				return false;
		}
		return true;
	},

	cancelcontactinforeq: function() {
		$('#reqcontactinfo')[0].deactivate();
	},

	getcontactinfo: function() {

		if ($('#reqcontactinfo:visible').length)
			lfjs.window.wait();
		var requestkey = $('#requestkey').val();
		$("#reqdetailerror").html("").hide();
		$.get("managerequest.cfc", {"method":"contact","requestkey":requestkey, "no_cache":new Date().valueOf()}, function(data)
		{
			if ($('#reqcontactinfo:visible').length)
				lfjs.window.nowait();
			if ($('error',data).length) {
				$("#reqdetailerror").html($('error',data).text()).show();
				$('#reqcontactinfo:visible')[0].deactivate();
				return;
			}
			var res=$('results',data).text();
			var detail=$('details',data).text();
			if (res == 'false') {
				$("#reqdetailerror").html(detail).show();
				$('#reqcontactinfo:visible')[0].deactivate();
				return;
			}

			modules.requests.dispcontactinfo(data);
			$('#reqcontactinfo:visible')[0].deactivate();
		});
	},

	dispcontactinfo: function(reqdata) {
		var contactdata = $(reqdata).find('contactinfo');
		$('#username').text($(reqdata).find('username').text());
		
		if (!contactdata) {
			return;
		}

		var continfo = document.createElement("div");
		$(continfo).attr("id", "contactinfo");
		continfo.tab = $("#requestdetailtabs")[0].addTab("Contact Information", { contents: continfo });

		if ($('oldcontactrequest',reqdata).length) {
			var message = 'Direct contact information was initiated by ' + $('agentname',reqdata).text()
				+ ' (login: ' + $('loginname',reqdata).text() + ') on ' + $('agentreqtime',reqdata).text() + '.';
			$('#contactinfo').append('<h3 style="margin-top: 0px;">' + message + '</h3>');
			if ($('#reqcontactinfo:visible').length)
				alert(message);
		}

		$(contactdata).children().each(function(i) {
			if (this.tagName == 'budget') {
				$('#contactinfo').append("<strong>Approx. budget per person:</strong> " + $(this).text() + "<br>\n");
			}
			else if (this.tagName == 'time') {
				$('#contactinfo').append("<strong>Best time to contact:</strong> " + $(this).text() + "<br>\n");
			}
			else if (this.tagName == 'phone') {
				$('#contactinfo').append("<strong>Phone:</strong> " + $(this).text() + "<br>\n");
			}
			else if (this.tagName == 'name') {
				$('#contactinfo').append("<strong>Name:</strong> " + $(this).text() + "<br>\n");
			}
			else if (this.tagName == 'email') {
				$('#contactinfo').append("<strong>E-mail:</strong> " + $(this).text() + "<br>\n");
			}
		});
		$('#contactinfo').append("<br>Remember, we are counting on you to contact this user right away.  Thanks!\n");
		$('#contactinfo')[0].tab.show();
		$('#requestaddquote').hide();
	},
	
	addquote: function() {
		if ($("#requestaddquote").val() == "Get Contact Information") {
			return modules.requests.reqcontactinfo();
		}
		if($("#q_quotevariant:visible").length) {
			$("#requestaddquote").val("Add A New Quote");
			$("#requestcancel").val("Close Window");
		} else {
			$("#requestaddquote").val("Hide Quote Form");
			$("#requestcancel").val("Discard Changes");
		}
		   
		$("#q_quotevariant, #q_quote").slideToggle();
		$("#requestsave").toggle();
	},
	confirmkeyhandler: function(in_key) {
		switch (in_key.toLowerCase()) {
			case 'ctrl+enter':
				modules.requests.savequote();
			case 'esc':
				$('#requestconfirm')[0].deactivate();
				return false;
		}
		return true;
	},
	confirmquote: function() {
		var currencyerror = false;
		var htmlstr = "<table>";
		$("#requestdetail input[name^='quote']").each(
			function(i){
				//validate currency
				var val = $(this).val();
				if(!/^\$?\d{1,3}(,?\d{3})*(\.\d{1,2})?$/.test(val) && val != "")
					currencyerror = true;
				var variantkey = this.name.replace(/[^\d]*([\d]*)$/, "$1");
				var label = $("#requestdetail #label" + variantkey).text().replace(/\:$/,"");
				htmlstr += '<tr><td class="detaillabel">' + label + ':</td>';
				var dspval = val;
				if(dspval == "")
					dspval = "No Quote";
				htmlstr += '<td class="detailcontent">' + dspval + '</td></tr>';
				
			}
		);
		htmlstr += "</table>";
		if(currencyerror) {
			$("#reqdetailerror").html("All quotes must be in a valid currency format (i.e. 850.99) or empty.").slideDown("normal");
			return;
		}
		
		if(modules.requests.quoterules.length) {
			var othervalRE = /\%([^\.]*)\.value\%/g;
			for(var i=0; i < modules.requests.quoterules.length; i++) {
				var curr = modules.requests.quoterules[i];	
				var key = curr.detailkey;
				var name = curr.detailname.toLowerCase().replace(/ /g, "_");
				var sel = "#detailval" + name + key;
				if(!curr.getval)
					curr.getval = "";
				var val = $(sel).text();
				if(curr.getval == "stringnumsum") {
					var numRE = /\d+/g;
					var res = val.match(numRE);
					var cnt = 0;
					for(var j=0; j < res.length; j++)
						cnt += parseInt(res[j], 10);
					val = cnt;
				} else {
				}
				var rule = curr.rule.replace(/\%value\%/g, val);
				if(othervalRE.test(rule)) {
					othervalRE.lastIndex = 0;
					var tmp;
					var origrule = rule;
					while((tmp = othervalRE.exec(origrule)) != null) {
						var match = tmp[1];
						var tmpval = $("#detailval" + match).text();
						
						rule = rule.replace(new RegExp("%" + match + "\\.value%"), tmpval);
					}
				}
				if(rule.indexOf("%quotevalue%") >= 0) {
					var origrule = rule;
					var first = true;
					$("#requestdetail input[name^=quote]").each(function(i) {
						if($(this).val() == "")
							return true;
							
						var val = parseInt(this.value.replace(/[\$\,]/g, ""), 10);
						if(isNaN(val))
							return true;
						if(!first)
							rule += " || ";
						else {
							first = false;
							rule = "";
						}
						rule += "(" + origrule.replace(/%quotevalue%/g, val) + ")";									 
					});
				}
				
				try {
					var res = eval(rule);
				} catch (e) {
					var res = false;
				}
				if(res) {
					htmlstr += "<p class='error'>" + curr.alert.replace(/\%value\%/g, val) + "</p>";	
				}
			}
		}
		
		$("#requestconfirm #confirmtext").html(htmlstr);
		
		$("#requestconfirm")[0].activate({title:"Confirm Your Quote", 
						keyhandler: modules.requests.confirmkeyhandler });
		
		$("#reqdetailerror").slideUp("normal");
	},
	savequote: function(){
		lfjs.window.wait();
		
		var quotes = "";
		var comments = $("#agentcomments").val();
		var xbenefit = $("#benefit").val();
		var notes = $("#agentnotes").val();
		var requestkey = $("#requestkey").val();
		
		$("#requestdetail input[name^='quote']").each(
			function(i){
				var key = $(this).attr("name").substring(5);
				if($("#requestdetail select[name='noquote"+key+"']").get().length)
					quotes = quotes + $(this).attr("name") + "=no" + $("#requestdetail select[name='noquote"+key+"']").val().replace(/\$/g, "") + "&";
				else
					quotes = quotes + $(this).attr("name") + "=" + $(this).val().replace(/\$/g, "") + "&";						
			}
		);
			
		$.ajax( {
				type: "POST",
				url: "managerequest.cfc?method=save",
				async: true,
				cache: false,
				data: {
					quotes: quotes,
					comments: comments,
					xbenefit: xbenefit,
					notes: notes,
					requestkey: requestkey
				},
				success: function(req){
					lfjs.window.nowait();
					if($(req).find("error").length) {
						var errors = [];
						$(req).find("error").each(function(i) {
							errors[errors.length] = $(this).text();							   
						});
						$("#reqdetailerror").html(errors.join("<br>")).slideDown("normal");
					} else {
						if($(req).find("status").length && $(req).find("status").text().toLowerCase() == "success") {
							if($('#requestdetail')[0].grid && $('#requestdetail')[0].grid.currview) {
								if($('#requestdetail')[0].grid.currview != "oldquotes" 
									&& $('#requestdetail')[0].grid.currview != "oldmyquotes") {
									$('#requestdetail')[0].grid.removeRow($('#requestdetail')[0].grid.getSelectedId());
									modules.requests.showconfirmation('listrequestconfirm', 'The quote has been saved.', 5000);
									lfjs.keypress.stuff('esc');
								} else {
									$.ajax( {
										type: "GET",
										url: "managerequest.cfc?method=get&requestkey="+requestkey,
										cache: false,
										async: true,
										complete: function(req) {lfjs.keypress.stuff('esc'); modules.requests.showdetail(req) }
									} );
								} 
							} else {
								lfjs.keypress.stuff('esc');	
							}
						} else {
							$("#reqdetailerror").html("There was a problem saving your quote.<br>Please submit your quote again").slideDown("normal");
						}
					}
				},
				error: function(req, err) {
					lfjs.window.nowait();
					$("#reqdetailerror").html("Error: " + err).slideDown("normal");
				}
			} ); 
		
	},	
	closefilterwin: function(){
		$("#queryEdit")[0].deactivate();
	},
	
	closereqwin: function(){
		$("#listrequestscreen")[0].deactivate();	
	},
	
	showconfirmation: function(el, msg, time) {
		if(typeof el == "string")
			el = "#" + el;
		if(typeof time == "undefined")
			time = 5000;
		if($(el).length) {
			$(el).html(msg).slideDown("normal", function() { 
				var el = this;
				setTimeout(function() { $(el).slideUp("normal") }, time)
			});
		}
		
	},
	
	manage_agencyinfo_keyhandler: function(in_key) {
		switch (in_key.toLowerCase()) {
			case 'ctrl+enter':
				$('#agencyinfo')[0].deactivate();
				return false;
			case 'esc':
				$('#agencyinfo')[0].deactivate();
				return false;
		
		}
		return true;
	},
	
	agencyinfo: function(agentkey){
		$.ajax( { type: "GET", 
			   	  cache: false,
				  url: "/user/managequotes.cfm?action=agencyinfo&agentid=" + agentkey,
				  complete: modules.requests.showagencyinfo
			});
	},
	
	showagencyinfo: function(req){
		$('#agencyinfo')[0].dbform = new lfjs.dbForm(agencyfieldlist, $(req.responseXML).find("agencyinfo")[0]);
		$("#ai_atdesc, #ai_acdesc").each(function(i) {
			this.innerHTML = $(this).text().replace(/\n|\r/g," <br />");											  
		});
		$('#agencyinfo')[0].activate({
			title:"Agency Information", keyhandler:modules.requests.manage_agencyinfo_keyhandler});	
	},
	minmaxwindow: function(dir, img, stretchel) {
		if(typeof stretchel == "string")
			stretchel = "#" + stretchel;
		
		if(!$(img).parents(".screen").length)
			return false;
		
		var win = $(img).parents(".screen:first");
		$(img).siblings(":hidden").show().end().hide();
		if(dir == -1) {
			win.height(win[0].minheight).width(win[0].minwidth).css( {top: win[0].mintop, left: win[0].minleft });
		} else {
			win[0].minheight = win.height();
			win[0].minwidth = win.width();
			win[0].mintop = win.css("top");
			win[0].minleft = win.css("left");
			
			//when maximizing, height/width doesn't account for anyscrollbars added, so pad a bit
			win.height($(window).height()-20).width($(window).width()-16).css( {top: "0px", left: "0px" });
		}
		if(stretchel) {
			var csssub = ["padding-bottom","padding-top"]
			
			var height = 0;
			win.children().not($(stretchel)[0]).each(function() {
				var desc = (this.id == "") ?  this.className:this.id ;
				//console.log(desc + " - " + $(this).height() + " - " + this.offsetHeight + " - " + $(this).css("float") + " - " + $(this).css("position"));
				//var myheight = $(this).height(); 
				if($(this).css("float") == "none" && $(this).css("position") == "static") {
					height += this.offsetHeight;
					if(!isNaN(parseInt($(this).css("margin-top"),10)))
						height += parseInt($(this).css("margin-top"),10);
					if(!isNaN(parseInt($(this).css("margin-top"),10)))
						height += parseInt($(this).css("margin-bottom"),10);
				}
				
			});
			var heightleft = win.height() - height;
			for(var i=0; i < csssub.length; i++) {
				heightleft -= parseInt(win.css(csssub[i]),10);	
			}
			//console.log("Window: " + win.height() + " - " + heightleft);
			$(stretchel).height(heightleft);
		}
		
			
	}
}
