/*
	DEPENDENCIES
		THIS FILE USES FUNCTIONS FROM /ASSETS_GLOBAL/SCRIPTS/UTILS/COOKIE.JS. THIS FILE ALSO USES THE AJAX
		CLASS AT /ASSETS_GLOBAL/SCRIPTS/CLASSES/AJAXREQUEST.JS. BE SURE TO INCLUDE BOTH OF THOSE SCRIPTS
		BEFORE THIS SCRIPT IS INCLUDED.
	
	THIS FILE CONTAINS THE FOLLOWING PUBLIC METHODS WHICH ARE USED TO MANAGE TRIPS
	
	listSaved:
		IF THE USER IS LOGGED IN A WEB SERVICE RETRIEVES THE LIST OF SAVED TRIPS FROM A DATABASE. IF THE USER IS NOT
		LOGGED IN A JAVASCRIPT FUNCTION RETRIEVES THE LIST OF SAVED TRIPS FROM A COOKIE AND PASSES THAT
		LIST TO A WEB SERVICE. BOTH WEB SERVICES RETURN A JSON OBJECT THAT CONTAINS THE FOLLOWING STRUCTURE:
		
		{
			"ROWCOUNT":3,
			"COLUMNS":["PACKAGEID","TPCPACKAGE","DISABLED"]
			,"DATA":{"PACKAGEID":[1234,5678]
			,"TPCPACKAGE":["Trip One","Trip Two"]
			,"DISABLED":[0,0]}
		}
		
		ARGUMENT DESCRIPTION
		=========================================================================================================
		NO ARGUMENTS
		=========================================================================================================
	
	save:	
		IF THE USER IS LOGGED IN A WEB SERVICE IS CALLED WHICH ASSOCIATES A TRIPID WITH A USERID AS A SAVED TRIP.
		IF THE USER IS NOT LOGGED IN A JAVASCRIPT FUNCTION IS CALLED WHICH ADDS THE TRIP ID TO A COOKIE VARIABLE.
		THE WEB SERVICE RETURNS A JSON OBJECT THAT CONTAINS THE FOLLOWING STRUCTURE:
		
		{
			"LAST_SAVED_TRIP":{
				"ID":4041,
				"NAME":"East Africa in Style - 2009"
			}
		}
		
		ARGUMENT DESCRIPTION
		=========================================================================================================
		NAME				TYPE			DESCRIPTION
		tripID				integer			The id if the trip
		=========================================================================================================
	
	remove:	
		IF THE USER IS LOGGED IN A WEB SERVICE IS CALLED WHICH REMOVES THE ASSOCIATION BETWEEN A TRIPID AND A USERID.
		IF THE USER IS NOT LOGGED IN A JAVASCRIPT FUNCTION IS CALLED WHICH REMOVES THE TRIP ID FROM THE COOKIE VARIABLE.
		
		ARGUMENT DESCRIPTION
		=========================================================================================================
		NAME				TYPE			DESCRIPTION
		tripID				integer			The id if the trip
		=========================================================================================================
	
	compare:	
		THE COMPARE LINK NEEDS TO DETERMINE IF THE USER HAS SAVED AT LEAST 2 TRIPS. IF THE USER HAS NOT SAVED
		AT LEAST 2 TRIPS, THAN THE listSaved FUNCTION WILL BE CALLED, OTHERWISE THE USER WILL BE TAKEN TO THE
		COMPARE PAGE.
		
		ARGUMENT DESCRIPTION
		=========================================================================================================
		NO ARGUMENTS
		=========================================================================================================
*/

Trip = function() {
	this.userID = arguments[0] || 0;
	this.savedTrip = 0;
}

