cms_ngapp.controller('cardController', function($scope, $rootScope, $mdDialog, $msgService, $mdSidenav, $mdMedia, $favoriteService, $cardviewer, $location, $timeout, $http) {
	var timer;
	$scope.cards = [];
	$scope.card_loading=false;
	$scope.favorite_svc = $favoriteService;
	$scope.cache_in_use = false;
	$scope.pagination = {current: 1};
	
	$scope.card_viewer = angular.copy($cardviewer);
	if ( typeof $scope.data.cardViewer != "undefined" ) {
		$scope.card_viewer.setObj($scope.data.cardViewer);
	}
	
	$scope.card_viewer.current_pageid = "";
	if ( typeof $rootScope.page != "undefined" ) {
		$scope.card_viewer.current_pageid = $rootScope.page.id;
		$scope.card_viewer.refreshCacheKeys();
	}
	
	$scope.screenIsSmall = !$mdMedia('gt-sm');
	if ( $scope.screenIsSmall ) {
		$scope.card_viewer.setPinSidebar(false, false);
	}
	
	$rootScope.$on("evg.savedfilters.labelupd", function(e, filterData) {
		$scope.card_viewer.setSavedFilterLabel(filterData.id, filterData.label);
	});
	
	$rootScope.$on("evg.savedfilters.rmv", function(e, filterData) {
		$scope.card_viewer.removeSavedFilterFromList(filterData.id);
	});
	
	$scope.toggleSidebar = buildToggler($scope.card_viewer.sidebar_id);
	$scope.isSideNavOpen = function( navName ) {
		return $mdSidenav(navName).isOpen();
	};
	
	$scope.isOpenSidebar = function() {
		if ( $scope.card_viewer.attributes.x_pin_sidebar == true ) {
			return true;
		}
	};
	
	$scope.isEditorMode = function() {
		var sURL = $location.url();
		return (sURL.indexOf('/editor/') > -1 );
	};
	
	$scope.closeSidenav = function( navID ) {
		$mdSidenav(navID).close()
		.then(function () {
			$scope.card_viewer.setPinSidebar(false, !$scope.screenIsSmall);
		});
	};
	
	function buildToggler(navID) {
		return function() {
			$mdSidenav(navID)
			.toggle()
			.then(function () {
				
			});
		};
	}
	
	$scope.getMessage = function( sKey ) {
		if ( typeof $scope.data.msg_map == "undefined") {
			return sKey;
		}
		
		if ( typeof $scope.data.msg_map[sKey] != "undefined") {
			return $scope.data.msg_map[sKey];
		}
		
		return sKey;
	};
	
	$scope.goToURL = function( id, sys_id, msg, sTarget ) {
		if ( id == null ) { return;}
			if  (sTarget == null ) { sTarget = ""; }
			if ( id.startsWith('/') || id.startsWith('?')) {
			$location.url(id);
		} else {
			if ( id.startsWith('http') && sTarget == "_blank") {
				window.open(id);
				return;
			}
			
			if ( id.startsWith('http') && sTarget != "_blank") {
				location.href = id;
				return;
			}
			var urlProp = {};
			urlProp.id = id;
			if ( sys_id != null ) {
				urlProp.sys_id = sys_id;
			}
			if ( msg != null ) {
				urlProp.sys_message = msg;
			}
			$location.search(urlProp);
		}
	};
	
	$scope.removeFavorite = function( card, ev, prompt, proceedMsg, cancelMsg, bIgnorePrompt ) {
		var favObj = null;
		for ( var i=0; i<$scope.favorite_svc.favorites.length; i++ ) {
			if ( $scope.favorite_svc.favorites[i].id == card.id ) {
				favObj = $scope.favorite_svc.favorites[i];
			}
		}
		if ( favObj == null ) {
			$scope.favorite_svc.removeFavorite(card, ev)
			.then(function(returnData) {
				var bSuccess = false;
				if ( typeof returnData.status != "undefined") {
					bSuccess = (returnData.status == 201);
				}
				if ( bSuccess ) {
					card.x_is_favorite = false;
					var aNewFavs = [];
					for ( var x=0; x<$scope.favorite_svc.favorites.length; x++ ) {
						if ( $scope.favorite_svc.favorites[x].activity_id != card.activity_id ) {
							aNewFavs.push($scope.favorite_svc.favorites[x]);
						}
					}
					$scope.favorite_svc.favorites = aNewFavs;
					$msgService.showSimpleToast(card.description + ' '+$scope.getMessage('evgcms_favorite_remove_msg'), 'success');
				} else {
					$msgService.showSimpleToast($scope.getMessage('evgcms_favorite_remove_error'), 'error');
				}
			});
			return;
		}
		
		if ( bIgnorePrompt == null ) { bIgnorePrompt = false; }
			
		if ( proceedMsg == null ) { proceedMsg = "Yes, proceed!";}
			if ( cancelMsg == null ) { cancelMsg = "No";}
			
		if ( bIgnorePrompt ) {
			$scope.favorite_svc.removeFavorite(favObj, ev)
			.then(function(returnData) {
				var bSuccess = false;
				if ( typeof returnData.status != "undefined") {
					bSuccess = (returnData.status == 201);
				}
				if ( bSuccess ) {
					card.x_is_favorite = false;
					var aNewFavs = [];
					for ( var x=0; x<$scope.favorite_svc.favorites.length; x++ ) {
						if ( $scope.favorite_svc.favorites[x].activity_id != favObj.activity_id ) {
							aNewFavs.push($scope.favorite_svc.favorites[x]);
						}
					}
					$scope.favorite_svc.favorites = aNewFavs;
					$msgService.showSimpleToast(favObj.description + ' '+$scope.getMessage('evgcms_favorite_remove_msg'), 'success');
				} else {
					$msgService.showSimpleToast($scope.getMessage('evgcms_favorite_remove_error'), 'error');
				}
			});
		} else {
			var confirmPrompt = $scope.getMessage('evgcms_remove_favorite_prompt1')+' \''+favObj.description +'\'?';
			if ( prompt != null) {
				confirmPrompt = prompt;
			}
			var confirm = $mdDialog.confirm()
			.title(confirmPrompt)
			.textContent(confirmPrompt)
			.ariaLabel(confirmPrompt)
			.targetEvent(ev)
			.ok(proceedMsg)
			.cancel(cancelMsg);
			$mdDialog.show(confirm).then(function() {
				$scope.favorite_svc.removeFavorite(favObj, ev)
				.then(function(returnData) {
					var bSuccess = false;
					if ( typeof returnData.status != "undefined") {
						bSuccess = (returnData.status == 201);
					}
					if ( bSuccess ) {
						card.x_is_favorite = false;
						var aNewFavs = [];
						for ( var x=0; x<$scope.favorite_svc.favorites.length; x++ ) {
							if ( $scope.favorite_svc.favorites[x].activity_id != favObj.activity_id ) {
								aNewFavs.push($scope.favorite_svc.favorites[x]);
							}
						}
						$scope.favorite_svc.favorites = aNewFavs;
						$msgService.showSimpleToast(favObj.description + ' '+$scope.getMessage('evgcms_favorite_remove_msg'), 'success');
					} else {
						$msgService.showSimpleToast($scope.getMessage('evgcms_favorite_remove_error'), 'error');
					}
				});
			}, function() {
			});
		}
	};
	
	$scope.addToFavorites = function(card, ev) {
		$scope.favorite_svc.addToFavorites(card)
		.then(function(returnData) {
			var bSuccess = false;
			if ( typeof returnData.status != "undefined") {
				bSuccess = (returnData.status == 201);
			}
			if ( bSuccess ) {
				card.x_is_favorite = true;
				$scope.favorite_svc.favorites.push(returnData.data.result);
				$msgService.showSimpleToast($scope.getMessage('evgcms_favorite_add_msg'), 'success');
			} else {
				$msgService.showSimpleToast($scope.getMessage('evgcms_favorite_add_error'), 'error');
			}
		});
	};
	
	$scope.addSidebarWidget = function( widgetName, dataObj, iOrder, bSuppressServerUpdate) {
		if ( dataObj == null ) { dataObj = {};}
			if ( iOrder == null ) { iOrder = $scope.data.sidebar_widgets.length;}
			if ( bSuppressServerUpdate == null ) { bSuppressServerUpdate = true; }
			$scope.data.sidebar_widgets.push({'name':widgetName, 'data':dataObj, 'order':iOrder});
		if ( !bSuppressServerUpdate ) {
			$scope.server.update().then(function(data) {})
		}
	};
	
	$scope.removeSidebarWidget = function( widgetName, bSuppressServerUpdate ) {
		var iIndex = -1;
		if ( bSuppressServerUpdate == null ) { bSuppressServerUpdate = true; }
			for ( var i=0; i<c.data.sidebar_widgets.length; i++ ) {
			if ( $scope.data.sidebar_widgets[i].name == widgetName ) {
				iIndex = i;
			}
		}
		if ( iIndex > -1 ) {
			$scope.data.sidebar_widgets.splice(iIndex, 1);
			if ( !bSuppressServerUpdate ) {
				$scope.server.update().then(function(data) {})
			}
		}
	};
	
	$scope.toggleExpand = function ( value ) {
		for (var i=0; i< $scope.cards.length; i++ ) {
			$scope.cards[i].x_expanded = value;
		}
		$scope.card_viewer.setExpanded(value);
	};
	
	$scope.showExpand = function(card) {
		if ( $scope.card_viewer.attributes.view == 'list' && $scope.card_viewer.attributes.expand_behavior == 'hover' ) {
			timer = $timeout(function () {
				card.x_expanded = true;
			}, 500);
		}
	};
	
	$scope.hideExpand = function(card) {
		if ( $scope.card_viewer.attributes.view == 'list' && $scope.card_viewer.attributes.expand_behavior == 'hover' ) {
			$timeout.cancel(timer);
			card.x_expanded = false;
		}
	};
	
	$scope.processCardClick = function(card, ev) {
		if ( $scope.card_viewer.attributes_view == 'small' ) {
			$scope.card_viewer.setClickBehavior("open");
		}
		
		var cardClickBehavior = $scope.card_viewer.attributes.click_behavior;
		if ( typeof card.x_override_click_behavior != "undefined" ) {
			cardClickBehavior = card.x_override_click_behavior;
		}
		if ( cardClickBehavior == "popup" && $scope.screenIsSmall ) {
			cardClickBehavior = "open";
		}
		
		switch(cardClickBehavior) {
			case 'open':
			var sTmpURL = card.sp_url;
			if ( typeof card.x_is_content_item != "undefined") {
				if ( card.x_is_content_item ) {
					sTmpURL = card.external_url;
				}
			}
			$scope.goToURL(sTmpURL, null, null, card.url_target);
			break;
			case 'open-window':
			window.open(card.sp_url);
			break;
			case 'popup-window':
			var sTmpURL2 = card.url;
			var popupProps = "";
			if ( !$scope.screenIsSmall ) {
				var w=900;
				var h=600;
				var left = (screen.width/2)-(w/2);
				var top = (screen.height/2)-(h/2);
				popupProps = 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left;
			}
			var popup = window.open(sTmpURL2, "popup", popupProps);
			break;
			case 'popup':
			if ( typeof card.x_type.sp_widget == "undefined" || card.x_type.sp_widget == "" ) {
				$scope.goToURL(card.sp_url);
				break;
			}
			var tmpCard = angular.copy(card);
			$mdDialog.show({
				templateUrl: "custom/cardPopupTemplate",
				parent: angular.element(document.body),
				targetEvent: ev,
				clickOutsideToClose:false,
				hasBackdrop: false,
				locals: {
					input_card: tmpCard
				},
				controller: function CardPopupController($scope, $mdDialog, input_card, spUtil, $location) {
					$scope.card = input_card;
					spUtil.get(card.x_type.sp_widget, {"sys_id": $scope.card.id, "show_sidebar":false, "suppress_crumbs":true, "is_embedded":true}).then(function(response) {
						$scope.cardWidget = response;
					});
					
					$scope.closeDialog = function() {
						$mdDialog.hide('cancel');
					};
					$scope.answer = function(answer) {
						$mdDialog.hide(answer);
					};
					
					$scope.expanded_dialog = false;
					$scope.openDetail = function(card) {
						$scope.closeDialog();
						if ( card.x_name == 'sc_cat_item') {
							//EAO-1693 Disable broadcast to prevent auto-field validation in London upgrade
							//$scope.$broadcast('saveVars');
						}
						$location.url(card.sp_url);
					};
					
				}
			})
			.then(function(answer) {
			}, function() {
			});
			break;
			case 'expand':
			card.x_expanded = !card.x_expanded;
			break;
		}
	};
	
	$scope.checkCondition = function( conditionStr, card ) {
		if ( conditionStr == null || conditionStr == '' ) {
			return true;
		}
		$scope.card = card;
		var bReturnValue = $scope.$eval(conditionStr);
		return bReturnValue;
	};
	
	$scope.processActionClick = function( action, card, ev, sourceRec ) {
		var context = "service-portal";
		$scope.selected_card = angular.copy(card);
		var sFunctionCode = $scope.card_viewer.getActionScript(action.id);
		if ( sFunctionCode == null || sFunctionCode == '' ) {
			$msgService.showSimpleToast($scope.getMessage('evgcms_no_action_code'), 'error');
			return;
		}
		
		eval(sFunctionCode);
	};
	
	$scope.callAction = function( card, actionName, ev, sourceRec ) {
		var actions = $scope.card_viewer.getValue('actions');
		var actionToCall = null;
		for ( var q=0; q<actions.length; q++ ) {
			if ( actions[q].name == actionName ) {
				actionToCall = actions[q];
			}
		}
		
		if ( actionToCall == null ) {
			$msgService.showSimpleToast('No action named \''+actionName+'\' available', 'error');
		} else {
			$scope.processActionClick(actionToCall, card, ev, sourceRec);
		}
	};
	
	$scope.getCards = function(bInitialLoad, sCardQueryMsg, bClearCache) {
		if ( bInitialLoad == null ) { bInitialLoad = false; }
			if ( bClearCache == null ) { bClearCache = false; }
			$scope.cards = [];
		$scope.pagination.current = 1;
		var bCountMode = false;
		if ( sCardQueryMsg == null ) { sCardQueryMsg = $scope.card_query_msg; }
			if ( typeof $scope.card_viewer.attributes.x_count_mode != "undefined" ) {
			bCountMode = $scope.card_viewer.attributes.x_count_mode;
		}
		if ( $scope.isEditorMode() ) {
			return;
		}
		$scope.card_loading = true;
		$scope.card_viewer.getCards(null, null, bClearCache)
		.then(function(returnData) {
			$scope.card_loading = false;
			if ( bCountMode ) {
				$msgService.showSimpleToast(returnData + " "+sCardQueryMsg, "success");
			} else {
				$scope.cards = returnData;
				$scope.cache_in_use = $scope.card_viewer.cache_in_use;
				if ( $scope.card_viewer.isVerbose() ) {
					if ( bInitialLoad && $scope.card_viewer.getValue('x_startup_msg') != "" ) {
						$msgService.showSimpleToast($scope.card_viewer.getValue('x_startup_msg'), "success");
					} else {
						$msgService.showSimpleToast($scope.cards.length + " "+sCardQueryMsg, "success");
					}
				}
			}
			$rootScope.$emit('evg.getcards.finished');
		});
	};
	
	$scope.updateFilterValue = function( filterObj ) {
		if ( filterObj.field_type == 'multiselectchk' ) {
			var tmpList = [];
			var tmpOrderList = [];
			for ( var i = 0; i<filterObj.list_data.length; i++ ) {
				if ( filterObj.list_data[i].ticked ) {
					tmpList.push(filterObj.list_data[i].id);
					if ( typeof filterObj.list_data[i].order != "undefined" ) {
						tmpOrderList.push(filterObj.list_data[i].order);
					}
				}
			}
			filterObj.value = tmpList.join(',');
			if ( tmpOrderList.length > 0 ) {
				filterObj.order_value = tmpOrderList.join(',');
			}
		}
	};
	
	$scope.setFilterTypes = function( cardTypes ) {
		if ( cardTypes.length == 0) { return;}
			for ( var q=0; q< $scope.client_filters.length; q++ ) {
			if ( $scope.client_filters[q].name == 'types') {
				var filterObj = $scope.client_filters[q];
				for ( var tt=0; tt<filterObj.list_data.length; tt++ ) {
					filterObj.list_data[tt].ticked = false;
					if ( cardTypes.indexOf(filterObj.list_data[tt].name) > -1 ) {
						filterObj.list_data[tt].ticked = true;
					}
				}
				$scope.updateFilterValue(filterObj);
			}
		}
	};
	
	$scope.openMenu = function($mdOpenMenu, ev) {
		originatorEv = ev;
		$mdOpenMenu(ev);
	};
	
	$scope.filterByCategory = function( categoryID, recordType ) {
		if ( typeof $scope.selectCategoryByID == "function" ) {
			if ( categoryID != null && categoryID != "" && categoryID != "null") {
				$scope.selectCategoryByID(categoryID);
			}
		} else {
			var targetPage = "";
			if ( recordType == "sc_cat_item" ) {
				targetPage = "evg-catitem-browse";
			}
			
			if ( recordType == "sc_cat_item_service") {
				targetPage = "evg-service-browse";
			}
			
			if ( recordType == "kb_knowledge") {
				targetPage = "evg-kb-browse";
			}
						
			
			if ( targetPage != "") {
				var sURL = "?id="+targetPage + "&sysparm_category="+categoryID;
				$location.url(sURL);
			}
			
			if(recordType == "cmdb_ci_service"){
				targetPage = "evg-service-item";
				$location.url("?id="+targetPage + "&sys_id="+categoryID);
			}
			
		}
	};
	
	$scope.updateFilterLabel = function(filterObj, tmpEditObj) {
		tmpEditObj.$save();
		$scope.favorite_svc.setFilterLabel(filterObj.id, filterObj.label)
		.then(function(returnData) {
			var bSuccess = false;
			if ( typeof returnData.status != "undefined") {
				bSuccess = (returnData.status == 201);
			}
			
			if (bSuccess) {
				$scope.$emit('evg.savedfilters.labelupd.header', filterObj);
			}
		});
	};
	
	$scope.handleFilterLabelEvent = function(event,tmpEditObj, filterObj) {
		if (event.keyCode==13) {
			$scope.updateFilterLabel(filterObj, tmpEditObj);
		}
	};
	
	$scope.showHelper = function() {
		$scope.$emit('evg.show.helper', true);
	};
});

