// THIS FILE CONTAINS THE MOST COMMON UTILITY FUNCTIONS

var isIE = (navigator.userAgent.indexOf("MSIE") != -1) ? true : false;
var isIE6 = (navigator.userAgent.indexOf("MSIE 6") != -1) ? true : false;

/*
	CLEANTEXT IS A FUNCTION THAT REMOVES HTML ENTITIES AND REPLACES THEM WITH CHARACTERS JAVASCRIPT CAN DISPLAY IN A TEXT NODE.
	THE JAVASCRIPT ESCAPED VERSIONS CAN BE OCTAL (\DDD), HEXIDECIMAL, (\XDD) OR UNICODE (\UDDDD). BELOW WE ARE USING HEX BY
	DEFAULT. IF WE CANNOT FIND A HEX VALUE THAT WORKS, THEN USE UNICODE.
*/
String.prototype.replaceHTMLEntity = function() {
	var cleanString = this;
	cleanString = cleanString.replace(/&amp;/g,'\x26');
	cleanString = cleanString.replace(/&reg;/g,'\xAE');
	cleanString = cleanString.replace(/&trade;/g,'\u2122');
	cleanString = cleanString.replace(/&copy;/g,'\xA9');
	cleanString = cleanString.replace(/&reg;/g,'\xAE');
	cleanString = cleanString.replace(/&aacute;/g,'\xE1');
	cleanString = cleanString.replace(/&eacute;/g,'\xE9');
	cleanString = cleanString.replace(/&ntilde;/g,'\xF1');
	return cleanString;
}

/*
	NUMBERFORMAT IS A FUNCTION THAT WAS FOUND ON THE MOO TOOLS FORUMS. IT ALLOWS US TO FORMAT ANY NUMBER IN JAVASCRIPT
*/
Number.implement({
 
	/*
	Property: numberFormat
		Format a number with grouped thousands.

	Arguments:
		decimals, optional - integer, number of decimal percision; default, 2
		dec_point, optional - string, decimal point notation; default, '.'
		thousands_sep, optional - string, grouped thousands notation; default, ','

	Returns:
		a formatted version of number.

	Example:
		>(36432.556).numberFormat()  // returns 36,432.56
		>(36432.556).numberFormat(2, '.', ',')  // returns 36,432.56
	*/

	numberFormat : function(decimals, dec_point, thousands_sep) {
		decimals = Math.abs(decimals) + 1 ? decimals : 2;
		dec_point = dec_point || '.';
		thousands_sep = thousands_sep || ',';

		var matches = /(-)?(\d+)(\.\d+)?/.exec((isNaN(this) ? 0 : this) + ''); // returns matches[1] as sign, matches[2] as numbers and matches[2] as decimals
		var remainder = matches[2].length > 3 ? matches[2].length % 3 : 0;
		return (matches[1] ? matches[1] : '') + (remainder ? matches[2].substr(0, remainder) + thousands_sep : '') + matches[2].substr(remainder).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep) + 
				(decimals ? dec_point + (+matches[3] || 0).toFixed(decimals).substr(2) : '');
	}


});

/* THESE HAVE BEEN REPLACED BY MOOTOOLS
function $() {
	return document.getElementById(arguments[0]);
}

function $$() {
	return document.getElementsByTagName(arguments[0]);
}*/

function $removeChildNodes() {
	var a = (typeof arguments[0] == "string") ? $(arguments[0]) : arguments[0];
	while ( a.hasChildNodes() ) {
		a.removeChild(a.childNodes[0]);
	}
}

function $removeElement() {
	var e = (typeof arguments[0] == "string") ? $(arguments[0]) : arguments[0];
	var parent = e.parentNode;
	parent.removeChild(e);
}