Trip.prototype = {
	/* 
		THE COOKIENAME VALUE SHOULD BE IN ALL CAPS. THIS VALUE IS THE COOKIE VARIABLE NAME AND
		TYPICALLY COLDFUSION COOKIE VARIABLE NAMES ARE IN ALL CAPS. COLDFUSION IS NOT CASE-SENSITIVE,
		SO IF WE USED saved_trips AND THEN A COOKIE SAVED_TRIPS WAS ALSO CREATED IT CAN CAUSE PROBLEMS
		WITH COLDFUSION, BECAUSE IT WOULD TREAT THEM AS 1 VARIABLE, BUT JAVASCRIPT TREATS THEM AS 2.
	*/
	cookieName : 'SAVED_TRIPS',
	// BY DEFAULT SET THE COOKIE TO EXPIRE IN 90 DAYS
	cookieDays : 90,
	// SAVE IS A PUBLIC METHOD THAT SAVES A TRIP
	save : function(value) {
		if(this.userID == 0) {
			this.saveToCookie(value);
		} else {
			this.saveToDatabase(value);
		}
	},
	// SAVETOCOOKIE IS A PRIVATE METHOD THAT IS USED TO SAVE TRIPS TO A COOKIE FOR A GUEST
	saveToCookie : function(value) {
		var result = new Object();
		result.SUCCESS = false;
		result.COUNT = 0;
		
		if(value) {
			var currentValue = Cookie.get(this.cookieName);
			var exists = currentValue.indexOf(value);
			// ADD THE VALUE IF IT DOESN'T ALREADY EXIST IN THE LIST.
			if(exists == -1) {
				if(currentValue.length == 0) {
					var newValue = value;
				} else {
					var newValue = currentValue + "," + value;
				}
				result.COUNT = newValue.split(',').length;
				Cookie.set(this.cookieName,newValue,this.cookieDays);
				result.SUCCESS =  true;
			} else { // IF IT ALREADY EXISTS IN THE LIST OF VALUES, DON'T ADD IT BUT RETURN TRUE BECAUSE IT IS THERE.
				result.COUNT = currentValue.split(',').length;
				result.SUCCESS =  true;
			}
		}
		// IF NO VALUE IS PASSED IN RETURN FALSE
		this.updateSavedTrip(value,result);
	},
	// SAVETODATABASE IS A PRIVATE METHOD THAT IS USED TO SAVE TRIPS TO A DATABASE FOR LOGGED IN USERS
	saveToDatabase : function(value) {
		// PASS THE USERID AND TRIPID TO A WEB SERIVCE TO SAVE THE TRIP. THE WEB SERVICE WILL RETURN AN 
		// OBJECT WITH SUCCESS AND COUNT VARIABLES AND THESE WILL BE RETURNED TO THE PUBLIC SAVE FUNCTION
		var delegate = this;
		var req = new AjaxRequest({
			f:'/webservices/trip/saved_trip.cfc?method=save_trip&queryFormat=column&userID=' + this.userID + '&tripID=' + value + '&dummy=' + new Date().getTime(),
			m:'get',
			t:'json',
			a:'',
			r:function() {
				// SINCE THE RESULT IS A TEXT STRING WE HAVE TO CONVERT IT INTO A JSON OBJECT
				// THE FOLLOWING EVAL STATEMENT WILL CONVERT A VALID JSON STRING INTO AN OBJECT
				var objResult = eval('(' + arguments[0] + ')');
				delegate.updateSavedTrip(value,objResult);
			} // END AJAX RETURN FUNCTION
		}); // END NEW AJAX REQUEST
	},
	// UPDATESAVEDTRIP IS A METHOD THAT UPDATES THE ITEMS ON THE SEARCH RESULTS PAGE WHEN THE SAVE THIS TRIP LINK IS CLICKED
	updateSavedTrip : function(value,result) {
		// UPDATE THE SAVED TRIP COUNT
		// GET THE STRONG TAG OBJECT THAT HOLDS THE SAVED TRIP COUNT
		var stLink = document.getElementById('saved_trip_count');
		// REMOVE ALL CHILD NODES
		$removeChildNodes(stLink);
		stLink.appendChild(document.createTextNode(result.COUNT));
		// UPDATE THE SAVE THIS TRIP TEXT
		var linkText = document.getElementById(value + '_a');
		$removeChildNodes(linkText);
		linkText.appendChild(document.createTextNode('Trip Saved'));
		linkText.title = 'View Saved Trips';
		linkText.className = linkText.className.replace('save_state_1','save_state_2');
		linkText.onclick = function() {
			trip.listSaved();
		}
		// UPDATE THE SAVE ICON
		//var icon = document.getElementById(value + '_p');
		this.savedTrip = value;
		this.listSaved();
	},
	// REMOVE IS A PUBLIC METHOD THAT REMOVES A TRIP
	remove : function(value) {
		if(this.userID == 0) {
			this.removeFromCookie(value);
		} else {
			this.removeFromDatabase(value);
		}
	},
	// REMOVEFROMCOOKIE IS A PRIVATE METHOD THAT IS USED TO REMOVE A SAVED TRIP FROM A COOKIE FOR A GUEST
	removeFromCookie : function(value) {
		var result = new Object();
		result.SUCCESS = false;
		if(value) {
			var currentValue = Cookie.get(this.cookieName);
			var exists = currentValue.indexOf(value);
			
			if(exists != -1){
				if(currentValue.indexOf("," + value) != -1) {
					var newValue = currentValue.replace("," + value,"");
					result.COUNT = newValue.split(',').length;
				} else if(currentValue.indexOf(value + ",") != -1) {
					var newValue = currentValue.replace(value + ",","");
					result.COUNT = newValue.split(',').length;
				} else {
					var newValue = currentValue.replace(value,"");
					result.COUNT = 0;
				}
				Cookie.set(this.cookieName,newValue,this.cookieDays);
				result.SUCCESS = true;
			} else {
				result.COUNT = currentValue.split(',').length;
				result.SUCCESS = true;
			}
			// UPDATE THE ITEMS ON THE PAGE
			this.updateRemovedTrip(value,result);
		}
	},
	// REMOVEFROMDATABASE IS A PRIVATE METHOD THAT IS USED TO REMOVE A SAVED TRIP FROM A DATABASE FOR A LOGGED IN USER
	removeFromDatabase : function(value) {
		// CREATE A NEW AJAX REQUEST TO REMOVE THE SAVED TRIP
		var delegate = this;
		var req = new AjaxRequest({
			f:'/webservices/trip/saved_trip.cfc?method=remove_trip&queryFormat=column&userID=' + this.userID + '&tripID=' + value + '&dummy=' + new Date().getTime(),
			m:'get',
			t:'json',
			a:'',
			r:function() {
				// SINCE THE RESULT IS A TEXT STRING WE HAVE TO CONVERT IT INTO A JSON OBJECT
				// THE FOLLOWING EVAL STATEMENT WILL CONVERT A VALID JSON STRING INTO AN OBJECT
				var objResult = eval('(' + arguments[0] + ')');
				delegate.updateRemovedTrip(value,objResult);
			} // END AJAX RETURN FUNCTION
		}); // END NEW AJAX REQUEST
		
	},
	// UPDATEREMOVEDTRIP IS A METHOD THAT UPDATES THE ITEMS ON THE SEARCH RESULTS PAGE WHEN THE SAVE THIS TRIP LINK IS CLICKED
	updateRemovedTrip : function(value,result) {
		// UPDATE THE SAVED TRIP COUNT. CHECK FOR THE EXISTENCE OF EACH OBJECT INDIVIDUALLY
		// SOME OBJECTS DO NOT EXIST ON THE INITIAL SEARCH PAGE OR THE TRIP PAGE.
		// GET THE STRONG TAG OBJECT THAT HOLDS THE SAVED TRIP COUNT
		var stLink = document.getElementById('saved_trip_count');
		if(stLink) {
			// REMOVE ALL CHILD NODES
			$removeChildNodes(stLink);
			stLink.appendChild(document.createTextNode(result.COUNT));
		}
		// UPDATE THE SAVE THIS TRIP TEXT
		var linkText = document.getElementById(value + '_a');
		if(linkText) {
			$removeChildNodes(linkText);
			linkText.appendChild(document.createTextNode('Save Trip'));
			/*
				THE FOLLOWING LINE HAS BEEN COMMENTED OUT BECAUSE STEVE WANTED THE TITLE TO SAY
				SAVE TRIP TO COMPARE INSTEAD OF SAVE TRIPNAME. I DID NOT DELETE THIS LINE BECAUSE
				STEVE COULD VERY EASILY CHANGE HIS MIND (AGAIN) ABOUT WHAT THE TITLE TEXT SHOULD SAY.
				I AGREE WITH YOU DAN.
			*/
			//linkText.title = 'Save ' + linkText.rel;
			linkText.title = 'Save Trip to Compare';
			linkText.className = linkText.className.replace('save_state_2','save_state_1');
			linkText.onclick = function() {
				trip.save(value);
			}
		}
		this.listSaved();
	},
	// LISTSAVED IS A PUBLIC METHOD THAT IS USED TO LIST SAVED TRIPS
	listSaved : function() {
		if(this.userID == 0) {
			this.listSavedFromCookie();
		} else {
			this.listSavedFromDatabase();
		}
	},
	// LISTSAVEDFROMCOOKIE IS A PRIVATE METHOD THAT IS USED TO GET THE SAVED TRIP LIST FROM A COOKIE
	listSavedFromCookie : function() {
		// GET THE VALUE OF THE SAVED_TRIPS COOKIE
		var trips = Cookie.get(this.cookieName);
		var delegate = this;
		// CREATE A NEW AJAX REQUEST TO RETRIEVE THE SAVED TRIP INFORMATION
		var req = new AjaxRequest({
			// PASS TRIPS (A COMMA SEPARATED LIST OF TRIP IDS) TO A WEB SERVICE WHICH RETURNS THE IDS AND NAMES
			f:'/webservices/trip/saved_trip.cfc?method=get_trips&queryFormat=column&tripID=' + trips + '&dummy=' + new Date().getTime(),
			m:'get',
			t:'json',
			a:'',
			r:function() {
				// SINCE THE RESULT IS A TEXT STRING WE HAVE TO CONVERT IT INTO A JSON OBJECT
				// THE FOLLOWING EVAL STATEMENT WILL CONVERT A VALID JSON STRING INTO AN OBJECT
				var objResult = eval('(' + arguments[0] + ')');
				// UPDATE THE SAVED TRIP OVERLAY
				delegate.updateSavedTripOverlay(objResult);
				// DISPLAY THE SAVED TRIP OVERLAY
				saved_trip_overlay.show();
			} // END AJAX RETURN FUNCTION
		}); // END NEW AJAX REQUEST
	},
	// LISTSAVEDFROMDATABASE IS A PRIVATE METHOD THAT IS USED TO GET THE SAVED TRIP LIST FROM A DATABASE
	listSavedFromDatabase : function() {
		// CREATE A NEW AJAX REQUEST TO RETRIEVE THE SAVED TRIP INFORMATION
		var delegate = this;
		var req = new AjaxRequest({
			f:'/webservices/trip/saved_trip.cfc?method=get_saved_trips&queryFormat=column&userID=' + this.userID + '&dummy=' + new Date().getTime(),
			m:'get',
			t:'json',
			a:'',
			r:function() {
				// SINCE THE RESULT IS A TEXT STRING WE HAVE TO CONVERT IT INTO A JSON OBJECT
				// THE FOLLOWING EVAL STATEMENT WILL CONVERT A VALID JSON STRING INTO AN OBJECT
				var objResult = eval('(' + arguments[0] + ')');
				// UPDATE THE SAVED TRIP OVERLAY
				delegate.updateSavedTripOverlay(objResult);
				// DISPLAY THE SAVED TRIP OVERLAY
				saved_trip_overlay.show();
			} // END AJAX RETURN FUNCTION
		}); // END NEW AJAX REQUEST
	},
	// UPDATESAVEDTRIPOVERLAY IS A PRIVATE METHOD THAT IS USED TO UPDATE THE SAVED TRIPS OVERLAY AFTER RETRIEVING THE SAVED TRIP LIST FROM THE DATABASE
	updateSavedTripOverlay : function(result) {
		// UPDATE THE SAVED TRIP COUNT. GET THE STRONG TAG OBJECT THAT HOLDS THE SAVED TRIP COUNT
		// THE COUNT SHOULD ALREADY BE CORRECT, BUT IT CAN BE INACCURATE AFTER THE USER USES THE BACK
		// BUTTON, SO UPDATE THAT NUMBER JUST IN CASE.
		var stLink = document.getElementById('saved_trip_count');
		if(stLink) {
			// REMOVE ALL CHILD NODES
			$removeChildNodes(stLink);
			stLink.appendChild(document.createTextNode(result.ROWCOUNT));
		}
		
		// GET THE MAIN OVERLAY CONTAINER OBJECT
		var container = saved_trip_overlay.getElement();
		// GET THE MAIN DIV OBJECT INSIDE THE CONTAINER
		var divs = container.getElementsByTagName("div");
		for(var i=0; i < divs.length; i++) {
			//Mark Wise edited this on 1/15/10 4:16 PM;
			//Allow multiple classNames
			//ORIGINAL if(divs[i].className == container.id) {
			if(divs[i].className.indexOf(container.id) != -1) {
				var div = divs[i];
				break;
			}
		}
		
		
		/*
		// GET THE H2 TAG THAT CONTAINS THE SAVED TRIP # TEXT
		var h2 = div.getElementsByTagName("h2")[0];
		// REMOVE THE CURRENT TEXT AND REPLACE IT WITH AN UPDATED COUNT
		$removeChildNodes(h2);
		h2.appendChild(document.createTextNode("Saved Trips (" + result.ROWCOUNT + ")"));
		// REMOVE THE h3 TAG IF IT EXISTS
		var h3 = div.getElementsByTagName("h3")[0];
		if(h3) {
			div.removeChild(h3);
		}
		*/
		
		//Mark Wise edited this on 1/18/10 12:13 PM;
		//Allow any element with a class name of 'title' to be the saved_trip_overlays title.
		var e=div.childNodes, l=e.length, i=0;
		for(; i<l; i++){
			if(e[i].className && e[i].className.indexOf('title') != -1){
				e[i].firstChild.nodeValue = "Saved Trips (" + result.ROWCOUNT + ")";
				break;
						
			}
			
		}
		
		
		
		// UPDATE THE TRIP LISTING
		var innerDiv = div.getElementsByTagName("div")[0];
		//var ul = innerDiv.getElementsByTagName("ul")[0];
		var table = innerDiv.getElementsByTagName("table")[0];
		var tbody = table.getElementsByTagName("tbody")[0];
		
		// CLEAR THE UL
		//$removeChildNodes(ul);
		// CLEAR THE TBODY
		$removeChildNodes(tbody);
		
		// LOOP THROUGH THE RESULT OBJECT TO POPULATE THE SAVED TRIP LIST
		for(var i=0; i < result.ROWCOUNT; i++) {
			// CHECK TO SEE IF A TRIP WAS JUST SAVED
			/*if(this.savedTrip != 0 && this.savedTrip == result.DATA.PACKAGEID[i]) {
				var newh3 = document.createElement("h3");
				div.insertBefore(newh3,h2.nextSibling);
				newh3.innerHTML = result.DATA.TPCPACKAGE[i] + " saved successfully.";
				//newh3.appendChild(document.createTextNode(result.DATA.TPCPACKAGE[i] + " saved successfully."));
				this.savedTrip = 0;
			}*/
			
			// FIRST ADD THE TR
			var tr = document.createElement("tr");
			tbody.appendChild(tr);
			// SET THE CLASS ON ODD ROWS. SINCE I STARTS AT 0, NOT 1, THIS WILL ACTUALLY LOOK LIKE THE EVEN ROWS TO THE USER
			if(i % 2 == 1) {
				tr.className = "nth_child_odd";
			}
			
			
			// CREATE THE REMOVE BUTTON TD
			var remove_td = document.createElement("td");
			tr.appendChild(remove_td);
			
			
			// CREATE THE A TAG
			var remove_a = document.createElement("a");
			remove_td.appendChild(remove_a);
			remove_a.href = "javascript:void(0);";
			remove_a.title = "Remove " + result.DATA.TPCPACKAGE[i];
			remove_a.id = "remove-trip_" + result.DATA.PACKAGEID[i];
			remove_a.onclick = function() {
				trip.remove(this.id.split('_')[1]);
			}
			
			// CREATE THE REMOVE IMAGE
			var remove_img = document.createElement("img");
			remove_a.appendChild(remove_img);
			remove_img.width = 11;
			remove_img.height = 11;
			remove_img.src = "/assets/images/graphics/icons/remove.gif";
			
			
			
			// CREATE THE TRIP NAME TD
			var trip_td = document.createElement("td");
			tr.appendChild(trip_td);
			// CREATE THE A TAG
			var trip_a = document.createElement("a");
			trip_td.appendChild(trip_a);
			trip_a.href = "/travel/index.cfm?tid=" + result.DATA.PACKAGEID[i];
			trip_a.title = "View " + result.DATA.TPCPACKAGE[i];
			trip_a.innerHTML = result.DATA.TPCPACKAGE[i];
			
		}
	},
	// COMPARE IS A PUBLIC METHOD THAT IS USED TO CONTROL THE ACTION OF THE COMPARE LINK
	compare : function(target) {
		if(this.userID == 0) {
			// GET COUNT FROM COOKIE
			var save_count = Cookie.get(this.cookieName).split(',').length;
			// IF THEY HAVE SAVED 2 OR MORE TRIPS, RETURN TRUE AND ALLOW THE HREF TO FIRE
			if(save_count > 1) {
				document.location.href = target;
			} else { // IF THEY HAVE NOT SAVED 2 OR MORE TRIPS, LIST THE SAVED TRIPS
				compare_overlay.show();
				//this.listSaved();
			}
		} else {
			// CREATE A NEW AJAX REQUEST TO RETRIEVE THE SAVED TRIP COUNT
			//var delegate = this;
			var req = new AjaxRequest({
				f:'/webservices/trip/saved_trip.cfc?method=get_saved_trip_count&queryFormat=column&userID=' + this.userID + '&dummy=' + new Date().getTime(),
				m:'get',
				t:'json',
				a:'',
				r:function() {
					// SINCE THE RESULT IS A TEXT STRING WE HAVE TO CONVERT IT INTO A JSON OBJECT
					// THE FOLLOWING EVAL STATEMENT WILL CONVERT A VALID JSON STRING INTO AN OBJECT
					var objResult = eval('(' + arguments[0] + ')');
					var save_count = objResult.DATA.TRIP_COUNT[0];
					if(save_count > 1) {
						document.location.href = target;
					} else { // IF THEY HAVE NOT SAVED 2 OR MORE TRIPS, LIST THE SAVED TRIPS
						compare_overlay.show();
						//delegate.listSaved();
					}
				} // END AJAX RETURN FUNCTION
			}); // END NEW AJAX REQUEST
			
		}
	}
}