cms_ngapp.controller('catItemController', function($controller, $scope, $msgService, $userService, $mdDialog, $http, spUtil) {
	angular.extend(this, $controller('cardController', {$scope: $scope}));
	
	$scope.cart_data = {};
	$scope.cart_data.items = [];
	$scope.saved_cart_data = {};
	$scope.saved_cart_data.items = [];
	$scope.cart_loading = false;
	$scope.show_search_cards = false;
	$scope.search_card_widget = "";
	
	$scope.setCartCount = function( iCount ) {
		$userService.setValue('cart_count', iCount);
	};
	
	$scope.getCartData = function(cartName) {
		$scope.cart_loading = true;
		var bSavedMode = false;
		if ( cartName != null ) {
			if ( cartName == 'SAVED' ) { bSavedMode = true; }
			}
		
		$userService.getCartDetails(cartName)
		.then(function(returnData) {
			if ( returnData != null ) {
				var cartObjData = returnData.data.result;
				if ( !bSavedMode ) {
					$scope.cart_data = cartObjData;
					$userService.setValue('cart_count', $scope.cart_data.items.length);
				} else {
					$scope.saved_cart_data = cartObjData;
					$userService.setValue('saved_cart_count', $scope.saved_cart_data.items.length);
				}
			}
			$scope.cart_loading = false;
		});
	};
	
	$scope.moveToCart = function( cartItemObj, cartName ) {
		var postData = {};
		postData.sysparm_cart_item_id = cartItemObj.id;
		postData.sysparm_new_cart = cartName;
		
		$http.post('/api/x_ever_metro_porta/evgess_common/move_to_cart', postData).then(function(response) {
			var bSuccess = false;
			if ( typeof response.status != "undefined") {
				bSuccess = (response.status == 201);
			}
			if ( bSuccess ) {
				$scope.refreshCartData();
			}
		});
	};
	
	$scope.removeCartItem = function( cartItemObj, ev, okMsg, cancelMsg, processingMsg ) {
		var removeQuestion = $scope.getMessage('evgcms_remove_favorite_prompt1')+" '"+cartItemObj.cat_item.label +"'?";
		var confirm = $mdDialog.confirm()
		.parent(angular.element(document.body))
		.title(removeQuestion)
		.ariaLabel('Remove')
		.ok(okMsg)
		.cancel(cancelMsg)
		.targetEvent(ev);
		
		$mdDialog.show(confirm).then(function() {
			$msgService.showSimpleToast(processingMsg+' '+ cartItemObj.cat_item.label);
			var postData = {};
			postData.sysparm_cart_item_id = cartItemObj.id;
			$http.post('/api/x_ever_metro_porta/evgess_common/remove_from_cart', postData).then(function(response) {
				var bSuccess = false;
				if ( typeof response.status != "undefined") {
					bSuccess = (response.status == 201);
				}
				if ( bSuccess ) {
					$scope.getCartData();
					$scope.getCartData('SAVED');
				}
			});
		}, function() {
		});
	};
	
	$scope.editCartItem = function( cartItemObj ) {
		var sEditURL = "?id=evg_sc_cat_item&sys_id="+cartItemObj.cat_item.id+"&cart_edit="+cartItemObj.id;
		var bDoPopup = false;
		if ( typeof cartItemObj.cat_item.x_override_click_behavior != "undefined") {
			if ( cartItemObj.cat_item.x_override_click_behavior == "popup-window" ) {
				bDoPopup = true;
				var sTmpURL2 = cartItemObj.cat_item.url + "&sysparm_cart_edit="+cartItemObj.id;
				var w=900;
				var h=600;
				var left = (screen.width/2)-(w/2);
				var top = (screen.height/2)-(h/2);
				var popupProps = 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left;
				if ( $scope.screenIsSmall ) { popupProps = "";}
					var popup = window.open(sTmpURL2, "popup", popupProps);
			}
		}
		if ( !bDoPopup ) {
			$scope.goToURL(sEditURL);
		}
	};
	
	$scope.openMenu = function($mdOpenMenu, ev) {
		var originatorEv = ev;
		$mdOpenMenu(ev);
	};
	
	$scope.refreshCartData = function() {
		$scope.getCartData();
		$scope.getCartData('SAVED');
	};
	
	$scope.buildSearchData = function( searchStr ) {
		$scope.show_search_cards = true;
		spUtil.get("evg-embedded-search-results", {"search_string": searchStr, "card_types":"knowledge"}).then(function(response) {
			$scope.search_card_widget = response;
		});
	};
	
});