function $getViewportScrollY() {
  var scrollY = 0;
  if( document.documentElement && document.documentElement.scrollTop ) {
    scrollY = document.documentElement.scrollTop;
  }
  else if( document.body && document.body.scrollTop ) {
    scrollY = document.body.scrollTop;
  }
  else if( window.pageYOffset ) {
    scrollY = window.pageYOffset;
  }
  else if( window.scrollY ) {
    scrollY = window.scrollY;
  }
  return scrollY;
}


// ACCEPTS ARRAYS A AND B. ATTEMPTS TO FIND EACH ELEMENT IN ARRAY B IN ARRAY A.
// ONCE A MATCH HAS BEEN FOUND THE POSITION OF THAT ITEM IN ARRAY A IS RETURNED.
// THIS FIND IS CASE SENSITIVE
function $arrayFind(arr_a,arr_b) {
	// LOOP THROUGH ARRAY B
	for (var i=0; i<arr_b.length; i++) {
		var e = arr_b[i];
		// USE INDEXOF TO SEARCH ARRAY A FOR VALUE E
		for (var j=0; j<arr_a.length; j++) {
			if (e == arr_a[j]) {
				return j;
			}
		}
	}
	// IF NOTHING IS FOUND RETURN -1
	return -1
}

// CASE-INSENSITIVE VERSION OF $ARRAYFIND
function $arrayFindNoCase(arr_a,arr_b) {
	var a = [];
	var b = [];
	// LOOP THROUGH ARRAY A
	for (var i=0; i<arr_a.length; i++) {
		a.push(arr_a[i].toLowerCase());
	}
	// LOOP THROUGH ARRAY B
	for (var j=0; j<arr_b.length; j++) {
		b.push(arr_b[j].toLowerCase());
	}
	// CALL $ARRAYFIND NOW THAT ALL VALUES ARE IN LOWER CASE
	return $arrayFind(a,b);
}

// FIREEVENT IS A WAY TO PROGRAMMATICALLY SIMULATE AN EVENT, LIKE A MOUSECLICK OR AN ONCHANGE
// THIS FUNCTION WAS FOUND AT http://jehiah.cz/archive/firing-javascript-events-properly
function $fireEvent(element,event){
	if (document.createEventObject){
		// DISPATCH FOR IE
		var evt = document.createEventObject();
		return element.fireEvent('on'+event,evt)
	}
	else{
		// DISPATCH FOR FIREFOX + OTHERS
		var evt = document.createEvent("HTMLEvents");
		evt.initEvent(event, true, true ); // EVENT TYPE,BUBBLING,CANCELABLE
		return !element.dispatchEvent(evt);
	}
}

// THE $CHECKALL FUNCTION IS A WAY TO CHECK, OR UNCHECK, A GROUP OF CHECKBOXES, OR TO UNCHECK A GROUP OF RADIO BUTTONS
function $checkAll() {
	var e = (typeof arguments[0] == "string") ? document.getElementsByName(arguments[0]) : arguments[0];
	// THIS FUNCTION WILL CHECK ALL BY DEFAULT. PASS IN FALSE TO UNCHECK ALL
	var checkIt = (arguments.length > 1) ? arguments[1] : true;
	var len = e.length;
	
	// RETURN FALSE IF THE TYPE IS NOT CHECKBOX OR RADIO OR IF SOMEONE IS TRYING TO CHECK ALL RADIO BUTTONS
	if( !(e[0].type == "checkbox" || e[0].type == "radio") || (e[0].type == "radio" && checkIt) ) {
		return false;
	} else {
		for(var i=0; i < len; i++) {
			e[i].checked = checkIt;
		}
	}
	return true;
}

