function definePackage (packageName) {
//	alert("definePackage: "+packageName);
	var levels = packageName.split(".");
	if(levels.length > 0){
		var exists = !eval(" typeof "+levels[0]+"=='undefined'");
		if(!exists){
			eval("window."+levels[0]+"={};");
		}
		var packagesBuilt = levels[0]+".";
		for (var i = 1 ; i < levels.length; i++) {
			exists = !eval(" typeof "+packagesBuilt+levels[i]+"=='undefined'");
			if(!exists){
				eval(packagesBuilt+levels[i]+"={};");
			}
			packagesBuilt = packagesBuilt+levels[i]+".";
		}
	}

}; 

/******************************************************************/
/*   This js file needs the following dependencies:
 *     stylesheets/dialog.css
 *     2.8.0r4/build/container/assets/skins/sam/container.css
 *     2.8.0r4/build/button/assets/skins/sam/button.css
 *     2.8.0r4/build/tabview/assets/skins/sam/tabview.css
 *     2.8.0r4/build/autocomplete/assets/skins/sam/autocomplete.css
 *     
 *     /dwr/engine.js
 *     /dwr/interface/DeviceService.js
 *     /dwr/interface/MessageService.js
 *     2.8.0r4/build/yahoo-dom-event/yahoo-dom-event.js
 *     2.8.0r4/build/element/element-min.js
 *     2.8.0r4/build/container/container-min.js
 *     2.8.0r4/build/datasource/datasource-min.js
 *     2.8.0r4/build/autocomplete/autocomplete-min.js
 */

/******************************************************************/

if(eval(" typeof skyguardPackage =='undefined'")){

	window.skyguardPackage={};
}

skyguardPackage.addressStateOptionsArray = ["", "AL", "AK", "AR", "AZ", "CA", "CO", "CT", "DC", "DE", "FL", "GA", "HI", "IA", "ID", "IL", "IN", "KS",
"KY", "LA", "MA", "MD", "ME", "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "PR  ", "RI", "SC",
"SD", "TN", "TX", "UT", "VA", "VT", "WA", "WI", "WV", "WY"];