cms_ngapp.controller('scheduleAppt', function($controller, $scope, $http, $mdDialog) {
	angular.extend(this, $controller('cardController', {$scope: $scope}));
	
	$scope.appointment_data = {};
	$scope.appointment_data.appointments = [];
	$scope.selected_date = new Date();
	$scope.processing = false;
	$scope.prompt_for_expert = false;
	$scope.expert_list = [];
	
	$scope.refreshAppointmentData = function(newDate) {
		$scope.appointment_data.appointments = [];
		$scope.processing = true;
		if ( newDate == null ) { newDate = $scope.adjustDateValue($scope.selected_date); }
			if ( newDate instanceof Date ) {
			newDate = $scope.adjustDateValue(newDate);
		}
		
		if ( $scope.data.appt_expert == "" || $scope.data.appt_expert == "unspecified") {
			$scope.prompt_for_expert = true;
			$scope.getExpertList();
		} else {
			$http.get('/api/x_ever_metro_porta/evgess_scheduleappt/'+$scope.data.appt_expert+'/get_appointments/'+newDate).then(function (response) {
				$scope.processing = false;
				if ( response.status == '200') {
					$scope.appointment_data = response.data.result;
				}
			});
		}
	};
	
	$scope.selectExpert = function( expertObj ) {
		$scope.data.appt_expert = expertObj.id;
		if ( $scope.data.appt_expert != "" && $scope.data.appt_expert != "unspecified") {
			$scope.prompt_for_expert = false;
			$scope.delayedUpdateForm('expert_group', $scope.data.appt_expert, 500);
			$scope.refreshAppointmentData();
		}
	};
	
	$scope.getExpertList = function() {
		$scope.expert_list = [];
		$scope.expert_list_processing = false;
		$http.get('/api/x_ever_metro_porta/evgess_scheduleappt/get_experts').then(function (response) {
			$scope.expert_list_processing = false;
			if ( response.status == '200') {
				$scope.expert_list = response.data.result;
			}
		});
		
	};
	
	$scope.clearExpert = function() {
		$scope.data.appt_expert = "unspecified";
		$scope.refreshAppointmentData();
	};
	
	$scope.adjustDateValue = function( dateObj, bUTC ) {
		if ( bUTC == null ) { bUTC = false; }
			var month = dateObj.getMonth() + 1; //months from 1-12
		var day = dateObj.getDate();
		if ( bUTC ) {
			day = dateObj.getUTCDate();
		}
		var year = dateObj.getFullYear();
		
		return year + "-" + month + "-" + day;
	};
	
	$scope.setNewDate = function( dateObj ) {
		var sValue = $scope.adjustDateValue( dateObj );
		$scope.updateForm('appointment_date', sValue);
		$scope.refreshAppointmentData(sValue);
	};
	
	$scope.clearSlotSelections = function() {
		for ( var i=0; i< $scope.appointment_data.x_time_slots.length; i++ ) {
			if ( $scope.appointment_data.x_time_slots[i].selected ) {
				$scope.appointment_data.x_time_slots[i].selected = false;
				$scope.appointment_data.x_time_slots[i].booked = false;
			}
		}
	};
	
	$scope.bookSlot = function( slot ) {
		if ( slot.booked ) { return; }
			$scope.clearSlotSelections();
		slot.booked = true;
		slot.selected = true;
		$scope.updateForm('appointment_time', slot.value);
		$scope.updateForm('appointment_time_display', slot.time_value);
	};
	
	$scope.hasSelectedTime = function() {
		for ( var i=0; i< $scope.appointment_data.x_time_slots.length; i++ ) {
			if ( $scope.appointment_data.x_time_slots[i].selected ) {
				return true;
			}
		}
		
		return false;
	};
	
	$scope.submitAppointment = function(ev, valMsg, okMsg) {
		if ( !$scope.hasSelectedTime() ) {
			$mdDialog.show(
			$mdDialog.alert()
			.parent(angular.element(document.body))
			.clickOutsideToClose(true)
			.title(valMsg)
			.textContent(valMsg)
			.ariaLabel(valMsg)
			.ok(okMsg)
			.targetEvent(ev)
			);
			return;
		}
		
		var postData = {};
		postData.sysparm_date = $scope.getFieldValue('appointment_date');
		postData.sysparm_timeslot = $scope.getFieldValue('appointment_time');
		
		$http.post('/api/x_ever_metro_porta/evgess_scheduleappt/'+$scope.data.appt_expert+'/create_appointment', postData).then(function (response) {
			if ( response.status == '201') {
				$scope.triggerOnSubmit();
			}
		});
	};
	
	$scope.$watch('selected_date', function(newVal, oldVal) {
		$scope.refreshAppointmentData(newVal);
	});
	
	
	
});