// THE $GETSLIDESHOWIMAGES FUNCTION PROVIDES AN AJAX GATEWAY TO RETRIEVE IMAGES FOR THE IMAGE GALLERY
function $getSlideShowImages() {
	var method = arguments[0];
	var id = arguments[1];
	var d = new Date();
	// THE CACHESTRING WILL BE UNIQUE PER DAY, SO BROWSERS CAN CACHE A GALLERY REQUEST FOR A DAY. SINCE THE GALLERIES RARELY CHANGE THIS SHOULD BE OK.
	var cacheString = d.getFullYear().toString() + d.getMonth().toString() + d.getDate().toString();
	var gallery_div_id = (arguments[2]) ? arguments[2] : 'image_gallery';
	var myRequest = new Request.JSON({
		url: '/webservices/image_gallery/slide_show.cfc'
		,method: 'get'
		,data: 'method=' + method + '&id=' + id + '&dummy=' + cacheString
		,onSuccess: function(obj,txt) {
			initializeImageGallery(obj,gallery_div_id);
					
		}
		,onFailure: function(e) {
			alert('Error: ' + e.status + '\nPlease try again');
		}
	}).send();
	
	if(gallery_div_id == 'image_gallery'){
		imageGalleryOverlay.show();
	}
			
}

// THE $GETSLIDESHOWIMAGES FUNCTION PROVIDES AN AJAX GATEWAY TO RETRIEVE IMAGES FOR THE IMAGE GALLERY
function $getSlideShowImages2() {
	var method = arguments[0];
	var nvp = arguments[1];
	var d = new Date();
	// THE CACHESTRING WILL BE UNIQUE PER DAY, SO BROWSERS CAN CACHE A GALLERY REQUEST FOR A DAY. SINCE THE GALLERIES RARELY CHANGE THIS SHOULD BE OK.
	var cacheString = d.getFullYear().toString() + d.getMonth().toString() + d.getDate().toString();
	var gallery_div_id = (arguments[2]) ? arguments[2] : 'image_gallery';
	var myRequest = new Request.JSON({
		url: '/webservices/image_gallery/slide_show.cfc'
		,method: 'get'
		,data: 'method=' + method + '&' + nvp + '&dummy=' + cacheString
		,onSuccess: function(obj,txt) {
			initializeImageGallery(obj,gallery_div_id);
					
		}
		,onFailure: function(e) {
			alert('Error: ' + e.status + '\nPlease try again');
		}
	}).send();
	
	if(gallery_div_id == 'image_gallery'){
		imageGalleryOverlay.show();
	}
			
}

// THE $GETTRAVELINTERESTOVERLAY FUNCTION PROVIDES AN AJAX GATEWAY TO RETRIEVE DETAILS FOR A TRAVEL INTEREST TO BE DISPLAYED IN AN OVERLAY
function $getTravelInterestOverlay() {
	var id = arguments[0];
	var myRequest = new Request.JSON({
		url: '/webservices/trip/auxiliary_data.cfc'
		,method: 'get'
		,data: 'method=getTravelInterestOverlay&id=' + id
		,onSuccess: function(obj, txt){
			$updateTravelInterestOverlay(obj)
		}
		,onFailure: function(e) {
			alert('Error: ' + e.status + '\nPlease try again');
		}
	}).send();
}

function $getSeriesOverlay() {
	var id = arguments[0];
	var myRequest = new Request.JSON({
		url: '/webservices/trip/auxiliary_data.cfc'
		,method: 'get'
		,data: 'method=getSeriesOverlay&id=' + id
		,onSuccess: function(obj, txt){
			$updateTravelInterestOverlay(obj)
		}
		,onFailure: function(e) {
			alert('Error: ' + e.status + '\nPlease try again');
		}
	}).send();
}

function $updateTravelInterestOverlay(obj){
	var overlay_div = $('travel_interest_overlay');
	/*var h2 = overlay_div.getElement('h2');*/
	var h2 = $$('#travel_interest_overlay .hl2')[0];
	h2.set('html',obj.h2_content);
	h2.set('class',obj.class_name + ' hl2');
	
	var div = h2.getNext('div');
	div.set('html',obj.description);
	div.set('class','description ' + obj.class_name);
	travel_interest_overlay.show();
}