skyguardPackage.getAddressStateOptionsString = function(){
	return skyguardPackage.createOptionsListString(skyguardPackage.addressStateOptionsArray);
}
skyguardPackage.createOptionsListString = function(list){
	return "<option>"+list.join("</option><option>")+"</option>";
}
skyguardPackage.setSelectBoxValue = function (select, value) {
	var options = select.options;
	for(i= 0 ; i < options.length; i++){
		if(options[i].value == value){
			return options[i].selected = true;
		}
	}
}
skyguardPackage.getSelectBoxValue = function (select) {
	var options = select.options;
	for(i= 0 ; i < options.length; i++){
		if(options[i].selected){
			if(options[i].value && options[i].value.length > 0) {
				return options[i].value;
			} else {
				return options[i].text;
			}
		}
	}
	return null;
}
skyguardPackage.HTMLEscape = function (inputStr) {
	if(inputStr != null && inputStr.replace){
		inputStr = inputStr.replace(/&/g,'&amp;').
		replace(/>/g,'&gt;').
		replace(/</g,'&lt;').
		replace(/"/g,'&quot;');
	}
	return inputStr;
};
skyguardPackage.preferenceSetting = null;
skyguardPackage.loadPreferencesSettings = function() {
	UserPreferencesService.getAllUserPreferences({async :false,
		callback : function(settings) {
			skyguardPackage.preferenceSetting = settings; 
		}
	});
}

skyguardPackage.getPreferenceSetting = function (preferenceName, defaultValue){
	preferenceName = "skyguardPackage."+preferenceName;
	if(skyguardPackage.preferenceSetting == null) {
		skyguardPackage.loadPreferencesSettings();
	}
	if(skyguardPackage.preferenceSetting !== null) {
		for(var i = 0; i< skyguardPackage.preferenceSetting.length; i++){
			var currentPrefName = skyguardPackage.preferenceSetting[i].preferenceName;
			if(currentPrefName == preferenceName) {
				return skyguardPackage.preferenceSetting[i].preferenceValue;
			}
		}
	}
	return defaultValue; 
};

skyguardPackage.updatePreferenceSetting = function (preferenceName, value){
	preferenceName = "skyguardPackage."+preferenceName;
	var found = false;
	for(var i = 0; i< skyguardPackage.preferenceSetting.length; i++){
		var currentPrefName = skyguardPackage.preferenceSetting[i].preferenceName;
		if(currentPrefName == preferenceName) {
			skyguardPackage.preferenceSetting[i].preferenceValue = value;
			found = true;
			break;
		}
	}
	if(!found) {
		skyguardPackage.preferenceSetting[skyguardPackage.preferenceSetting.length] = {preferenceName: preferenceName, preferenceValue:value};
	}
	UserPreferencesService.updateUserPreference(preferenceName, value);
};
skyguardPackage.getInputValue = function(input, trim){
	var value = "";
	if(!YAHOO.util.Dom.hasClass(input, "invite")) {
		value =  input.value;
	}
	if(trim){
		value = value.replace(/^\s+|\s+$/g, "");
	}
	return value;
}
skyguardPackage.createInvite = function(inputName, inviteText) {
	var inputEl = YAHOO.util.Dom.get(inputName);
	var checkInvite = function() {
		if(inputEl.value.length == 0) {
			YAHOO.util.Dom.addClass(inputEl, 'invite');
			inputEl.value = inviteText;
		}
	}
	checkInvite();
	YAHOO.util.Event.addListener(inputEl ,'focus', function() {
		if(YAHOO.util.Dom.hasClass(inputEl, 'invite')) {
			YAHOO.util.Dom.removeClass(inputEl, 'invite');
			inputEl.value = "";
		}
	});
	YAHOO.util.Event.addListener(inputEl ,'blur', checkInvite);
}

skyguardPackage.comboBox = function(comboBoxName, autoCompleteConfigs,  dataSource){

	var selectedItem = null;
	var comboBoxAC = null;

	var getDisplayFromData = function(data){
		var sMatchKey = (dataSource.responseSchema.fields) ? (dataSource.responseSchema.fields[0].key || dataSource.responseSchema.fields[0]) : 0;
		return data[sMatchKey];
	};
	this.getMarkup =  function(){
		var initialValue = "";
		if(selectedItem != null){
			initialValue = getDisplayFromData(selectedItem);
		}
		var markup = [];
		markup.push('<span class="sg-combo-box" id="'+comboBoxName+'Container">');
		markup.push('<input name="');
		markup.push(comboBoxName);
		markup.push('" id="'+comboBoxName+'" type="text" value="'+skyguardPackage.HTMLEscape(initialValue)+'">');
		markup.push('<span id="'+comboBoxName+'ComboToggleButton" class="button-container"></span>');
		markup.push('<div id="'+comboBoxName+'ComboContainer"></div>');
		markup.push('</span>');
		return markup.join("");
	};

	this.hide = function() {
		YAHOO.util.Dom.addClass(comboBoxName+'Container', 'hidden-sg-combo-box');
	}

	this.show = function() {
		YAHOO.util.Dom.removeClass(comboBoxName+'Container', 'hidden-sg-combo-box');
	}

	this.getInputElement = function(){
		return YAHOO.util.Dom.get(comboBoxName);
	};

	this.getSelectedItem = function () {
		return selectedItem;
	}

	this.setSelectedItem = function(item) {
		selectedItem = item;
	}
	this.getComboBoxAutoComplete = function() {
		return comboBoxAC;
	}
	this.createComboBox = function(){

		//We use forceSelection to fire the enforce event. So we can managed the selected item
		autoCompleteConfigs.forceSelection=true;
		autoCompleteConfigs.autoSnapContainer=false;
		comboBoxAC = new YAHOO.widget.AutoComplete(comboBoxName, comboBoxName+"ComboContainer", dataSource, autoCompleteConfigs);
		var containerOpen = false;

		//Fire itemSelectEvent when the item is also unselected.
		comboBoxAC.selectionEnforceEvent.subscribe(function(sType, aArgs) {
			//console.log("selectionEnforceEvent");
			//try{
			var myAC = aArgs[0]; // reference back to the AC instance 
			var sClearedValue= aArgs[1]; // The selected string.

			//Put this value Back.
			myAC.getInputEl().value=sClearedValue;

			//if(selectedItem != null){
			//	alert("selectedLandmark[sMatchKey]="+selectedItem[sMatchKey]);
			//}
			if(selectedItem != null && getDisplayFromData(selectedItem) != sClearedValue){
				//var landmark = findLandmarkByName(sClearedValue);
				comboBoxAC.itemSelectEvent.fire(this, null, null);
			}
			//} catch(e){alert("selectionEnforceEvent Error:"+e);}
		});

		var highlightMatch = function(full, snippet, matchindex) { 
			return full.substring(0, matchindex) +  
				"<span style='font-weight: bold;'>" +  
				full.substr(matchindex, snippet.length) +  
				"</span>" + 
				full.substring(matchindex + snippet.length); 
		};

		comboBoxAC.formatResult = function(oResultData, sQuery, sResultMatch) { 
			try{
	

//				var sMatchKey = (this.dataSource.responseSchema.fields) ? 
//					(this.dataSource.responseSchema.fields[0].key || this.dataSource.responseSchema.fields[0]) : 0;
//				var displayValue = oResultData[sMatchKey];
				var displayValue = getDisplayFromData(oResultData);

				var query = sQuery.toLowerCase();

				var matchIndex = displayValue.toLowerCase().indexOf(query);
				displayValue = highlightMatch(displayValue, query, matchIndex);
				return displayValue; 
			}catch(e) {alert("formatResult Error"+e.message);}
		};

		comboBoxAC.itemSelectEvent.subscribe(function(sType, aArgs) {

			selectedItem = aArgs[2]; // object literal of selected item's result data 
		}); 

		var buttonToggle = function(e) {
			// Is open
			if(containerOpen) {
				comboBoxAC.collapseContainer();
			}
			// Is closed
			else {
				comboBoxAC.getInputEl().focus(); // Needed to keep widget active
				var searchString = comboBoxAC.getInputEl().value;
				setTimeout(function() { // For IE
					comboBoxAC.sendQuery(searchString);
				}, 0);
			}
		}
		var selectToggler = YAHOO.util.Dom.get(comboBoxName+"ComboToggleButton");
		var oPushButton = new YAHOO.widget.Button({container:selectToggler});
		oPushButton.on("mousedown", buttonToggle);

		oPushButton.on("keydown", function(p_oEvent) {
			var charCode = YAHOO.util.Event.getCharCode(p_oEvent);
			if(charCode == 13 || charCode == 32){
				buttonToggle();
			}
		});

		YAHOO.util.Dom.setStyle(comboBoxAC.getContainerEl(),"display", "none");
		comboBoxAC.containerCollapseEvent.subscribe(function(){

			YAHOO.util.Dom.setStyle(comboBoxAC.getContainerEl(),"display", "none");
			YAHOO.util.Dom.removeClass(selectToggler, "open");
			window.setTimeout(function(){containerOpen = false;},200);
			});

		comboBoxAC.doBeforeExpandContainer = function(){

			YAHOO.util.Dom.setStyle(comboBoxAC.getContainerEl(),"display", "block");
			var inputFieldRegion = YAHOO.util.Dom.getRegion(comboBoxAC.getInputEl());
			var buttonRegion = YAHOO.util.Dom.getRegion(selectToggler);
			YAHOO.util.Dom.setX(comboBoxAC.getContainerEl(), inputFieldRegion.left);
			YAHOO.util.Dom.setY(comboBoxAC.getContainerEl(), inputFieldRegion.bottom);
			var borderWidths = 4;
			YAHOO.util.Dom.setStyle(comboBoxAC.getContainerEl(), "width", (buttonRegion.right - inputFieldRegion.left- borderWidths)+"px");
			YAHOO.util.Dom.addClass(selectToggler, "open");
			containerOpen = true;
			return true;
		};
		comboBoxAC.itemArrowToEvent.subscribe(function(eventName, params){

			var elItem = params[1];
			var visibleBottom = (comboBoxAC.getContainerEl().scrollTop + comboBoxAC.getContainerEl().offsetHeight);
			var itemBottom = (elItem.offsetTop + elItem.offsetHeight);
			if(visibleBottom < itemBottom) {
				//Try to scroll the bottom of the item into view.
				comboBoxAC.getContainerEl().scrollTop = elItem.offsetTop - (comboBoxAC.getContainerEl().offsetHeight - elItem.offsetHeight);
			} else if(elItem.offsetTop < comboBoxAC.getContainerEl().scrollTop) {
				comboBoxAC.getContainerEl().scrollTop = elItem.offsetTop;
			}
		});
		return comboBoxAC;
	}
}

skyguardPackage.getDisplayLandmarkName = function(landmark) {
	var displayLandmarkName = landmark.name;
	if (landmark.scheduleName != null && landmark.scheduleName.length > 0) {
		displayLandmarkName += " (" + landmark.scheduleName + ")";
	}
	return displayLandmarkName;
}
skyguardPackage.createLandmarkComboBox = function(landmarkComboBoxName){

	var landmarkDataSource = new YAHOO.util.FunctionDataSource(function(sQuery) {
		var nameMatch = decodeURIComponent(sQuery);
		var matches = null;
		var matchLimit = 21;
		try {
		LandmarkService.getLandmarkInstancesMatchingName(nameMatch, matchLimit, {async:false, 
			callback: function(landmarks) {
			if(landmarks){
				if(landmarks.length == matchLimit) {

					//Throw away the last 1, so we are sure there are more.
					landmarks.pop();
					landmarkComboBox.getComboBoxAutoComplete().setFooter("<i><b>Note: Only displaying first "+landmarks.length+ " matches.</b><i>"); 

				} else {

					landmarkComboBox.getComboBoxAutoComplete().setFooter("");
				}

				for(var i = 0 ; i < landmarks.length; i++){
					landmarks[i].displayLandmarkName = skyguardPackage.getDisplayLandmarkName(landmarks[i]);
				}
				matches = landmarks;
			}
			}
		});
		return matches;
		} catch (e) {
			alert("getLandmarkInstancesMatchingName Error: " + e.message);
		}
	});

	landmarkDataSource.responseSchema = { 
		fields: ["displayLandmarkName", "name", "id", "shape", "color", "street1", "city", "state", "zip", "longitude", "latitude", "scheduleId", "scheduleDeviceId", "scheduleDeviceName", "scheduleName", "garminLocationRecordId", "instanceId", "deviceCommunicationStatus", "stopStatus", "startScheduleSqlTimestamp", "endScheduleSqlTimestamp", "garminDeviceId"] 
	}
	var autoCompleteConfigs = {
			prehighlightClassName: "yui-ac-prehighlight",
			useShadow: true,
			queryDelay: 0.3,
			maxResultsDisplayed: 1000,
			minQueryLength: 0,
			resultTypeList: false,
			animVert: false
	};
	var landmarkComboBox = new skyguardPackage.comboBox(landmarkComboBoxName, autoCompleteConfigs, landmarkDataSource);
	landmarkComboBox._super_createComboBox = landmarkComboBox.createComboBox;
	landmarkComboBox.createComboBox = function(){
		var landmarkSelectAC = landmarkComboBox._super_createComboBox();
		var highlightMatch = function(full, snippet, matchindex) { 
			return full.substring(0, matchindex) +  
				"<span style='font-weight: bold;'>" +  
				skyguardPackage.HTMLEscape(full.substr(matchindex, snippet.length)) +  
				"</span>" + 
				skyguardPackage.HTMLEscape(full.substring(matchindex + snippet.length)); 
		};

		landmarkSelectAC.formatResult = function(oResultData, sQuery, sResultMatch) { 
			try{
				var landmark = oResultData;
				var query = sQuery.toLowerCase();
				var displayLandmarkName = landmark.displayLandmarkName; 

				var landmarkNameMatchIndex = displayLandmarkName.toLowerCase().indexOf(query);
				displayLandmarkName = highlightMatch(displayLandmarkName, query, landmarkNameMatchIndex);

				return '<img witdh="18" height="18" src="servlet/geticon?type=L&letter=L'+landmark.shape+'&color='+landmark.color+'">'+displayLandmarkName; 
			}catch(e) {alert("formatResult Error"+e.message);}
		};
		return landmarkSelectAC;
	}

	return landmarkComboBox;
}

skyguardPackage.createDeviceComboBox = function(deviceComboBoxName , initialDeviceId, terminalType){
	try{

	var autoCompleteConfigs = {
			prehighlightClassName :"yui-ac-prehighlight",
			useShadow :true,
			queryDelay :0.3,
			maxResultsDisplayed :1000,
			minQueryLength :0,
			resultTypeList :false,
			animVert :false
		};
	var deviceDataSource = new YAHOO.util.FunctionDataSource( function(sQuery) {
		var nameMatch = decodeURIComponent(sQuery);

		var matches = null;
		var matchLimit = 21;
//		 alert("calling getDevicesWithMatchingNames for "+nameMatch+" "+terminalType);
			try {
				DeviceService.getDevicesWithMatchingNames(nameMatch, terminalType, matchLimit, {
					async :false,
					callback : function(vehicles) {
						// alert("calling getDevicesWithMatchingNames reurned "+vehicles.length);
						if (vehicles.length == matchLimit) {

							// Throw away the last 1, so we are sure there are more.
							vehicles.pop();
							deviceComboBox.getComboBoxAutoComplete().setFooter("<i><b>Note: Only displaying first "+vehicles.length+ " matches.</b><i>");

						} else {

							deviceComboBox.getComboBoxAutoComplete().setFooter("");
						}

						for ( var i = 0; i < vehicles.length; i++) {
							vehicles[i].displayVehicleName = getDisplayDeviceName(vehicles[i]);
						}
						matches = vehicles;
					}
				});
				return matches;
			} catch (e) {
				alert("getDevicesWithMatchingNames Error: " + e.message);
			}
		});
	deviceDataSource.responseSchema = {
		fields : [ "displayVehicleName", "name", "driverName", "id" ]
	}

	var deviceComboBox = new skyguardPackage.comboBox(deviceComboBoxName, autoCompleteConfigs, deviceDataSource);

	var getDisplayDeviceName = function(device) {
		var deviceName = device.name;
		var driverName = device.driverName;

		var displayDeviceName = deviceName;
		if (driverName.length > 0) {
			displayDeviceName += " (" + driverName + ")";
		}
		return displayDeviceName;
	};

	if (initialDeviceId) {
		var selectedDevice = null;
		DeviceService.getVehicleForId(initialDeviceId, {
			async :false,
			callback : function(device) {
				selectedDevice = device;
				if(selectedDevice != null) {
					selectedDevice.displayVehicleName = getDisplayDeviceName(selectedDevice);
				}
			}
		});
		deviceComboBox.setSelectedItem(selectedDevice);
	}


//	YAHOO.util.Event.onAvailable(deviceComboBoxName, function(){
//
//		deviceSelectAC = deviceComboBox.createComboBox();
//	});
	return deviceComboBox;
	}catch(e) {alert("createDeviceComboBox Error:"+e.message);}
}
skyguardPackage._yui_OverLayManager = null;
skyguardPackage.getOverLayManager = function(){
	if(skyguardPackage._yui_OverLayManager == null){
		skyguardPackage._yui_OverLayManager = new YAHOO.widget.OverlayManager();
	}
	return skyguardPackage._yui_OverLayManager;
}
function getCookie(cookieName)
{
   var cookiedata = document.cookie;
   if(cookiedata == null || cookiedata.length<1)
      return null;

   var front = cookiedata.indexOf(cookieName);
   var end;
   if(front>=0)
   {
      end = cookiedata.indexOf(";",front+1);
      if(end == -1)
      {
         end = cookiedata.length;
      }

      return unescape(cookiedata.substring(front+cookieName.length+1,end));
   }
   else
   {
      return null;
   }
}


function setCookie(name, value, expires, path, domain, secure)
{
   var toStore = name + "=" + escape(value) +
                     ((expires) ? "; expires=" + expires.toGMTString() : "") +
                     ((path) ? "; path=" + path : "") +
                     ((domain) ? "; domain=" + domain : "") +
                     ((secure) ? "; secure=" + secure : "");

   //document.write("Cookie to be stored = "+ toStore);
   document.cookie = toStore;
}


function deleteCookie(name, path, domain)
{
   var cookie = getCookie(name);
   if(cookie != null && cookie.length>0)
   {
       document.cookie = name + "=" +
           ((path) ? "; path=" + path : "") +
           ((domain) ? "; domain=" + domain : "") +
           "; expires=Thu, 01-Jan-70 00:00:01 GMT";
   }
}