cms_ngapp.controller('cardBrowseController', function($controller, $scope, $http, $mdDialog, $cacheSvc, $msgService, $timeout, $q, $location) {
	angular.extend(this, $controller('cardController', {$scope: $scope}));
	
	$scope.selected_top = {};
	$scope.input_selected_cat = "";
	$scope.input_selected_cat_display = "";
	$scope.selected_category = "";
	$scope.selected_category_name = "";
	$scope.selected_subcategory = "";
	$scope.selected_subcategory_name = "";
	$scope.browsedata_loading = false;
	$scope.show_categories_in_sidebar = true;
	$scope.tags = [];
	$scope.tags_readonly = false;
	$scope.categorystr_max_length = 50;
	$scope.children_displayed = false;
	$scope.show_suggestions = true;
	$scope.current_category = {};
	$scope.suppress_getcards = false;
	
	var originalExpandBehavior = $scope.card_viewer.getValue('expand_behavior');
	var originalView = $scope.card_viewer.getValue('view');
	var originalExpanded = $scope.card_viewer.getValue('x_expanded');
	
	if ( typeof $scope.data.show_suggestions != "undefined") {
		$scope.show_suggestions = $scope.data.show_suggestions;
	}
	
	function inCategoryTree(aCategoryData, sCategoryID ) {
		for (var i = 0; i < aCategoryData.length; i++) {
			if ( aCategoryData[i].id == sCategoryID ) {
				$scope.input_selected_cat = aCategoryData[i].id;
				$scope.input_selected_cat_display = aCategoryData[i].label;
				return true;
			}
			if (aCategoryData[i].child.length > 0 ) {
				if ( inChildTree(aCategoryData[i].child, sCategoryID) ) {
					aCategoryData[i].child_show = true;
					$scope.input_selected_cat = aCategoryData[i].id;
					$scope.input_selected_cat_display = aCategoryData[i].label;
					return true;
				}
			}
		}
		
		return false;
	}
	
	function inChildTree( childList, sCategoryID ) {
		for ( var i=0; i<childList.length; i++ ) {
			if ( childList[i].id == sCategoryID ) {
				return true;
			}
			if ( childList[i].child.length > 0 ) {
				if( inChildTree(childList[i].child, sCategoryID) ) {
					childList[i].child_show = true;
					return true;
				}
				
			}
		}
	}
	
	function getCategoryObj(aCategoryData, sCategoryID) {
		for (var i = 0; i < aCategoryData.length; i++) {
			if ( aCategoryData[i].id == sCategoryID ) {
				return aCategoryData[i];
			}
			if (aCategoryData[i].child.length > 0 ) {
				var childObj = getCategoryObj_inChildTree(aCategoryData[i].child, sCategoryID);
				if ( childObj != null ) {
					return childObj;
				}
			}
		}
		
		return {};
	}
	
	function getCategoryObj_inChildTree(childList, sCategoryID) {
		for ( var i=0; i<childList.length; i++ ) {
			if ( childList[i].id == sCategoryID ) {
				return childList[i];
			}
			if ( childList[i].child.length > 0 ) {
				if( getCategoryObj_inChildTree(childList[i].child, sCategoryID) ) {
					return childList[i];
				}
				
			}
		}
	}
	
	function evaluateInputs(browseData) {
		var tmpCategoryObj = {};
		var bSelectCategory = false;
		var bTopSelected = false;
		var inputSearchStr = "";
		var categoryFilter = $scope.card_viewer.getFilter($scope.data.browse_properties.category_filter);
		if ( categoryFilter.value != "" ) {
			tmpCategoryObj.id = categoryFilter.value;
			tmpCategoryObj.label = categoryFilter.label;
			if ( $scope.data.input_category_display != "" ) {
				tmpCategoryObj.label = $scope.data.input_category_display;
			}
			bSelectCategory = true;
		}
		
		var searchFilter = $scope.card_viewer.getFilter('search_string');
		
		if ( searchFilter.value != "" ) {
			inputSearchStr = searchFilter.value;
		}
		
		var inputTopID = null;
		var topFilter = $scope.card_viewer.getFilter($scope.data.browse_properties.top_filter);
		if ( topFilter.value != "" ) {
			inputTopID = topFilter.value;
		}
		
		if ( bSelectCategory ) {
			for ( var i=0; i<browseData.length; i++ ) {
				if ( inCategoryTree(browseData[i].categories, tmpCategoryObj.id) ) {
					if ( $scope.input_selected_cat_display != "" && $scope.data.input_category_display == "" ){
						tmpCategoryObj.label = $scope.input_selected_cat_display;
					}
					$scope.selectTop(browseData[i], inputSearchStr, true);
					bTopSelected = true;
					break;
				}
			}
			
			if ( browseData.length == 1 && $scope.selected_category == '') {
				$scope.selectTop(browseData[0], inputSearchStr, true);
				bTopSelected = true;
			}
			if ( $scope.input_selected_cat != "" ) {
				$scope.selected_category = $scope.input_selected_cat;
				$scope.selectCategory(tmpCategoryObj,'subcategory');
			} else {
				$scope.selectCategory(tmpCategoryObj);
			}
		} else {
			if ( inputTopID != null && inputTopID != "" ) {
				for ( var x=0; x<browseData.length; x++ ) {
					if ( browseData[x].id == inputTopID ) {
						$scope.selectTop(browseData[x], inputSearchStr, true);
						bTopSelected = true;
					}
				}
			}
		}
		
		if ( browseData.length == 1 && $scope.selected_category == '' ) {
			$scope.selectTop(browseData[0], inputSearchStr, true);
			bTopSelected = true;
		}
		
		if ( !bSelectCategory && inputSearchStr == "" ) {
			if ( typeof $scope.data.browse_properties.special_function != "undefined" ) {
				$scope.buildFilterTags();
				if ( !$scope.suppress_getcards) {
					$scope.getCards();
				}
			}
		}
		
		if ( !bTopSelected && inputSearchStr != "" ) {
			$scope.runSearch(inputSearchStr);
		}
		
	}
	
	$scope.getCardsWrapper = function() {
		$scope.cards = [];
		
		if ( $scope.containsFilter() ) {
			$scope.card_viewer.setAttribute('expand_behavior', originalExpandBehavior);
			$scope.card_viewer.setAttribute('view',originalView);
			$scope.card_viewer.setAttribute('x_expanded', originalExpanded);
			var bGetCards = true;
			if ( $scope.suppress_getcards) {
				bGetCards = $scope.containsSearchFilter();
			}
			if ( bGetCards ) {
				$scope.getCards();
			}
		} else {
			$scope.card_viewer.setAttribute('x_expanded', true);
			$scope.card_viewer.setAttribute('expand_behavior', 'none');
			$scope.card_viewer.setAttribute('view','small');
			$scope.getSuggestions();
		}
		
	};
	
	$scope.runSearch = function(str, bClearCategoryFilter) {
		if ( bClearCategoryFilter == null ) { bClearCategoryFilter = false;}
			if ( bClearCategoryFilter ) {
			$scope.card_viewer.setFilter($scope.data.browse_properties.category_filter, "");
		}
		$scope.card_viewer.setFilter('search_string', str);
		$scope.buildFilterTags();
		$scope.getCardsWrapper();
	};
	
	$scope.selectTop = function( dataObj, str, bForceSearch ) {
		if ( str == null ) { str = ""; }
			if ( bForceSearch == null ) { bForceSearch = false; }
			if ( typeof $scope.selected_top.id == "undefined" && !bForceSearch ) {
			str = "";
			$scope.card_viewer.setFilter('search_string', '');
		}
		
		if ( dataObj == null ) {
			$scope.selected_top = {};
			$scope.search_placeholder = $scope.search_placeholder_default;
			$scope.card_viewer.setFilter($scope.data.browse_properties.top_filter, '');
			$scope.selectCategory();
		} else {
			$scope.selected_top = dataObj;
			$scope.search_placeholder = $scope.selected_top.placeholder;
			$scope.card_viewer.setFilter($scope.data.browse_properties.top_filter, dataObj.id);
			if ( $scope.screenIsSmall ) { $scope.selected_top.show_categories = true; }
				$scope.selectCategory();
		}
		if ( str != "" ) {
			$scope.search_str = str;
			$scope.runSearch(str);
		}
	};
	
	$scope.unselectCategory = function(categoryObj, sLevelVar) {
		if ( sLevelVar == "selected_subcategory") {
			var parentCategoryObj = getCategoryObj($scope.data.browse_data[0].categories, $scope.selected_category);
			//console.log('Attempted to get parent category of '+parentCategoryObj.label);
			$scope.selectCategory(parentCategoryObj, "category", true);
		} else {
			$scope.selectCategory();
		}
	};
	
	$scope.selectCategory = function( categoryObj, sLevelVar, bForceChange ) {
		if ( sLevelVar == null ) { sLevelVar = "category"; }
			if ( bForceChange == null ) { bForceChange = false; }
			sLevelVar = "selected_"+sLevelVar;
		var sLevelVarName = sLevelVar + "_name";
		
		if ( categoryObj != null && !bForceChange ) {
			if ( $scope[sLevelVar] == categoryObj.id) {
				$scope.unselectCategory(categoryObj, sLevelVar);
				return;
			}
		}
		
		if ( sLevelVar == "selected_category" ) {
			$scope.selected_subcategory = "";
			$scope.selected_subcategory_name = "";
		}
		
		var bChanged = bForceChange;
		var sPreviousValue = $scope[sLevelVar];
		$scope.children_displayed = false;
		
		if ( categoryObj == null ) {
			$scope[sLevelVar] = "";
			$scope[sLevelVarName] = "";
			$scope.card_viewer.setFilter($scope.data.browse_properties.category_filter, "");
			$scope.current_category = {};
			bChanged = true;
		} else {
			$scope[sLevelVar] = categoryObj.id;
			$scope[sLevelVarName] = categoryObj.label;
			$scope.card_viewer.setFilter($scope.data.browse_properties.category_filter, categoryObj.id);
			bChanged = true;
			if ( sPreviousValue == categoryObj.id ) {
				bChanged = bForceChange;
			}
			categoryObj.child_show = !categoryObj.child_show;
			if ( typeof categoryObj.child != "undefined") {
				if ( categoryObj.child.length > 0 && categoryObj.child_show ) {
					$scope.children_displayed = true;
				}
			}
		}
		
		if ( bChanged ) {
			$scope.buildFilterTags();
			$scope.getCardsWrapper();
			if ( categoryObj != null ) {
				$scope.current_category = categoryObj;
			}
		}
	};
	
	$scope.selectCategoryByID = function( categoryID ) {
		if ( !$scope.selected_view.is_default) {
			$location.search('input_view', null);
			$location.search('sysparm_category', categoryID);
			return;
		}
		
		if (typeof $scope.accordian_cats != "undefined") {
			var categoryObj = getCategoryObj($scope.accordian_cats, categoryID);
		} else {
			for ( var i=0; i<$scope.data.browse_data.length; i++ ) {
				var categoryObj = getCategoryObj($scope.data.browse_data[i].categories, categoryID);
				if ( typeof categoryObj.id != "undefined") {
					break;
				}
			}
		}
		var level = "category";
		if ( typeof categoryObj.parent_id != "undefined") {
			if ( categoryObj.parent_id != "") {
				level = "subcategory;"
			}
		}
		
		$scope.selectCategory(categoryObj, level, true);
	};
	
	$scope.buildFilterTags = function() {
		$scope.tags = [];
		var topFilter = $scope.card_viewer.getFilter($scope.data.browse_properties.top_filter);
		if ( typeof topFilter.value != "undefined" && $scope.data.browse_data.length > 1) {
			if ( topFilter.value != "" ) {
				topFilter.type = "container";
				topFilter.type_label = topFilter.label;
				topFilter.icon = "fa-cube";
				topFilter.value_display = $scope.selected_top.label;
				topFilter.readonly = ($scope.data.browse_data.length == 1);
				$scope.tags.push(topFilter);
			}
		}
		
		var categoryFilter = $scope.card_viewer.getFilter($scope.data.browse_properties.category_filter);
		if ( typeof categoryFilter.value != "undefined") {
			if ( categoryFilter.value != "" ) {
				categoryFilter.type = "category";
				categoryFilter.icon = "fa-folder";
				categoryFilter.value_display = $scope.selected_category_name;
				if ( categoryFilter.value_display == "" ) {
					categoryFilter.value_display = $scope.selected_subcategory_name;
				}
				if ( $scope.selected_subcategory != "" && $scope.selected_category != "" && $scope.selected_category != $scope.selected_subcategory ) {
					categoryFilter.value_display = $scope.selected_subcategory_name;
					categoryFilter.type = "subcategory";
					
					/* Add parent category to chips */
					var parentCategoryFilter = {};
					parentCategoryFilter.value = $scope.selected_category;
					parentCategoryFilter.value_display = $scope.selected_category_name;
					
					if ( parentCategoryFilter.value_display == "" ) {
						var parentCategoryObj2 = {};
						for ( var kbq=0; kbq<$scope.data.browse_data.length; kbq++ ) {
							parentCategoryObj2 = getCategoryObj($scope.data.browse_data[kbq].categories, parentCategoryFilter.value);
							if ( typeof parentCategoryObj2.id != "undefined") {
								parentCategoryFilter.value_display = parentCategoryObj2.label
								break;
							}
						}
					}
					
					parentCategoryFilter.type = "category";
					parentCategoryFilter.icon = "fa-folder";
					parentCategoryFilter.readonly = false;
					if ( parentCategoryFilter.value_display != "" ) {
						$scope.tags.push(parentCategoryFilter);
					}
				}
				categoryFilter.readonly = false;
				$scope.tags.push(categoryFilter);
			}
		}
		
		var searchFilter = $scope.card_viewer.getFilter('search_string');
		if ( typeof searchFilter.value != "undefined") {
			if ( searchFilter.value != "" ) {
				searchFilter.type = "keyword";
				searchFilter.icon = "fa-filter";
				searchFilter.value_display = searchFilter.value;
				searchFilter.readonly = false;
				$scope.tags.push(searchFilter);
			}
		}
	};
	
	$scope.clearCache = function() {
		$cacheSvc.removeCache($scope.data.browse_properties.key+'Data');
		window.location.reload();
	};
	
	$scope.getBrowseData = function(bClearCache) {
		if ( bClearCache == null ) { bClearCache = false; }
			if ( bClearCache ) {
			$scope.card_viewer.clearCache();
			$scope.cache_in_use = false;
		}
		$scope.browsedata_loading = true;
		var tmpData = $scope.card_viewer.getCacheData($scope.data.browse_properties.key+'Data');
		if ( tmpData != "" ) {
			$scope.cache_in_use = true;
			$scope.data.browse_data = JSON.parse(tmpData);
			$scope.browsedata_loading = false;
			evaluateInputs( $scope.data.browse_data );
		} else {
			/* Get Data Via an HTTP Post */
			var postData = {};
			if ( typeof $scope.data.browse_properties.data_function_parms != "undefined" ) {
				postData = $scope.data.browse_properties.data_function_parms;
			}
			postData.sysparm_cardviewer = $scope.card_viewer.toJSON();
			$http.post($scope.data.browse_properties.data_function, postData).then(function (response) {
				if ( response.status == '201') {
					var tmpData = response.data.result;
					$scope.card_viewer.setCacheData($scope.data.browse_properties.key+'Data', JSON.stringify(tmpData));
					$scope.data.browse_data = tmpData;
					evaluateInputs( $scope.data.browse_data );
				}
				$scope.browsedata_loading = false;
			});
		}
	};
	
	$scope.incompleteBrowseData = function(browseData, cacheKey) {
		if ( browseData.length == 0 ){
			return true;
		} 
		
		if ( cacheKey != "bizservice" ) {
			return false;
		}
		
		if ( typeof browseData[0].categories == "undefined" ) {
			return true;
		}
		
		if ( typeof browseData[0].categories[0].child == "undefined" ) {
			return true;
		}
		
		if ( browseData[0].categories[0].child.length == 0 ) {
			return true;
		}
		
		if ( typeof browseData[0].categories[0].child[0].items == "undefined" ) {
			return true;
		}
		
		if (browseData[0].categories[0].child[0].items.length == 0 ) {
			return true;
		}
		
		return false;
	};
	
	$scope.getBrowseDataQ = function(bIgnoreTopFilter) {
		var deferred = $q.defer();
		$scope.browsedata_loading = true;
		if ( bIgnoreTopFilter == null ) { bIgnoreTopFilter = true;}
		var bContinue = true;
		var tmpData = $scope.card_viewer.getCacheData($scope.data.browse_properties.key+'Data');
		if ( tmpData != "" ) {
			$scope.data.browse_data = JSON.parse(tmpData);
			if ( $scope.incompleteBrowseData($scope.data.browse_data, $scope.data.browse_properties.key) ) {
				console.log('[getBrowseDataQ] browse_data is incomplete in cache, getting from server');
			} else {
				console.log('[getBrowseDataQ] Using browser cache instead of getting data from server');
				bContinue = false;
				$scope.cache_in_use = true;
				$scope.browsedata_loading = false;
				evaluateInputs( $scope.data.browse_data );
				deferred.resolve($scope.data.browse_data);
			}
		}
		
		if ( bContinue ) {
			/* Get Data Via an HTTP Post */
			var postData = {};
			if ( typeof $scope.data.browse_properties.data_function_parms != "undefined" ) {
				postData = $scope.data.browse_properties.data_function_parms;
			}
			postData.sysparm_cardviewer = $scope.card_viewer.toJSON();
			postData.sysparm_ignoretopfilter = bIgnoreTopFilter;
			$http.post($scope.data.browse_properties.data_function, postData).then(function (response) {
				if ( response.status == '201') {
					var tmpData = response.data.result;
					$scope.card_viewer.setCacheData($scope.data.browse_properties.key+'Data', JSON.stringify(tmpData));
					$scope.data.browse_data = tmpData;
					evaluateInputs( $scope.data.browse_data );
					deferred.resolve($scope.data.browse_data);
				}
				$scope.browsedata_loading = false;
			});
		}
		
		return deferred.promise;
	};
	
	$scope.getAccordianData = function(bClearCache) {
		if ( bClearCache == null ) { bClearCache = false; }
			if ( bClearCache ) {
			$scope.card_viewer.clearCache();
			$scope.cache_in_use = false;
			$scope.data.sidebar_templates = [];
		}
		$scope.accordian_cats = [];
		$scope.accordian_catalogs = [];
		$scope.filter_catalog = "";
		$scope.suppress_getcards = true;
		$scope.data.sidebar_templates.push({'name':"custom/card_browser_accordian_filters", "order":100});
		$scope.show_categories_in_sidebar = false;
		var promise = $scope.getBrowseDataQ();
		promise.then(function(data) {
			$scope.accordian_cats = $scope.getAccordianCategories(data);
			$scope.accordian_catalogs = $scope.getAccordianCatalogs(data);
			if ( typeof $scope.selected_top.id != "undefined") {
				$scope.filter_catalog = $scope.selected_top.id;
			} else {
				var topCatalog = $cacheSvc.getData('svcSelectedCatalog');
				if ( topCatalog != "" ) {
					$scope.filter_catalog = topCatalog;
					$scope.changeAccordianTop(topCatalog);
				}
			}
			
			if ( typeof $scope.current_category.id != "undefined") {
				loop1:
				for ( var k=0; k<$scope.accordian_cats.length; k++ ) {
					if ( $scope.accordian_cats[k].id == $scope.current_category.id ) {
						$scope.jumpToServiceCategoryDelay($scope.current_category.id, 1000);
						if ( $scope.accordian_cats[k].child.length == 1 ) {
							$scope.toggleAccordianSubcategory($scope.accordian_cats[k].child[0]);
						}
						break loop1;
					} else {
						for ( var y=0; y<$scope.accordian_cats[k].child.length; y++ ) {
							if ( $scope.accordian_cats[k].child[y].id == $scope.current_category.id) {
								$scope.toggleAccordianSubcategory($scope.accordian_cats[k].child[y]);
								$scope.jumpToServiceCategoryDelay($scope.accordian_cats[k].id, 1000);
								break loop1;
							}
						}
					}
				};
			}
		});
	};
	
	$scope.setSuggestionPrefs = function() {
		$mdDialog.show({
			clickOutsideToClose: true,
			scope: $scope,        // use parent scope in template
			preserveScope: true,  // do not forget this if use parent scope
			templateUrl: 'custom/showSuggestionBrowseOptions',
			onRemoving: function() {
				var aPrefIDs = [];
				for ( var i=0; i<$scope.data.suggestion_options.length; i++) {
					if ( $scope.data.suggestion_options[i].active ) {
						aPrefIDs.push($scope.data.suggestion_options[i].id);
					}
				}
				
				var postData = {};
				postData.sysparm_preference = "evg.suggestions.pref::"+$scope.data.browse_properties.key;
				postData.sysparm_preference_value = aPrefIDs.join(',');
				if (postData.sysparm_preference_value == ""){
					$scope.suggested_services = "";
				}	else{		
					$http.post('/api/x_ever_metro_porta/evgess_common/store_pref', postData).then(function(response) {
						$scope.getSuggestions();
					});
				}
			},
			controller: function showSuggestionOptsDialogController($scope, $mdDialog) {
			$scope.closeDialog = function() {
				var aPrefIDs = [];
				for ( var i=0; i<$scope.data.suggestion_options.length; i++) {
					if ( $scope.data.suggestion_options[i].active ) {
						aPrefIDs.push($scope.data.suggestion_options[i].id);
					}
				}
				
				var postData = {};
				postData.sysparm_preference = "evg.suggestions.pref::"+$scope.data.browse_properties.key;
				postData.sysparm_preference_value = aPrefIDs.join(',');
				if (postData.sysparm_preference_value == ""){
					$scope.suggested_services = "";
				}	else{		
					$http.post('/api/x_ever_metro_porta/evgess_common/store_pref', postData).then(function(response) {
						$scope.getSuggestions();
					});
				}
				$mdDialog.hide('cancel');
			};
		$scope.answer = function(answer) {
			$mdDialog.hide(answer);
		};
	}
	})
	.then(function(answer) {
	}, function() {
	});
};

$scope.toggleSuggestions = function() {
	$scope.show_suggestions = !$scope.show_suggestions;
	$scope.getSuggestions();
	var postData = {};
	postData.sysparm_preference = "evg.show_suggestions::"+$scope.data.browse_properties.key;
	postData.sysparm_preference_value = $scope.show_suggestions;
	$http.post('/api/x_ever_metro_porta/evgess_common/store_pref', postData).then(function(response) {
	});
};


$scope.getSuggestions = function() {
	//if ( $scope.show_suggestions == true ) {
		if ( $scope.getting_suggestions ){
			return;
		}
	
		$scope.getting_suggestions = true;
		var postData = {};
		postData.sysparm_catalog = "";
		if ( typeof $scope.selected_top.id != "undefined") {
			postData.sysparm_catalog = $scope.selected_top.id;
		}
		
		postData.sysparm_recordkey = $scope.data.browse_properties.key;
		$http.post('/api/x_ever_metro_porta/evgess_cards/get_suggestions', postData).then(function (response) {
			if ( response.status == '200') {
				var tmpData = response.data.result;
				var suggestedServices = [];
				
				for (var i=0;i<tmpData.length;i++) {
					
					if (tmpData[i].x_name != 'sc_cat_item_content' &&
					   !tmpData[i].x_is_content_item) {
						suggestedServices.push(tmpData[i]);
					}
						
				}
				$scope.suggested_services = suggestedServices;
			}
			$scope.getting_suggestions = false;
		});
	//}
};

$scope.getTileData = function(bClearCache) {
	$scope.card_viewer.setViewType('small');
	if ( bClearCache == null ) { bClearCache = false; }
		if ( bClearCache ) {
		$scope.card_viewer.clearCache();
		$scope.cache_in_use = false;
		$scope.data.sidebar_templates = [];
	}
	$scope.accordian_cats = [];
	$scope.accordian_catalogs = [];
	$scope.suggested_services = [];
	$scope.getting_suggestions = false;
	$scope.filter_catalog = "";
	$scope.data.sidebar_templates.push({'name':"custom/card_browser_tile_filters", "order":100});
	$scope.show_categories_in_sidebar = false;
	var promise = $scope.getBrowseDataQ(true);
	promise.then(function(data) {
		$scope.accordian_cats = $scope.getAccordianCategories(data);
		$scope.accordian_catalogs = $scope.getAccordianCatalogs(data);
		if ( typeof $scope.selected_top.id != "undefined") {
			$scope.filter_catalog = $scope.selected_top.id;
		} else {
			var topCatalog = $cacheSvc.getData('svcSelectedCatalog');
			if ( topCatalog != "" && false ) {
				$scope.filter_catalog = topCatalog;
				$scope.changeAccordianTop(topCatalog, true);
			}
		}
		
		$scope.getSuggestions();
		
		if ( typeof $scope.current_category.id != "undefined") {
			if ( typeof $scope.current_category.parent_id == "undefined") {
				$scope.current_category = getCategoryObj($scope.accordian_cats, $scope.current_category.id);
			}
		}
	});
};

$scope.getAccordianCategories = function(browseData) {
	var returnList = [];
	var selectedTopID = null;
	if ( typeof $scope.selected_top.id != "undefined") {
		selectedTopID = $scope.selected_top.id;
	}
	
	if ( typeof browseData.length == "undefined") {
		return [];
	}
	for ( var x=0; x<browseData.length; x++ ) {
		
		if (selectedTopID == null || browseData[x].id == selectedTopID) {
			//console.log('[getAccordianCategories] Selected top: '+selectedTopID + ' and catalog id:'+browseData[x].id)
			for ( var q=0; q<browseData[x].categories.length; q++ ) {
				if ( browseData[x].categories[q].total_count > 0 ) {
					if ( browseData[x].categories[q].child.length == 0 ) {
						var childObj = {};
						childObj.id = browseData[x].categories[q].id;
						childObj.label = "Unclassified";
						childObj.icon = "fa-file-text";
						childObj.count = browseData[x].categories[q].count;
						childObj.total_count = browseData[x].categories[q].total_count;
						childObj.child = [];
						childObj.child_show = false;
						browseData[x].categories[q].child.push(childObj);
					}
					returnList.push(browseData[x].categories[q]);
				}
			}
		}
	}
	
	return returnList;
};

$scope.getAccordianCatalogs = function(browseData) {
	var returnList = [];
	var selectedTopID = null;
	if ( typeof $scope.selected_top.id != "undefined") {
		selectedTopID = $scope.selected_top.id;
	}
	if ( typeof browseData.length == "undefined") {
		return [];
	}
	for ( var x=0; x<browseData.length; x++ ) {		
		
		if ( browseData[x].total_count > 0 ) {
			var tmpCatalog = angular.copy(browseData[x]);
			delete tmpCatalog.categories;
			returnList.push(tmpCatalog);
		}
	}
	
	return returnList;
};

$scope.changeAccordianTop = function(catalogID, bSetCats) {
	if ( bSetCats == null ) { bSetCats = false;}
		//console.log('[changeAccordianTop] called with catalog '+catalogID);
	if ( catalogID == "") {
		$scope.selectTop(null);
		$cacheSvc.removeCache('svcSelectedCatalog');
	} else {
		for ( var x=0; x<$scope.accordian_catalogs.length; x++ ) {
			if ( $scope.accordian_catalogs[x].id == catalogID ) {
				$scope.selectTop($scope.accordian_catalogs[x]);
				$cacheSvc.setData('svcSelectedCatalog', catalogID);
			}
		}
	}
	$scope.accordian_cats = $scope.getAccordianCategories($scope.data.browse_data);
	if ( bSetCats && typeof $scope.selected_top.id != "undefined") {
		$scope.selected_top.categories = $scope.accordian_cats;
		$scope.filter_catalog = $scope.selected_top.id;
	}
	
	if ( bSetCats ) {
		$scope.getSuggestions();
	}
};

$scope.jumpToServiceCategory = function(categoryID ) {
	$targetElement = $("#"+categoryID);
	if ( $targetElement.length > 0 ) {
		var iTop = $targetElement.offset().top;
		iTop = iTop - 135;
		$('html, body').animate({
			scrollTop: iTop
		}, 1000);
	}
};

$scope.jumpToServiceCategoryDelay = function(categoryID, iTimer) {
	$timeout(function () {
		$scope.jumpToServiceCategory(categoryID);
	}, iTimer);
};

$scope.toggleAccordianSubcategory = function( childObj ) {
	if ( childObj.child_show == true ) {
		childObj.child_show = false;
	} else {
		$scope.selectCategory(childObj, "subcategory", true);
		childObj.loading = true;
		childObj.child_show = true;
		/*
		$scope.card_viewer.getCards(null, null, false)
		.then(function(returnData) {
			childObj.loading = false;
			$scope.cards = returnData;
			$scope.cache_in_use = $scope.card_viewer.cache_in_use;
			childObj.items = angular.copy($scope.cards);
		});
 		*/
		var postData = {};
		postData.sysparm_cardtypes = $scope.card_viewer.getTypes().join(',');
		postData.sysparm_context = "sp";
		postData.sysparm_categoryid = childObj.id;
		$http.post("/api/x_ever_metro_porta/evgess_cards/category_list", postData).then(function (cardDataResponse) {
			childObj.loading = false;
			if ( cardDataResponse.status == '200') {
				childObj.items = cardDataResponse.data.result;
			}
		});
	}
};

$scope.containsSearchFilter = function() {
	var searchFilter = $scope.card_viewer.getFilter('search_string');
	return (searchFilter.value != "" );
};

$scope.containsCategoryFilter = function() {
	var catFilter = $scope.card_viewer.getFilter($scope.data.browse_properties.category_filter);
	return (catFilter.value != "" );
};

$scope.containsFilter = function() {
	if ( $scope.containsSearchFilter() ) {
		return true;
	}
	
	if ( $scope.containsCategoryFilter() ) {
		return true;
	}
	
	return false;
};


$scope.getCurrentCategory = function() {
	if ( typeof $scope.accordian_cats == "undefined") {
		return {};
	}
	var catFilter = $scope.card_viewer.getFilter($scope.data.browse_properties.category_filter);
	
	return catFilter.value;
};

$scope.goUpCategoryTree = function() {
	if ( typeof $scope.current_category.parent_id == "undefined") {
		console.warn('[goUpCategoryTree] parent_id is undefined');
		return;
	}
	
	if ( $scope.current_category.parent_id == "" ) {
		$scope.selectCategory();
	} else {
		if ( typeof $scope.accordian_cats == "undefined") {
			$scope.selectCategory();
		} else {
			var parentObj = getCategoryObj($scope.accordian_cats, $scope.current_category.parent_id);
			var sType = "category";
			if ( parentObj.parent_id != "") {
				sType = "subcategory";
			}
			//console.log('Parent category = '+JSON.stringify(parentObj));
			$scope.selectCategory(parentObj, sType, true);
		}
	}
};

$scope.hasValidChildren = function( categoryObj ) {
	if ( categoryObj.child.length == 0 ) {
		return false;
	}
	
	if ( categoryObj.child.length == 1 ) {
		if (categoryObj.child[0].id == categoryObj.id ) {
			return false;
		}
		
		if (categoryObj.child[0].total_count == 0 ) {
			return false
		}
	}
	
	return true;
};

$scope.resetFilters = function() {
	$scope.search_str = "";
	$scope.card_viewer.setFilter('search_string', "");
	
	$scope.selectCategory();
	
	for ( var x=0; x<$scope.accordian_cats.length; x++ ) {
		$scope.accordian_cats[x].child_show = false;
	}
	
	if ( $scope.accordian_catalogs.length > 1 ) {
		$scope.selectTop(null);
		if ( typeof $scope.filter_catalog != "undefined") {
			$scope.filter_catalog = "";
			$scope.changeAccordianTop("");
		}
	}
};

$scope.clearSearch = function() {
	var timer = $timeout(function () {
		$scope.search_str = "";
		$scope.card_viewer.setFilter('search_string', "");
		$scope.getCardsWrapper();
	}, 500);
};

$scope.removeTag = function(tag) {
	//$msgService.showSimpleToast(tag.value_display + ' ('+tag.name + ') '+$scope.getMessage('evgcms_remove_from_list_msg'), 'success');
	if ( tag.type == 'container' ) {
		$scope.selectTop(null);
		if ( typeof $scope.filter_catalog != "undefined") {
			$scope.filter_catalog = "";
			$scope.changeAccordianTop("");
		}
	}
	
	if ( tag.type == 'category' ) {
		$scope.selectCategory();
	}
	
	if ( tag.type == 'subcategory' ) {
		var parentCategoryObj = getCategoryObj($scope.data.browse_data[0].categories, $scope.selected_category);
		$scope.selectCategory(parentCategoryObj, "category", true);
		var timer = $timeout(function () {
			$scope.buildFilterTags();
		}, 500);
	}
	
	if ( tag.type == 'keyword' ) {
		$scope.clearSearch();
	}
};

$scope.addKeywordTag = function( tag ) {
	$scope.search_str = tag;
	$scope.runSearch(tag);
	return {
		display_value: tag,
		type: 'keyword',
		icon: 'fa-filter',
		readonly: false
	};
};

});

cms_ngapp.controller('scItemCardBrowser', function($controller, $scope, $http, $mdDialog) {
	angular.extend(this, $controller('cardBrowseController', {$scope: $scope}));
	
});

cms_ngapp.controller('bizserviceCardBrowser', function($controller, $scope, $http, $mdDialog, $cacheSvc, $location) {
	angular.extend(this, $controller('cardBrowseController', {$scope: $scope}));
	
	$scope.getMyServices = function(bClearCache) {
		$scope.card_viewer.setFilter('myservices', true);
		$scope.getCards();
	};
	
	$scope.getHighestRatedSvcs = function() {
		$scope.card_viewer.setFilter('has_rating', true);
		$scope.getCards();
	};
	
	$scope.getServicesIOwn = function() {
		$scope.card_viewer.setFilter('owned', true);
		$scope.getCards();
	};
	
	var cardClickFN = angular.copy($scope.processCardClick);
	
	$scope.processCardClick = function(card, ev) {
		if ( typeof $scope.selected_view.name != "undefined") {
			if ( $scope.selected_view.name == "owned") {
				var urlProp = {};
				urlProp.id = "evg-svc-dashboard";
				urlProp.sys_id = card.id;
				$location.search(urlProp);
			} else {
				cardClickFN(card, ev);
			}
		} else {
			cardClickFN(card, ev);
		}
		
	};
	
});

cms_ngapp.controller('adBizserviceCardBrowser', function($controller, $scope, $http, $mdDialog, $cacheSvc, $location) {
	angular.extend(this, $controller('cardBrowseController', {$scope: $scope}));
	
	$scope.filter_categories = [];
	
	$scope.getMyServices = function(bClearCache) {
		$scope.card_viewer.setFilter('myservices', true);
		$scope.getCards();
	};
	
	$scope.getHighestRatedSvcs = function() {
		$scope.card_viewer.setFilter('has_rating', true);
		$scope.getCards();
	};
	
	$scope.getServicesIOwn = function() {
		$scope.card_viewer.setFilter('owned', true);
		$scope.getCards();
	};
	
	var cardClickFN = angular.copy($scope.processCardClick);
	
	$scope.processCardClick = function(card, ev) {
		if ( typeof $scope.selected_view.name != "undefined") {
			if ( $scope.selected_view.name == "owned") {
				var urlProp = {};
				urlProp.id = "evg-svc-dashboard";
				urlProp.sys_id = card.id;
				$location.search(urlProp);
			} else {
				cardClickFN(card, ev);
			}
		} else {
			cardClickFN(card, ev);
		}
		
	};
	
	function getCategoryObj(aCategoryData, sCategoryID) {
		for (var i = 0; i < aCategoryData.length; i++) {
			if ( aCategoryData[i].id == sCategoryID ) {
				return aCategoryData[i];
			}
			if (aCategoryData[i].child.length > 0 ) {
				var childObj = getCategoryObj_inChildTree(aCategoryData[i].child, sCategoryID);
				if ( childObj != null ) {
					return childObj;
				}
			}
		}
		
		return {};
	}
	
	function getCategoryObj_inChildTree(childList, sCategoryID) {
		for ( var i=0; i<childList.length; i++ ) {
			if ( childList[i].id == sCategoryID ) {
				return childList[i];
			}
			if ( childList[i].child.length > 0 ) {
				if( getCategoryObj_inChildTree(childList[i].child, sCategoryID) ) {
					return childList[i];
				}
				
			}
		}
	}
	
	$scope.getTocData = function(bClearCache) {
		$scope.card_viewer.setViewType('small');
		if ( bClearCache == null ) { bClearCache = false; }
			if ( bClearCache ) {
			$scope.card_viewer.clearCache();
			$scope.cache_in_use = false;
			$scope.data.sidebar_templates = [];
		}
		$scope.accordian_cats = [];
		$scope.accordian_catalogs = [];
		$scope.suggested_services = [];
		$scope.getting_suggestions = false;
		$scope.filter_catalog = "";
		$scope.show_categories_in_sidebar = false;
		$scope.suppress_getcards = true;
		var promise = $scope.getBrowseDataQ(true);
		promise.then(function(data) {
			$scope.accordian_cats = $scope.getAccordianCategories(data);
			$scope.accordian_catalogs = $scope.getAccordianCatalogs(data);
			if ( typeof $scope.selected_top.id != "undefined") {
				$scope.filter_catalog = $scope.selected_top.id;
			} else {
				var topCatalog = $cacheSvc.getData('svcSelectedCatalog');
			}
			
			$scope.getSuggestions();
			
			if ( typeof $scope.current_category.id != "undefined") {
				console.log('[getTocData] Category ID Filter:'+$scope.current_category.id);
				if ( typeof $scope.current_category.parent_id == "undefined") {
					$scope.current_category = getCategoryObj($scope.accordian_cats, $scope.current_category.id);
					console.log('[getTocData] Parent Category ID Filter:'+$scope.current_category.parent_id);
				}
				
				if ( typeof $scope.current_category.parent_id != "undefined") {
					if ( $scope.current_category.parent_id != "" ) {
						$scope.filter_categories.push($scope.current_category.parent_id);
					} else {
						$scope.filter_categories.push($scope.current_category.id);
					}
				}
			}
		});
	};
	
	$scope.toggleCategoryFilters = function(categoryID, roleBased) {
		
		$scope.child_filter_categories = []
		if (roleBased) {				
			$http.get('/api/aueis/helphub_role_based_suggestions/getSuggestions')
				.then(function(response) {
				console.log('ROLE BASED RESPONSE ', response);
				var suggestions = response.data.result;
				$scope.child_filter_categories.push("ROLE_BASED");
				for (var i=0;i<suggestions.length;i++) {
					$scope.child_filter_categories.push(suggestions[i]);
				}
				
			});
		} else {
			$scope.child_filter_categories = [];
		}
			if ( categoryID == null ) {
				$scope.filter_categories = [];
			} else {
				var iIndex = $scope.filter_categories.indexOf(categoryID);
				if ( iIndex > -1 ) {
					$scope.filter_categories.splice(iIndex, 1);
				} else {
					console.log("FITLER CATS : " + categoryID)
					$scope.filter_categories.push(categoryID);
				}
			}
			if ( $scope.containsSearchFilter() ) {
				$scope.card_viewer.setFilter('search_string', "");
			}
		
		
		
	};
	
});